---
title: "Get Team Tickets"
method: GET
path: "/api/psa/{team_key}/tickets"
tags: ["psa"]
---

# Get Team Tickets

`GET /api/psa/{team_key}/tickets`

## Request

- Base URL: `https://api.superit.ai` (the document declares no server; this is the origin it was published from)
- URL: `https://api.superit.ai/api/psa/{team_key}/tickets`
- Auth: HTTP bearer

## Path parameters

- `team_key` string, required

## Query parameters

- `search` string
- `status` string[]
- `analysis_state` string[]
- `ticket_specification` string[]
- `created_days` integer
- `sort_by` 'updated_at' | 'created_at' | 'source_updated_at' | 'source_created_at' | 'summary' | 'status' | 'ticket_number'
- `sort_dir` 'asc' | 'desc'
- `page` integer
- `page_size` integer

## Response `200`

Successful Response

- TicketsListResponse: Paginated list of tickets.
  - `results` TicketListItemResponse[], required
    - `key` string, required
    - `psaType` 'halo' | 'connectwise' | 'accelo' | 'autotask' | 'native', required
    - `ticketNumber` string, required
    - `summary` string, required
    - `status` string, required
    - `statusCategory` 'NEW' | 'OPEN' | 'CLOSED': Generalised PSA ticket status category. Each PsaStatus row is mapped to one of these by an admin (or by the name-pattern backfill in migration 0182). Triage rules reference categories rather than raw status names so defaults stay universal. Three buckets, deliberately. The original nine (WAITING, ESCALATED, ON_HOLD, CANCELLED, MERGED, DUPLICATE) made the one question this field exists to answer — "how many tickets are open right now" — impossible to express as a single predicate, because whether WAITING and ON_HOLD counted as open was a judgement call every caller made differently. WAITING / ESCALATED / ON_HOLD are open; CANCELLED / MERGED / DUPLICATE are closed. MERGED and DUPLICATE never had a single row in production.
    - `priority` string, nullable
    - `createdAt` string, date-time, required
    - `updatedAt` string, date-time, required
    - `sourceCreatedAt` string, date-time, nullable
    - `sourceUpdatedAt` string, date-time, nullable
    - `analysisState` 'not_analysed' | 'queued' | 'analysing' | 'analysed' | 'skipped' | 'failed', required: Ticket-level analysis state (denormalized from pipeline).
    - `analysedAt` string, date-time, nullable
    - `ticketSpecification` 'service_request' | 'incident' | 'other': Whether a ticket is a service request, an incident, or other.
    - `oneSentenceSummary` string, nullable
  - `count` integer, required
  - `totalPages` integer, required
  - `statuses` string[]

## Other responses

- `400`: Invalid input
- `401`: Not authenticated
- `403`: Forbidden
- `404`: Not found
- `405`: Method not allowed
- `409`: Conflict
- `422`: Validation Error

---

[API](https://skmtc.dev/superit/apis/super-it-api.md) - [All operations](https://skmtc.dev/superit/apis/super-it-api/llms.txt) - [OpenAPI document](https://skmtc.dev/superit/apis/super-it-api/revisions/4944d556c2bb?raw)
