Skip to main content

Pagination

  • page — one-based; the first page is 1 (default 1). page=0 is invalid and returns an error.
  • pageSize — results per page (default 50)
  • Response includes hasMore: boolean

Sorting

Select specific fields

A comma-separated value in a single select parameter is not supported and is silently ignored. Repeat the parameter instead:
Or, for POST /project/query, pass select as a JSON array in the body:
Append :column1,column2 to limit search to specific columns.

Filtering

Simple equality:
Multiple values for the same field mean IN. With operators:
There is no :in operator — a filter like progress.status:in=wip,rework is accepted by the query parser but fails at the database layer (500). To match a field against multiple values, repeat the plain field param (see Multiple values for the same field mean IN above): ?progress.status=wip&progress.status=rework.
Complex AND/OR:
Format: ?join:<table>:<fields>=<condition>
  • Multiple joins: pass several join: params in one request to join several tables.
  • Chained joins: a condition may reference another join’s alias (not only the base table), so you can hop across joined tables — e.g. join deliverable as d, then deliverable as o on o.id eq d.rootParentId. Declare a join before any join that references it. Conditions support JSONB paths (d.data.stageId) and id-fields are cast automatically. See the timesheet attribution example.
Joins to sensitive internal tables (e.g. api_key) are blocked.