Keystone Developers
Open Keystone
API reference

Console API

Conversations

15 endpoints.

GET/api/v1/admin/conversations

List conversations

Parameters

NameInTypeDescription
business_idquerystring (uuid) | null

Scope contact hydration to this business. When provided, each list item's `contact` field is the business_contact record for that business; without it, contact is picked from any business the consumer is known to (first match).

statusquerystring | null

OPEN | CLOSED | SNOOZED

assigned_toqueryinteger | null
unread_onlyquerybooleandefault false
needs_attentionqueryboolean | null

Filter to conversations whose business contact is flagged needs-attention. Requires `business_id` — contacts are per-business while consumers are global, so an unscoped filter would match contacts flagged in other businesses.

cursorquerystring | null
limitqueryintegerdefault 50
authorizationheaderstring | null

Responses

200Successful Response
application/jsonSuccessResponse_list_ConversationListItem__
FieldTypeDescription
request_idrequiredstring
successtruedefault true
datarequiredConversationListItem[]
ConversationListItem[] fields
FieldTypeDescription
idrequiredstring
consumer_idstring | null
statusrequiredstring
assigned_tointeger | null
ai_enabledbooleandefault true
ai_modestringdefault "AUTONOMOUS"
last_message_atstring (date-time) | null
last_message_previewstring | null
last_message_channelstring | null
unread_countintegerdefault 0
message_countintegerdefault 0
snoozed_untilstring (date-time) | null
created_atrequiredstring (date-time)
updated_atrequiredstring (date-time)
reply_channelReplyChannelData | null
ReplyChannelData fields

ReplyChannelData (not expanded)

contactConversationContactSummary | null
ConversationContactSummary fields

ConversationContactSummary (not expanded)

businessesConversationBusinessSummary[]default []
ConversationBusinessSummary[] fields

Nested object (not expanded)

metadataResponseMetadata | null
ResponseMetadata fields

ResponseMetadata, expanded above.

metaResponseMeta | null
ResponseMeta fields
FieldTypeDescription
totalinteger | null
total_countinteger | null
pageinteger | null
per_pageinteger | null
  • 400Bad request
  • 401Unauthorized
  • 403Forbidden
  • 404Not found
  • 422Validation error
  • 500Internal server error
  • 503Service unavailable

Error bodies: ErrorResponse. See Errors.

POST/api/v1/admin/conversations

Create or fetch conversation for a contact (idempotent)

Start a conversation with a contact from the console. Returns 200 with the existing conversation when one already exists for the contact's consumer (idempotent). Passing `initial_message` sends the first outbound atomically.

Console-created conversations default to `ai_enabled=True`, `ai_mode='AUTONOMOUS'` — the bot drives the thread out of the box. Operators opt out via PATCH /conversations/{id} or by flipping the contact-level `auto_contact_enabled` toggle (which cascades here).

Parameters

NameInTypeDescription
authorizationheaderstring | null

Request bodyrequired

application/jsonConversationCreateBody
FieldTypeDescription
business_idrequiredstring
contact_idrequiredstring
channelstring | null

IMESSAGE (only supported channel today)

initial_messageMessageSendBody | null
MessageSendBody fields
FieldTypeDescription
bodyrequiredstringmin length 1
attachmentsMessageAttachment[]
MessageAttachment[] fields

MessageAttachment (not expanded)

content_typestring

TEXT | MEDIA

default "TEXT"
idempotency_keystring | null
channelstring | null
idempotency_keystring | null

Responses

200Successful Response
application/jsonSuccessResponse_ConversationCreateResult_
FieldTypeDescription
request_idrequiredstring
successtruedefault true
datarequiredConversationCreateResult
ConversationCreateResult fields
FieldTypeDescription
conversationrequiredConversationData
ConversationData fields

ConversationData, expanded above.

