Skip to content

Provisioning API · Internal testing only

Connect a domain to a sequencer

PUT
/domains/{dom}/sequencer
curl --request PUT \
--url https://api.builders.ac/api/provisioning/v1alpha1/domains/dom_01k5nb3wz7q2hj8vd4rt6ye9ma/sequencer \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{ "provider_account_id": "pra_01jsdqrf91f949ybjwh90xde9g", "sequencer_workspace": "Northwind Outbound" }'

Bind the domain to one sequencer account and one workspace on it, and queue every inbox already created on the domain for connection. PUT, so no Idempotency-Key: binding a domain to the sequencer it is already bound to is binding it once. A domain has at most one sequencer, so this replaces any previous binding and re-queues the inboxes against the new one. The domain does not have to be active yet. Answers with the domain, whose sequencer block is the read-back. API-key callers also receive its SMTP password sealed to that key; OAuth MCP callers receive a successful response without smtp_password. Available only to accounts entitled to Mailbox Upload (422 mailbox_upload_unavailable otherwise).

dom
required
string
>= 30 characters <= 30 characters /^[dD][oO][mM]_[0-7][0-9a-hjkmnp-tv-zA-HJKMNP-TV-Z]{25}$/

Domain TypeIDs are accepted case-insensitively. Responses use canonical lowercase.

Media typeapplication/json
object
provider_account_id
required

The sequencer account to bind, as GET /provider-accounts lists it.

string
>= 30 characters <= 30 characters /^[pP][rR][aA]_[0-7][0-9a-hjkmnp-tv-zA-HJKMNP-TV-Z]{25}$/
sequencer_workspace
required

One of that account’s sequencer_workspaces. A name the account does not know answers 422.

string
>= 1 characters <= 255 characters

Updated domain. smtp_password is sealed to the request API Key when present, and omitted for OAuth MCP callers.

Media typeapplication/json
object
id
required
string
>= 30 characters <= 30 characters /^dom_[0-7][0-9a-hjkmnp-tv-z]{25}$/
object
required
Allowed value: domain
workspace_id
required
string | null
>= 30 characters <= 30 characters /^wsp_[0-7][0-9a-hjkmnp-tv-z]{25}$/
name
required
string
<= 253 characters
state
required

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.

string
Allowed values: pending provisioning awaiting_nameservers active failed deprovisioning deprovisioned
registrar
required

Whether we can act on the registration. spaceship: registered through our own registrar account, so nameservers and renewal are ours to change. external: held elsewhere, and the customer must act. unknown: no registrar recorded.

string
Allowed values: spaceship external unknown
registered_on
required
string | null format: date
expires_on
required
string | null format: date
nameservers
required

The nameservers this domain must be delegated to. Empty until the connect operation has issued them.

Array<string>
health
required

Empty when no health check has ever finished for this domain.

Array<object>
object
check
required
string
Allowed values: nameservers cloudflare_zone mx spf dkim dmarc o365_license o365_certificates redirect other
status
required

failing means the check ran and found a problem; unmeasured means it could not be run, which is not the same thing.

string
Allowed values: ok failing unmeasured
detail

Present on other, carrying the raw internal signal so a new one is never silently invisible.

string
<= 200 characters
health_checked_at
required
string | null format: date-time
redirect
required
One of:

The automatic redirect served on the domain. Null when no target is set.

object
target_url
required
string format: uri
<= 500 characters
mode
required

redirect serves a 301 to the target; clone serves a copy of it on the domain itself.

string
Allowed values: redirect clone
state
required

active: the edge Worker is confirmed serving it. deploying: on its way. failed: the last redirect or clone operation for this domain failed.

string
Allowed values: deploying active failed
cloned_at
required
string | null format: date-time
sequencer
required
One of:

The sequencer this domain is bound to, as PUT /domains/{dom}/sequencer left it, with how far its inboxes have got. Null on a domain with no binding.

object
provider_account_id
required
One of:
null
provider
required
string
Allowed values: smartlead instantly plusvibe bison other
workspace
required

The workspace at the sequencer that inboxes on this domain are connected to.

string | null
<= 255 characters
inboxes
required

How many of this domain’s inboxes are connected to that workspace, waiting to be connected, and no longer connected. An inbox that was never linked is in none of the three.

object
uploaded
required
integer
pending
required
integer
disconnected
required
integer
smtp_password

Sealed to the request API Key on GET /domains/{dom} and PUT /domains/{dom}/sequencer. Omitted from OAuth MCP sequencer-binding responses; never in a list or on a deprovisioned domain.

object
ciphertext
required

An ASCII-armored age v1 file. Response values are sealed to the API Key used for the request; request values are sealed to a recipient published by GET /encryption-keys.

