API Reference
Conversations Endpoint
List messages and send replies on a ticket.
List messages
GET /tickets/:id/messagesScopes required: messages:read
Returns every message in the ticket's conversation, ordered by creation time.
Response:
{
"messages": [
{
"id": "msg_01abc...",
"direction": "inbound",
"channel": "email",
"subject": "Where's my order?",
"fromAddress": "jane@example.com",
"fromName": "Jane Smith",
"toAddresses": ["support@yourcompany.com"],
"ccAddresses": [],
"bodyText": "Hi, my order hasn't arrived yet.",
"bodyHtml": null,
"bodyTextCleaned": "Hi, my order hasn't arrived yet.",
"externalId": "<msg@mail.example.com>",
"inReplyTo": null,
"authorType": "customer",
"authorId": "cust_01abc...",
"authorName": "Jane Smith",
"conversationId": "conv_01abc...",
"aiSentiment": "neutral",
"detectedLanguage": "en",
"createdAt": "2026-04-22T10:30:00Z"
}
],
"total": 1
}Selected message fields:
| Field | Description |
|---|---|
direction | inbound (from customer) or outbound (from operator or AI) |
channel | How the message entered: email or chat |
fromAddress / fromName | Sender's email and display name |
toAddresses / ccAddresses | Recipient lists, same semantics as email |
bodyText | Plain-text body as originally received or sent |
bodyTextCleaned | Inbound-only — body with quoted-reply chains and signatures stripped. Null on outbound messages |
authorType | customer, user (operator), or agent (AI/system) |
aiSentiment | positive, neutral, negative, or frustrated — set on inbound messages when auto-triage is enabled |
detectedLanguage | ISO 639-1 code (e.g. en, es) — null if detection hasn't run |
Send a reply
POST /tickets/:id/messagesScopes required: messages:send
Sends an outbound reply to the customer from a monitored inbox address. The reply is threaded into the ticket's conversation and dispatched via the normal outbound pipeline (DKIM/SPF, signature, AI attribution if applicable).
Request body:
{
"fromAddress": "support@yourcompany.com",
"bodyText": "Thanks for reaching out! Your order ships tomorrow.",
"userId": "user_01abc..."
}| Field | Type | Required | Description |
|---|---|---|---|
fromAddress | string | yes | A monitored inbox on a verified domain — typically the one the ticket came in on |
bodyText | string | yes | Plain-text reply body |
userId | string | yes | The operator the reply should be attributed to |
bodyHtml | string | no | Optional HTML body |
subject | string | no | Defaults to Re: <ticket subject> |
ccAddresses | string[] | no | Additional recipients |
Response (201):
{
"message": {
"id": "msg_01def...",
"direction": "outbound",
"bodyText": "Thanks for reaching out! ...",
"...": "other message fields as above"
}
}Every message posted to this endpoint is sent to the customer. Internal notes (team-only comments that never leave Ticket0) are a separate resource and are not currently exposed on the public v1 API — you can only create them through the app UI.