Skip to main content
Learn these once and every resource follows the same rules. The examples use /project, and the same paths exist for /deliverable, /stage, /document, and the rest. Not every resource offers all of them. timesheet is read-only, worker refuses hard deletes, and qc-template is read and delete only. Each resource page says what it supports, and the API reference lists the concrete paths.

Four things that trip people up

PUT needs ?update=

Both PUT /{id} and PUT /bulk require an update query parameter naming which columns to overwrite when a row with a conflicting unique key already exists. Without it the request is rejected with 400. Pass it as a repeated parameter. A single comma-separated value is not accepted:

PATCH /bulk needs its filter in the query string

A filter in the request body is ignored. Without a filter in the query string the request fails with 400 and "No filter provided for updateMany", which is deliberate: it stops you updating an entire table by accident.

Bulk delete does not exist

On writable factory resources, DELETE /{resource}/bulk returns 403; read-only resources do not register it. To remove many records, archive them with PATCH /bulk. See archiving and deleting.

Archived records are hidden by default

Reads filter to isArchived eq false unless you say otherwise:
This applies to single-record reads too, which is the part that surprises people: GET /project/{id} on an archived record returns 404, and there is no query parameter that changes it on that route. When an id might belong to an archived record, read it through the list endpoint instead, where the filter is yours to set:
Repeating isArchived matches either value, so that request returns the record whether it is archived or not. See archiving and deleting.

Creating one record or many

POST takes either an object or an array. An object comes back as value, an array as values:

When your filter is too long for a URL

Long filters, big id lists, and wide select lists hit URL length limits at the load balancer before they reach us. Every resource has POST twins that take the same options in the body:
See querying for the filter, sort, and join syntax these share.

Resource-specific write rules

The standard shape does not mean every resource supports every method. Stock, allocations, teams, shifts, and departments expose reads. Transactions accept a restricted single-object POST. Documents disable generic POST and PUT and restrict PATCH to isArchived. DELETE archives items, BOM lines, production outputs, units of measure, vendors, locations, trucks, contacts, custom properties, and delivery lines. Deliveries have dedicated archive/restore commands while DELETE is destructive. Check each resource page before generating writes.