string
>= 1 characters <= 65536 characters
external_id
required

Your own id for this domain. Unique per account among live domains, set once and immutable afterwards, released when the domain is deprovisioned.

string | null
<= 255 characters
created_at
required
string format: date-time
updated_at
required
string format: date-time
Example
{
"id": "dom_01k5nb3wz7q2hj8vd4rt6ye9ma",
"object": "domain",
"workspace_id": "wsp_01k5n2rf8bd3xa9e7m4jt6vq5h",
"name": "northwind-outbound.com",
"state": "pending",
"registrar": "spaceship",
"registered_on": "2026-01-22",
"expires_on": "2027-01-22",
"nameservers": [
"dara.ns.cloudflare.com",
"rex.ns.cloudflare.com"
],
"health": [
{
"check": "nameservers",
"status": "ok"
}
],
"health_checked_at": "2026-04-16T10:58:12Z",
"redirect": {
"target_url": "https://www.northwind-labs.com",
"mode": "redirect",
"state": "deploying",
"cloned_at": "2026-04-16T10:44:09Z"
},
"sequencer": {
"provider_account_id": "pra_01jsdqrf91f949ybjwh90xde9g",
"provider": "smartlead",
"workspace": "Northwind Outbound",
"inboxes": {
"uploaded": 3,
"pending": 0,
"disconnected": 0
}
},
"smtp_password": {
"ciphertext": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBHd0pQTGdGMlkxSjhkUzBu\nCg==\n-----END AGE ENCRYPTED FILE-----\n"
},
"external_id": "crm-8421",
"created_at": "2026-04-15T09:15:04Z",
"updated_at": "2026-04-16T11:02:37Z"
}
x-correlation-id
string

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.

Media typeapplication/problem+json
object
type
required
string format: uri-reference
title
required
string
status
required
integer
detail
required
string
code
required

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.

string
retryable
required
boolean
retry_after
string format: date-time
correlation_id
required
string
errors
object
key
additional properties
Array<string>
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"
}
x-correlation-id
string

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.

Media typeapplication/problem+json
object
type
required
string format: uri-reference
title
required
string
status
required
integer
detail
required
string
code
required

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.

string
retryable
required
boolean
retry_after
string format: date-time
correlation_id
required
string
errors
object
key
additional properties
Array<string>
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"
}
x-correlation-id
string

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.

Not found. The example shows not_found.

Media typeapplication/problem+json
object
type
required
string format: uri-reference
title
required
string
status
required
integer
detail
required
string
code
required

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.

string
retryable
required
boolean
retry_after
string format: date-time
correlation_id
required
string
errors
object
key
additional properties
Array<string>
Example
{
"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"
}
x-correlation-id
string

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 request is well-formed but cannot be acted on: the account is not entitled to Mailbox Upload, or sequencer_workspace is not a workspace of that account.

Media typeapplication/problem+json
One of:
object
type
required
string format: uri-reference
title
required
string
status
required
integer
detail
required
string
code
required

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.

string
retryable
required
boolean
retry_after
string format: date-time
correlation_id
required
string
errors
object
key
additional properties
Array<string>
type
required
title
required
Allowed value: Mailbox Upload unavailable
status
required
Allowed value: 422
code
required
Allowed value: mailbox_upload_unavailable
retryable
required
detail
required
Allowed value: Mailbox Upload is not available for this product. Contact your deliverability advisor to discuss.
Examples
Examplemailbox_upload_unavailable

Mailbox Upload unavailable

{
"type": "https://api.builders.ac/api/provisioning/v1alpha1/problems/mailbox_upload_unavailable",
"title": "Mailbox Upload unavailable",
"status": 422,
"detail": "Mailbox Upload is not available for this product. Contact your deliverability advisor to discuss.",
"code": "mailbox_upload_unavailable",
"retryable": false,
"correlation_id": "9f1c2b7a-3d5e-4c81-9a77-2f6b0e4d51c3"
}
x-correlation-id
string

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.

Media typeapplication/problem+json
object
type
required
string format: uri-reference
title
required
string
status
required
integer
detail
required
string
code
required

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.

string
retryable
required
boolean
retry_after
string format: date-time
correlation_id
required
string
errors
object
key
additional properties
Array<string>
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"
}
x-correlation-id
string

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.

Media typeapplication/problem+json
object
type
required
string format: uri-reference
title
required
string
status
required
integer
detail
required
string
code
required

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.

string
retryable
required
boolean
retry_after
string format: date-time
correlation_id
required
string
errors
object
key
additional properties
Array<string>
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"
}
x-correlation-id
string

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.