POST
/api/public/v1/ticketsCreate a ticket
File a piece of work. There is one level of ticket: a breakdown is a checklist on the record (`subtaskCount`), not more tickets.
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
Request Body
| Property | Type | Description |
|---|---|---|
title | string | What the work is. |
description | string | The detail behind it. |
status | string | Defaults to TODO. Creating straight into DONE stamps `resolvedAt`. |
priority | string | Defaults to MEDIUM. |
assigneeId | string | Must be an active employee of this company, and on the project — an assignee who cannot open the ticket is a ticket nobody is really holding. Assigning notifies them. |
reporterId | string | Who reported the work. Defaults to whoever is filing it. Any active employee of the company — unlike the assignee, they do not have to be on the project, because the person to follow up with often is not. |
reporterAccountId | string | The xRM customer who reported it, instead of an employee — never both. Needs `customers:read` on that customer’s location. The response reads it back as `reporter.kind: "CUSTOMER"`. |
milestoneId | string | Group the work under a milestone. |
dueDate | string | ISO 8601. Shows on the assignee’s calendar as an 8:00am marker in their own timezone. It marks the day; it does not hold the time. |
labelIds | array | Up to 20. Ids that are not this company’s are dropped, not rejected. |
POSTExample request
curl
curl -X POST "https://www.pxb.app/api/public/v1/tickets" \
-H "Authorization: Bearer your_access_token" \
-H "Content-Type: application/json" \
-d '{
"title": "Ship the billing export",
"priority": "HIGH",
"assigneeId": "emp_44f1",
"dueDate": "2026-09-15T08:00:00.000Z"
}'200Example response
json
{
"message": "Ticket created successfully!",
"content": {
"ticket": {
"id": "tkt_a1b2c3",
"key": "APOLLO-14",
"number": 14,
"title": "Ship the billing export",
"description": "CSV export of the ledger for accountants.",
"status": "PLANNING",
"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
}
}
}400Example response
In the console
The same thing done by hand, for anyone comparing the API against the screen they already use.