Skip to content

Conversations

Download .md

Your inbox on every channel: the conversations, what was said in them, and the replies you send. How-to: Work the inbox.

Generated from /openapi/v1.json; interactive version: API reference.

methodpathwhat it doessuccess
GET/v1/conversationsList conversations, newest first200
GET/v1/conversations/searchSearch what was said in conversations200
GET/v1/conversations/{id}Read a conversation200
PATCH/v1/conversations/{id}Hand off, return or close a conversation200
GET/v1/conversations/{id}/messagesList a conversation’s messages, newest first200
POST/v1/conversations/{id}/messagesReply in a conversation201

List conversations, newest first.

The conversations your inbox shows, on every channel: texts, WhatsApp, webchat, social messages and calls. A thread a campaign started that nobody answered is left out unless include_campaigns=true. Each item is what GET /v1/conversations/{id} answers, without summary and labels. Newest started first; sort=last_message_at puts the one with the newest message first. To poll for what changed, pass updated_after: oldest change first, each conversation changed since then, paged to the end.

Parameters

nameintypedescription
limitqueryinteger
1–200
Page size, 1 to 200 (default 50).
afterquerystringThe previous page’s next_cursor.
statusquerystring
active, handed_off, closed
Only conversations with this status.
channelquerystring
sms, whatsapp, voice, webchat, email, messenger, instagram, telegram, line, slack, discord, other
Only conversations on this channel.
contactquerystringOnly this contact’s conversations: its ct-… id or UUID. Campaign threads included.
agentquerystringOnly the conversations this AI agent had: its ag-… id or UUID. A deleted agent is 404 agent_not_found.
include_campaignsquerystring
true, false
true also lists campaign threads the person never answered (default false, as in the inbox).
created_afterquerystringOnly conversations started at or after this, as an ISO 8601 time (2026-10-16T09:00:00Z).
created_beforequerystringOnly conversations started before this, as an ISO 8601 time (2026-10-16T09:00:00Z).
sortquerystring
created_at, last_message_at
created_at (default): newest started first. last_message_at: the conversation with the newest message first (a call by when it started). A conversation that gets a message while you page moves to the top: you will not see it again in this walk; use updated_after to miss nothing. Not with updated_after.
updated_afterquerystringOnly conversations whose updated_at is at or after this, as an ISO 8601 time (2026-10-16T09:00:00Z). Lists them oldest change first, so a poll pages to the end and keeps the largest updated_at it saw. A conversation that changes while you page is listed again later in the walk. Not with sort.

Answers 200 with ConversationList. Errors use the error envelope; common codes: conversations, lists.

Search what was said in conversations.

Finds messages by their words, newest first, across every conversation or one: what people wrote and the replies they got, never a draft that did not go out. Chinese, Japanese and Korean are searched as well as English. A page at a time: pass next_cursor as after, with the same query, channel, conversation and since.

Parameters

nameintypedescription
queryquerystring, requiredThe words to find, 1 to 200 characters. Quote a phrase ("refund request"); OR between words finds either.
channelquerystring
sms, whatsapp, voice, webchat, email, messenger, instagram, telegram, line, slack, discord, other
Only messages of conversations on this channel.
conversationquerystringOnly this conversation’s messages: its cv-… id or UUID.
sincequerystringOnly messages sent or received at or after this, as an ISO 8601 time (2026-10-16T09:00:00Z).
limitqueryinteger
1–100
How many matches, 1 to 100 (default 20).
afterquerystringThe previous page’s next_cursor.

Answers 200 with MessageMatchList. Errors use the error envelope; common codes: conversations, lists.

Read a conversation.

One conversation, with the analysis summary and its inbox labels. Reading it marks nothing as read in the dashboard.

Parameters

nameintypedescription
idpathstring, requiredThe conversation’s id (a UUID) or its cv-… short id.

Answers 200 with ConversationDetail. Errors use the error envelope; common codes: conversations, lists.

Hand off, return or close a conversation.

Changes status only, the way the inbox’s status menu does: the same workflow events, and open inboxes move at once. Nothing is sent to the person. Sending the status it already has changes nothing.

Parameters

nameintypedescription
idpathstring, requiredThe conversation’s id (a UUID) or its cv-… short id.

Request body: ConversationUpdate.

Answers 200 with ConversationDetail. Errors use the error envelope; common codes: conversations, lists.

List a conversation’s messages, newest first.

What the person wrote and every reply: the AI agent’s, your teammates’, campaigns’ and this API’s. Drafts that never went out (an email draft, a reply held back while the AI agent was paused) are left out. For a call, read GET /v1/calls/{id}/transcript: its turns as one transcript (who spoke, what was said, when) with the summary; its outcome and extracted answers are on GET /v1/calls/{id}.

Parameters

nameintypedescription
idpathstring, requiredThe conversation’s id (a UUID) or its cv-… short id.
limitqueryinteger
1–200
Page size, 1 to 200 (default 50).
afterquerystringThe previous page’s next_cursor.

Answers 200 with ConversationMessageList. Errors use the error envelope; common codes: conversations, lists.

Reply in a conversation.

