Skip to content

Project

Allowed query parameters

Filters

FilterTypeDescription
searchStringFull-text search
ownBooleanShow only own projects (as project leader)
involvedBooleanShow only projects where user is involved
assignedBooleanShow only projects assigned to the current user
contactIdFilter by Contact Id
is_archivedBooleanShow archived projects (completed)
is_internalBooleanShow only projects without billing
with_billable_costsBooleanShow only projects with billable costs
companyIdFilter by Company Id
billing_typeStringFilter by billing type (flat, hourly)
statusStringFilter by status (active, completed)
custom_fieldKey,StringFilter by Custom Field (eg. my_internal_id,42)

Sorting

name, created_at, starts_at, company, budget_used, billable_costs, last_time_tracked

Includes

company.media, owner.user, times.rate, unbilledTimes.rate, offers, approvedOffers, expenses, invoices, rates, timesCount, offersCount, invoicesCount, expensesCount, overdueInvoicesCount, assignedMembers.user.media

Create a project

post
/project
Attribute (* required)TypeDescription
name *StringProject title
descriptionStringProject description
company_id *StringA Company Id
member_id *StringA Member Id
starts_at *DateStart date
billing_typeStringBilling type (flat, hourly)
costs_limitNumberCost limit for the project (minimum: 0)
assigned_member_idsArrayArray of Member IDs assigned to the project
statusStringStatus of project (active, completed, default: active)
custom_fieldsObject?Custom data as Custom Fields

Example response

json
// HTTP 201 Created
{
    // a project object
}

Update a project

put
/project/{id}
Attribute (* required)TypeDescription
nameStringProject title
descriptionStringProject description
company_idStringA Company Id
member_idStringA Member Id
starts_atDateStart date
billing_typeStringBilling type (flat, hourly)
costs_limitNumberCost limit for the project (minimum: 0)
assigned_member_idsArrayArray of Member IDs assigned to the project
statusStringStatus of project (active, completed)
custom_fieldsObject?Custom data as Custom Fields

Example response

json
// HTTP 200 OK
{
    // a project object
}

Retrieve a project

get
/project/{id}

Example response

json
// HTTP 200 OK
{
    "id": "EO6YGvqMRV",
    "name": "CMS Upgrade",
    "description": null,
    "starts_at": "2022-02-09T08:52:00.000000Z",
    "due_at": null,
    "billing_type": "flat",
    "company_id": "PQYLdqm4wR",
    "company": {
        // a company object
    },
    "owner": {
        // a member object
    },
    "involved_members": [
        // an array of member objects with user data
    ],
    "assigned_members": [
        // an array of assigned member objects
    ],
    "assigned_member_ids": [1, 2, 3],
    "times": [
        // an array of time objects
    ],
    "invoices": [
        // an array of invoice objects
    ],
    "expenses": [
        // an array of expense objects
    ],
    "times_count": 45,
    "invoices_count": 3,
    "expenses_count": 12,
    "status": "active",
    "is_archived": false,
    "is_ongoing": true,
    "is_internal": false,
    "costs_limit": 5000.0,
    "custom_fields": {},
    "created_at": "2021-12-09T09:05:28.000000Z",
    "updated_at": "2022-02-09T08:52:00.000000Z"
}

Delete a project

delete
/project/{id}

Example response

json
// HTTP 204 No Content

List projects

get
/project

The list endpoint accepts the same parameters as in Retrieve a project and returns a paginated array of the same project object in the data property.

Read more about Pagination, Filtering, Sorting and Includes on the Introduction page.

Merge a project

post
/project/{id}/merge

Merges a project into another active, top-level project of the same company. All related resources — offers, invoices, times, expenses, media and assigned members — are moved from the source project into the target project. The source project is then archived (status set to completed).

Required Permission

This endpoint requires the supervise project permission. Users without it receive a 403 Forbidden response.

The target must be a top-level project — a sub-project can never be a merge target.

Attribute (* required)TypeDescription
target_project_id *StringA Project Id to merge into. Must be an active, top-level project of the same company (a sub-project cannot be a target)
move_sub_projectsBooleanRe-parent the source's sub-projects under the target. If omitted or false, the sub-projects are archived together with the source project (default: false)

Example request

json
{
    "target_project_id": "PQYLdqm4wR",
    "move_sub_projects": true
}

Example response

The target project is returned.

json
// HTTP 200 OK
{
    // a project object
}