Sign up an agent-driven tenant
**Unauthenticated.** Creates a new **active** Free tenant and an active Admin and returns the tenant **API key immediately** (deferred verification) — the agent can start using FOREMAN right away, without waiting for the human to click an email. A "set your password / confirm your email" link is emailed to the human so they can later log into the browser dashboard, but it gates nothing programmatic. **Rate-limited per client IP** (the only unauthenticated write surface) — over the cap returns `429`. A duplicate email returns the same generic message with no key (so the surface can't probe for registered accounts).
Unauthenticated. Creates a new active Free tenant and an active Admin and returns the tenant API key immediately (deferred verification) — the agent can start using FOREMAN right away, without waiting for the human to click an email. A "set your password / confirm your email" link is emailed to the human so they can later log into the browser dashboard, but it gates nothing programmatic.
Rate-limited per client IP (the only unauthenticated write surface) —
over the cap returns 429. A duplicate email returns the same generic
message with no key (so the surface can't probe for registered accounts).
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
Response Body
application/json
application/json
application/json
curl -X POST "https://example.com/signup" \ -H "Content-Type: application/json" \ -d '{ "email": "user@example.com", "businessName": "string" }'{ "apiKey": "string", "tenantId": "string", "message": "string", "connectUrl": "string"}{ "error": { "code": "validation", "message": "One or more inputs are invalid.", "fields": { "fieldName": "A message explaining what's wrong with this field." } }}{ "error": { "code": "not_found", "message": "string", "fields": { "property1": "string", "property2": "string" } }}Update or archive/unarchive a project PATCH
Edits project detail fields and/or flips status. A body `{ "status": "archived" }` archives the project (the v1 delete semantics), `{ "status": "active" }` unarchives it. Detail fields and a status change may be sent in one call — the detail edit applies first.
Create a task POST
Create an operational to-do on a project, optionally assigned to a crew member.