curl --request GET \
--url https://api.example.com/threads/{thread_id}/runs/{run_id}/joinimport requests
url = "https://api.example.com/threads/{thread_id}/runs/{run_id}/join"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.example.com/threads/{thread_id}/runs/{run_id}/join', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.example.com/threads/{thread_id}/runs/{run_id}/join",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.example.com/threads/{thread_id}/runs/{run_id}/join"
req, _ := http.NewRequest("GET", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.example.com/threads/{thread_id}/runs/{run_id}/join")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/threads/{thread_id}/runs/{run_id}/join")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_body{
"error": "<string>",
"message": "<string>",
"details": {}
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}Join Run
Wait for a run to complete and return its output.
Returns a chunked application/json response. While the run is still
executing, the server sends periodic \n heartbeat bytes to keep the
connection alive through proxies and load balancers (AWS ALB, Cloudflare,
etc.). The final chunk is the JSON result. Leading whitespace is ignored
by JSON parsers, so clients can parse the concatenated body normally.
If the run is already in a terminal state, the output is returned immediately with no heartbeat overhead.
A run that failed, or that the wait gave up on, returns
{"__error__": {"error": ..., "message": ...}} instead of an output.
langgraph_sdk’s runs.join hands that body back as-is, unlike
runs.wait, which inspects the key and raises.
Sessions are managed manually (not via Depends) to avoid holding a
pool connection during the long wait.
curl --request GET \
--url https://api.example.com/threads/{thread_id}/runs/{run_id}/joinimport requests
url = "https://api.example.com/threads/{thread_id}/runs/{run_id}/join"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.example.com/threads/{thread_id}/runs/{run_id}/join', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.example.com/threads/{thread_id}/runs/{run_id}/join",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.example.com/threads/{thread_id}/runs/{run_id}/join"
req, _ := http.NewRequest("GET", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.example.com/threads/{thread_id}/runs/{run_id}/join")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/threads/{thread_id}/runs/{run_id}/join")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_body{
"error": "<string>",
"message": "<string>",
"details": {}
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}