Resume Conversation
curl --request POST \
--url https://api.bland.ai/v1/sms/conversations/{conversation_id}/resume \
--header 'Content-Type: application/json' \
--header 'authorization: <authorization>' \
--data '
{
"node_id": "<string>",
"message": "<string>",
"generate_reply": true,
"actor": "<string>"
}
'import requests
url = "https://api.bland.ai/v1/sms/conversations/{conversation_id}/resume"
payload = {
"node_id": "<string>",
"message": "<string>",
"generate_reply": True,
"actor": "<string>"
}
headers = {
"authorization": "<authorization>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {authorization: '<authorization>', 'Content-Type': 'application/json'},
body: JSON.stringify({
node_id: '<string>',
message: '<string>',
generate_reply: true,
actor: '<string>'
})
};
fetch('https://api.bland.ai/v1/sms/conversations/{conversation_id}/resume', 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.bland.ai/v1/sms/conversations/{conversation_id}/resume",
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([
'node_id' => '<string>',
'message' => '<string>',
'generate_reply' => true,
'actor' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"authorization: <authorization>"
],
]);
$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.bland.ai/v1/sms/conversations/{conversation_id}/resume"
payload := strings.NewReader("{\n \"node_id\": \"<string>\",\n \"message\": \"<string>\",\n \"generate_reply\": true,\n \"actor\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("authorization", "<authorization>")
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.bland.ai/v1/sms/conversations/{conversation_id}/resume")
.header("authorization", "<authorization>")
.header("Content-Type", "application/json")
.body("{\n \"node_id\": \"<string>\",\n \"message\": \"<string>\",\n \"generate_reply\": true,\n \"actor\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.bland.ai/v1/sms/conversations/{conversation_id}/resume")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["authorization"] = '<authorization>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"node_id\": \"<string>\",\n \"message\": \"<string>\",\n \"generate_reply\": true,\n \"actor\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"message": "Conversation returned to the agent",
"was_active": true,
"conversation": {
"id": "8f1c2a4e-1b7d-4f2a-9c1e-2d3f4a5b6c7d",
"is_active": true,
"current_node_id": "confirm-booking",
"human_handoff_at": null,
"human_handoff_reason": null,
"human_handoff_metadata": null,
"updated_at": "2026-09-02T18:31:02.000Z"
},
"status": "processing",
"message_id": "0c9d8e7f-6a5b-4c3d-9e8f-7a6b5c4d3e2f"
},
"errors": null
}
Messaging
Resume Conversation
Hand a conversation back to the agent after a human handoff.
POST
/
v1
/
sms
/
conversations
/
{conversation_id}
/
resume
Resume Conversation
curl --request POST \
--url https://api.bland.ai/v1/sms/conversations/{conversation_id}/resume \
--header 'Content-Type: application/json' \
--header 'authorization: <authorization>' \
--data '
{
"node_id": "<string>",
"message": "<string>",
"generate_reply": true,
"actor": "<string>"
}
'import requests
url = "https://api.bland.ai/v1/sms/conversations/{conversation_id}/resume"
payload = {
"node_id": "<string>",
"message": "<string>",
"generate_reply": True,
"actor": "<string>"
}
headers = {
"authorization": "<authorization>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {authorization: '<authorization>', 'Content-Type': 'application/json'},
body: JSON.stringify({
node_id: '<string>',
message: '<string>',
generate_reply: true,
actor: '<string>'
})
};
fetch('https://api.bland.ai/v1/sms/conversations/{conversation_id}/resume', 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.bland.ai/v1/sms/conversations/{conversation_id}/resume",
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([
'node_id' => '<string>',
'message' => '<string>',
'generate_reply' => true,
'actor' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"authorization: <authorization>"
],
]);
$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.bland.ai/v1/sms/conversations/{conversation_id}/resume"
payload := strings.NewReader("{\n \"node_id\": \"<string>\",\n \"message\": \"<string>\",\n \"generate_reply\": true,\n \"actor\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("authorization", "<authorization>")
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.bland.ai/v1/sms/conversations/{conversation_id}/resume")
.header("authorization", "<authorization>")
.header("Content-Type", "application/json")
.body("{\n \"node_id\": \"<string>\",\n \"message\": \"<string>\",\n \"generate_reply\": true,\n \"actor\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.bland.ai/v1/sms/conversations/{conversation_id}/resume")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["authorization"] = '<authorization>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"node_id\": \"<string>\",\n \"message\": \"<string>\",\n \"generate_reply\": true,\n \"actor\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"message": "Conversation returned to the agent",
"was_active": true,
"conversation": {
"id": "8f1c2a4e-1b7d-4f2a-9c1e-2d3f4a5b6c7d",
"is_active": true,
"current_node_id": "confirm-booking",
"human_handoff_at": null,
"human_handoff_reason": null,
"human_handoff_metadata": null,
"updated_at": "2026-09-02T18:31:02.000Z"
},
"status": "processing",
"message_id": "0c9d8e7f-6a5b-4c3d-9e8f-7a6b5c4d3e2f"
},
"errors": null
}
Enterprise Feature - SMS is only available on Enterprise plans.
status: "human_handoff_ended" webhook fires.
If the pathway is still sitting on the Transfer to Human node, pass
node_id so the agent continues somewhere useful. Otherwise the next inbound message re-enters that node and hands the thread off again.Headers
string
required
Your API key for authentication.
Path Parameters
string
required
The conversation to resume.
Body Parameters
string
Pathway node to continue from.
string
A fixed message to send from the agent as it takes the thread back. Cannot be combined with
generate_reply.boolean
Have the agent generate and send its next turn immediately from the current (or
node_id) node, rather than waiting for the user to text.string
Who returned the thread, for the audit trail.
Response
boolean
false when no handoff was active (the node jump still applies).{
"data": {
"message": "Conversation returned to the agent",
"was_active": true,
"conversation": {
"id": "8f1c2a4e-1b7d-4f2a-9c1e-2d3f4a5b6c7d",
"is_active": true,
"current_node_id": "confirm-booking",
"human_handoff_at": null,
"human_handoff_reason": null,
"human_handoff_metadata": null,
"updated_at": "2026-09-02T18:31:02.000Z"
},
"status": "processing",
"message_id": "0c9d8e7f-6a5b-4c3d-9e8f-7a6b5c4d3e2f"
},
"errors": null
}
Was this page helpful?