AuralisDocs
OperationsTickets

Post a reply or an internal note

Append a customer-facing reply or an internal note to the timeline, optionally moving the ticket's status in the same call.

/v1/tickets/{ticket_id}/eventsEditor
Operation id
add_event
Access
A viewer is refused.
POST/v1/tickets/{ticket_id}/events

Append a customer-facing reply or an internal note to the timeline, optionally moving the ticket's status in the same call.

Use this to answer a customer. kind is reply, which is customer facing, or internal_note, which is not.

The first reply stamps first_responded_at, which stops the first-response SLA timer, and moves an open ticket to pending.

One call can write several timeline entries. A reply sent with apply_status: "solved" writes the reply, a status change, and, the first time a ticket is solved, a CSAT request. Expect three entries from one request, and do not treat the extra ones as duplicates.

An apply_status naming the status the ticket already holds is treated as a no-op rather than refused. The reply is what matters and is never discarded, so nothing is written for the status and no event is emitted for it.

A reply is also handed to the ticket's channel for delivery, which matters on email. The outcome is recorded on the event as meta.delivery rather than raised, so a reply that was not delivered still returns 201 and is still on the timeline. Read meta.delivery to know what happened: a workspace or a channel that cannot send reads as skipped, and the reply is kept either way. An internal_note is never delivered anywhere.

A terminal ticket refuses new events outright. Reopen it first.

The response is the full ticket detail, including the events this call just added.

Tenancy: the request is scoped to one workspace, and the credential presented is what selects it. A caller with no membership in that workspace is refused with 404, which is indistinguishable from a workspace that does not exist.

Authorisation: editor, admin or owner. A viewer receives 403 insufficient_role.

Access: Authorization: Bearer carrying either a realm access token or an API key. A key must hold the tickets:write scope, and the workspace role of the person who owns it must meet the floor above.

Authorization

AuthorizationBearer <token>

A realm-issued access token, presented as Authorization: Bearer <token>. It acts as the person who signed in, and every operation resolves their workspace role live from the membership record.

In: header

Path Parameters

ticket_id*Ticket Id
Formatuuid

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

application/json

application/json

curl -X POST "https://example.com/v1/tickets/497f6eca-6276-4993-bfeb-53cbbbba6f08/events" \  -H "Content-Type: application/json" \  -d '{    "kind": "reply",    "body": "We have refunded the duplicate charge; it should clear in 3 days.",    "apply_status": "solved"  }'
{  "id": "5e8b0c31-7a4d-4f92-b6c8-1d3e2a5f7b90",  "subject": "Card declined at checkout",  "description": "Customer's Visa is declined on every attempt since Tuesday.",  "status": "solved",  "priority": "high",  "source": "email",  "assignee_id": "3fe98b76-2409-5003-b75a-93e56b450433",  "assignee_name": "Dana Osei",  "customer_id": "9f1d6c4e-6b6e-4b31-9a5b-2f1c9a4d5e60",  "customer_name": "Sam Okafor",  "customer_email": "sam.okafor@northwind.example",  "team_id": "d907a188-148a-5522-82a6-55798ccdecb6",  "team_name": "Billing",  "tags": [    "billing",    "vip"  ],  "metadata": {    "order_id": "A-1042"  },  "first_response_due": "2026-08-14T12:20:00+00:00",  "resolution_due": "2026-08-15T10:20:00+00:00",  "first_responded_at": "2026-08-14T11:12:03+00:00",  "sla_breached": false,  "sla_policy_id": "b6a0f2d7-4c19-4e63-8f52-7a1b9c0d3e46",  "csat_requested_at": "2026-08-14T11:12:03+00:00",  "created_at": "2026-08-14T10:20:00+00:00",  "updated_at": "2026-08-14T11:12:03+00:00",  "solved_at": "2026-08-14T11:12:03+00:00",  "legal_next_states": [],  "assignee_email": "dana.osei@northwind.example",  "time_total_minutes": 25,  "time_billable_minutes": 25,  "todo_counts": {    "open": 1,    "done": 2,    "overdue": 0  },  "events": [    {      "id": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",      "kind": "inbound_email",      "body": "My card is declined every time I try to pay.",      "meta": {        "channel": "email",        "external_id": "0100019180a4c1f2"      },      "actor_type": "customer",      "created_at": "2026-08-14T10:20:00+00:00"    },    {      "id": "f0e9d8c7-b6a5-4948-9382-71605f4e3d2c",      "kind": "internal_note",      "body": "Payment provider is returning a soft decline on this BIN.",      "meta": {},      "actor_user_id": "3fe98b76-2409-5003-b75a-93e56b450433",      "actor_type": "user",      "actor_name": "Dana Osei",      "created_at": "2026-08-14T10:41:12+00:00"    },    {      "id": "2b7c9d10-4e5f-4a6b-8c7d-9e0f1a2b3c4d",      "kind": "reply",      "body": "We have refunded the duplicate charge; it should clear in 3 days.",      "meta": {},      "actor_user_id": "3fe98b76-2409-5003-b75a-93e56b450433",      "actor_type": "user",      "actor_name": "Dana Osei",      "created_at": "2026-08-14T11:12:03+00:00"    },    {      "id": "3c8d0e21-5f60-4b7c-9d8e-0f1a2b3c4d5e",      "kind": "status_change",      "meta": {        "from": "open",        "to": "solved",        "via": "reply_apply"      },      "actor_user_id": "3fe98b76-2409-5003-b75a-93e56b450433",      "actor_type": "user",      "actor_name": "Dana Osei",      "created_at": "2026-08-14T11:12:03+00:00"    },    {      "id": "4d9e1f32-6a71-4c8d-8e9f-1a2b3c4d5e6f",      "kind": "csat_request",      "meta": {},      "actor_user_id": "3fe98b76-2409-5003-b75a-93e56b450433",      "actor_type": "system",      "created_at": "2026-08-14T11:12:03+00:00"    }  ]}