List and filter the ticket queue
Page the ticket queue with any combination of status, priority, source, assignee, team, customer, overdue and free-text filters.
/v1/ticketsViewer- Operation id
- list_tickets
- Access
- Any workspace role can call this.
/v1/ticketsPage the ticket queue with any combination of status, priority, source, assignee, team, customer, overdue and free-text filters.
Use this to find tickets. Ordering is priority first (urgent to low), then most recently updated, then id. That is stable enough that a paged traversal returns each ticket exactly once.
Filters combine with AND, and a filter that takes a list matches any value
in it. So status=open&status=pending&priority=urgent means "open or
pending, and urgent". overdue=false asks for the tickets that are not
overdue, not for all tickets.
total and breach_count describe the filtered set. counts and
source_counts are deliberately unfiltered, because they power filter
chips, which must show what selecting them would yield.
Page with limit and offset. limit is 1 to 500 and defaults to 50.
assignee accepts a user id or one of two sentinels: me, meaning the
calling user, and unassigned. team_id accepts a team id or none.
An unknown value in status, priority or source is a 400 naming which
one, rather than an empty result that looks like "no tickets".
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: any workspace role, including viewer. Reads are open to every member.
Access: Authorization: Bearer carrying either a realm access token or an API key. A key must hold the tickets:read scope, and the workspace role of the person who owns it must meet the floor above.
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
Query Parameters
1 <= value <= 500500 <= value <= 21474836470Response Body
application/json
application/json
application/json
application/json
curl -X GET "https://example.com/v1/tickets"{ "tickets": [ { "id": "5e8b0c31-7a4d-4f92-b6c8-1d3e2a5f7b90", "subject": "Card declined at checkout", "description": "Customer's Visa is declined on every attempt since Tuesday.", "status": "open", "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", "sla_breached": false, "sla_policy_id": "b6a0f2d7-4c19-4e63-8f52-7a1b9c0d3e46", "created_at": "2026-08-14T10:20:00+00:00", "updated_at": "2026-08-14T10:20:00+00:00", "legal_next_states": [ "closed", "on_hold", "pending", "solved", "spam" ] } ], "total": 1, "counts": { "open": 34, "pending": 12, "on_hold": 3, "solved": 208, "closed": 1174 }, "source_counts": { "email": 903, "web_widget": 402, "manual": 88, "api": 41 }, "breach_count": 0}Get one ticket with its full timeline
Everything the ticket detail view needs in one call: the ticket, its resolved assignee/customer/agent/team names, its SLA state, its own logged time and todo counts, and its comple...
Merge this ticket into another
Merge `ticket_id` (source) into `body.target_ticket_id` (winner).