tickets:write scope. Rate limit: 30 requests / minute (see Rate limits).
Prerequisites
- API key with
tickets:write— create or update under Settings → API. - An existing ticket — get its
ticket_numberfrom Create a ticket orGET /public/v1/tickets. - HTTP client —
curl, Postman, or any server that can sendPOSTwith JSON.
Request
Send only the fields listed below. Extra fields in the JSON body return an error.
Request body
Idempotency (optional)
Add anIdempotency-Key header with any unique value you generate per real send attempt (for example a UUID) to safely retry a request — for example after a timeout — without sending the same message twice.
- First request with a key: processed normally. The response is cached for 1 hour.
- Same key, same body, within 1 hour: no new message is sent. You get back the exact same response as the first request.
- Same key, different body: rejected with a
400 IDEMPOTENCY_KEY_CONFLICTerror — reuse a key only for retries of the identical request. - No key: works exactly as described above, with no duplicate protection.
Attachments
Attach a file in three calls: request an upload URL, upload the file, then confirm it before referencing it here. See Create a ticket → Attachments for the full flow and limits.Minimal example
Reply on the ticket’s own channel:Full example
Reply sent from a named agent, with metadata:Response
201 Created — standard v1 success envelope:
author_kind is human and agent_id is the teammate’s opaque ID when you pass from_agent; without it they are system and null. GET /public/v1/tickets/:ticketNumber/messages returns the same two fields for every message (customer, human, ai_agent, workflow, auto_reply, csat_survey, imported or system), and ticket exports include them as agent_id and author_kind columns. Messages a Chatarmin marketing flow sent are workflow, sends of an AI agent excluded from analytics (such as a CSAT survey agent) are csat_survey, and business messages synced from the Chatarmin app are imported; none of them carries an agent_id.
status reflects delivery state (queued, sent, delivered, failed, …). A reply is born queued and picked up by the existing send pipeline; a note is delivered immediately since it is never sent out.
Errors
See Errors for the full catalog and
request_id usage.
Every successful request creates a new message. Use the optional
Idempotency-Key header to safely retry without duplicating it.Try it first
- In Settings → API, create a key with
tickets:write. - Create a test ticket (see Create a ticket), then send a message to it using the examples above.
- Confirm the message appears in the ticket thread with the expected channel and sender.
Related
OpenAPI reference
Interactive schema and Try it for
POST /tickets/:ticketNumber/messages.Create a ticket
Start a ticket, including its first message.
Authentication
Scopes, key rotation, and least privilege.
Rate limits
Write tier (30/min) and backoff on 429.