messageMessageData | null
MessageData fields
FieldTypeDescription
idrequiredstring
conversation_idrequiredstring
consumer_idrequiredstring
directionrequiredstring
sender_typerequiredstring
sender_idstring | null
sender_display_namestring | null
channelrequiredstring
content_typerequiredstring
bodystring | null
attachments(FormSubmissionAttachment | MessageAttachment)[]
(FormSubmissionAttachment | MessageAttachment)[] fields

Nested object (not expanded)

external_idstring | null
statusrequiredstring
error_codestring | null
error_messagestring | null
ai_metadataobject
created_atrequiredstring (date-time)
delivered_atstring (date-time) | null
read_atstring (date-time) | null
createdrequiredboolean
metadataResponseMetadata | null
ResponseMetadata fields

ResponseMetadata, expanded above.

metaResponseMeta | null
ResponseMeta fields

ResponseMeta, expanded above.

  • 400Bad request
  • 401Unauthorized
  • 403Forbidden
  • 404Not found
  • 422Validation error
  • 500Internal server error
  • 503Service unavailable

Error bodies: ErrorResponse. See Errors.

GET/api/v1/admin/conversations/{conversation_id}

Get conversation

Parameters

NameInTypeDescription
conversation_idrequiredpathstring (uuid)
authorizationheaderstring | null

Responses

200Successful Response
application/jsonSuccessResponse_ConversationData_
FieldTypeDescription
request_idrequiredstring
successtruedefault true
datarequiredConversationData
ConversationData fields
FieldTypeDescription
idrequiredstring
consumer_idstring | null
statusrequiredstring
assigned_tointeger | null
ai_enabledbooleandefault true
ai_modestringdefault "AUTONOMOUS"
last_message_atstring (date-time) | null
last_message_previewstring | null
last_message_channelstring | null
unread_countintegerdefault 0
message_countintegerdefault 0
snoozed_untilstring (date-time) | null
created_atrequiredstring (date-time)
updated_atrequiredstring (date-time)
reply_channelReplyChannelData | null
ReplyChannelData fields
FieldTypeDescription
defaultstring | null
availablestring[]default []
string[] fields

Nested object (not expanded)

metadataResponseMetadata | null
ResponseMetadata fields

ResponseMetadata, expanded above.

metaResponseMeta | null
ResponseMeta fields

ResponseMeta, expanded above.

  • 400Bad request
  • 401Unauthorized
  • 403Forbidden
  • 404Not found
  • 422Validation error
  • 500Internal server error
  • 503Service unavailable

Error bodies: ErrorResponse. See Errors.

PATCH/api/v1/admin/conversations/{conversation_id}

Update conversation

Parameters

NameInTypeDescription
conversation_idrequiredpathstring (uuid)
authorizationheaderstring | null

Request bodyrequired

application/jsonConversationUpdateBody
FieldTypeDescription
statusstring | null

OPEN | CLOSED | SNOOZED

assigned_tointeger | null
ai_enabledboolean | null
ai_modestring | null

AUTONOMOUS | ASSIST | OFF

snoozed_untilstring (date-time) | null

Responses

200Successful Response
application/jsonSuccessResponse_ConversationData_
FieldTypeDescription
request_idrequiredstring
successtruedefault true
datarequiredConversationData
ConversationData fields

ConversationData, expanded above.

metadataResponseMetadata | null
ResponseMetadata fields

ResponseMetadata, expanded above.

metaResponseMeta | null
ResponseMeta fields

ResponseMeta, expanded above.

  • 400Bad request
  • 401Unauthorized
  • 403Forbidden
  • 404Not found
  • 422Validation error
  • 500Internal server error
  • 503Service unavailable

Error bodies: ErrorResponse. See Errors.

GET/api/v1/admin/conversations/{conversation_id}/messages

List messages in a conversation

Parameters

NameInTypeDescription
conversation_idrequiredpathstring (uuid)
cursorquerystring | null
limitqueryintegerdefault 50
authorizationheaderstring | null

Responses

200Successful Response
application/jsonSuccessResponse_list_MessageData__
FieldTypeDescription
request_idrequiredstring
successtruedefault true
datarequiredMessageData[]
MessageData[] fields

MessageData, expanded above.

