assignment_status reflects the current connection: "active" means the recipient is connected right now, and "released" means the connection is no longer active. A standard shared-service connection can also be released after inactivity. Expiry preserves history and does not introduce a separate assignment status. Group conversations instead return null assignment_id, assignment_status, and remote_number, plus is_group: true, a best-known participants list, and group_creation_status.
List conversations
Query parameters
Identity-scoped API keys never see blocked rows in conversation summaries. With
is_blocked=false, previews, ordering, unread counts, and totals are computed from non-blocked rows only.
start_datetime, end_datetime, and tz filter on the conversation’s created_at — when the conversation was created, not its latest-message time. This list is ordered by most recent message, but the date filter is on creation time. Previews, unread counts, totals, and ordering still describe the full conversation — they are not sliced to the window. Both bounds are optional and non-breaking — omit them for unchanged behavior. See Filtering by date.
Response (200)
JSON
Error responses
Get conversation
GET /messages?conversation_id=....
Path parameters
Query parameters
Response (200)
JSON
group_creation_status is "creating" while the first send is establishing the group, "not_created" when no confirmed group is available, and "ready" after the group is established. Failed or unconfirmed creation attempts remain in the conversation’s message history. A fresh explicit send can try creation again, but do not blindly repeat an earlier message whose delivery is unknown. See Group creation lifecycle.
Error responses
Get conversation thread
thread_id from a message or thread response; it is an opaque UUID, not the root message ID. The thread must belong to the specified conversation. An unknown or inaccessible conversation or thread returns 404; an invalid cursor or pagination parameter returns 422.
This endpoint accepts optional agent_identity_id, limit (default 50, maximum 200), and cursor. It returns the same thread response: thread_id, conversation_id, nullable thread_root_message_id, oldest-first messages, and next_cursor. Continue with the cursor until it is null.
To discover the thread from any member message instead, use GET /messages/{message_id}/thread. To filter the existing flat, newest-first message list, pass both conversation_id and thread_id to GET /messages. That list returns 200 with [] for an unknown or inaccessible thread within an accessible conversation, rather than this endpoint’s 404.
List connections
assignment_status on conversation reads to detect a disconnect after the fact.
Query parameters
Response (200)
JSON
Error responses
Release connection
assignment_status set to released.
Outgoing messages whose sending has not started are canceled. They remain in
history with status: "error" and error_code: "imessage_assignment_inactive".
Pool connections report these cancellations through imessage.delivery_failed.
Messages already being sent cannot be recalled.
The recipient is not notified. Standard shared-service recipients reconnect by texting the router again, which starts a new connection with a new id. For a organization-owned shared pool, use connect, subject to its eligibility checks. You can also disconnect by identity and recipient without looking up an assignment ID.
Path parameters
Response (204)
No content.Error responses
Mark conversation read
Request body
Request example
JSON
Response (200)
JSON
updated_count: 0 means no inbound messages needed updating; the read receipt is still sent.
Error responses
Send typing indicator
Request body
Response (200)
JSON
Error responses
Conversation object
A dedicated-line conversation can have a non-phone sender address. You can read its history, but it is receive-only. Anassignment_status of "active" does not make every sender address a valid outbound recipient.
Conversation summary object
Returned by List conversations; adds latest-message preview fields:
Group summaries use the same nullable assignment/remote fields and
participants, is_group, and group_creation_status fields as the conversation object. Groups appear only when include_groups=true.

