Skip to main content
Every endpoint below is generated from the OpenAPI specification, so the fields you see in the request and response panels are the fields the API actually accepts and returns.

Trying requests

Paste your key into the playground’s X-API-Key field and you can send real requests from these pages. They run against your own organization, so anything you create, change, or delete is real.
The playground sends live requests. Take care with DELETE and PATCH /bulk, and see archiving and deleting before you try a delete.
The server field defaults to app.buildingswell.com. Change {instance} if you are pointed at a different host.

Base URL

How the groups are organized

Each resource group lists its endpoints in the same order: the collection, then a single record, then counts and queries, then the bulk routes, then anything specific to that resource. Most resources share one CRUD and query pattern. Rather than repeating it on every endpoint, it is written up once:

Standard endpoints

The shared CRUD pattern, ?update= on upserts, and why bulk delete returns 403.

Querying

Filters, operators, select, search, and joins.

Response format

Response envelopes, error codes, and what to branch on.

Resources

Field-by-field reference with the behavior behind each one.

Reading the field tables

  • Read-only fields are returned but ignored on write. computed on a deliverable is the largest example.
  • Required on create marks the few fields you must send. Everything else falls back to a default.
  • A type of string | null means the field can hold null. That is different from the field being absent, which matters most for timesheet metadata.