curl --silent --show-error --fail-with-body --request POST \
--url 'https://api.example.com/api/admin/live-chat/{id}/messages' \
--header 'Authorization: Bearer YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data '{
"text": "I am checking the shipment status.",
"clientMessageId": "operator_reply_20261020_001"
}'
{
"message": {
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"sender": "string",
"text": "Two-person tent, green — replacement for damaged pole set.",
"timestamp": "2026-08-31T14:22:05Z",
"authorName": "string",
"operatorEvent": "joined",
"attachments": [
{
"name": "Two-Person Tent",
"type": "standard"
}
]
},
"replayed": true
}
Send a native operator reply
Requires the owning active claim for a new reply. Identical stored ID/content/operator replays before claim validation, even after release…
POST
/
api
/
admin
/
live-chat
/
{id}
/
messages
curl --silent --show-error --fail-with-body --request POST \
--url 'https://api.example.com/api/admin/live-chat/{id}/messages' \
--header 'Authorization: Bearer YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data '{
"text": "I am checking the shipment status.",
"clientMessageId": "operator_reply_20261020_001"
}'
{
"message": {
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"sender": "string",
"text": "Two-person tent, green — replacement for damaged pole set.",
"timestamp": "2026-08-31T14:22:05Z",
"authorName": "string",
"operatorEvent": "joined",
"attachments": [
{
"name": "Two-Person Tent",
"type": "standard"
}
]
},
"replayed": true
}
Requires the owning active claim for a new reply. Identical stored ID/content/operator replays before claim validation, even after release. Changed text or operator returns message_id_conflict. Acknowledged only after thread persistence. Requires WIDGET_LIVE_CHAT_ENABLED=true, an admin bearer key and verified thread ownership. Responses use Cache-Control: no-store. Mutations share the customer/AI thread execution lease. Limited to 120 requests/minute per credential (shared with Redis when configured).
Path parameters
Request body
object
Stable ID for this intentional action. Reuse only with identical content when recovering delivery. Minimum length:
8. Maximum length: 128.Response
object
Status codes
| Code | Meaning |
|---|---|
200 | Persisted result |
400 | Invalid operator name, message or note |
401 | Missing or invalid admin key |
404 | Thread not found in the authenticated organization |
409 | Claim, content-ID, note-limit or thread lease conflict |
429 | Rate limit exceeded |
503 | Live chat disabled or persistence unavailable |
Using this contract
Read the source OpenAPI document for declared schemas and alternatives. This page also includes documented corrections from the spec overlays. Example IDs and values are illustrative; replace them with records from your workspace.curl --silent --show-error --fail-with-body --request POST \
--url 'https://api.example.com/api/admin/live-chat/{id}/messages' \
--header 'Authorization: Bearer YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data '{
"text": "I am checking the shipment status.",
"clientMessageId": "operator_reply_20261020_001"
}'
{
"message": {
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"sender": "string",
"text": "Two-person tent, green — replacement for damaged pole set.",
"timestamp": "2026-08-31T14:22:05Z",
"authorName": "string",
"operatorEvent": "joined",
"attachments": [
{
"name": "Two-Person Tent",
"type": "standard"
}
]
},
"replayed": true
}
Last modified on November 13, 2026