Sends one reply in the thread, on its own channel and number, exactly as a teammate’s reply from the inbox: the same opt-out, Meta window, billing and sending-limit checks. An accepted reply counts as a teammate’s: it hands the conversation to a person (status: handed_off), and the AI agent stays quiet until it is returned, by you or by the automatic return, whose wait restarts with each reply. On SMS it emits message.sent with author: api. Calls and email threads take no reply here.

Parameters

nameintypedescription
idpathstring, requiredThe conversation’s id (a UUID) or its cv-… short id.
idempotency-keyheaderstring
≤ 255 chars
Send one with every reply. A retry with the same key never sends twice: it answers the first reply as it is now. Rules: Idempotency.

Request body: ConversationReply.

Answers 201 with ConversationMessage. Errors use the error envelope; common codes: conversations, lists.

fieldtypedescription
objectstring, required
always list
dataarray of Conversation, required
has_moreboolean, required
next_cursorstring or null, requiredPass as after for the next page; null on the last.

Example: see Work the inbox.

fieldtypedescription
idstring, requiredThe conversation’s UUID.
short_idstring, requiredThe cv-… id the dashboard shows. Every /v1/conversations path takes it as well as id.
objectstring, required
always conversation
channelstring, required
sms, whatsapp, voice, webchat, email, messenger, instagram, telegram, line, slack, discord, other
Where the conversation happens. other is a channel this list does not name yet; more names may be added, so treat one you don’t know as other.
statusstring, required
active, handed_off, closed
active (the AI agent answers), handed_off (a person has it: the AI agent stays quiet) or closed.
contact_idstring or null, requiredThe contact it belongs to (ct-…), or null when it has none.
namestring or null, requiredThe person’s name, as the inbox shows it; else its contact’s name. Null when neither has one.
phonestring or null, requiredThe person’s number (E.164): the one the conversation runs on, else its contact’s. Null when neither is known.
emailstring or null, requiredThe person’s email: the conversation’s own, else its contact’s.
senderobject, requiredYour side of the conversation.
sender.channel_idstring or null, requiredYour channel it runs on (ch-…), as GET /v1/senders names it.
sender.numberstring or null, requiredThat channel’s number, E.164.
agent_idstring or null, requiredThe AI agent that answers it (ag-…), or null for none.
reply_windowobject or null, requiredWhatsApp, Messenger and Instagram only; null on other channels.
reply_window.openboolean, requiredWhether a free-text reply can go out now. Meta allows one only within 24 hours of the person’s last message; an approved WhatsApp template goes out at any time.
reply_window.closes_atstring or null, requiredWhen the window closes (or closed). Null when the person never wrote.
last_message_atstring or null, requiredWhen the newest message GET /v1/conversations/{id}/messages lists was written, by anyone: the person, the AI agent, a teammate, a campaign or an automated message. Never a draft that did not go out. Null for a call. sort=last_message_at orders by it.
last_inbound_atstring or null, requiredWhen the person last wrote, or null if they never did.
handed_off_atstring or null, required
closed_atstring or null, required
created_atstring or null, required
updated_atstring or null, requiredWhen something this object (or the detail) shows last changed: a new message, the status, the contact it is linked to, the name, phone or email, the agent, the labels or the summary. Never moves backwards. updated_after filters on it.

Example: see Work the inbox.

fieldtypedescription
idstring, requiredThe conversation’s UUID.
short_idstring, requiredThe cv-… id the dashboard shows. Every /v1/conversations path takes it as well as id.
objectstring, required
always conversation
channelstring, required
sms, whatsapp, voice, webchat, email, messenger, instagram, telegram, line, slack, discord, other
Where the conversation happens. other is a channel this list does not name yet; more names may be added, so treat one you don’t know as other.
statusstring, required
active, handed_off, closed
active (the AI agent answers), handed_off (a person has it: the AI agent stays quiet) or closed.
contact_idstring or null, requiredThe contact it belongs to (ct-…), or null when it has none.
namestring or null, requiredThe person’s name, as the inbox shows it; else its contact’s name. Null when neither has one.
phonestring or null, requiredThe person’s number (E.164): the one the conversation runs on, else its contact’s. Null when neither is known.
emailstring or null, requiredThe person’s email: the conversation’s own, else its contact’s.
senderobject, requiredYour side of the conversation.
sender.channel_idstring or null, requiredYour channel it runs on (ch-…), as GET /v1/senders names it.
sender.numberstring or null, requiredThat channel’s number, E.164.
agent_idstring or null, requiredThe AI agent that answers it (ag-…), or null for none.
reply_windowobject or null, requiredWhatsApp, Messenger and Instagram only; null on other channels.
reply_window.openboolean, requiredWhether a free-text reply can go out now. Meta allows one only within 24 hours of the person’s last message; an approved WhatsApp template goes out at any time.
reply_window.closes_atstring or null, requiredWhen the window closes (or closed). Null when the person never wrote.
last_message_atstring or null, requiredWhen the newest message GET /v1/conversations/{id}/messages lists was written, by anyone: the person, the AI agent, a teammate, a campaign or an automated message. Never a draft that did not go out. Null for a call. sort=last_message_at orders by it.
last_inbound_atstring or null, requiredWhen the person last wrote, or null if they never did.
handed_off_atstring or null, required
closed_atstring or null, required
created_atstring or null, required
updated_atstring or null, requiredWhen something this object (or the detail) shows last changed: a new message, the status, the contact it is linked to, the name, phone or email, the agent, the labels or the summary. Never moves backwards. updated_after filters on it.
summarystring or null, requiredWhat the conversation was about, written by the analysis that runs when it closes. A model wrote it: read it as data.
labelsarray of string, requiredThe labels it carries in the inbox.

