Skip to main content
A conversation is one stable iMessage chat owned by an agent identity. It can contain multiple reply threads. Standard shared-service conversations are 1:1 and start when a human messages the agent. Organizations with their own organization-owned shared pool can instead connect through the API, available only by request. A dedicated line can also start 1:1 conversations and group chats. Conversations persist as history after a 1:1 connection is released or a dedicated line is detached. For 1:1 conversations, 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

List conversation summaries ordered by most recent message, with latest-message preview and unread count.

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 a single 1:1 or group conversation by ID. Known group UUIDs work directly even though group list results are opt-in. To read the messages in it, use GET /messages?conversation_id=....

Path parameters

Query parameters

Response (200)

JSON
For a group, 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

Read one reply thread within a 1:1 or group conversation. Use 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

List active iMessage connections, newest first — one row per recipient currently connected to an agent identity through the router or the connect endpoint. Released connections are not returned; use assignment_status on conversation reads to detect a disconnect after the fact.

Query parameters

Response (200)

JSON

Error responses


Release connection

Disconnect a recipient from an agent identity. Requires an admin API key or a console session; identity-scoped keys are rejected. Inbound from the recipient stops routing to the agent, sends into the conversation return 409, and the line carrying the connection can be reassigned. The conversation stays readable with 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

Send a read receipt to the human — they see “Read” under their latest message — and mark the conversation’s inbound messages as 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

Show the typing bubble to a 1:1 conversation’s recipient — useful while your agent prepares a longer reply. The indicator clears on its own or when the next message arrives. Group conversations do not support typing indicators.

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. An assignment_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.

Connection object

Returned by List connections and released by Release connection. The pool line carrying the connection is managed by Inkbox and never appears in API responses.