Skip to main content
A conversation is one customer contact: a phone call, a text thread, a website chat, or an email thread. When the AI texts a caller during or after a call, those texts belong to the call’s conversation.

Search conversations

Try it in the playground. Returns conversation summaries, most recent activity first. To read what was said, get the conversation.
string
Matches the customer’s name, phone number, or email, or words in the title, summary, or category. Up to 100 characters.
string
One of phone, text, web_chat, or email. Returns conversations that happened on that channel. A call the customer replied to by text matches both phone and text.
string
Created within this window: today, yesterday, 7d, 14d, 30d, 90d, 365d, mtd, or ytd. Every window starts at midnight in your team’s timezone. See time ranges. Leave it out for all time.
integer
default:"10"
Results per page, 1 to 50.
integer
default:"1"
Page number. Use next_page from the previous response.

Conversation fields

integer
The conversation ID. Use it to get the conversation or its recording.
string
The conversation in the dashboard.
string | null
The channel the conversation started on: phone, text, web_chat, or email.
string[]
Every channel the conversation happened on. A call the customer replied to by text lists phone and text. Texts the AI sent during or after a call appear in written.messages but don’t add text.
string | null
When the conversation started, as an ISO 8601 UTC timestamp.
string | null
The latest message, or started_at when there were no later messages. null only when both are missing.
string | null
A short title the AI wrote. Up to 200 characters.
string | null
The AI’s summary. Up to 1,500 characters.
string | null
The conversation category key, such as cancellation, billing, damage_claim, lost_items, sales, scheduling, hours_status, service_status, account_update, general_questions, job_seeking, or other. GET /reports/metrics lists every key with its label under categories. Older conversations can have a retired key that is not in that list.
object
The customer’s name, phone, and email. Any of them can be null.
object | null
The phone line (location) that took the conversation: id, name, and phone_number. name and phone_number can be null.
integer | null
Call length in seconds. null for texts, chats, and emails.
boolean
true when GET /conversations/{conversation_id}/recording has audio to stream for this call. false for texts, chats, emails, and calls that were not recorded. For some calls the recording provider stores the audio and can delete it, so true can still get a 404.

Get a conversation

Try it in the playground. Returns one conversation with every conversation field, plus the questions the customer asked, its task, and the full transcript.
integer
required
The conversation ID.
object[]
Questions the customer asked, each with the question, the answer given, and whether it was answered. answer can be null.
object | null
The task this conversation created, in the same shape as Get a task, with its description. null when it created no task.
object | null
The spoken transcript of a phone call. null for texts, chats, and emails.
object | null
Texts, chat messages, and emails in the conversation. null when there are none. A phone call with follow-up texts has both transcript and written.
A conversation that does not exist, or that the key’s owner cannot see, returns 404.

Download a call recording

Try it in the playground. Returns the call audio. The response body is the audio file, not JSON. The format depends on how the call was recorded, such as MP3 or Ogg. Read the Content-Type header.
integer
required
The conversation ID of a phone call.
string
Optional. Request part of the file, such as bytes=0-1048575. The response is then 206 with a Content-Range header.
Returns 404 when the conversation has no recording. Check has_recording on the conversation first. Texts, chats, emails, and calls that were not recorded have none. Recordings come back as MP3 (audio/mpeg) or Ogg (audio/ogg). Read the Content-Type header. A Range header that falls outside the file returns 416 when the recording provider supports byte ranges. Otherwise it returns 404. If the recording provider is down, the API returns 502 or 503 for most recordings and 404 or 500 for some, so retry later before treating a recording as missing.