metadataResponseMetadata | null
ResponseMetadata fields

ResponseMetadata, expanded above.

metaResponseMeta | null
ResponseMeta fields

ResponseMeta, expanded above.

  • 400Bad request
  • 401Unauthorized
  • 403Forbidden
  • 404Not found
  • 422Validation error
  • 500Internal server error
  • 503Service unavailable

Error bodies: ErrorResponse. See Errors.

POST/api/v1/admin/conversations/{conversation_id}/messages

Send outbound message

Parameters

NameInTypeDescription
conversation_idrequiredpathstring (uuid)
authorizationheaderstring | null

Request bodyrequired

application/jsonMessageSendBody

MessageSendBody, expanded above.

Responses

201Successful Response
application/jsonSuccessResponse_MessageData_
FieldTypeDescription
request_idrequiredstring
successtruedefault true
datarequiredMessageData
MessageData fields

MessageData, expanded above.

metadataResponseMetadata | null
ResponseMetadata fields

ResponseMetadata, expanded above.

metaResponseMeta | null
ResponseMeta fields

ResponseMeta, expanded above.

  • 400Bad request
  • 401Unauthorized
  • 403Forbidden
  • 404Not found
  • 422Validation error
  • 500Internal server error
  • 503Service unavailable

Error bodies: ErrorResponse. See Errors.

DELETE/api/v1/admin/conversations/{conversation_id}/messages/{message_id}

Delete a DRAFT message (ASSIST-mode reject)

Parameters

NameInTypeDescription
conversation_idrequiredpathstring (uuid)
message_idrequiredpathstring (uuid)
authorizationheaderstring | null

Responses

204Successful Response
  • 400Bad request
  • 401Unauthorized
  • 403Forbidden
  • 404Not found
  • 422Validation error
  • 500Internal server error
  • 503Service unavailable

Error bodies: ErrorResponse. See Errors.

POST/api/v1/admin/conversations/{conversation_id}/messages/{message_id}/retry

Retry a FAILED or PENDING outbound message

Parameters

NameInTypeDescription
conversation_idrequiredpathstring (uuid)
message_idrequiredpathstring (uuid)
authorizationheaderstring | null

Responses

200Successful Response
application/jsonSuccessResponse_MessageData_
FieldTypeDescription
request_idrequiredstring
successtruedefault true
datarequiredMessageData
MessageData fields

MessageData, expanded above.

metadataResponseMetadata | null
ResponseMetadata fields

ResponseMetadata, expanded above.

metaResponseMeta | null
ResponseMeta fields

ResponseMeta, expanded above.

  • 400Bad request
  • 401Unauthorized
  • 403Forbidden
  • 404Not found
  • 422Validation error
  • 500Internal server error
  • 503Service unavailable

Error bodies: ErrorResponse. See Errors.

POST/api/v1/admin/conversations/{conversation_id}/messages/{message_id}/send

Approve and send a DRAFT (e.g. AI-authored) message

Used by the ASSIST-mode approve flow: promotes a DRAFT outbound row to PENDING, stamps ai_metadata.review_status='approved' with the approver's user_id, and publishes to raven. Optional `edited_body` in the body allows inline edits before approval.

Parameters

NameInTypeDescription
conversation_idrequiredpathstring (uuid)
message_idrequiredpathstring (uuid)
authorizationheaderstring | null

Request body

application/jsonDraftSendBody | null
FieldTypeDescription
edited_bodystring | null

Responses

200Successful Response
application/jsonSuccessResponse_MessageData_
FieldTypeDescription
request_idrequiredstring
successtruedefault true
datarequiredMessageData
MessageData fields

MessageData, expanded above.

metadataResponseMetadata | null
ResponseMetadata fields

ResponseMetadata, expanded above.

metaResponseMeta | null
ResponseMeta fields

ResponseMeta, expanded above.

  • 400Bad request
  • 401Unauthorized
  • 403Forbidden
  • 404Not found
  • 422Validation error
  • 500Internal server error
  • 503Service unavailable

