POST
/api/public/v1/tickets

Create 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

PropertyTypeDescription
titlestringWhat the work is.
descriptionstringThe detail behind it.
statusstringDefaults to TODO. Creating straight into DONE stamps `resolvedAt`.
prioritystringDefaults to MEDIUM.
assigneeIdstringMust 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.
reporterIdstringWho 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.
reporterAccountIdstringThe 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"`.
milestoneIdstringGroup the work under a milestone.
dueDatestringISO 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.
labelIdsarrayUp 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.

Projects
/projects
  1. Open the Projects table or board.
  2. New ticket.