Overview
A conversation is one thread with a lead, on one channel and business account: WhatsApp, email, the web chat (chatbot), Facebook, Instagram, SMS or TikTok. A lead can have several conversations on the same channel and business account, one for each contact address (phone number, email address or handle) it has used, so key your copy on the conversation's id. You get the conversation's metadata, never its messages:
channel_type: the channel, ornullfor a channel this version of the API does not know.status:activeorarchivedin the team's inbox.assignee: the team member the conversation is assigned to, ornull.reply_mode:humanwhile a person has taken the conversation over, including a WhatsApp chat answered from the WhatsApp Business app, andaiotherwise.aimeans no takeover is active; it does not mean an assistant is set up or answering on that channel. A takeover with a time limit goes back toaiwhen it ends, and the conversation gets a new version then.last_inbound_atandlast_outbound_at: when the latest message came in from the customer, and when the latest message that did not fail went out to them. Erased messages, imported WhatsApp history and web-chat visitor messages do not count as inbound, so achatbotconversation readsnullthere. Imported WhatsApp history does count as outbound.
The contact's name, phone number or handle travel on the linked lead, not on the conversation. For the picture across all of a lead's channels, read the lead's response facet with GET /v1/leads/{id}.
Use GET /v1/conversations and GET /v1/conversations/{id} to look conversations up; GET /v1/conversations?lead= lists one lead's conversations. To keep a copy, follow the changes feed: Keep a copy in sync explains it.
GET /
Returns a page of the team's conversations, one per channel, business account and contact address: channel, inbox status, assignee and the times of the latest inbound and outbound messages. Pass lead for one lead's conversations. Message content is never exported.
Query parameters
limitinteger Range 1–100 Default25Items per page, 1–100. Defaults to 25.
cursorstring 1–512 charsThe
next_cursorof the previous page. Omit it for the first page.leadstring ID prefixlead_…Only the conversations linked to this lead: every item's
leadis this id. A lead of another team, or one that does not exist, matches nothing.
Headers
Totem-Teamstring Conditional ID prefixteam_…The team to read, as a
team_…id. Omit it when the key reads one team; it is required when the key reads several (400 team_required). When you send it, it must name a team the key reads: a malformed id gets400 invalid_request, and a team outside the key gets404 team_not_accessible, as does a request without it once the key reads no team at all.
Returns
Returns a list of Conversation objects.
objectstringAlways
list.dataArray<Conversation>The items of this page.
has_morebooleantruewhen another page follows: fetch it withnext_cursor, even if this page holds fewer items thanlimit.next_cursorstring NullableOpaque cursor for the next page, or null on the last page. Never parse it.
Errors
- 400
team_requiredTeam required - 403
team_state_restrictedTeam restricted - 403
sector_restrictedSector restricted - 404
team_not_accessibleTeam not accessible - 409
capture_not_readyTeam data is still being prepared - 429
quota_exceededDaily quota exceeded
curl 'https://api.totemstudio.ai/v1/conversations?limit=25' \
-H "Authorization: Bearer $TOTEM_API_KEY" \
-H "Totem-Team: $TOTEM_TEAM_ID"{
"object": "list",
"data": [
{
"id": "conv_m3GhGjRHmFbww1g10oqOp7j3gWqPJ",
"object": "conversation",
"livemode": false,
"team": "team_r9uYrIW4gSFJJ6hZQ9ip1UIpPaAD1CF7NR",
"lead": "lead_r72EfbRNUzuqORFJR0O8HxAwEXd93jGUTYMaMMXKSF0QbLS8CiUKJpEP34LFQG",
"channel_type": "whatsapp",
"status": "active",
"assignee": "mem_h548E7UiYhutHhucVrQCzkM0eaea0",
"reply_mode": "ai",
"created_at": "2026-09-28T10:16:00.000Z",
"last_inbound_at": "2026-10-01T08:58:00.000Z",
"last_outbound_at": "2026-10-01T08:59:30.000Z",
"version": 12,
"updated_at": "2026-10-01T08:59:31.040Z"
}
],
"has_more": false,
"next_cursor": null
}GET /
Returns one conversation by its id, without message content. A conversation this key cannot read, or one that was removed, answers 404 resource_missing.
Path parameters
idstring Required ID prefixconv_…The conversation's public id.
Returns
Returns a Conversation object.
idstring ID prefixconv_…Public id of the record.
objectstringAlways
conversation.livemodebooleantruefor real data;falsein example data.teamstring ID prefixteam_…The team this record belongs to.
leadstring Nullable ID prefixlead_…The lead this conversation is linked to, or null when it is unlinked or the lead no longer exists. Identity (name, phone, handle) travels on the lead only.
channel_typestring NullableThe channel:
whatsapp,email,chatbot(the web chat),facebook,instagram,smsortiktok; null for a value this version does not know. A lead can have several conversations on the same channel and business account, one for each contact address (phone number, email address or handle) it has used, so key your copy onid.Possible valuessmswhatsappfacebookinstagramtiktokchatbotemail
statusstring Nullableactiveorarchivedin the team's inbox; null for a value this version does not know.Possible valuesactivearchived
assigneestring Nullable ID prefixmem_…The team member assigned to the conversation (see
/members), or null.reply_modestringhumanwhile a person has taken the conversation over, including a WhatsApp chat answered from the WhatsApp Business app;aiotherwise.aimeans no takeover is active, not that an assistant is set up or answering on this channel. A timed takeover returns toaiwhen it expires, and the record's version changes then.Possible valuesaihuman
created_atstring Nullable Formatdate-timeWhen the conversation was created (UTC).
last_inbound_atstring Nullable Formatdate-timeThe latest customer message (UTC). Not counted: erased messages, imported WhatsApp history and web-chat visitor turns, so a
chatbotconversation reads null. Instagram shares cannot be told apart and count.last_outbound_atstring Nullable Formatdate-timeThe latest message sent to the customer that did not fail (UTC), whoever sent it. Imported WhatsApp history counts.
versioninteger Range ≥ 1Increases every time one of the record's exported fields changes. Apply a change only when its version is greater than the one you hold.
updated_atstring Formatdate-timeWhen Totem recorded this version (UTC). It is not the time the business event happened.
Errors
- 403
team_state_restrictedTeam restricted - 403
sector_restrictedSector restricted - 404
resource_missingResource not found - 409
capture_not_readyTeam data is still being prepared
curl 'https://api.totemstudio.ai/v1/conversations/conv_m3GhGjRHmFbww1g10oqOp7j3gWqPJ' \
-H "Authorization: Bearer $TOTEM_API_KEY"{
"id": "conv_m3GhGjRHmFbww1g10oqOp7j3gWqPJ",
"object": "conversation",
"livemode": false,
"team": "team_r9uYrIW4gSFJJ6hZQ9ip1UIpPaAD1CF7NR",
"lead": "lead_r72EfbRNUzuqORFJR0O8HxAwEXd93jGUTYMaMMXKSF0QbLS8CiUKJpEP34LFQG",
"channel_type": "whatsapp",
"status": "active",
"assignee": "mem_h548E7UiYhutHhucVrQCzkM0eaea0",
"reply_mode": "ai",
"created_at": "2026-09-28T10:16:00.000Z",
"last_inbound_at": "2026-10-01T08:58:00.000Z",
"last_outbound_at": "2026-10-01T08:59:30.000Z",
"version": 12,
"updated_at": "2026-10-01T08:59:31.040Z"
}A conversation on one channel: its status, assignee and the times of the latest messages, never their content.
Attributes
idstring ID prefixconv_…Public id of the record.
objectstringAlways
conversation.livemodebooleantruefor real data;falsein example data.teamstring ID prefixteam_…The team this record belongs to.
leadstring Nullable ID prefixlead_…The lead this conversation is linked to, or null when it is unlinked or the lead no longer exists. Identity (name, phone, handle) travels on the lead only.
channel_typestring NullableThe channel:
whatsapp,email,chatbot(the web chat),facebook,instagram,smsortiktok; null for a value this version does not know. A lead can have several conversations on the same channel and business account, one for each contact address (phone number, email address or handle) it has used, so key your copy onid.Possible valuessmswhatsappfacebookinstagramtiktokchatbotemail
statusstring Nullableactiveorarchivedin the team's inbox; null for a value this version does not know.Possible valuesactivearchived
assigneestring Nullable ID prefixmem_…The team member assigned to the conversation (see
/members), or null.reply_modestringhumanwhile a person has taken the conversation over, including a WhatsApp chat answered from the WhatsApp Business app;aiotherwise.aimeans no takeover is active, not that an assistant is set up or answering on this channel. A timed takeover returns toaiwhen it expires, and the record's version changes then.Possible valuesaihuman
created_atstring Nullable Formatdate-timeWhen the conversation was created (UTC).
last_inbound_atstring Nullable Formatdate-timeThe latest customer message (UTC). Not counted: erased messages, imported WhatsApp history and web-chat visitor turns, so a
chatbotconversation reads null. Instagram shares cannot be told apart and count.last_outbound_atstring Nullable Formatdate-timeThe latest message sent to the customer that did not fail (UTC), whoever sent it. Imported WhatsApp history counts.
versioninteger Range ≥ 1Increases every time one of the record's exported fields changes. Apply a change only when its version is greater than the one you hold.
updated_atstring Formatdate-timeWhen Totem recorded this version (UTC). It is not the time the business event happened.
{
"id": "conv_m3GhGjRHmFbww1g10oqOp7j3gWqPJ",
"object": "conversation",
"livemode": false,
"team": "team_r9uYrIW4gSFJJ6hZQ9ip1UIpPaAD1CF7NR",
"lead": "lead_r72EfbRNUzuqORFJR0O8HxAwEXd93jGUTYMaMMXKSF0QbLS8CiUKJpEP34LFQG",
"channel_type": "whatsapp",
"status": "active",
"assignee": "mem_h548E7UiYhutHhucVrQCzkM0eaea0",
"reply_mode": "ai",
"created_at": "2026-09-28T10:16:00.000Z",
"last_inbound_at": "2026-10-01T08:58:00.000Z",
"last_outbound_at": "2026-10-01T08:59:30.000Z",
"version": 12,
"updated_at": "2026-10-01T08:59:31.040Z"
}