API reference · Dashboard
List conversations
One page of conversations.
- Authentication
- Bearer token
- Retries
- Safe to repeat
- Body
- None
- Version
- 2026-09-03
cursor is the mode to use for anything that walks the whole list - exports, infinite scroll, an integration syncing conversations. It is constant-cost at any depth and stable while new conversations arrive; page is neither, and exists because a numbered pager needs it.
search_transcript=true widens q from metadata - visitor, page, contact details, title - to what was actually said, using the full-text index that has been in the schema since the first migration and, until now, was referenced by no query in the codebase.
count=false skips the COUNT(*), which is the half of the request that scans. total comes back as -1 and has_more is the field to read.
outcome, sentiment, intent, min_rating / max_rating, min_lead_score and the date bounds are what make the insight panels lead somewhere. Before them, the dashboard could tell a customer that 22% of their pricing conversations were refused and offer no way to open those twelve conversations - which is a report, not a tool.
Path parameters
bot_idstringrequired
Query parameters
pageintegerDefault: 1·≥ 1
page_sizeintegerDefault: 20·≥ 1 and ≤ 100
statusstring | nullhas_leadboolean | nullqstring | nullUp to 200 characters
search_transcriptbooleanDefault: false
sortstring | nullUp to 64 characters
cursorstring | nullUp to 512 characters
countbooleanDefault: true
fieldsstring | nullUp to 500 characters
outcomestring | nullPattern: ^(resolved|refused|handed_off|abandoned|errored)$
sentimentstring | nullPattern: ^(positive|neutral|negative)$
intentstring | nullUp to 48 characters
min_ratinginteger | null≥ 1 and ≤ 5
max_ratinginteger | null≥ 1 and ≤ 5
min_lead_scoreinteger | null≥ 0 and ≤ 100
unratedboolean | nulldate_fromstring (date-time) | nulldate_tostring (date-time) | null
Responses
- 200OKapplication/json
PaginatedResponse_ConversationRead_
itemsarray of ConversationReadrequired21 fields · ConversationRead
idstringrequiredlast_message_atstring (date-time)requiredstarted_atstring (date-time)requiredstatusstringrequiredvisitor_idstringrequiredconsentstringDefault: unknown
contact_emailstring | nullcontact_idstring | nullcontact_namestring | nullcontact_phonestring | nullcustom_fieldsobjectended_atstring (date-time) | nullis_leadbooleanDefault: false
message_countintegerDefault: 0
page_urlstring | nullratinginteger | nullresolvedboolean | nullsentimentstring | nullsummarystring | nulltitlestring | nulltotal_cost_usdnumberDefault: 0
pageintegerrequiredpage_sizeintegerrequiredtotalintegerrequiredhas_morebooleanDefault: false
next_cursorstring | null
5 response headers
- RateLimit-Limit
Requests permitted in the current window.
- RateLimit-Remaining
Requests left in the current window. Back off before it reaches 0.
- RateLimit-Reset
Seconds until the current window resets.
- X-API-Version
The dated version of the API contract that served this response, e.g.
2026-09-03. Pin against it; it changes only when a response shape changes incompatibly.- X-Request-ID
Quote this in a support request to identify the call.
- 422Validation error
The shared error envelope, served as
application/problem+jsonwitherror.codeset to validation_error. Its details name each field that failed and why.
Example request
curl "https://api.integrable.cloud/api/bots/$BOT_ID/conversations" \
-H "Authorization: Bearer $INTEGRABLE_API_KEY"Set INTEGRABLE_API_KEY and the path variables first. The same call from the TypeScript or Python SDK takes the same fields.
Example response
{
"has_more": false,
"items": [
{
"consent": "unknown",
"contact_email": "sam@example.com",
"contact_id": "01a0652b-3713-7ea1-a6c9-2e895389ec34",
"contact_name": "string",
"contact_phone": "+15550100",
"custom_fields": {},
"ended_at": "2026-09-03T09:30:00Z",
"id": "01a0652b-3713-7ea1-a6c9-2e895389ec34",
"is_lead": false,
"last_message_at": "2026-09-03T09:30:00Z",
"message_count": 0,
"page_url": "https://example.com",
"rating": 0,
"resolved": true,
"sentiment": "string",
"started_at": "2026-09-03T09:30:00Z",
"status": "string",
"summary": "string",
"title": "string",
"total_cost_usd": 0,
"visitor_id": "01a0652b-3713-7ea1-a6c9-2e895389ec34"
}
],
"next_cursor": "string",
"page": 0,
"page_size": 20,
"total": 0
}Generated from the schema above — the shape is exact, the values are placeholders.
Errors
Failures use one envelope on every endpoint, described in Retries, versioning and limits. The codes you are most likely to meet here:
validation_error· 422 — The payload was well-formed JSON but failed schema validation.unauthenticated· 401 — The request carried no API key, or one the API could not verify.forbidden· 403 — The key is valid, but it is not allowed to do this — either the scope is missing or the resource belongs to another workspace.rate_limited· 429 — Too many requests in the current window. The limit is per workspace, and some endpoints add a per-bot limit on top.
More Dashboard endpoints
- get/api/api-keysList API keys
- post/api/api-keysCreate API key
- delete/api/api-keys/{api_key_id}Revoke API key
- get/api/bots/{bot_id}/analyticsBot analytics
- get/api/bots/{bot_id}/analytics/gapsKnowledge gaps
- get/api/bots/{bot_id}/analytics/insightsBot insights
- get/api/bots/{bot_id}/contactsList contacts
- get/api/bots/{bot_id}/contacts/exportExport contacts
- get/api/bots/{bot_id}/contacts/{contact_id}/dataExport subject data
- delete/api/bots/{bot_id}/contacts/{contact_id}/dataErase subject data
- post/api/bots/{bot_id}/conversations/bulkBulk update conversations
- get/api/bots/{bot_id}/conversations/{conversation_id}Get conversation
- get/api/logsList request logs
- get/api/logs/summaryRequest log summary
- get/api/overviewOrg overview
- get/api/usagePlan usage
- get/api/viewsList saved views
- post/api/viewsCreate saved view
- patch/api/views/{view_id}Update saved view
- delete/api/views/{view_id}Delete saved view
Something here wrong or missing? Tell us — the documentation and the API are maintained by the same person, so a correction is a fix rather than a ticket.