リファレンスHTTP APIAuth

Create the first owner and default workspace, or recover an owner

POST
/v1/auth/bootstrap

Allowed only while no live owner exists (an owner whose account or membership is disabled is not live). On an installation that already has users it adds or restores the owner in the existing workspace, ignores workspace_name and workspace_slug, revokes every web session in the workspace and writes a recover_owner receipt. Each BOOTSTRAP_TOKEN works once per installation; a token presented while a live owner exists is spent. A wrong or spent token answers 401 before the owner state is looked at.

Auth: public; no credential. Idempotency-Key: ignored.

Request Body

application/json
  1. body
bootstrap_token*string
Length32 <= length <= 256
email*string
Match^(?:[A-Za-z0-9_'+\-]+\.)*[A-Za-z0-9_'+\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,}$
Formatemail
Lengthlength <= 254
password*string
Length12 <= length
display_name*string
Length1 <= length <= 64
workspace_name*string
Length1 <= length <= 120
workspace_slug*string
Match^[a-z0-9][a-z0-9-]*$
Length1 <= length <= 64

Response Body

The owner, the workspace and the membership are created, or the owner is restored in the existing workspace.

application/json
  1. response
user_id*string
Match^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
Formatuuid
workspace*
role*string
Example Request
curl -X POST 'https://example.com/v1/auth/bootstrap' \  -H 'Content-Type: application/json' \  -d '{  "bootstrap_token": "<the BOOTSTRAP_TOKEN printed at install>",  "email": "owner@example.com",  "password": "correct horse battery staple",  "display_name": "Ada Owner",  "workspace_name": "Acme",  "workspace_slug": "acme"}'
Example Response
{  "user_id": "3e7f1a90-5c2d-4b8e-8f61-2a9d0c4b7e35",  "workspace": {    "id": "9d2c4e61-8a3b-4f70-b1e5-6c0a7d3f2b98",    "slug": "acme",    "name": "Acme",    "settings": {      "dispatch_model": null,      "kill_switch": false,      "daily_cost_limit_usd": null,      "idle_pause_minutes": 30,      "audit_retention_days": 90,      "slack_guest_enabled": false,      "achievement_judge": {        "connection_id": null,        "threshold": 0.9,        "on_evidence": true,        "every_n_turns": null,        "on_idle": false,        "transcript": "recent",        "daily_budget_usd": 1,        "max_per_session": 20      }    },    "created_at": "2026-10-01T09:00:00Z"  },  "role": "owner"}