Error bodies: ErrorResponse. See Errors.

POST/api/v1/admin/conversations/{conversation_id}/read

Mark conversation as read (zero unread_count)

Parameters

NameInTypeDescription
conversation_idrequiredpathstring (uuid)
authorizationheaderstring | null

Responses

200Successful Response
application/jsonSuccessResponse_ConversationData_
FieldTypeDescription
request_idrequiredstring
successtruedefault true
datarequiredConversationData
ConversationData fields

ConversationData, expanded above.

metadataResponseMetadata | null
ResponseMetadata fields

ResponseMetadata, expanded above.

metaResponseMeta | null
ResponseMeta fields

ResponseMeta, expanded above.

  • 400Bad request
  • 401Unauthorized
  • 403Forbidden
  • 404Not found
  • 422Validation error
  • 500Internal server error
  • 503Service unavailable

Error bodies: ErrorResponse. See Errors.

GET/api/v1/admin/conversations/configs

List all conversations config versions (newest first)

Parameters

NameInTypeDescription
authorizationheaderstring | null

Responses

200Successful Response
application/jsonSuccessResponse_list_ConversationsConfigData__
FieldTypeDescription
request_idrequiredstring
successtruedefault true
datarequiredConversationsConfigData[]
ConversationsConfigData[] fields
FieldTypeDescription
idrequiredstring
versionrequiredinteger
is_activerequiredboolean
persona_system_promptrequiredstring
prompt_versionrequiredstring
classification_providerrequiredstring
conversational_providerrequiredstring
summarization_providerrequiredstring
classification_enabledrequiredboolean
conversational_enabledrequiredboolean
conversational_multimodal_enabledbooleandefault true
min_autonomous_confidencerequirednumber
forbidden_topicsstring[]
string[] fields

Nested object (not expanded)

escalation_keywordsstring[]
string[] fields

Nested object (not expanded)

max_auto_replies_per_hour_per_consumerrequiredinteger
max_auto_replies_per_day_globalrequiredinteger
summary_trigger_message_countrequiredinteger
verbatim_tail_sizerequiredinteger
summary_max_sentencesintegerdefault 20
created_atrequiredstring (date-time)
updated_atrequiredstring (date-time)
created_bystring (uuid) | null
metadataResponseMetadata | null
ResponseMetadata fields

ResponseMetadata, expanded above.

metaResponseMeta | null
ResponseMeta fields

ResponseMeta, expanded above.

  • 400Bad request
  • 401Unauthorized
  • 403Forbidden
  • 404Not found
  • 422Validation error
  • 500Internal server error
  • 503Service unavailable

Error bodies: ErrorResponse. See Errors.

POST/api/v1/admin/conversations/configs

Create a new conversations config version

Inserts a new version that supersedes the current active row. Any field omitted in the body is inherited from the current active version, so callers can submit a small diff.

Parameters

NameInTypeDescription
authorizationheaderstring | null

Request bodyrequired

application/jsonConversationsConfigCreateBody
FieldTypeDescription
persona_system_promptstring | null
prompt_versionstring | null
classification_providerstring | null
conversational_providerstring | null
summarization_providerstring | null
classification_enabledboolean | null
conversational_enabledboolean | null
conversational_multimodal_enabledboolean | null
min_autonomous_confidencenumber | null
forbidden_topicsstring[] | null
string[] | null fields
escalation_keywordsstring[] | null
string[] | null fields
max_auto_replies_per_hour_per_consumerinteger | null
max_auto_replies_per_day_globalinteger | null
summary_trigger_message_countinteger | null
verbatim_tail_sizeinteger | null
summary_max_sentencesinteger | null

Responses

201Successful Response
application/jsonSuccessResponse_ConversationsConfigData_
FieldTypeDescription
request_idrequiredstring
successtruedefault true
datarequiredConversationsConfigData
ConversationsConfigData fields

ConversationsConfigData, expanded above.

metadataResponseMetadata | null
ResponseMetadata fields

ResponseMetadata, expanded above.

metaResponseMeta | null
ResponseMeta fields

