curl --request POST \
--url https://api.example.com/threads/{thread_id}/state \
--header 'Content-Type: application/json' \
--data '
{
"values": {},
"checkpoint": {},
"checkpoint_id": "<string>",
"as_node": "<string>",
"subgraphs": false,
"checkpoint_ns": "<string>"
}
'import requests
url = "https://api.example.com/threads/{thread_id}/state"
payload = {
"values": {},
"checkpoint": {},
"checkpoint_id": "<string>",
"as_node": "<string>",
"subgraphs": False,
"checkpoint_ns": "<string>"
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
values: {},
checkpoint: {},
checkpoint_id: '<string>',
as_node: '<string>',
subgraphs: false,
checkpoint_ns: '<string>'
})
};
fetch('https://api.example.com/threads/{thread_id}/state', 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}/state",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'values' => [
],
'checkpoint' => [
],
'checkpoint_id' => '<string>',
'as_node' => '<string>',
'subgraphs' => false,
'checkpoint_ns' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.example.com/threads/{thread_id}/state"
payload := strings.NewReader("{\n \"values\": {},\n \"checkpoint\": {},\n \"checkpoint_id\": \"<string>\",\n \"as_node\": \"<string>\",\n \"subgraphs\": false,\n \"checkpoint_ns\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.example.com/threads/{thread_id}/state")
.header("Content-Type", "application/json")
.body("{\n \"values\": {},\n \"checkpoint\": {},\n \"checkpoint_id\": \"<string>\",\n \"as_node\": \"<string>\",\n \"subgraphs\": false,\n \"checkpoint_ns\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/threads/{thread_id}/state")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"values\": {},\n \"checkpoint\": {},\n \"checkpoint_id\": \"<string>\",\n \"as_node\": \"<string>\",\n \"subgraphs\": false,\n \"checkpoint_ns\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"values": {},
"checkpoint": {
"checkpoint_id": "<string>",
"thread_id": "<string>",
"checkpoint_ns": ""
},
"next": [
"<string>"
],
"tasks": [
{}
],
"interrupts": [
{}
],
"metadata": {},
"created_at": "2023-11-07T05:31:56Z",
"parent_checkpoint": {
"checkpoint_id": "<string>",
"thread_id": "<string>",
"checkpoint_ns": ""
},
"checkpoint_id": "<string>",
"parent_checkpoint_id": "<string>"
}{
"error": "<string>",
"message": "<string>",
"details": {}
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}Update Thread State
Update thread state or retrieve it via POST.
When values is provided, creates a new checkpoint with the updated state.
Use as_node to attribute the update to a specific graph node. When
values is null AND as_node is not provided, this endpoint acts as a
POST-based alternative to the GET state endpoint (useful when passing
complex checkpoint/subgraph parameters in the request body).
When values is null AND as_node is provided (e.g. as_node="__copy__"
as LangGraph Studio sends for “Re-run from here”), this creates a new
checkpoint derived from the supplied checkpoint_id without applying
any state change — used to anchor a subsequent run as a fork of that
checkpoint rather than of the thread’s latest state.
curl --request POST \
--url https://api.example.com/threads/{thread_id}/state \
--header 'Content-Type: application/json' \
--data '
{
"values": {},
"checkpoint": {},
"checkpoint_id": "<string>",
"as_node": "<string>",
"subgraphs": false,
"checkpoint_ns": "<string>"
}
'import requests
url = "https://api.example.com/threads/{thread_id}/state"
payload = {
"values": {},
"checkpoint": {},
"checkpoint_id": "<string>",
"as_node": "<string>",
"subgraphs": False,
"checkpoint_ns": "<string>"
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
values: {},
checkpoint: {},
checkpoint_id: '<string>',
as_node: '<string>',
subgraphs: false,
checkpoint_ns: '<string>'
})
};
fetch('https://api.example.com/threads/{thread_id}/state', 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}/state",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'values' => [
],
'checkpoint' => [
],
'checkpoint_id' => '<string>',
'as_node' => '<string>',
'subgraphs' => false,
'checkpoint_ns' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.example.com/threads/{thread_id}/state"
payload := strings.NewReader("{\n \"values\": {},\n \"checkpoint\": {},\n \"checkpoint_id\": \"<string>\",\n \"as_node\": \"<string>\",\n \"subgraphs\": false,\n \"checkpoint_ns\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.example.com/threads/{thread_id}/state")
.header("Content-Type", "application/json")
.body("{\n \"values\": {},\n \"checkpoint\": {},\n \"checkpoint_id\": \"<string>\",\n \"as_node\": \"<string>\",\n \"subgraphs\": false,\n \"checkpoint_ns\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/threads/{thread_id}/state")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"values\": {},\n \"checkpoint\": {},\n \"checkpoint_id\": \"<string>\",\n \"as_node\": \"<string>\",\n \"subgraphs\": false,\n \"checkpoint_ns\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"values": {},
"checkpoint": {
"checkpoint_id": "<string>",
"thread_id": "<string>",
"checkpoint_ns": ""
},
"next": [
"<string>"
],
"tasks": [
{}
],
"interrupts": [
{}
],
"metadata": {},
"created_at": "2023-11-07T05:31:56Z",
"parent_checkpoint": {
"checkpoint_id": "<string>",
"thread_id": "<string>",
"checkpoint_ns": ""
},
"checkpoint_id": "<string>",
"parent_checkpoint_id": "<string>"
}{
"error": "<string>",
"message": "<string>",
"details": {}
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}Path Parameters
Body
Request model for updating thread state
The values to update the state with
- Values · object
- Values · object[]
The checkpoint to update the state of
Optional checkpoint ID to update from
Update the state as if this node had just executed
Include states from subgraphs
Checkpoint namespace
Response
Successful Response
- ThreadState
- ThreadStateUpdateResponse
Thread state model for history endpoint
Channel values (messages, etc.)
Current checkpoint
Show child attributes
Show child attributes
Next nodes to execute
Tasks to execute
Interrupt data
Checkpoint metadata
Timestamp of state creation
Parent checkpoint
Show child attributes
Show child attributes
Checkpoint ID (for backward compatibility)
Parent checkpoint ID (for backward compatibility)