Qualified Conversations API
Engaged chat conversations, meaning the visitor exchanged messages with a rep, bot, or AI assistant.
Engaged chat conversations, meaning the visitor exchanged messages with a rep, bot, or AI assistant.
Every API here is available over the APIs.io API and to AI agents over MCP.
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
find_apisBrowse and filter every API in the catalog.get_api_artifactsOne API's artifacts, grouped by type.get_openapiThe primary OpenAPI for this API.find_similar_apisAPIs that look like this one.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.curl "https://apis.io/api/v1/apis/qualified-com-conversations-api"
curl "https://apis.io/api/v1/apis?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
title: Qualified Enterprise Conversations API
version: '2.0'
description: '# Overview
_Last updated: August 9, 2026_
The Qualified Enterprise API connects your Qualified data to your warehouse, CDP, and downstream systems.'
servers:
- url: https://api.qualified.com
description: Production
security:
- bearerToken: []
tags:
- name: Conversations
description: Engaged chat conversations, meaning the visitor exchanged messages with a rep, bot, or AI assistant.
paths:
/v2/conversations:
get:
summary: List conversations
operationId: listConversations
description: 'Returns engaged conversations, newest first. Window with `ended_after`/`ended_before`; a conversation is windowed by end time and becomes available in this list 30 minutes after its session ends.
**Scope:** `conversation:view`'
tags:
- Conversations
parameters:
- $ref: '#/components/parameters/After'
- $ref: '#/components/parameters/Before'
- $ref: '#/components/parameters/EndedAfter'
- $ref: '#/components/parameters/EndedBefore'
- $ref: '#/components/parameters/VisitorId'
responses:
'200':
description: A page of conversations.
content:
application/json:
schema:
type: object
properties:
data:
type: array
items:
$ref: '#/components/schemas/Conversation'
pageInfo:
$ref: '#/components/schemas/PageInfo'
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'429':
$ref: '#/components/responses/TooManyRequests'
'500':
$ref: '#/components/responses/InternalServerError'
/v2/conversations/{id}:
get:
summary: Get a conversation
operationId: getConversation
description: 'Returns a single conversation by id. Returns `404` if the conversation is not engaged.
**Scope:** `conversation:view`'
tags:
- Conversations
parameters:
- name: id
in: path
required: true
description: Encoded conversation id.
schema:
type: string
responses:
'200':
description: The conversation.
content:
application/json:
schema:
type: object
properties:
data:
$ref: '#/components/schemas/Conversation'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'404':
$ref: '#/components/responses/NotFound'
'429':
$ref: '#/components/responses/TooManyRequests'
'500':
$ref: '#/components/responses/InternalServerError'
/v2/conversations/{id}/messages:
get:
summary: List messages in a conversation
operationId: listConversationMessages
description: 'Returns the messages for one conversation, newest first. Window with `created_after`/`created_before`; messages are immutable once delivered, so these give stable windowing (`updated_after`/`updated_before` are also accepted). `event`-type messages are excluded. Returns `404` if the conversation is not engaged.
**Scope:** `conversation:view`'
tags:
- Conversations
parameters:
- name: id
in: path
required: true
description: Encoded conversation id.
schema:
type: string
- $ref: '#/components/parameters/After'
- $ref: '#/components/parameters/Before'
- $ref: '#/components/parameters/CreatedAfter'
- $ref: '#/components/parameters/CreatedBefore'
- $ref: '#/components/parameters/UpdatedAfter'
- $ref: '#/components/parameters/UpdatedBefore'
responses:
'200':
description: A page of messages.
content:
application/json:
schema:
type: object
properties:
data:
type: array
items:
$ref: '#/components/schemas/Message'
pageInfo:
$ref: '#/components/schemas/PageInfo'
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'404':
$ref: '#/components/responses/NotFound'
'429':
$ref: '#/components/responses/TooManyRequests'
'500':
$ref: '#/components/responses/InternalServerError'
components:
schemas:
Message:
type: object
description: A single message within a conversation. Messages are immutable.
properties:
id:
type: string
description: Encoded message identifier.
type:
type: string
description: Message type, e.g. text. `event`-type messages are never returned.
text:
type: string
description: Message text.
createdAt:
type: string
format: date-time
description: When the message was sent.
senderType:
type:
- string
- 'null'
enum:
- user
- visitor
- experience
- ai_profile
description: Who sent the message. Null if the sender cannot be resolved.
senderName:
type:
- string
- 'null'
description: Display name of the sender. Null for visitors and where no name is available.
conversationId:
type: string
description: Encoded id of the conversation this message belongs to.
CodeErrorResponse:
type: object
properties:
code:
type: string
description: Machine-readable error code.
message:
type: string
description: Human-readable error message.
PageInfo:
type: object
description: Cursor-based pagination metadata.
properties:
hasNextPage:
type: boolean
description: Whether more results exist after `endCursor`.
hasPreviousPage:
type: boolean
description: Whether more results exist before `startCursor`.
startCursor:
type:
- string
- 'null'
description: Cursor for the first item on this page.
endCursor:
type:
- string
- 'null'
description: Cursor for the last item on this page.
Conversation:
type: object
description: An engaged chat conversation between a visitor and a rep, bot, or AI assistant.
properties:
id:
type: string
description: Encoded conversation identifier.
sessionId:
type: string
description: Encoded id of the parent session.
meetingIds:
type: array
items:
type: string
description: Encoded ids of meetings offered in this conversation. Empty when none.
experienceName:
type:
- string
- 'null'
description: Name of the bot experience, if any.
createdAt:
type: string
format: date-time
description: When the conversation started.
endedAt:
type:
- string
- 'null'
format: date-time
description: When the conversation ended.
userId:
type:
- string
- 'null'
description: Encoded id of the rep who participated. Null unless a rep joined, which is uncommon.
visitorId:
type: string
description: Encoded id of the visitor this conversation belongs to. Always present and immutable, so it is the durable key whether or not the visitor is identified. Match it against a lead's `visitorIds` to resolve the conversation to a person.
ErrorResponse:
type: object
properties:
error:
type: string
description: Human-readable error message.
parameters:
VisitorId:
name: visitor_id
in: query
required: false
description: Return only records for this visitor, including activity recorded before the visitor was identified. To pull everything for one person, read the lead's `visitorIds` and query each in turn.
schema:
type: string
CreatedAfter:
name: created_after
in: query
required: false
description: Return records created at or after this time. Accepts an ISO-8601 timestamp, interpreted as UTC unless it carries an offset. A bare date (`YYYY-MM-DD`) means midnight UTC at the start of that day.
schema:
type: string
EndedBefore:
name: ended_before
in: query
required: false
description: Return records that ended at or before this time. Interpreted as UTC unless an offset is given. A bare date (`YYYY-MM-DD`) means midnight UTC at the start of that day, so pass the next day's date to include a whole day.
schema:
type: string
UpdatedAfter:
name: updated_after
in: query
required: false
description: Return records updated at or after this time. Interpreted as UTC unless an offset is given. A bare date (`YYYY-MM-DD`) means midnight UTC at the start of that day.
schema:
type: string
After:
name: after
in: query
required: false
description: Cursor for forward pagination. Pass the `endCursor` from the previous response.
schema:
type: string
Before:
name: before
in: query
required: false
description: Cursor for backward pagination. Pass the `startCursor` from the previous response.
schema:
type: string
UpdatedBefore:
name: updated_before
in: query
required: false
description: Return records updated at or before this time. Interpreted as UTC unless an offset is given. A bare date (`YYYY-MM-DD`) means midnight UTC at the start of that day, so pass the next day's date to include a whole day.
schema:
type: string
CreatedBefore:
name: created_before
in: query
required: false
description: Return records created at or before this time. Accepts an ISO-8601 timestamp, interpreted as UTC unless it carries an offset. A bare date (`YYYY-MM-DD`) means midnight UTC at the start of that day, so pass the next day's date to include a whole day.
schema:
type: string
EndedAfter:
name: ended_after
in: query
required: false
description: Return records that ended at or after this time. Interpreted as UTC unless an offset is given. A bare date (`YYYY-MM-DD`) means midnight UTC at the start of that day.
schema:
type: string
responses:
InternalServerError:
description: Unexpected server error.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error: Internal server error
BadRequest:
description: Malformed request, such as an invalid date or cursor.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
Forbidden:
description: The token lacks the required OAuth scope.
content:
application/json:
schema:
$ref: '#/components/schemas/CodeErrorResponse'
example:
code: insufficient_scope
Unauthorized:
description: Missing or invalid token, or the API is not enabled for the team.
content:
application/json:
schema:
$ref: '#/components/schemas/CodeErrorResponse'
example:
code: invalid_token
NotFound:
description: The record was not found, or the id could not be decoded.
content:
application/json:
schema:
oneOf:
- $ref: '#/components/schemas/ErrorResponse'
- $ref: '#/components/schemas/CodeErrorResponse'
TooManyRequests:
description: A rate limit was exceeded. The three time-window limits set a `Retry-After` header; the concurrency limit does not, so treat its absence as "retry once an in-flight request finishes".
content:
application/json:
schema:
$ref: '#/components/schemas/CodeErrorResponse'
example:
code: rate_limited
message: Enterprise API rate limit exceeded
securitySchemes:
bearerToken:
type: http
scheme: bearer
bearerFormat: Token
x-tagGroups:
- name: Write APIs
tags:
- Leads
- Companies
- Bulk
- name: Activity APIs
tags:
- Sessions
- Conversations
- Messages
- Meetings
- Emails
- name: Utility APIs
tags:
- Cancel Meeting
- GDPR
- name: Legacy Reporting API
tags:
- Bot Conversations
- Rep Conversations