List messages
Returns the messages in a conversation in chronological order (oldest first). Internal operator notes are never included.
GET/api/v1/conversations/{id}/messages/
List messages in a conversation (cursor-paginated, oldest first).
Response
200Success
{
"results": [
{
"id": "a1000000-0000-4000-8000-000000000001",
"conversation_id": "3f2b1c9a-7d4e-4b21-9c33-0a1b2c3d4e5f",
"thread_id": null,
"sender_type": "CLIENT",
"content": "Where is my order?",
"is_internal_note": false,
"reply_to_id": null,
"created_at": "2026-07-01T10:30:00+00:00",
"attachments": []
},
{
"id": "b2d7e410-3c88-4a15-9f60-7d8e9a0b1c2d",
"conversation_id": "3f2b1c9a-7d4e-4b21-9c33-0a1b2c3d4e5f",
"thread_id": null,
"sender_type": "OPERATOR",
"content": "It shipped this morning \u2014 tracking below.",
"is_internal_note": false,
"reply_to_id": null,
"created_at": "2026-07-01T10:40:00+00:00",
"attachments": []
}
],
"next_cursor": null,
"has_more": false
}The message object
- id, conversation_id, thread_id (usually
null). - sender_type —
CLIENT(the customer),OPERATOR,AI, orSYSTEM. - content — the message text.
- is_internal_note — always
falsehere. - reply_to_id — id of the message this replies to, or
null. - created_at — ISO-8601.
- attachments — array of
{ id, filename, content_type, size }.
Send a message
Delivers a message to the customer through the conversation’s channel. The message is recorded as an OPERATOR message tagged as sent via the API. It appears live in the operator dashboard.
POST/api/v1/conversations/{id}/messages/
Send a message into an existing conversation.
Request
Body
{
"content": "Your refund of $20.00 has been processed.",
"reply_to_message_id": null
}Responses
201Created
{
"id": "b2d7e410-3c88-4a15-9f60-7d8e9a0b1c2d",
"conversation_id": "3f2b1c9a-7d4e-4b21-9c33-0a1b2c3d4e5f",
"thread_id": null,
"sender_type": "OPERATOR",
"content": "Your refund of $20.00 has been processed.",
"is_internal_note": false,
"reply_to_id": null,
"created_at": "2026-07-01T10:41:00+00:00",
"attachments": []
}400Closed
{ "detail": "conversation_closed" }Body fields
- content — required; the message text (max 4096 characters).
- reply_to_message_id — optional; id of a message in the same conversation to reply to.
Notes & limits
- Sending to a
CLOSEDconversation returns400 conversation_closed. - Group (Telegram group) conversations are not supported in v1 (
400 group_conversations_not_supported). - An empty
contentreturns400 content_required. - Rate limit: 60 requests/minute per API key.