POST
/api/public/v1/projectsCreate a project
The first project a company creates also seeds its default ticket type. In the console, whoever creates a project becomes its first manager; a project created through the API has no members until somebody is added to it.
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:admin
Request Body
| Property | Type | Description |
|---|---|---|
name | string | What the project is. |
key | string | Uppercase, 2-10 characters, starting with a letter. Prefixes every ticket id in the project (APOLLO-14) and cannot be changed afterwards. |
color | string | A palette key — blue, purple, green, orange, red, amber, indigo, gray. |
description | string | What it is for. |
managerId | string | Somebody to manage it alongside its creator, who always gets the role. Writes a project membership and nothing else. Must be an active employee of this company. |
startDate | string | ISO 8601. |
targetDate | string | ISO 8601. |
POSTExample request
curl
curl -X POST "https://www.pxb.app/api/public/v1/projects" \
-H "Authorization: Bearer your_access_token" \
-H "Content-Type: application/json" \
-d '{
"name": "Apollo billing rebuild",
"key": "APOLLO",
"color": "violet"
}'200Example response
json
{
"message": "Project created successfully!",
"content": {
"project": {
"id": "prj_a1b2c3",
"key": "APOLLO",
"name": "Apollo billing rebuild",
"description": "Everything that has to land before invoicing moves over.",
"color": "violet",
"icon": null,
"status": "ACTIVE",
"startDate": "2026-07-01T12:00:00.000Z",
"targetDate": "2026-12-31T12:00:00.000Z",
"creator": {
"employeeId": "emp_12ab",
"name": "Sam Okafor",
"email": null,
"avatarUrl": null
},
"ticketCount": 24,
"milestoneCount": 3,
"goalCount": 5,
"createdAt": "2026-06-02T10:00:00.000Z",
"updatedAt": "2026-08-20T09:41:00.000Z"
}
}
}400Example response
In the console
The same thing done by hand, for anyone comparing the API against the screen they already use.