Conversations
For instructions on how to authenticate to use this endpoint, see API overview.
Endpoints
POST | |
GET | |
GET | |
POST | |
PATCH | |
DELETE | |
POST | |
POST | |
POST | |
POST | |
GET | |
GET | |
POST | |
GET | |
PATCH | |
DELETE |
Create conversations tickets ai human outcome
Record that a human used or edited the latest AI draft.
Required API key scopes
ticket:writePath parameters
- idstring
Request parameters
- message_idstring
- outcome
Response
Example request
POST /api /projects /:project_id /conversations /tickets /:id /ai_human_outcomeExample response
Status 202
Status 409
List all conversations tickets messages
Return the message thread for a ticket, ordered chronologically (paginated).
Required API key scopes
ticket:readPath parameters
- idstring
Query parameters
- limitinteger
- offsetinteger
Response
Example request
GET /api /projects /:project_id /conversations /tickets /:id /messagesExample response
Status 200
Retrieve conversations tickets messages full email
Return the full inbound email body in Markdown.
Required API key scopes
ticket:readPath parameters
- idstring
- message_idstring
Response
Example request
GET /api /projects /:project_id /conversations /tickets /:id /messages /:message_id /full_emailExample response
Status 200
Status 404
Create conversations tickets notes
Add a private note to a ticket.
The note is visible to your team only. The request has no privacy field, so this endpoint never sends anything to the customer.
Required API key scopes
ticket:writePath parameters
- idstring
Request parameters
- messagestring
- rich_content
Response
Example request
POST /api /projects /:project_id /conversations /tickets /:id /notesExample response
Status 200 An identical note was already posted by a recent request. The original note is returned and nothing new is written.
Status 201
Status 400
Status 409 An identical note is still being created by another request.
Update conversations tickets notes
Update a private note on a ticket.
Only the note's author can edit it. Customer-facing replies cannot be edited (outbound delivery only runs on create).
Required API key scopes
ticket:writePath parameters
- idstring
- message_idstring
Request parameters
- messagestring
- rich_content
Response
Example request
PATCH /api /projects /:project_id /conversations /tickets /:id /notes /:message_idExample response
Status 200
Status 400
Status 403
Status 404
Delete conversations tickets notes
Soft-delete a private note on a ticket.
Only the note's author can delete it. Customer-facing replies cannot be deleted via this endpoint.
Required API key scopes
ticket:writePath parameters
- idstring
- message_idstring
Example request
DELETE /api /projects /:project_id /conversations /tickets /:id /notes /:message_idExample response
Status 204 Note soft-deleted.
Status 400
Status 403
Status 404
Create conversations tickets reply
Post a reply or internal note to a ticket.
With is_private=false, the reply is delivered to the customer via the ticket's channel (email, Slack, Teams, GitHub). With is_private=true, the message is stored as an internal note only visible to team members.
Retrying an identical message from the same author within a short window returns the original message with a 200 rather than posting it twice, and a 409 while a concurrent request is still creating it.
Required API key scopes
ticket:writePath parameters
- idstring
Request parameters
- messagestring
- is_privatebooleanDefault:
false - rich_content
Response
Example request
POST /api /projects /:project_id /conversations /tickets /:id /replyExample response
Status 200 An identical message was already posted by a recent request. The original message is returned and nothing new is written.
Status 201
Status 400
Status 409 An identical message is still being created by another request.
Create conversations tickets bulk update status
Update the status of multiple tickets in a single request.
Only tickets belonging to the current team are affected; other-team UUIDs are silently ignored. Tickets the caller lacks editor-level access to (denied or view-only via object-level access control) are silently skipped too, the same way single-ticket updates enforce object-level access via get_object(). Tickets already in the requested status are skipped.
Request parameters
- idsarray
- status
Response
Example request
POST /api /projects /:project_id /conversations /tickets /bulk_update_statusExample response
Status 200
Create conversations tickets bulk update tags
Bulk update tags on multiple objects.
PAT access: this action has no required_scopes= on the decorator —
inheriting viewsets must add "bulk_update_tags" to their
scope_object_write_actions list to accept personal API keys.
Without that opt-in, APIScopePermission rejects PAT requests with
"This action does not support personal API key access". Done per-viewset
so granting <scope>:write for one resource doesn't leak access to
sibling resources that share this mixin.
Accepts:
- {"ids": [...], "action": "add"|"remove"|"set", "tags": ["tag1", "tag2"]}
Actions:
- "add": Add tags to existing tags on each object
- "remove": Remove specific tags from each object
- "set": Replace all tags on each object with the provided list
Request parameters
- idsarray
- action
- tagsarray
Response
Example request
POST /api /projects /:project_id /conversations /tickets /bulk_update_tagsExample response
Status 200
Create conversations tickets compose
Create a new outbound ticket and send the first message to the customer.
Idempotent within a short window: an identical compose retried while the first is still in flight returns 409, and one retried after it committed returns the same ticket with a 200. Only a genuinely new request creates a ticket and emails the customer.
Required API key scopes
ticket:writeRequest parameters
- recipient_emailstring
- recipient_distinct_idstring
- email_subjectstring
- email_config_idstring
- messagestring
- rich_content
- tagsarray
Response
Example request
POST /api /projects /:project_id /conversations /tickets /composeExample response
Status 200 An identical compose was already handled; the existing ticket is returned.
Status 201 Ticket created.
Status 400
Status 409 An identical compose is still being created by another request.
Retrieve conversations tickets unread count
Get total unread ticket count for the team.
Returns the sum of unread_team_count for all non-resolved tickets visible to the caller. The team-wide Redis cache (30s TTL, invalidated on changes) is only used for callers without object-level ticket restrictions, since it holds one unscoped total per team - serving it to a restricted member would leak counts for tickets they can't see.
Required API key scopes
ticket:readResponse
Example request
GET /api /projects /:project_id /conversations /tickets /unread_countExample response
Status 200
List all conversations views
Required API key scopes
ticket:readQuery parameters
- limitinteger
- offsetinteger
Response
Example request
GET /api /projects /:project_id /conversations /viewsExample response
Status 200
Create conversations views
Required API key scopes
ticket:writeRequest parameters
- namestring
- filters
- is_favoritedboolean
Response
Example request
POST /api /projects /:project_id /conversations /viewsExample response
Status 201
Retrieve conversations views
Required API key scopes
ticket:readPath parameters
- short_idstring
Response
Example request
GET /api /projects /:project_id /conversations /views /:short_idExample response
Status 200
Update conversations views
Required API key scopes
ticket:writePath parameters
- short_idstring
Request parameters
- namestring
- filters
- is_favoritedboolean
Response
Example request
PATCH /api /projects /:project_id /conversations /views /:short_idExample response
Status 200
Delete conversations views
Required API key scopes
ticket:writePath parameters
- short_idstring
Example request
DELETE /api /projects /:project_id /conversations /views /:short_id