---
title: "Get Team Ticket"
method: GET
path: "/api/psa/{team_key}/ticket/{ticket_key}"
tags: ["psa"]
---

# Get Team Ticket

`GET /api/psa/{team_key}/ticket/{ticket_key}`

## 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}/ticket/{ticket_key}`
- Auth: HTTP bearer

## Path parameters

- `ticket_key` string, required
- `team_key` string, required

## Response `200`

Successful Response

- PsaTicketDetailResponse: Unified ticket detail — ticket + triage + actions.
  - `ticket` PsaTicketResponse, required: Read model for PsaTicket — excludes DB internals.
    - `key` string, required
    - `teamKey` string, required
    - `psaType` 'halo' | 'connectwise' | 'accelo' | 'autotask' | 'native', required
    - `connectionId` integer, nullable
    - `entityId` string, required
    - `ticketNumber` string, required
    - `summary` string, required
    - `description` string, nullable
    - `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
    - `analysisState` 'not_analysed' | 'queued' | 'analysing' | 'analysed' | 'skipped' | 'failed', required: Ticket-level analysis state (denormalized from pipeline).
    - `analysedAt` string, date-time, nullable
    - `syncStatus` 'never' | 'pending' | 'synced' | 'error' | 'cancelled': Sync status for client/ticket sync operations.
    - `lastSyncedAt` string, date-time, nullable
    - `createdAt` string, date-time, required
    - `updatedAt` string, date-time, required
    - `sourceCreatedAt` string, date-time, nullable
    - `sourceUpdatedAt` string, date-time, nullable
    - `contentHash` string, nullable
    - `assignedUserName` string, nullable
    - `contactUserName` string, nullable
    - `contactEmail` string, nullable
    - `clientName` string, nullable
    - `cwBoardName` string, nullable
    - `haloTickettypeName` string, nullable
    - `haloCategoryNames` string[], nullable
    - `acceloTypeName` string, nullable
    - `acceloClassName` string, nullable
    - `psaFields` union
      - ConnectWisePsaFields: ConnectWise classification + leftover display fields.
        - `psaType` 'connectwise'
        - `boardName` string, nullable
        - `typeName` string, nullable
        - `subtypeName` string, nullable
        - `itemName` string, nullable
        - `sourceName` string, nullable
        - `severity` string, nullable
        - `impact` string, nullable
        - `extra` object
      - HaloPsaFields: Halo classification + leftover display fields.
        - `psaType` 'halo'
        - `ticketTypeName` string, nullable
        - `categoryNames` string[], nullable
        - `extra` object
      - AcceloPsaFields: Accelo classification + leftover display fields.
        - `psaType` 'accelo'
        - `typeName` string, nullable
        - `className` string, nullable
        - `extra` object
      - AutotaskPsaFields: Autotask classification + leftover display fields.
        - `psaType` 'autotask'
        - `queueName` string, nullable
        - `extra` object
  - `triage` TicketTriageResponse, required: Triage/analysis metadata for a ticket detail.
    - `ticketSpecification` 'service_request' | 'incident' | 'other': Whether a ticket is a service request, an incident, or other.
    - `oneSentenceSummary` string, nullable
    - `status` string, nullable
    - `category` string, nullable
    - `complexity` string, nullable
    - `skipReason` string, nullable
    - `analysisData` object, nullable
    - `analysedAt` string, date-time, nullable
    - `contentHash` string, nullable
    - `autoMode` string, nullable
    - `psaWriteStatus` string, nullable
  - `actions` PsaActionResponse[]
    - `key` string, required
    - `psaType` 'halo' | 'connectwise' | 'accelo' | 'autotask' | 'native', required
    - `entityId` string, required
    - `actionType` string, required
    - `internal` boolean
    - `createdByName` string, nullable
    - `text` string, nullable
    - `actualHours` string, nullable
    - `occurredAt` string, date-time, nullable
    - `createdAt` string, date-time, required
    - `updatedAt` string, date-time, required
  - `deepLinkUrl` string, nullable
  - `syncState` TicketSyncState: Per-ticket outbound sync state derived from TicketEvent log.
    - `status` 'synced' | 'syncing' | 'failed', required: Per-ticket outbound sync status derived from the TicketEvent log.
    - `lastSyncedAt` string, date-time, nullable
    - `lastError` string, nullable
  - `discoveryFinding` TicketDiscoveryFindingResponse: Latest discovery finding for the ticket detail (chat- or agent-written). Role-gated: all fields are elevated-only, so non-elevated roles get an empty object shape with every field set to None.
    - `confidence` string, nullable
    - `createdAt` string, date-time, nullable
    - `agentRunKey` string, nullable
    - `note` string, nullable
    - `instructedResults` string, nullable
    - `deviceHostname` string, nullable
    - `deviceOs` string, nullable
  - `allowedRerunFlows` string[]
  - `recommendedActions` RecommendedActionResponse[]
    - `key` string, required
    - `kind` string, required
    - `status` string, required
    - `payload` object, required
    - `createdAt` string, date-time, required
  - `relationships` TicketRelationshipEntry[]
    - `role` string, required
    - `relatedEntityId` string, required
    - `ticketKey` string, nullable
    - `ticketNumber` string, nullable
    - `summary` string, nullable
    - `status` string, nullable
    - `teamKey` string, nullable

## 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)
