Get a conversation
GET/api/v1/conversations/{id}
scope
conversations:readOne thread with its contact summary, assignment and AI ownership.
Path parameters
| Name | Type | Description |
|---|---|---|
idrequired | string (uuid) | Conversation id |
Request
curl "https://your-crm.example.com/api/v1/conversations/4e5f6a7b-8c9d-4e0f-a1b2-c3d4e5f6a7b8" \
-H "Authorization: Bearer $RAABTA_API_KEY"Response · 200 OK
{
"data": {
"id": "4e5f6a7b-8c9d-4e0f-a1b2-c3d4e5f6a7b8",
"contact_id": "9d7e4c11-5a2b-4f7c-8e3d-2a1b0c9d8e7f",
"contact": {
"id": "9d7e4c11-5a2b-4f7c-8e3d-2a1b0c9d8e7f",
"name": "Ayesha Khan",
"phone": "+971501234567"
},
"channel": "whatsapp",
"connection_id": null,
"status": "open",
"assigned_to": null,
"ai_ownership": null,
"needs_attention": false,
"handoff_reason": null,
"last_message_text": "Is the clinic open on Saturday?",
"last_message_at": "2026-09-02T09:58:00.000Z",
"unread_count": 1,
"created_at": "2026-09-01T08:15:00.000Z",
"updated_at": "2026-09-02T09:58:00.000Z"
}
}Response
Wrapped in { data: … }| Name | Type | Description |
|---|---|---|
idrequired | string (uuid) | UUID |
contact_idrequired | string (uuid) | UUID |
contactrequired | object | The person on the other side |
contact.idrequired | string (uuid) | UUID |
contact.namerequired | string | null | Display name |
contact.phonerequired | string | null | E.164 phone number, when the channel has one |
channelrequired | string (enum) | The channel the thread lives onwhatsappmessengerinstagramwebchatpersonal_whatsapp |
connection_idrequired | string (uuid) | null | For personal WhatsApp: the linked number this thread is on |
statusrequired | string (enum) | Where the thread sits in the inboxopenpendingclosed |
assigned_torequired | string (uuid) | null | Member user id, or null when unassigned |
ai_ownershiprequired | string (enum) | null | Who is answering: the assistant, a human, or null = inherit from the channel’s assistant bindingaihuman |
needs_attentionrequired | boolean | The assistant handed this thread to a human and nobody has picked it up |
handoff_reasonrequired | string | null | Why the thread was handed to a human, when it was |
last_message_textrequired | string | null | Preview of the most recent message |
last_message_atrequired | string (date-time) | null | |
unread_countrequired | integer | Inbound messages not yet marked read |
created_atrequired | string (date-time) | ISO 8601 timestamp |
updated_atrequired | string (date-time) | ISO 8601 timestamp |
Errors
| Status | Code | When |
|---|---|---|
| 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. |