List messages in a conversation
GET/api/v1/conversations/{id}/messages
scope
messages:readPaginatedThe thread’s messages, newest first, as the customer saw them. Internal AI-activity notes are excluded.
Path parameters
| Name | Type | Description |
|---|---|---|
idrequired | string (uuid) | Conversation id |
Query parameters
| Name | Type | Description |
|---|---|---|
limitoptional | integer | Page size, 1–100Default: 20 |
cursoroptional | string | The `next_cursor` from the previous page |
Request
curl "https://your-crm.example.com/api/v1/conversations/4e5f6a7b-8c9d-4e0f-a1b2-c3d4e5f6a7b8/messages" \
-H "Authorization: Bearer $RAABTA_API_KEY"Response · 200 OK
{
"data": [
{
"id": "7a8b9c0d-1e2f-4a3b-8c4d-5e6f7a8b9c0d",
"conversation_id": "4e5f6a7b-8c9d-4e0f-a1b2-c3d4e5f6a7b8",
"direction": "inbound",
"sender_type": "customer",
"type": "text",
"text": "Is the clinic open on Saturday?",
"media_url": null,
"template_name": null,
"status": "delivered",
"channel_message_id": "wamid.HBgLOTcxNTAxMjM0NTY3FQIAEhgUM0E5QjZDRkQ0RkQ5QjM3RTQ3NkQA",
"reply_to_message_id": null,
"created_at": "2026-09-02T09:58:00.000Z"
}
],
"meta": {
"next_cursor": null,
"has_more": false,
"limit": 20
}
}Response
Wrapped in { data: [...], meta }| Name | Type | Description |
|---|---|---|
idrequired | string (uuid) | UUID |
conversation_idrequired | string (uuid) | UUID |
directionrequired | string (enum) | inbound = from the customerinboundoutbound |
sender_typerequired | string (enum) | bot = the assistant or an API key; agent = a member in the inboxcustomeragentbot |
typerequired | string (enum) | Content typetextimagedocumentaudiovideolocationtemplateinteractive |
textrequired | string | null | Body text, or the caption of a media message |
media_urlrequired | string | null | URL of the attached image, video, document or audio |
template_namerequired | string | null | The template this message was sent from, for template sends |
statusrequired | string (enum) | Delivery status as reported by the channelsendingsentdeliveredreadfailed |
channel_message_idrequired | string | null | The channel’s own id (a WhatsApp wamid, a Messenger mid) |
reply_to_message_idrequired | string (uuid) | null | The message this one replies to, when the customer quoted one |
created_atrequired | string (date-time) | ISO 8601 timestamp |
Errors
| Status | Code | When |
|---|---|---|
| 400 | bad_request | The request could not be parsed: malformed JSON, an invalid cursor, or a query parameter of the wrong shape. |
| 400 | validation_error | The body or query failed validation. `details` lists each failing field with a `path` and a `message`. |
| 401 | unauthorized | No usable API key: the Authorization header is missing or malformed, or the key is unknown, revoked or expired. The three are deliberately indistinguishable. |
| 403 | forbidden | The key is valid but lacks the scope this endpoint requires, or the request came from an address outside the key’s IP allowlist. The message says which. |
| 403 | account_suspended | The account this key belongs to is suspended. Rotating the key will not help; contact support. |
| 404 | not_found | No such resource in this account. A resource that exists in another account also returns this. |
| 429 | rate_limited | The per-key budget, or the per-IP budget for failed authentication, is exhausted. Honour `Retry-After` before retrying. |
| 500 | internal | Something failed on our side. Safe to retry with the same Idempotency-Key; quote `request_id` if it persists. |