Create a project
Create a new job site. On the Free plan, exceeding the project cap returns `403` (`project_cap`) with an upgrade Checkout link.
Create a new job site. On the Free plan, exceeding the project cap returns 403 (project_cap) with an upgrade Checkout link.
The per-tenant API key, copied from Settings → API & integrations.
Sent as the x-api-key request header. The key is tenant-scoped and acts
with Admin-equivalent, tenant-wide access.
In: header
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
Response Body
application/json
application/json
application/json
application/json
curl -X POST "https://example.com/projects" \ -H "Content-Type: application/json" \ -d '{ "name": "string", "address": "string" }'{ "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08", "name": "string", "address": "string", "ownerContact": "string", "gateCodes": "string", "description": "string", "status": "active", "inductionToken": "string", "createdAt": "2019-08-24T14:15:22Z"}{ "error": { "code": "unauthorized", "message": "Missing or invalid API key." }}{ "error": { "code": "read_only", "message": "Your subscription is inactive. This action is read-only." }}{ "error": { "code": "validation", "message": "One or more inputs are invalid.", "fields": { "fieldName": "A message explaining what's wrong with this field." } }}Assign a crew member to a project POST
Adds a Site Crew member to the project's roster (Admin or the project's Site Manager). Idempotent — re-adding is a no-op. Admins are on every project already and can't be rostered.
Archive a project DELETE
Archives the project. Projects have no hard delete in v1 — archiving is the delete semantics and preserves roster and audit data.