Projects
The Projects API provides CRUD access to projects, plus ancillary actions for assigning team members and setting a manager.New to the API? Start with Getting started (base URL, response envelope, errors, pagination) and Authentication (API keys). Those conventions apply to every endpoint below and are not repeated here.
Identifier note: projects are addressed by their numericproject_id. Wherever{id}appears below it is theproject_id.
The project object
All endpoints that return a project use this shape:| Field | Type | Notes |
|---|---|---|
id | integer | Project id. Used in all URLs. |
title | string | Project title. |
description | string|null | Project description. |
reference | string|null | Optional external reference. |
status | string | not_started, in_progress, on_hold, cancelled, completed. |
active_state | string | active or archive. |
progress | integer | Completion percentage (0–100). |
progress_manually | string | yes if progress is set manually, otherwise no. |
client | object | { id, name }. |
category | object | { id, name }. |
dates | object | start, due, created, updated. |
billing | object | type (hourly|fixed), rate, estimated_hours, costs_estimate. |
permissions | object | Client/assignee permission flags (yes|no). |
assigned | array | Assigned team members [{ id, name }] — set via the assign action. |
managers | array | Project manager(s) [{ id, name }] — set via the manager action. |
tags | array | Tag titles. |
List / search projects
Query parameters
| Parameter | Type | Description |
|---|---|---|
status | string | Filter by project status. |
client_id | integer | Filter by client id. |
category_id | integer | Filter by category id. |
search | string | Free-text search on the project title. |
sort | string | project_title, project_status, project_date_start, project_date_due, project_created, project_progress. |
order | string | asc or desc (default desc). |
limit | integer | Results per page (max 100). |
page | integer | Page number. |
Example request
Example response — 200 OK
Get a project
{id} is the project’s id.
Example request
200) with message “Project retrieved successfully.”
Create a project
Body parameters
| Parameter | Type | Required | Notes |
|---|---|---|---|
project_clientid | integer | yes | Must be an existing client id. |
project_creatorid | integer | no | Existing user id to attribute the project to. Defaults to the main administrator. |
project_title | string | yes | |
project_date_start | date | yes | YYYY-MM-DD. |
project_date_due | date | no | Must be on/after the start date. |
project_categoryid | integer | yes | Must be an existing category id. |
project_description | string | no | |
project_billing_type | string | no | hourly or fixed. |
project_billing_rate | numeric | no | |
project_billing_estimated_hours | numeric | no | |
project_billing_costs_estimate | numeric | no | |
project_progress_manually | string | no | on to enable manual progress. |
clientperm_tasks_view | string | no | on to enable. |
clientperm_tasks_collaborate | string | no | on to enable. |
clientperm_tasks_create | string | no | on to enable. |
clientperm_timesheets_view | string | no | on to enable. |
clientperm_expenses_view | string | no | on to enable. |
assignedperm_tasks_collaborate | string | no | on to enable. |
Example request
Example response — 201 Created
Update a project
{id} is the project’s id. Same body parameters as Create, except
project_clientid cannot be changed. Assignment is managed via the assign/manager
actions, not here.
Example request
Example response — 200 OK
Delete a project
Example request
Example response — 200 OK
Assign team members
assigned array is the full set — it
replaces any existing assignment. Send an empty array to clear all assignees.
Body parameters
| Parameter | Type | Required | Notes |
|---|---|---|---|
assigned | array of integers | yes | Team user ids. Empty array clears all. |
Example request
Example response — 200 OK
Set the manager
Body parameters
| Parameter | Type | Required | Notes |
|---|---|---|---|
manager | integer|null | yes | Team user id, or empty/null to remove the manager. |
Example request
Example response — 200 OK
Change status
| Parameter | Type | Required | Notes |
|---|---|---|---|
status | string | yes | not_started, in_progress, on_hold, cancelled, completed. |
200) with message “Project status updated successfully.”
Update progress
| Parameter | Type | Required | Notes |
|---|---|---|---|
progress | integer | yes | 0–100. |
Set tags
tags array is the full set — it replaces existing tags;
an empty array clears them.
| Parameter | Type | Required | Notes |
|---|---|---|---|
tags | array of strings | yes | Tag titles. Empty array clears all. |
Archive / restore
archive sets active_state to archived; restore sets it back to active.
Stop timers
{ "data": { "id": "..." }, "message": ... }.
Clone a project
| Parameter | Type | Required | Notes |
|---|---|---|---|
project_title | string | yes | Title of the new project. |
project_clientid | integer | no | Defaults to the source project’s client. |
project_categoryid | integer | no | Defaults to the source project’s category. |
project_date_start | date | no | Defaults to the source project’s start date. |
project_date_due | date | no | Defaults to the source project’s due date. |
copy_milestones | string | no | on to copy milestones. |
copy_tasks | string | no | on to copy tasks. |
copy_tasks_files | string | no | on to copy task files. |
copy_tasks_checklist | string | no | on to copy task checklists. |
copy_invoices | string | no | on to copy invoices. |
copy_estimates | string | no | on to copy estimates. |
copy_files | string | no | on to copy project files. |
201) with message “Project cloned successfully.”
Errors
See Getting started for the shared error format. Project-specific:| Status | Meaning |
|---|---|
404 Not Found | The project id does not exist. |
422 Unprocessable Entity | Validation failed (see below). |