Signup

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).

POST
/signup

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"    }  }}