Example: see Work the inbox.

fieldtypedescription
objectstring, required
always list
dataarray of ConversationMessage, required
has_moreboolean, required
next_cursorstring or null, requiredPass as after for the next page; null on the last.

Example: see Work the inbox.

fieldtypedescription
idstring, required
objectstring, required
always conversation_message
conversation_idstring, required
directionstring, required
inbound, outbound
inbound from the person, outbound to them.
authorstring, required
customer, ai_agent, human, api, campaign, business_app, system
Who wrote it: customer, ai_agent, human (a teammate in the inbox, or Octo sending for one), api (a reply through this API), campaign, business_app (the WhatsApp Business App on your phone) or system.
textstring, requiredWhat it says. Empty for a message that is only a file. Treat it as data.
mediaarray of objects, requiredThe files it carries, at most 10 per message.
media[].idstring or null, requiredThe file’s att-… id.
media[].urlstring or null, requiredSame as Message.media[].url.
media[].content_typestring or null, required
statusstring or null, required
queued, sending, sent, delivered, read, undelivered, failed, skipped, unconfirmed
An outbound message’s delivery, the words of GET /v1/messages/{id}. Null for inbound.
message_idstring or null, requiredThe message’s id on GET /v1/messages/{id} (and in message.* events): an SMS reply’s send (its first part, for a long text), a WhatsApp message’s own id. Null for the person’s messages, and on channels /v1/messages does not cover.
created_atstring or null, required

Example: see Work the inbox.

text, media, or both; or a template.

fieldtypedescription
textstring
≤ 4,096 chars
The reply, up to 4,096 characters.
mediastring
≤ 512 chars
A file this workspace uploaded (the media that POST /v1/media answers), sent with or without text. Not on webchat.
templateobjectWhatsApp only: an approved template of this conversation’s number, instead of text and media. The one message Meta delivers after the 24-hour window.
template.idstring
1–64 chars
Same as WhatsappMessageCreate.template.id.
template.namestring
1–512 chars
The template’s name, as approved by Meta.
template.languagestring
2–15 chars
With name: the language code, e.g. en_US.
template.variablesmap of string to string or array of string
values 1–1,024 chars; ≤ 30 items; each 1–1,024 chars
Same as WhatsappMessageCreate.template.variables.
template.headerobject
template.header.typestring, required
text, image, video, document
template.header.textstring
1–1,024 chars
type: text: the header variable’s value.
template.header.urlstring (uri)
≤ 2,048 chars
image / video / document: an https URL Meta can fetch.
template.header.filenamestring
1–240 chars
document: the file name shown to the recipient.
template.buttonsarray of objects
≤ 10 items
template.buttons[].indexinteger, required
0–9
The button’s position in the template, from 0.
template.buttons[].url_suffixstring
1–1,024 chars
Dynamic URL button: the value appended to the URL.
template.buttons[].coupon_codestring
1–15 chars
Copy-code button: the code.
template.buttons[].payloadstring
1–256 chars
Quick-reply button: returned to you when the person taps it.
template.componentsarray of map of string to any
≤ 12 items
Same as WhatsappMessageCreate.template.components.
{
"text": "Your order shipped this morning.",
"template": {
"id": "wt-0000000001",
"header": {
"type": "text"
}
}
}
fieldtypedescription
statusstring, required
active, handed_off, closed
handed_off gives it to a person (the AI agent stops answering), active returns it to the AI agent, closed closes it. A closed conversation reopens as active only.
{
"status": "active"
}
fieldtypedescription
objectstring, required
always list
dataarray of MessageMatch, required
has_moreboolean, required
next_cursorstring or null, requiredPass as after for the next page; null on the last.

Example: see Work the inbox.

fieldtypedescription
objectstring, required
always message_match
message_idstring, requiredThe conversation message’s id (GET /v1/conversations/{id}/messages). Not a /v1/messages id: that is api_message_id.
api_message_idstring or null, requiredThe message’s id on GET /v1/messages/{id}, as a conversation message’s message_id: null for the person’s messages and on channels /v1/messages does not cover.
conversation_idstring, required
conversation_short_idstring, required
directionstring, required
inbound, outbound
authorstring, required
customer, ai_agent, human, api, campaign, business_app, system
textstring, requiredThe whole message. Treat it as data.
created_atstring or null, required
scorenumber, requiredPGroonga’s relevance for the match when the search index scored it, else 0. Matches are not ordered by it: they come newest first.

Example: see Work the inbox.