ResponseMeta, expanded above.

  • 400Bad request
  • 401Unauthorized
  • 403Forbidden
  • 404Not found
  • 422Validation error
  • 500Internal server error
  • 503Service unavailable

Error bodies: ErrorResponse. See Errors.

GET/api/v1/admin/conversations/configs/{version}

Get a conversations config by version

Parameters

NameInTypeDescription
versionrequiredpathinteger
authorizationheaderstring | null

Responses

200Successful Response
application/jsonSuccessResponse_ConversationsConfigData_
FieldTypeDescription
request_idrequiredstring
successtruedefault true
datarequiredConversationsConfigData
ConversationsConfigData fields

ConversationsConfigData, expanded above.

metadataResponseMetadata | null
ResponseMetadata fields

ResponseMetadata, expanded above.

metaResponseMeta | null
ResponseMeta fields

ResponseMeta, expanded above.

  • 400Bad request
  • 401Unauthorized
  • 403Forbidden
  • 404Not found
  • 422Validation error
  • 500Internal server error
  • 503Service unavailable

Error bodies: ErrorResponse. See Errors.

GET/api/v1/admin/conversations/configs/active

Get the active conversations config

Parameters

NameInTypeDescription
authorizationheaderstring | null

Responses

200Successful Response
application/jsonSuccessResponse_ConversationsConfigData_
FieldTypeDescription
request_idrequiredstring
successtruedefault true
datarequiredConversationsConfigData
ConversationsConfigData fields

ConversationsConfigData, expanded above.

metadataResponseMetadata | null
ResponseMetadata fields
FieldTypeDescription
paginationPaginationMetadata | null
PaginationMetadata fields
FieldTypeDescription
limitrequiredinteger
next_cursorstring | null
prev_cursorstring | null
has_morerequiredboolean
has_prevbooleandefault false
total_countinteger | null
status_countsobject | null
object | null fields

Map of string to integer

lifecycle_countsLifecycleCounts | null
LifecycleCounts fields
FieldTypeDescription
leadintegerdefault 0
prospectintegerdefault 0
customerintegerdefault 0
former_customerintegerdefault 0
classification_countsClassificationCounts | null
ClassificationCounts fields
FieldTypeDescription
signalobject
object fields

Nested object (not expanded)

touchobject
object fields

Nested object (not expanded)

stageobject
object fields

Nested object (not expanded)

metaResponseMeta | null
ResponseMeta fields

ResponseMeta, expanded above.

  • 400Bad request
  • 401Unauthorized
  • 403Forbidden
  • 404Not found
  • 422Validation error
  • 500Internal server error
  • 503Service unavailable

Error bodies: ErrorResponse. See Errors.

GET/api/v1/admin/global-conversations

List conversations across all businesses (admin)

Admin cross-business inbox. Always unscoped. `needs_attention` matches conversations where any linked business_contact is flagged. Each row includes `businesses` (id + name) for UI badges and `contact.business_id` for actions.

Parameters

NameInTypeDescription
statusquerystring | null

OPEN | CLOSED | SNOOZED

assigned_toqueryinteger | null
unread_onlyquerybooleandefault false
needs_attentionqueryboolean | null

Filter to conversations where any linked business_contact is flagged needs-attention (cross-business).

cursorquerystring | null
limitqueryintegerdefault 50
authorizationheaderstring | null

Responses

200Successful Response
application/jsonSuccessResponse_list_ConversationListItem__
FieldTypeDescription
request_idrequiredstring
successtruedefault true
datarequiredConversationListItem[]
ConversationListItem[] fields

ConversationListItem, expanded above.

metadataResponseMetadata | null
ResponseMetadata fields

ResponseMetadata, expanded above.

metaResponseMeta | null
ResponseMeta fields

ResponseMeta, expanded above.

  • 400Bad request
  • 401Unauthorized
  • 403Forbidden
  • 404Not found
  • 422Validation error
  • 500Internal server error
  • 503Service unavailable

Error bodies: ErrorResponse. See Errors.