Chatonio

Messages

July 7, 2026 ViewsChatonio API

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_typeCLIENT (the customer), OPERATOR, AI, or SYSTEM.
  • content — the message text.
  • is_internal_note — always false here.
  • 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 CLOSED conversation returns 400 conversation_closed.
  • Group (Telegram group) conversations are not supported in v1 (400 group_conversations_not_supported).
  • An empty content returns 400 content_required.
  • Rate limit: 60 requests/minute per API key.

Was this article helpful?