/api/public/v1/tickets/{ticketId}/commentsList comments on a ticket
The discussion on one work item, oldest first. Mentions appear inline in `body` as `<@employeeId>`, with the same ids repeated in `mentionedEmployeeIds` so you need not parse the text. Files posted with a comment come back under `attachments`, each with a short-lived signed `url` — read it now rather than storing it; the same files are listed on the ticket. `reactions` is the emoji people have put on each comment, already grouped — one entry per emoji with everybody who picked it, and `mine` saying whether the authenticated caller is one of them.
Required scope
The access token must carry this scope. A token missing it gets 403 Forbidden. Grant them to an API client under Settings → Company → API, and to a teammate under Employee → Permissions.
Path Parameters
| Name | Type | Required | Description |
|---|---|---|---|
ticketId | string | Required | Ticket ID. |
curl -X GET "https://www.pxb.app/api/public/v1/tickets/{ticketId}/comments" \
-H "Authorization: Bearer your_access_token"{
"message": "Comments retrieved successfully!",
"content": {
"comments": [
{
"id": "cmt_88aa",
"body": "Blocked on the tax categories — <@emp_44f1> can you confirm?",
"mentionedEmployeeIds": [
"emp_44f1"
],
"author": {
"employeeId": "emp_12ab",
"name": "Sam Okafor",
"email": null,
"avatarUrl": null
},
"attachments": [
{
"id": "att_31cd",
"fileName": "tax-categories.png",
"mimeType": "image/png",
"sizeBytes": 184320,
"url": "https://storage.pixelbase.co/priv/…"
}
],
"reactions": [
{
"emoji": "👍",
"count": 2,
"mine": false,
"employeeIds": [
"emp_44f1",
"emp_90de"
]
}
],
"canDelete": true,
"createdAt": "2026-08-20T09:41:00.000Z",
"updatedAt": "2026-08-20T09:41:00.000Z"
}
]
}
}In the console
The same thing done by hand, for anyone comparing the API against the screen they already use.