List Ticket Approval Cards
GET/api/support/agent/tickets/:ticket/approvals
Every approval card on one ticket — each version and its decision — newest version first, as a plain array (no pagination). Use it to follow how a proposal was revised: a card opened after a decline_revise names the card it revises in diff_from_id.
support:readGrant this scope to your token under Settings → Developer → Personal Access Tokens.
Path parameters
ticket(integer) — the ticket id.
Card fields (each card in data):
id(integer),ticket_id(integer),ticket_number(string, e.g.#3521)version(integer) — the card's per-ticket version, starting at 1. Send it back asexpected_versionwhen deciding.kind(string) — one of: reply, question, fix, merge, repair, status, escalate, error;kind_label(string) — e.g.Reply ready,Needs your decision,Status change,Needs a personstate(string) — one of: pending, approved, edited, declined_revise, declined_drop, taken_over, snoozed, supersededtitle(string),body(string) — what the AI agent (or an agent) is asking for, in plain textconfidence(string, nullable) — high, medium or lowpayload(object) — what the card proposes:draft_body,status_afterandcc[]on a reply card;choices[]({key, label, recommended}) andallow_texton a question card;statuson a status card.{}when the card carries nothing extra.evidence[]— {label, url (nullable), attachment_id (nullable)}, in the order given. A file attached with the card (see Open Approval Cardfiles[]) is an entry {label, attachment_id, filename, content_type, size (bytes), kind (html, image, pdf, text or file)}. Every entry that names an attachment also carriesdownload_url— the relative path of Get Approval Card File (/api/support/agent/approvals/{approval}/files/{attachment}).requested_by({id, name, is_bot}) — who opened the card;decided_by({id, name, is_bot}, nullable),decided_at(ISO-8601, nullable),decision_channel(console, email or local, nullable)reason(string, nullable) — the decider's note (required on decline_revise), or why the card was superseded (new_card)choice(string, nullable) — the choice key a question card was approved with;edited_body(string, nullable) — the reply the decider wrote on aneditconsumed_at(ISO-8601, nullable) — when the AI agent acknowledged the decision;snoozed_until(ISO-8601, nullable)diff_from_id(integer, nullable) — the earlier card on the same ticket this version revises;run_id(integer, nullable) — the AI run that produced itsla_due_at(ISO-8601, nullable) — the ticket's next SLA deadline: the first-response due date until the first response is sent, then the resolution due datenew_customer_message(boolean) — the customer wrote again after the card was opened, so it may be out of dateticket({id, number, subject, status, priority, tenant_id, requester_name, assignee_user_id}, nullable)created_at,updated_at(ISO-8601)
Authentication: Bearer token with the support:read scope, or an authenticated session, from a caller with an active support role (any role, including viewer). No tenant context — this endpoint is central.
Request
Responses
- 200
- 401
- 403
- 404
- 429
OK
Response Headers
Unauthorized
Response Headers
Forbidden
Response Headers
Not Found
Response Headers
Rate limited — platform limit is 1,000 requests/min; individual tokens may carry lower limits. Honor the Retry-After header before retrying. See the Rate Limits guide.