Provisioning API · Internal testing only
createInboxes
const url = 'https://api.builders.ac/api/provisioning/v1alpha1/domains/dom_01k5nb3wz7q2hj8vd4rt6ye9ma/inboxes';const options = { method: 'POST', headers: { 'Idempotency-Key': 'example', Authorization: 'Bearer <token>', 'Content-Type': 'application/json' }, body: '{"from_personas":[{"persona_id":"per_01k5n7qd2vb8ye4ka3mzt9rf6x","count":1}]}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request POST \ --url https://api.builders.ac/api/provisioning/v1alpha1/domains/dom_01k5nb3wz7q2hj8vd4rt6ye9ma/inboxes \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --header 'Idempotency-Key: example' \ --data '{ "from_personas": [ { "persona_id": "per_01k5n7qd2vb8ye4ka3mzt9rf6x", "count": 1 } ] }'Atomically adds 1–150 Inboxes to an active Domain. The resulting number of capacity-occupying Inboxes on that Domain must be exactly 50, 75 or 150, so additive top-ups and replacements may request smaller batches. The target Domain and its backing Microsoft 365 tenant each have an effective capacity of 150 Inboxes, and reservation growth must fit the owning Account’s paid mailbox slots. Count, capacity, lifecycle, or overlapping-operation refusals return a typed 409 without reserving any Inbox.
Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Path Parameters
Section titled “Path Parameters”Domain TypeIDs are accepted case-insensitively. Responses use canonical lowercase.
Header Parameters
Section titled “Header Parameters”A client-generated key containing 1–255 printable ASCII characters (0x20 through 0x7E). Reuse it only for exact retries of one logical request.
Request Bodyrequired
Section titled “Request Bodyrequired”object
The sum of count across all Persona batches must be between 1 and 150 Inboxes.
object
Number of Inbox identities to generate from this Persona.
object
object
The portion before @. Requests are accepted case-insensitively, stored lowercase, and immutable.
Defaults to a title-cased form of local_part.
The partner-owned identifier for this Inbox; unique per Account among Inboxes.
Examples
Generate Inbox addresses from Personas
{ "from_personas": [ { "persona_id": "per_01k5n7qd2vb8ye4ka3mzt9rf6x", "count": 1 } ]}Choose Inbox addresses explicitly
When display_name is omitted, it defaults to a title-cased form of local_part; ada.l therefore becomes Ada L.
{ "inboxes": [ { "local_part": "sales", "display_name": "Sales Desk", "external_id": "acme-sales" }, { "local_part": "ada.l" } ]}Responses
Section titled “Responses”Inbox creation accepted.
object
Canonical lowercase TypeID.
Canonical lowercase TypeID.
Nearest ancestor public Operation which caused this child Operation. Omitted on root Operations.
object
object
Canonical lowercase TypeID.
Cancellation was requested. It is honoured only at a safe boundary, so keep polling state and done to learn whether it took effect.
Next date by which meaningful progress should be visible.
Public completion SLA for this Operation.
Example
{ "id": "op_01k5nd7v2qe9ma4bt3rz8hy6xw", "object": "operation", "workspace_id": "wsp_01k5n2rf8bd3xa9e7m4jt6vq5h", "parent_operation_id": "op_01k5nf4b8yt3qd7vm2ae9rz6hx", "type": "inbox.create", "state": "pending", "done": false, "target": { "object": "inbox_collection", "ids": [ "inb_01k5nc9te4vr7bd2hq8ym3xz6a" ] }, "metadata": { "domain_id": "dom_01k5nb3wz7q2hj8vd4rt6ye9ma", "requested": 3, "active": 3, "failed": 0, "retrying": 0 }, "created_at": "2026-04-15T09:15:04Z", "update_by_date": "2026-04-15T09:45:04Z", "completion_by_date": "2026-04-15T10:15:04Z"}Headers
Section titled “Headers”Canonical URL of the Operation.
Present with value true only for a stored exact replay.
The id of this request, echoed on every response and repeated in the correlation_id member of a problem body. Quote it in support requests.
Idempotency key required. The example shows idempotency_key_required.
object
Extensible enum. Branch on this, never on title. New codes may appear at any time, so treat an unrecognised one as its HTTP status; GET /problems lists every code this version can answer with, and GET /problems/{code} resolves one.
object
Example
{ "type": "https://api.builders.ac/api/provisioning/v1alpha1/problems/idempotency_key_required", "title": "Idempotency key required", "status": 400, "detail": "This request requires a valid Idempotency-Key header.", "code": "idempotency_key_required", "retryable": false, "correlation_id": "9f1c2b7a-3d5e-4c81-9a77-2f6b0e4d51c3"}Headers
Section titled “Headers”The id of this request, echoed on every response and repeated in the correlation_id member of a problem body. Quote it in support requests.
Authentication required. The example shows authentication_required; this status is also answered with invalid_api_key. Branch on code, not on the status.
object
Extensible enum. Branch on this, never on title. New codes may appear at any time, so treat an unrecognised one as its HTTP status; GET /problems lists every code this version can answer with, and GET /problems/{code} resolves one.
object
Example
{ "type": "https://api.builders.ac/api/provisioning/v1alpha1/problems/authentication_required", "title": "Authentication required", "status": 401, "detail": "Provide an active Provisioning API Key as a Bearer token.", "code": "authentication_required", "retryable": false, "correlation_id": "9f1c2b7a-3d5e-4c81-9a77-2f6b0e4d51c3"}Headers
Section titled “Headers”The id of this request, echoed on every response and repeated in the correlation_id member of a problem body. Quote it in support requests.
Account inactive. The example shows account_inactive; this status is also answered with insufficient_proof. Branch on code, not on the status.
object
Extensible enum. Branch on this, never on title. New codes may appear at any time, so treat an unrecognised one as its HTTP status; GET /problems lists every code this version can answer with, and GET /problems/{code} resolves one.
object
Example
{ "type": "https://api.builders.ac/api/provisioning/v1alpha1/problems/account_inactive", "title": "Account inactive", "status": 403, "detail": "This account is inactive.", "code": "account_inactive", "retryable": false, "correlation_id": "9f1c2b7a-3d5e-4c81-9a77-2f6b0e4d51c3"}Headers
Section titled “Headers”The id of this request, echoed on every response and repeated in the correlation_id member of a problem body. Quote it in support requests.
The Domain path or one or more Persona references could not be resolved. errors identifies the affected request locations without revealing whether a resource is missing, deleted, or inaccessible.
object
Extensible enum. Branch on this, never on title. New codes may appear at any time, so treat an unrecognised one as its HTTP status; GET /problems lists every code this version can answer with, and GET /problems/{code} resolves one.
object
Identifies the unresolved dom path parameter or every unresolved from_personas.N.persona_id input. Missing, deleted, and inaccessible resources intentionally share the same message.
object
Examples
Not found
{ "type": "https://api.builders.ac/api/provisioning/v1alpha1/problems/not_found", "title": "Not found", "status": 404, "detail": "The requested resource was not found.", "code": "not_found", "retryable": false, "correlation_id": "9f1c2b7a-3d5e-4c81-9a77-2f6b0e4d51c3", "errors": { "from_personas.0.persona_id": [ "The Persona was not found or is not accessible." ] }}Headers
Section titled “Headers”The id of this request, echoed on every response and repeated in the correlation_id member of a problem body. Quote it in support requests.
Inbox creation was refused atomically. The problem code identifies the lifecycle, capacity, quota, identity, workspace, idempotency, or overlapping-operation boundary.
object
Extensible enum. Branch on this, never on title. New codes may appear at any time, so treat an unrecognised one as its HTTP status; GET /problems lists every code this version can answer with, and GET /problems/{code} resolves one.
object
Where the domain is in its lifecycle. pending is accepted but not started; provisioning is in flight; awaiting_nameservers is waiting for the nameservers this API issued to be delegated at the registrar; active is live; failed needs a retry; deprovisioning and deprovisioned are teardown. Read-only: it moves through the actions, never through PATCH.
object
Extensible enum. Branch on this, never on title. New codes may appear at any time, so treat an unrecognised one as its HTTP status; GET /problems lists every code this version can answer with, and GET /problems/{code} resolves one.
object
object
Extensible enum. Branch on this, never on title. New codes may appear at any time, so treat an unrecognised one as its HTTP status; GET /problems lists every code this version can answer with, and GET /problems/{code} resolves one.
object
object
Extensible enum. Branch on this, never on title. New codes may appear at any time, so treat an unrecognised one as its HTTP status; GET /problems lists every code this version can answer with, and GET /problems/{code} resolves one.
object
object
Extensible enum. Branch on this, never on title. New codes may appear at any time, so treat an unrecognised one as its HTTP status; GET /problems lists every code this version can answer with, and GET /problems/{code} resolves one.
object
object
Extensible enum. Branch on this, never on title. New codes may appear at any time, so treat an unrecognised one as its HTTP status; GET /problems lists every code this version can answer with, and GET /problems/{code} resolves one.
object
The Operation holding the resource. Null when the blocking run is a dashboard workflow, which has no public Operation; absent on chapters that do not report it.
object
Extensible enum. Branch on this, never on title. New codes may appear at any time, so treat an unrecognised one as its HTTP status; GET /problems lists every code this version can answer with, and GET /problems/{code} resolves one.
object
object
Extensible enum. Branch on this, never on title. New codes may appear at any time, so treat an unrecognised one as its HTTP status; GET /problems lists every code this version can answer with, and GET /problems/{code} resolves one.
object
object
Extensible enum. Branch on this, never on title. New codes may appear at any time, so treat an unrecognised one as its HTTP status; GET /problems lists every code this version can answer with, and GET /problems/{code} resolves one.
object
object
Extensible enum. Branch on this, never on title. New codes may appear at any time, so treat an unrecognised one as its HTTP status; GET /problems lists every code this version can answer with, and GET /problems/{code} resolves one.
object
Examples
Domain is not active
{ "type": "https://api.builders.ac/api/provisioning/v1alpha1/problems/domain_not_active", "title": "Domain is not active", "status": 409, "detail": "This action needs a live domain; `state` says where this one is. Wait for it to reach `active` — poll the connect operation — and try again.", "code": "domain_not_active", "retryable": false, "correlation_id": "9f1c2b7a-3d5e-4c81-9a77-2f6b0e4d51c3", "state": "pending"}Domain not ready
{ "type": "https://api.builders.ac/api/provisioning/v1alpha1/problems/domain_not_ready", "title": "Domain not ready", "status": 409, "detail": "Wait until the Domain is ready for mailbox provisioning, then retry with a new Idempotency-Key.", "code": "domain_not_ready", "retryable": true, "correlation_id": "9f1c2b7a-3d5e-4c81-9a77-2f6b0e4d51c3"}Domain Inbox capacity exceeded
{ "type": "https://api.builders.ac/api/provisioning/v1alpha1/problems/domain_inbox_capacity_exceeded", "title": "Domain Inbox capacity exceeded", "status": 409, "detail": "This request would exceed the effective Inbox capacity behind this Domain; `limit`, `used`, `available` and `requested` show the boundary. Request fewer Inboxes, or deprovision Inboxes on this Domain before retrying.", "code": "domain_inbox_capacity_exceeded", "retryable": false, "correlation_id": "9f1c2b7a-3d5e-4c81-9a77-2f6b0e4d51c3", "limit": 150, "used": 140, "available": 10, "requested": 25}Unsupported Domain Inbox total
{ "type": "https://api.builders.ac/api/provisioning/v1alpha1/problems/domain_inbox_count_invalid", "title": "Unsupported Domain Inbox total", "status": 409, "detail": "This request would leave the Domain with an unsupported Inbox total; `current`, `requested`, `resulting`, `allowed_totals` and `allowed_additions` show how to reach 50, 75 or 150. Submit one of the allowed additions.", "code": "domain_inbox_count_invalid", "retryable": false, "correlation_id": "9f1c2b7a-3d5e-4c81-9a77-2f6b0e4d51c3", "allowed_totals": [ 50, 75, 150 ]}Mailbox slot quota exceeded
{ "type": "https://api.builders.ac/api/provisioning/v1alpha1/problems/resource_quota_exceeded", "title": "Mailbox slot quota exceeded", "status": 409, "detail": "This request would reserve more mailbox slots than the account has paid for; `subscribed`, `used`, `available` and `requested` show by how much. Buy more slots, or deprovision domains you no longer send from.", "code": "resource_quota_exceeded", "retryable": false, "correlation_id": "9f1c2b7a-3d5e-4c81-9a77-2f6b0e4d51c3", "subscribed": 200, "used": 190, "available": 10, "requested": 25}Resource operation in progress
{ "type": "https://api.builders.ac/api/provisioning/v1alpha1/problems/resource_operation_in_progress", "title": "Resource operation in progress", "status": 409, "detail": "Wait for the current operation to finish, then retry with a new Idempotency-Key.", "code": "resource_operation_in_progress", "retryable": true, "correlation_id": "9f1c2b7a-3d5e-4c81-9a77-2f6b0e4d51c3", "operation_id": "op_01k5nd7v2qe9ma4bt3rz8hy6xw"}Inbox address unavailable
{ "type": "https://api.builders.ac/api/provisioning/v1alpha1/problems/inbox_address_unavailable", "title": "Inbox address unavailable", "status": 409, "detail": "Choose a different local_part, or request fewer addresses for this Persona.", "code": "inbox_address_unavailable", "retryable": false, "correlation_id": "9f1c2b7a-3d5e-4c81-9a77-2f6b0e4d51c3"}External ID already in use
{ "type": "https://api.builders.ac/api/provisioning/v1alpha1/problems/external_id_conflict", "title": "External ID already in use", "status": 409, "detail": "Choose a different external_id, or retrieve the existing resource using this external_id.", "code": "external_id_conflict", "retryable": false, "correlation_id": "9f1c2b7a-3d5e-4c81-9a77-2f6b0e4d51c3"}Workspace archived
{ "type": "https://api.builders.ac/api/provisioning/v1alpha1/problems/workspace_archived", "title": "Workspace archived", "status": 409, "detail": "Unarchive this workspace before creating resources in it.", "code": "workspace_archived", "retryable": false, "correlation_id": "9f1c2b7a-3d5e-4c81-9a77-2f6b0e4d51c3"}Request already in progress
{ "type": "https://api.builders.ac/api/provisioning/v1alpha1/problems/idempotency_in_progress", "title": "Request already in progress", "status": 409, "detail": "A request using this idempotency key is still in progress.", "code": "idempotency_in_progress", "retryable": true, "correlation_id": "9f1c2b7a-3d5e-4c81-9a77-2f6b0e4d51c3"}Headers
Section titled “Headers”The id of this request, echoed on every response and repeated in the correlation_id member of a problem body. Quote it in support requests.
Validation failed. The example shows validation_error; this status is also answered with idempotency_mismatch, invalid_sealed_value, mailbox_upload_unavailable, provider_credentials_invalid, domains_not_bound, sequencer_targets_mixed. Branch on code, not on the status.
object
Extensible enum. Branch on this, never on title. New codes may appear at any time, so treat an unrecognised one as its HTTP status; GET /problems lists every code this version can answer with, and GET /problems/{code} resolves one.
object
Example
{ "type": "https://api.builders.ac/api/provisioning/v1alpha1/problems/validation_error", "title": "Validation failed", "status": 422, "detail": "One or more request fields are invalid.", "code": "validation_error", "retryable": false, "correlation_id": "9f1c2b7a-3d5e-4c81-9a77-2f6b0e4d51c3", "errors": { "display_name": [ "The display name must not be blank." ] }}Headers
Section titled “Headers”The id of this request, echoed on every response and repeated in the correlation_id member of a problem body. Quote it in support requests.
Rate limit exceeded. The example shows rate_limit_exceeded.
object
Extensible enum. Branch on this, never on title. New codes may appear at any time, so treat an unrecognised one as its HTTP status; GET /problems lists every code this version can answer with, and GET /problems/{code} resolves one.
object
Example
{ "type": "https://api.builders.ac/api/provisioning/v1alpha1/problems/rate_limit_exceeded", "title": "Rate limit exceeded", "status": 429, "detail": "Too many requests were made for this policy.", "code": "rate_limit_exceeded", "retryable": true, "correlation_id": "9f1c2b7a-3d5e-4c81-9a77-2f6b0e4d51c3", "retry_after": "2026-04-15T09:16:04Z"}Headers
Section titled “Headers”The id of this request, echoed on every response and repeated in the correlation_id member of a problem body. Quote it in support requests.
Service unavailable. The example shows service_unavailable; this status is also answered with encryption_keys_unavailable, provider_unreachable. Branch on code, not on the status.
object
Extensible enum. Branch on this, never on title. New codes may appear at any time, so treat an unrecognised one as its HTTP status; GET /problems lists every code this version can answer with, and GET /problems/{code} resolves one.
object
Example
{ "type": "https://api.builders.ac/api/provisioning/v1alpha1/problems/service_unavailable", "title": "Service unavailable", "status": 503, "detail": "Retry the request later; the service is temporarily unavailable.", "code": "service_unavailable", "retryable": true, "correlation_id": "9f1c2b7a-3d5e-4c81-9a77-2f6b0e4d51c3"}Headers
Section titled “Headers”The id of this request, echoed on every response and repeated in the correlation_id member of a problem body. Quote it in support requests.