Provisioning API
Create a sender
const url = 'https://live-api.customers.ac/v1/senders';const options = { method: 'POST', headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'}, body: '{"user_id":"usr_a1b2c3d4-e5f6-7890-abcd-ef1234567890","name":"Acme Outbound Q1","domains":["outbound.acme.com","cold.acme.com","sales.acme.com"],"personas":[{"first_name":"Jane","last_name":"Doe","title":"Head of Partnerships"}]}'};
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://live-api.customers.ac/v1/senders \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --data '{ "user_id": "usr_a1b2c3d4-e5f6-7890-abcd-ef1234567890", "name": "Acme Outbound Q1", "domains": [ "outbound.acme.com", "cold.acme.com", "sales.acme.com" ], "personas": [ { "first_name": "Jane", "last_name": "Doe", "title": "Head of Partnerships" } ] }'Creates a new sender with all its domains. Domains must be specified at creation time and cannot be added afterwards. The platform immediately begins processing each domain: assigning nameservers (asynchronous — usually within a few minutes), then waiting for DNS propagation (up to 48 hours per domain), then provisioning mailboxes automatically.
After creation, call GET /v1/senders/{id}/domains to retrieve the nameserver values assigned to each domain.
Authorizations
Section titled “Authorizations”Request Bodyrequired
Section titled “Request Bodyrequired”object
The user this sender belongs to.
A human-readable name for this sender.
The domains to connect to this sender. All domains must be specified at creation time. Minimum 1, maximum 50.
Persona templates for generating mailboxes. You can also add these later.
A persona template. One mailbox is created per persona per domain (e.g., 3 personas x 3 domains = 9 mailboxes).
object
First name used in the mailbox address.
Last name used in the mailbox address.
Job title, used for display name in the mailbox.
Example
{ "user_id": "usr_a1b2c3d4-e5f6-7890-abcd-ef1234567890", "name": "Acme Outbound Q1", "domains": [ "outbound.acme.com", "cold.acme.com", "sales.acme.com" ], "personas": [ { "first_name": "Jane", "last_name": "Doe", "title": "Head of Partnerships" } ]}Responses
Section titled “Responses”Sender created. Domain nameserver assignment has begun. Call GET /v1/senders/{id}/domains to check nameserver assignments and update your registrar.
object
object
Unique identifier for the sender.
The user this sender belongs to.
A human-readable name for this sender, chosen by the partner.
The current lifecycle status of a sender.
Templates used to generate mailbox usernames on each domain.
A persona template. One mailbox is created per persona per domain (e.g., 3 personas x 3 domains = 9 mailboxes).
object
First name used in the mailbox address.
Last name used in the mailbox address.
Job title, used for display name in the mailbox.
Number of domains connected to this sender.
Total number of mailboxes across all domains.
The ID of the provisioning operation. Poll GET /v1/operations/{id} to track progress.
Example
{ "data": { "id": "snd_a1b2c3d4-e5f6-7890-abcd-ef1234567890", "user_id": "usr_a1b2c3d4-e5f6-7890-abcd-ef1234567890", "name": "Acme Outbound Q1", "status": "pending", "personas": [ { "first_name": "Jane", "last_name": "Doe", "title": "Head of Partnerships" } ], "domains_count": 3, "mailboxes_count": 9, "created_at": "2026-03-20T09:00:00Z", "updated_at": "2026-03-20T12:30:00Z" }, "operation_id": "op_f47ac10b-58cc-4372-a567-0e02b2c3d479"}The request body failed validation.
object
object
A machine-readable error code.
A human-readable explanation of the error.
A link to the documentation page for this error code.
For validation errors, a list of individual field-level problems.
object
The field that caused the error, in dot notation.
A machine-readable code for this specific validation issue.
A human-readable explanation.
Example
{ "error": { "code": "validation.required_field", "message": "The request body is missing required fields.", "doc_url": "https://docs.sending.ac/errors/validation-required-field", "details": [ { "field": "email", "code": "validation.required_field", "message": "This field is required." } ] }}Authentication failed. The API key is missing or invalid.
object
object
A machine-readable error code.
A human-readable explanation of the error.
A link to the documentation page for this error code.
For validation errors, a list of individual field-level problems.
object
The field that caused the error, in dot notation.
A machine-readable code for this specific validation issue.
A human-readable explanation.
Examples
No API key provided
{ "error": { "code": "auth.missing_key", "message": "No API key was provided. Include your key in the Authorization header: Bearer sac_live_xxxxx.", "doc_url": "https://docs.sending.ac/errors/auth-missing-key" }}Invalid API key
{ "error": { "code": "auth.invalid_key", "message": "The API key provided is invalid or has been revoked.", "doc_url": "https://docs.sending.ac/errors/auth-invalid-key" }}The API key does not have the required scope for this operation.
object
object
A machine-readable error code.
A human-readable explanation of the error.
A link to the documentation page for this error code.
For validation errors, a list of individual field-level problems.
object
The field that caused the error, in dot notation.
A machine-readable code for this specific validation issue.
A human-readable explanation.
Example
{ "error": { "code": "auth.insufficient_scope", "message": "Your API key does not have the 'senders:write' scope required for this operation.", "doc_url": "https://docs.sending.ac/errors/auth-insufficient-scope" }}You have exceeded the rate limit. Wait and retry.
object
object
A machine-readable error code.
A human-readable explanation of the error.
A link to the documentation page for this error code.
For validation errors, a list of individual field-level problems.
object
The field that caused the error, in dot notation.
A machine-readable code for this specific validation issue.
A human-readable explanation.
Example
{ "error": { "code": "rate.quota_exceeded", "message": "Rate limit exceeded. You may make 120 requests per minute. Retry after 30 seconds.", "doc_url": "https://docs.sending.ac/errors/rate-quota-exceeded" }}Headers
Section titled “Headers”Example
30Number of seconds to wait before retrying.
Example
120The maximum number of requests allowed per minute.
Example
0The number of requests remaining in the current window.
Example
1711267260Unix timestamp when the rate limit window resets.