A ticket

.md

One support ticket, with everything above the tabs of the website and what this person may do with it.

Scopesadmin:read
Permissionview_tickets
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, the trader and 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.

Reading it marks nothing read. That is mark read.

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

Request

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

Response

{
    "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": "[email protected]",
            "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, and:

FieldDescription
last_trader_message_atWhen the trader last wrote
last_admin_message_atWhen the team last answered the trader. Null until it has. The first answer switches the assistant off and takes a ticket nobody holds
closed_byWho resolved or closed it, by name. Null while it is open, when it closed itself, and for our own staff
idle_warning_sent_atWhen the trader was warned that the quiet ticket is about to close. Any new message clears it
trader.is_activeFalse for a trader who cannot sign in
trader.on_teamThe trader is also on the team
trader.onlineSeen in the last two minutes
trader.last_seen_atWhen the trader was last active anywhere on the platform
assignee.meYou hold the ticket
countsThe 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)
tabsconversation and trader, and activity with view_activity_logs
can.manageMay answer, assign, tag, rename, change the priority, block the assistant, resolve, close, and open a ticket with a trader (manage_tickets)
can.aiMay ask the assistant for a reply: manage, and the firm has not switched the assistant off for its team
can.teamsMay change support teams (manage_support_settings)
can.traders, can.accounts, can.payouts, can.fraud, can.activityMay open the trader, their accounts, payouts, fraud flags and the activity log on the website, each with its own view_ permission. The trader tab leaves out what this person may not see
channelThe ticket's own channel, which the trader listens on too

Errors

StatusCodeMeaning
400workspace_requiredAsked by our own staff without naming a firm
401invalid_tokenNot a token, or the secret does not match
401revoked_tokenSigned out here or from another device
401expired_tokenNinety days without use, or a set expiry passed
403admin_access_requiredThis account no longer helps run the environment
403insufficient_scopeThis device does not hold admin:read
403workspace_not_permittedThe Propper-Workspace header names an environment this account cannot act in
403forbiddenWithout view_tickets
404resource_not_foundNo ticket with that id in this firm