A ticket: the conversation

.md

Every message of a ticket, oldest first, with the team's internal notes between them.

Scopesadmin:read
Permissionview_tickets
GET/v1/admin/tickets/{ticket}/messages

The tab Conversation of the website's Tickets screen: the trader, the team, the assistant, the lines the system adds, and the team's internal notes between them, in the order they were written. The whole thread comes at once, without pages, because a conversation is one thing to read.

Reading it marks nothing read, as on the website. Tell the server the team has seen it with mark read. New messages arrive on the ticket's channel while it is open, see listen on a websocket.

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

Request

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

Response

{
    "data": [
        {
            "object": "ticket_message",
            "id": "tmsg_w8aesu7f9p4v4akd",
            "ticket_id": "tkt_zyy8t2dwma2nprbt",
            "from": "system",
            "author": null,
            "body": "The assistant handed this conversation to the team.",
            "image_url": null,
            "image_name": null,
            "internal": false,
            "streaming": false,
            "via_email": false,
            "event": "handoff",
            "read_at": null,
            "created_at": "2026-08-18T01:27:19+00:00"
        },
        {
            "object": "ticket_message",
            "id": "tmsg_ebt6zayzphz6vras",
            "ticket_id": "tkt_zyy8t2dwma2nprbt",
            "from": "admin",
            "author": "Ios Tester",
            "body": "",
            "image_url": "/v1/admin/tickets/tkt_zyy8t2dwma2nprbt/messages/tmsg_ebt6zayzphz6vras/image",
            "image_name": "red.png",
            "internal": false,
            "streaming": false,
            "via_email": false,
            "event": null,
            "read_at": null,
            "created_at": "2026-10-15T22:20:00+00:00"
        }
    ],
    "meta": {
        "request_id": "req_01m50tw0vzfkbf76h61r45sp9w",
        "has_more": false,
        "next_cursor": null
    }
}
FieldDescription
fromtrader, admin (the team), ai (the assistant) or system
authorWho on the team wrote it, by name. Null for the trader, the assistant and the system, and for our own staff
bodyThe text. Empty for a picture sent alone
image_urlThe picture the message carries, on this API. Null without one
image_nameWhat the picture was called when it was sent
internalA note for the team. The trader never sees it
streamingNothing sets it today. An answer the assistant is still writing arrives on the ticket's channel as text_delta, and lands here once it is done
via_emailThe trader answered from their mail client, without seeing the thread
eventWhat a line of the system or a note stands for, see below. Null for an ordinary message
read_atWhen the trader read it, for what the team, the assistant and the system wrote where the trader can see it. Null until then, and always for the trader's own messages and for notes
EventWhat happened
handoffThe assistant handed the conversation to the team
ai_failure_handoffThe assistant could not answer, so the ticket went to the team
ai_commandThe team's instruction to the assistant, kept as a note. See ask the assistant
ai_command_failedThe assistant could not follow that instruction. A note, and nothing reached the trader
ai_blockedThe team blocked the assistant while it was answering, which handed the ticket over
ai_resumed_by_traderThe trader called the assistant back in with /ai
resolvedThe team resolved the ticket
idle_warningThe trader was warned that the quiet ticket is about to close
auto_closedThe quiet ticket closed itself

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