:::endpoint GET /v1/admin/tickets/{ticket}

One ticket: what it is about, who asked, where it stands, and who on the team
holds it. The head of the inspector on the website's Tickets screen, which
stays the same whichever tab is open below it. The tabs themselves are
[the conversation](/docs/api/admin/ticket-messages),
[the trader](/docs/api/admin/ticket-trader) and
[activity](/docs/api/admin/ticket-activity).

`tabs` says which tabs of the website this person may open, and `can` what
they may do, both worked out on the server, so a client never rebuilds the
permission rules. Every change to a ticket answers with this same object as
it is afterwards.

`channel` is where the conversation hears what the trader can see happen,
while it is open. See [listen on a websocket](/docs/api/apps/realtime#the-ticket-channels).

Reading it marks nothing read. That is [mark read](/docs/api/admin/ticket-read).

Needs a firm. Our own staff name one with the `Propper-Workspace` header.

## Request

```bash
curl "https://api.proppertrading.com/v1/admin/tickets/tkt_ftks2g7ewh6t5psv" \
  -H "Authorization: Bearer ptat_9f2c1a44_3b8e7d2f5c9a1b4e6d8f0a2c4e6b8d1f" \
  -H "Propper-Workspace: acme"
```

## Response

```json
{
    "data": {
        "object": "ticket",
        "id": "tkt_ftks2g7ewh6t5psv",
        "number": "#6T5PSV",
        "subject": "Spread widened during news",
        "status": "open",
        "priority": "normal",
        "ai_enabled": true,
        "ai_blocked": false,
        "created_at": "2026-08-21T21:23:19+00:00",
        "last_message_at": "2026-08-21T23:46:19+00:00",
        "last_trader_message_at": "2026-08-21T23:46:19+00:00",
        "last_admin_message_at": null,
        "closed_at": null,
        "closed_by": null,
        "idle_warning_sent_at": null,
        "trader": {
            "id": "usr_qdfy8c9x65wurwym",
            "name": "Kelli Konopelski",
            "email": "johnson.ryan@example.net",
            "avatar_url": null,
            "is_active": true,
            "deleted": false,
            "on_team": false,
            "online": false,
            "last_seen_at": null
        },
        "assignee": null,
        "team": null,
        "tags": [
            {
                "id": "ttag_6fjgbatb6fxzafc8",
                "name": "Payout",
                "color": "emerald"
            },
            {
                "id": "ttag_bvumknnax5q6kbwd",
                "name": "Platform",
                "color": "blue"
            }
        ],
        "counts": {
            "messages": 3,
            "notes": 0,
            "unread": 0,
            "tickets": 1,
            "payouts": 0
        },
        "tabs": [
            "conversation",
            "trader",
            "activity"
        ],
        "can": {
            "manage": true,
            "teams": true,
            "traders": true,
            "accounts": true,
            "payouts": true,
            "fraud": true,
            "activity": true,
            "ai": true
        },
        "channel": "private-ticket.tkt_ftks2g7ewh6t5psv",
        "action_url": "/admin/tickets/tkt_ftks2g7ewh6t5psv"
    },
    "meta": {
        "request_id": "req_01m50tv35kgez2hgyb53w3305m"
    }
}
```

The fields of the [list](/docs/api/admin/tickets), and:

| Field                    | Description |
| ------------------------ | ----------- |
| `last_trader_message_at` | When the trader last wrote |
| `last_admin_message_at`  | When the team last answered the trader. Null until it has. The first answer switches the assistant off and takes a ticket nobody holds |
| `closed_by`              | Who resolved or closed it, by name. Null while it is open, when it closed itself, and for our own staff |
| `idle_warning_sent_at`   | When the trader was warned that the quiet ticket is about to close. Any new message clears it |
| `trader.is_active`       | False for a trader who cannot sign in |
| `trader.on_team`         | The trader is also on the team |
| `trader.online`          | Seen in the last two minutes |
| `trader.last_seen_at`    | When the trader was last active anywhere on the platform |
| `assignee.me`            | You hold the ticket |
| `counts`                 | The `messages` the trader can see, the team's `notes`, what the team has not read (`unread`), every ticket of the trader including this one (`tickets`), and the payouts linked to it (`payouts`, null without `view_payouts`) |
| `tabs`                   | `conversation` and `trader`, and `activity` with `view_activity_logs` |
| `can.manage`             | May answer, assign, tag, rename, change the priority, block the assistant, resolve, close, and open a ticket with a trader (`manage_tickets`) |
| `can.ai`                 | May [ask the assistant](/docs/api/admin/ticket-ai) for a reply: `manage`, and the firm has not switched the assistant off for its team |
| `can.teams`              | May change [support teams](/docs/api/admin/support-teams) (`manage_support_settings`) |
| `can.traders`, `can.accounts`, `can.payouts`, `can.fraud`, `can.activity` | May open the trader, their accounts, payouts, fraud flags and the activity log on the website, each with its own `view_` permission. The [trader tab](/docs/api/admin/ticket-trader) leaves out what this person may not see |
| `channel`                | The ticket's own channel, which the trader listens on too |

## Errors

| Status | Code                      | Meaning                                                                         |
| ------ | ------------------------- | ------------------------------------------------------------------------------- |
| 400    | `workspace_required`      | Asked by our own staff without naming a firm                                    |
| 401    | `invalid_token`           | Not a token, or the secret does not match                                       |
| 401    | `revoked_token`           | Signed out here or from another device                                          |
| 401    | `expired_token`           | Ninety days without use, or a set expiry passed                                 |
| 403    | `admin_access_required`   | This account no longer helps run the environment                                |
| 403    | `insufficient_scope`      | This device does not hold `admin:read`                                          |
| 403    | `workspace_not_permitted` | The `Propper-Workspace` header names an environment this account cannot act in |
| 403    | `forbidden`               | Without `view_tickets`                                                          |
| 404    | `resource_not_found`      | No ticket with that id in this firm                                             |