Create a tenant operator — owner or member
const url = 'http://localhost:3000/admin/operators';const options = { method: 'POST', headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'}, body: '{"email":"hello@example.com","name":"example","role":"owner","tenant_id":"example"}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request POST \ --url http://localhost:3000/admin/operators \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --data '{ "email": "hello@example.com", "name": "example", "role": "owner", "tenant_id": "example" }'Creates the account and issues a one-time invite; the operator sets their own password via POST /operator/invite/accept. Who asked for it is logged.
Platform staff operators CANNOT be created here. There is no network path to a
staff account: staff is created at a shell on the host with pnpm operator:seed,
writing to the platform database directly. See
docs/superpowers/specs/2026-08-12-staff-seeding-design.md.
Authorizations
Section titled “Authorizations”Request Bodyrequired
Section titled “Request Bodyrequired”object
The tenant this operator belongs to. Required; it must exist.
Responses
Section titled “Responses”Created. invite_token is returned once, here — only its sha256 is stored.
object
object
One-time invite token. Redeem it with POST /operator/invite/accept.
Example
{ "operator": { "role": "owner", "status": "active" }}Malformed body (bad email, empty name, missing or empty tenant_id), a role other than owner or member — staff is rejected here and seeded at a shell instead — or a tenant_id that does not exist.
object
object
Present only for VALIDATION_FAILED.
object
Example
{ "error": { "code": "VALIDATION_FAILED" }}Authenticated but not permitted.
object
object
Present only for VALIDATION_FAILED.
object
Example
{ "error": { "code": "VALIDATION_FAILED" }}An operator with this email already exists.
object
object
Present only for VALIDATION_FAILED.
object
Example
{ "error": { "code": "VALIDATION_FAILED" }}