Agent Console
List Agent Queue Tickets
Lists tickets across every tenant for the agent console. `queue` selects which slice to return:
Get Agent Ticket
Returns one ticket for the agent console: everything a customer sees, plus the internal fields and every link (including agent-only kinds like a bug tracker reference).
Update Agent Ticket
Partially updates a ticket from the agent console — status, priority, type, visibility, group, assignee, tenant, tags, or the follow-up reminder. Only the fields present in the request are changed; each change is recorded on the ticket's timeline (see List Agent Ticket Events) and, when anything changed, the `ticket_updated` automation rules run. Changing `priority` recomputes the SLA due dates.
Assign Ticket to Me
Assigns the ticket to the calling agent. A no-op (still 200) if the ticket is already assigned to them. The response is the updated ticket. The agent view adds `group_key`, `external_ref`, `note_count`, `merged_into_ticket_id`, `sla_policy_id`, `created_by_user_id`, `sla_paused_at`, `snoozed_until` (with `is_snoozed`, true while that moment is still in the future), `follow_up_at` (the agent's own reminder, or `null`), the agent-facing `status_label`, the assignee's email, and `ai` — the latest completed triage and draft runs that are not withheld. `first_response_sla_status` and `resolution_sla_status` report the ticket's two SLA clocks: one of `on_track`, `breaching_soon` (past the policy's warning point, by default 75% of the way from creation to the due date), `breached`, `paused` (the ticket is waiting on the customer, so neither clock warns), `met` (responded / resolved before the due date). `merged_into` is `{id, number}` once the ticket has been merged into another, otherwise `null`.
Triage Agent Ticket
Takes one ticket out of the triage pile. `accept` assigns it to the caller and sets it to `open`; `decline` closes it with the reason recorded on the ticket timeline, optionally sending that reason to the customer as a public reply.
Snooze Agent Ticket
Hides a ticket from every agent queue except `snoozed` (and `all`) until a moment in the future. When that moment passes the ticket is brought back automatically and an `unsnoozed` event is recorded; an agent can also bring it back early with Unsnooze Agent Ticket. Snoozing does not change the ticket's status, assignee or SLA clocks, and the hourly automation rules leave a snoozed ticket alone.
Unsnooze Agent Ticket
Brings a snoozed ticket back into the queues now: `snoozed_until` is cleared and an `unsnoozed` event is recorded on the timeline (from the previous `snoozed_until`). Nothing else on the ticket changes. Calling this on a ticket that is not snoozed is harmless — nothing is recorded and the ticket is returned unchanged.
Merge Agent Ticket
Folds this ticket (the source) into another ticket (the target) and returns the target. Everything moves to the target and the source is closed:
Split Agent Ticket
Moves some of this ticket's messages into a brand-new ticket for the same requester and tenant, and returns the new ticket. Use it when one thread turns out to hold two separate problems.
List Agent Ticket Messages
Returns the full thread for a ticket, oldest first, including internal notes — the customer-facing List Support Ticket Messages endpoint omits those. `kind` is `public`, `note` or `system`; `via` is one of app, email, api, automation, ai, import, agent. `mentions` lists the user ids of agents @mentioned in an internal note and is empty on every other message.
Reply to Ticket as Agent
Adds a public reply as an agent, emailed to the requester and CCs. The reply stamps `first_responded_at` when it is the first agent reply, and the built-in 'Assign first responder' automation rule assigns the ticket to the replying agent when it is unassigned (a support admin can change that rule).
List Agent Ticket Events
Returns the ticket's audit timeline, oldest first. `event` is one of: created, status_changed, priority_changed, type_changed, visibility_changed, group_changed, assigned, unassigned, replied, noted, watcher_added, watcher_removed, linked, unlinked, reopened, rated, tags_changed, tenant_changed, sla_breached, sla_warning, sla_paused, sla_resumed, ai_triaged, snoozed, unsnoozed, merged, split, mentioned, follow_up_changed, notified, rule_applied. Each event carries the actor (null for system-generated events, with `actor_label` naming the automation, e.g. `ai` or a rule), the from/to values, and any extra metadata.
Add Internal Note
Adds an internal note to the ticket — never visible to the customer. Any active support role may leave a note, including viewers who cannot reply or change the ticket.
List Ticket Drafts
Lists every ticket that currently holds an unsent shared draft, most recently saved first — one call, so a queue can mark the tickets somebody is already writing on without asking ticket by ticket.
Get Ticket Draft
Returns the ticket's shared draft, or `{'data': null}` when the ticket has none.
Save Ticket Draft
Saves the ticket's one shared draft, creating it when the ticket has none. The caller becomes the holder: the draft is team property, and everyone else sees who wrote it last.
Discard Ticket Draft
Discards the ticket's shared draft — it was emptied, or the agent gave up on it. The draft is shared, so this removes it for everyone. Returns 204 with no body, and is a no-op when the ticket has no draft.
Add Ticket Link
Links the ticket to an external reference — an issue tracker item, an error tracker event, a deploy, another ticket, an internal record, or an arbitrary URL. Linking the same (kind, ref) pair again is a no-op update rather than a duplicate. Only `deploy` and `record` kinds are shown to the customer; the rest (`jira`, `sentry`, `ticket`, `url`) are agent-only.
Remove Ticket Link
Removes a link from the ticket.
Flag Ticket as Important to Customer
Flags (or unflags) a ticket as important to the tenant that raised it. The flag weights the customer-demand count behind a linked issue (see List Issue Requesters), can be filtered and sorted on in the agent queue, and every change is recorded on the ticket timeline with the agent who made it.
List Issue Requesters
Lists every ticket linked to one issue key, with the tenant and requester behind each — how much customer demand is waiting on a single piece of engineering work.
Get Ticket Customer Context
Returns who the customer behind a ticket is: the tenant (account), the requester, the people who can speak for the account, how much the account has open, its most recently touched tickets, and links out to the tenant's app and the record the ticket was raised from.
Get Customer Timeline
One customer, every ticket they raised, and a single merged history of the messages, timeline events and links on all of them — newest first. The history spans every tenant: a person who works for two accounts has one history here, matched on their user id or the requester email on the ticket. Internal notes are included and marked `internal: true`.
List Saved Views
Lists the saved queue views the caller can see: their own views plus every view a colleague shared, ordered by `position` then `name`. A saved view is a named set of agent-queue filters; to run one, send its `filters` as the query parameters of List Agent Queue Tickets. No filters or pagination.
Create Saved View
Saves a set of agent-queue filters as a named view owned by the caller. Private by default; a shared view is visible to every agent but can still only be edited by its owner.
Update Saved View
Updates a saved view. Only the owner may edit a view — a shared view belonging to a colleague is visible but read-only. Every field is optional; only the fields present are changed. When `filters` is sent it replaces the whole saved filter object.
Delete Saved View
Deletes a saved view. The owner may delete any of their views; a support admin may also delete a shared view that belongs to someone else (so a departed colleague's shared views can be tidied up). A private view owned by someone else is reported as not found.
List Agent Macros
Lists the macros the calling agent may use: every shared macro plus the caller's own private ones, sorted by name. No filters or pagination. The bodies are returned with their `{{placeholder}}` tokens still in place — call Render Agent Macro to get them filled in for a specific ticket.
Render Agent Macro
Renders a macro for one ticket as the calling agent: every `{{placeholder}}` in the macro body is replaced with the ticket's, requester's, agent's and tenant's current values. Values substituted into `body_html` are HTML-escaped; `body_text` is substituted raw. The macro's `actions` are handed back untouched — rendering changes nothing on the ticket; apply the actions (and send the reply) through the normal ticket endpoints.
List Agent Directory
Lists the support agents another agent can choose from — when assigning a ticket or @mentioning someone in an internal note. By default only active seats held by super-admin users who still exist are returned; pass `include_inactive=1` to also get revoked seats, seats whose user is no longer a super admin, and seats whose user has been deleted from sku.io — all reported with `is_active: false`, since `is_active` here means the seat can actually be assigned work (active AND super admin AND not deleted). Entries are sorted by display name, case-insensitively. No pagination.
Rerun AI Triage
Re-runs the AI triage and drafted reply for a ticket from the current thread. Each call starts a new pass and does not overwrite earlier runs; the response is the latest completed run of each kind (`triage`, `draft`) that is not withheld. A run can finish as `done`, `skipped` (a prompt-injection screen matched the ticket text and it was left for a human), `failed`, or `superseded` (a draft replaced by the regenerated one after a release) — only `done` runs are returned. Nothing here reaches the customer; a drafted reply is only sent if an agent sends it.
Record AI Feedback
Records whether an agent used an AI triage or drafted reply, for the AI draft acceptance rate shown on the dashboard (see Get Agent Dashboard Metrics).
Get Ticket AI Insights
Returns the latest AI state of a ticket in one object: the triage (classification, suggested type and priority, product area, summary, questions to ask, whether the text proves a bug), the documentation sections that may answer it, and the drafted reply with its withheld state. A drafted reply is only ever a suggestion — it reaches the customer only when an agent sends it. Compare Rerun AI Triage, which starts a new pass; this endpoint only reads.
Search Help Docs
Searches the published help documentation for sections an agent can quote or link in a reply. The agent-side twin of Get Support Deflection Suggestions: the same search, but central (no tenant context) and documentation only — it never looks at other customers' tickets.
Get Agent Dashboard Metrics
Returns the agent dashboard numbers for a trailing window: ticket volume by source/type/priority/tenant, first-response and resolution times (median and p90) with SLA attainment, backlog age buckets and current breaches, quality (reopen rate, CSAT, AI draft share / acceptance / currently withheld drafts, the median time from a bug ticket's creation to its linked release), email quarantine and bounce counts, load (active users and open tickets per active user), per-agent open-ticket counts, and a daily trend series.
Get Daily Support Metrics
Returns the per-day metrics snapshot for one slice of the support desk over a date range — the series behind the dashboard trend charts. One point per day, oldest first; days with no snapshot are simply absent (there is no zero-filling). The snapshot is written once a night, so today's point normally appears tomorrow. For the live, windowed numbers use Get Agent Dashboard Metrics.
List Agent Webhooks
Lists every outbound support webhook endpoint across every tenant, plus the global ones (`tenant_id` null) that receive every tenant's ticket events. Read-only: endpoints are registered and edited by the tenant through the customer webhook endpoints. The signing secret is never returned here.
List Agent Webhook Deliveries
Lists the delivery log of one outbound support webhook — every event that was (or is about to be) POSTed to it, with the exact body sent, how many attempts were made and what came back. Newest first by default. A delivery is tried up to 3 times (retries after 30 seconds, then 5 minutes) before it is marked `failed`; `ping` rows are the tenant's 'send test' deliveries and are tried once.
List Quarantined Inbound Mail
Lists the email quarantine: messages that reached the support intake but did not become a ticket or a reply. Newest first.
Record Support Release
Records that a build shipped, for the Jira issues named in `jira_keys`. Every ticket linked (see Add Ticket Link) to one of those issues gets a `deploy` link, an internal note announcing the release (with your `notes` appended), and — if it is still unresolved and not already awaiting release — moves to `awaiting_release`. Any AI drafted reply that was withheld for 'awaiting deploy' on those tickets is released, and the agents are alerted that the fix shipped so the next step is to reply and resolve. Nothing customer-facing is sent by this call. Tickets with no matching link are left untouched; duplicate keys are ignored.