# List all projects No specific scope required. Endpoint: GET /projects Version: v1 Security: http, oauth2 ## Query parameters: - `sort` (string) Available sorts are shortcode, title, updated_at, created_at, computed_fields..You can sort by multiple options by separating them with a comma. To sort in descending order, use - sign in front of the sort, for example: -title. Example: "sort=-created_at,title" - `include` (string) Available includes are team, guests, tags, client, client.primary_contact. You can include multiple options by separating them with a comma. - `page[size]` (integer) The number of results that will be returned per page. - `page[cursor]` (string) The cursor to start the pagination from. - `filter` (string) Allowed filter fields (with allowed operators): | Field | Type | Operators | |------|------|-----------| | shortcode | string | in, nin, notin, eq, ne, neq, contains, like, startswith, endswith, isnull, isnotnull, notnull | | title | string | in, nin, notin, eq, ne, neq, contains, like, startswith, endswith, isnull, isnotnull, notnull | | status | enum:running, closed | eq, ne, neq, in, nin, notin, isnull, isnotnull, notnull | | is_acquisition | boolean | eq, ne, neq | | client.id | id | eq, ne, neq, in, nin, notin, isnull, isnotnull, notnull | | client.name | string | in, nin, notin, eq, ne, neq, contains, like, startswith, endswith, isnull, isnotnull, notnull | | client.shortcode | string | in, nin, notin, eq, ne, neq, contains, like, startswith, endswith, isnull, isnotnull, notnull | | client.primary_contact_id | id | eq, ne, neq, in, nin, notin, isnull, isnotnull, notnull | | project_type.title | string | in, nin, notin, eq, ne, neq, contains, like, startswith, endswith, isnull, isnotnull, notnull | | project_type.id | id | eq, ne, neq, in, nin, notin, isnull, isnotnull, notnull | | created_by | id | eq, ne, neq, in, nin, notin, isnull, isnotnull, notnull | | created_at | datetime | eq, ne, neq, lt, lte, le, gt, gte, ge, in, nin, notin, isnull, isnotnull, notnull | | start_date | date | eq, ne, neq, lt, lte, le, gt, gte, ge, in, nin, notin, isnull, isnotnull, notnull | | end_date | date | eq, ne, neq, lt, lte, le, gt, gte, ge, in, nin, notin, isnull, isnotnull, notnull | | tags | Relation - title (string) | any, none, count, all | | team | Relation - id (id) - email (string) - space.id (id) - space.name (string) - added_at (datetime) | any, none, count, all | | guests | Relation - id (id) - email (string) - added_at (datetime) | any, none, count, all | | tasks | Relation - uri (string) - title (string) - parent_task.id (id) - assignee.id (id) - assignee.email (string) - status (enum) | any, none, count, all | Filtering expression. Accepts either JSON (array/tree of conditions) or a readable string DSL. You can check the full syntax at Docs Filtering section. Special values: - me.id — current authenticated user id (usable on fields of type id). Example: id eq me.id - now — current date-time. Example: dueOn lt now - sow/eow — start/end of week. Examples: dueOn gt sow, dueOn lt eow - som/eom — start/end of month. Examples: dueOn gt som, dueOn lt eom - today — special date for today; with eq it expands to the whole day range. Example: dueOn eq today - today±Nd — relative day offset. Examples: today-30d, today+5d. Example: "title contains \"Acme\" and (created_at >= \"2024-01-01\" or client.name contains \"Corp\")" - `computed_fields[alias]` (string) Dynamic computed relation fields (computed_fields[alias]) Declare ad-hoc aggregates per request using: computed_fields[] = relation.aggregate(args) Syntax: - Count: relation.count() or relation.count() - Sum/Avg/Min/Max: relation.sum() or relation.sum(, ) Where is written using the same Filter DSL and is validated against the relation's allowed fields. Use the prefix computed_fields. when referencing these aliases in filter or sort, e.g., filter=computed_fields.tasks_done gte 1 or sort=-computed_fields.tasks_done. Bare aliases are accepted for backward compatibility but deprecated. Allowed relations for computed_fields (deny-all by default): - tasks (→ effort_sum): aggregates: count, sum, avg, min, max; coalesce default: 0 Example: ?computed_fields[tasks_done]=tasks.count(status%20eq%20%22Completed%22)&filter=computed_fields.tasks_done%20gt%200 Example: "computed_fields[tasks_done]=tasks.count(status%20eq%20%22Completed%22)" ## Response 200 fields (application/json): - `data` (array, required) The list of items - `data.id` (string, required) - `data.external_id` (string,null, required) Can be used to add an identifier to the project from an external system, must be unique - `data.external_origin` (string,null, required) If originated from external system origin is added - `data.title` (string, required) - `data.shortcode` (string, required) - `data.po_number` (string,null, required) - `data.project_type` (object, required) - `data.project_type.color` (string, required) - `data.project_type.order` (integer, required) - `data.project_type.is_default` (boolean, required) - `data.status` (string, required) - `data.is_acquisition` (boolean, required) - `data.is_private` (boolean, required) - `data.start_date` (string,null, required) - `data.end_date` (string,null, required) - `data.client` (object, required) - `data.client.external_id` (string,null, required) Can be used to add an identifier to the client from an external system, must be unique - `data.client.name` (string, required) - `data.client.primary_contact` (any, required) - `data.client.origin_space` (any, required) - `data.tags` (array) - `data.custom_fields` (object, required) The key is the field name for your custom field, value type depends on the field type - `data.team` (array) Project team - `data.team.first_name` (string, required) - `data.team.last_name` (string, required) - `data.team.email` (string, required) - `data.team.type` (string, required) Enum: "user", "guest", "tax_advisor", "integration" - `data.team.added_at` (string, required) - `data.team.space` (object, required) - `data.guests` (array) Project guests - `data.computed_fields` (object) - `links` (array, required) - `meta` (object, required) - `meta.path` (string,null, required) Base path for paginator generated URLs. - `meta.per_page` (integer, required) Number of items shown per page. - `meta.next_cursor` (string,null, required) - `meta.next_cursor_url` (string,null, required) - `meta.prev_cursor` (string,null, required) - `meta.prev_cursor_url` (string,null, required) ## Response 401 fields (application/json): - `message` (string, required) Error overview.