PATCH
/api/public/v1/tickets/{ticketId}Update a ticket
Change any field on a work item, including moving it between statuses. Send only what changes. Only the creator, the assignee, or a manager of the ticket’s project may edit a given item.
Required scope
The access token must carry this scope. A token missing it gets 403 Forbidden. Grant them to an API client under Dev Tools → API, to an assistant or CLI sign-in when you approve or edit it under Dev Tools, and to a teammate under Employee → Permissions.
projects:write
Path Parameters
| Name | Type | Required | Description |
|---|---|---|---|
ticketId | string | Required | Ticket ID. |
Request Body
| Property | Type | Description |
|---|---|---|
title | string | What the work is. |
description | string | Send null to clear it. |
status | string | Moving to DONE stamps `resolvedAt`; moving off DONE clears it again. |
priority | string | |
assigneeId | string | Send null to leave it unassigned. Whoever is named has to be on the project, and is notified. |
reporterId | string | Move who the work is credited to. There is no null — a ticket always has a reporter. |
reporterAccountId | string | Credit it to an xRM customer instead, which clears the employee. Never send both. |
milestoneId | string | Any milestone in the same project. Send null to take the ticket out of its milestone. |
dueDate | string | ISO 8601, or null to unschedule. |
labelIds | array | Replaces the whole label set — send the full list, not a delta. |
knownUpdatedAt | string | The `updatedAt` you last read. Writes still land if the record moved since (last write wins), but the response carries a `conflict` naming who changed what. |
PATCHExample request
curl
curl -X PATCH "https://www.pxb.app/api/public/v1/tickets/{ticketId}" \
-H "Authorization: Bearer your_access_token" \
-H "Content-Type: application/json" \
-d '{
"status": "IN_REVIEW",
"assigneeId": "emp_44f1"
}'200Example response
json
{
"message": "Ticket updated successfully!",
"content": {
"project": {
"id": "tkt_a1b2c3",
"key": "APOLLO-14",
"number": 14,
"title": "Ship the billing export",
"description": "CSV export of the ledger for accountants.",
"status": "IN_REVIEW",
"priority": "HIGH",
"estimate": 5,
"dueDate": "2026-09-15T08:00:00.000Z",
"isOverdue": false,
"project": {
"id": "prj_a1b2c3",
"key": "APOLLO",
"name": "Apollo billing rebuild",
"color": "violet"
},
"type": {
"id": "typ_01",
"name": "Task",
"icon": "CircleCheck",
"color": "blue"
},
"milestone": {
"id": "epc_9f8e",
"name": "Billing",
"color": "violet"
},
"goal": {
"id": "spr_22",
"number": 4,
"year": 2026,
"status": "ACTIVE"
},
"assignee": {
"employeeId": "emp_44f1",
"name": "Dana Reyes",
"email": null,
"avatarUrl": null
},
"creator": {
"employeeId": "emp_12ab",
"name": "Sam Okafor",
"email": null,
"avatarUrl": null
},
"reporter": {
"kind": "CUSTOMER",
"id": "acc_5e2f",
"name": "Priya Nair",
"email": "priya@example.com",
"avatarUrl": null
},
"labels": [
{
"id": "lbl_77",
"name": "customer-request",
"color": "amber"
}
],
"projectId": "prj_a1b2c3",
"typeId": "typ_01",
"milestoneId": "epc_9f8e",
"goalId": "spr_22",
"boardOrder": 0,
"planOrder": 0,
"subtaskCount": 2,
"commentCount": 4,
"attachmentCount": 0,
"linkCount": 1,
"createdAt": "2026-08-01T14:02:00.000Z",
"updatedAt": "2026-08-20T09:41:00.000Z",
"resolvedAt": null
},
"conflict": null
}
}403Example response
json
{
"message": "Only the assignee, the creator, or a manager of this project can change this ticket."
}In the console
The same thing done by hand, for anyone comparing the API against the screen they already use.
Projects
/projects- Open a ticket, or use the inline controls on the table row.
- Drag a card on the board to change its status.