Skip to content

Create a domain

POST
/domains
curl --request POST \
--url https://api.spacepost.dev/domains \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{ "name": "acme.com", "region": "eu-central-1", "custom_return_path": "send" }'

Registers a domain and returns the DNS records to add (three DKIM CNAMEs, plus MX and SPF on the MAIL FROM subdomain). Domain names are globally unique. The number of domains is limited by your plan (Free 3, Pro 10, Scale 1,000).

Media typeapplication/json
object
name
required

Domain or subdomain you own. Lower-cased.

string
region

Accepted for compatibility. The region is chosen by the platform and returned on the domain.

string
custom_return_path

Subdomain used for the custom MAIL FROM (bounce handling and SPF).

string
default: send /^[a-z0-9-]{1,63}$/
tenant_id

Platform mode. Make the domain tenant-owned (our tenant id or your external_id). Mail from it is attributed to that tenant.

string
>= 1 characters <= 200 characters

Example

{
"name": "acme.com",
"region": "eu-central-1",
"custom_return_path": "send"
}

The domain with its DNS records.

Media typeapplication/json
object
object
required
string
Allowed value: domain
id
required
string format: uuid
name
required
string
status
required
string
Allowed values: not_started pending verified failed temporary_failure
created_at
required
string format: date-time
region
required
string
tenant_id
required

The tenant that owns the domain

string | null format: uuid
open_tracking
required
boolean
click_tracking
required
boolean
records
required
Array<object>
object
record
required
string
Allowed values: SPF DKIM DMARC MX
name
required

Host relative to the domain.

string
type
required
string
Allowed values: MX TXT CNAME
ttl
required
string
status
required
string
Allowed values: not_started pending verified failed temporary_failure
value
required
string
priority
integer
recommended_records
required

Optional records that improve deliverability, such as DMARC.

Array<object>
object
record
required
string
Allowed values: SPF DKIM DMARC MX
name
required

Host relative to the domain.

string
type
required
string
Allowed values: MX TXT CNAME
ttl
required
string
status
required
string
Allowed values: not_started pending verified failed temporary_failure
value
required
string
priority
integer

Example

{
"object": "domain",
"status": "not_started",
"region": "eu-central-1",
"records": [
{
"record": "DKIM",
"name": "abc123._domainkey",
"type": "CNAME",
"ttl": "Auto",
"status": "pending",
"value": "abc123.dkim.amazonses.com"
},
{
"record": "SPF",
"name": "send",
"type": "MX",
"ttl": "Auto",
"status": "pending",
"value": "feedback-smtp.eu-central-1.amazonses.com",
"priority": 10
},
{
"record": "SPF",
"name": "send",
"type": "TXT",
"ttl": "Auto",
"status": "pending",
"value": "\"v=spf1 include:amazonses.com ~all\""
}
]
}

An error. Common statuses: 400 invalid_idempotency_key; 401 missing_api_key or restricted_api_key; 403 invalid_api_key, invalid_from_address, sending_paused (team or tenant) or invalid_access; 404 not_found; 409 invalid_idempotent_request or concurrent_idempotent_requests; 422 validation_error (also: tenant_id conflicts with the domain’s tenant; deleting a tenant that still has domains); 429 quota errors.

Media typeapplication/json
object
statusCode
required
integer
name
required

Machine-readable error name.

  • missing_api_key (401): no bearer token.
  • invalid_api_key (403): unknown or malformed key.
  • restricted_api_key (401): the key is sending_access (or limited to another domain).
  • validation_error (422): invalid request. Also used with 403 for plan limits and test-domain restrictions.
  • not_found (404): the resource does not exist or belongs to another team.
  • method_not_allowed (405)
  • invalid_idempotency_key (400): key length outside 1 to 256.
  • concurrent_idempotent_requests (409): the original request is still running.
  • invalid_idempotent_request (409): the key was used with a different payload.
  • rate_limit_exceeded (429)
  • daily_quota_exceeded (429): the sandbox, daily limit or a tenant’s daily_limit was reached.
  • monthly_quota_exceeded (429): the plan’s monthly limit was reached (Free plan).
  • invalid_from_address (403): the sender domain is not verified.
  • invalid_access (422; 403 when a team that is not trusted tries to unpause a tenant paused for its bounce or complaint rate)
  • invalid_parameter (422)
  • sending_paused (403): sending is paused for the team, or for the tenant named by tenant_id, after a bounce or complaint spike or a manual pause.
  • security_error (451)
  • application_error (500)
  • internal_server_error (500)
string
Allowed values: missing_api_key invalid_api_key restricted_api_key validation_error not_found method_not_allowed invalid_idempotency_key concurrent_idempotent_requests invalid_idempotent_request rate_limit_exceeded daily_quota_exceeded monthly_quota_exceeded invalid_from_address invalid_access invalid_parameter sending_paused security_error application_error internal_server_error
message
required
string

Examples

{
"statusCode": 422,
"name": "validation_error",
"message": "`subject`: Invalid input: expected string, received undefined"
}

An error. Common statuses: 400 invalid_idempotency_key; 401 missing_api_key or restricted_api_key; 403 invalid_api_key, invalid_from_address, sending_paused (team or tenant) or invalid_access; 404 not_found; 409 invalid_idempotent_request or concurrent_idempotent_requests; 422 validation_error (also: tenant_id conflicts with the domain’s tenant; deleting a tenant that still has domains); 429 quota errors.

Media typeapplication/json
object
statusCode
required
integer
name
required

Machine-readable error name.

  • missing_api_key (401): no bearer token.
  • invalid_api_key (403): unknown or malformed key.
  • restricted_api_key (401): the key is sending_access (or limited to another domain).
  • validation_error (422): invalid request. Also used with 403 for plan limits and test-domain restrictions.
  • not_found (404): the resource does not exist or belongs to another team.
  • method_not_allowed (405)
  • invalid_idempotency_key (400): key length outside 1 to 256.
  • concurrent_idempotent_requests (409): the original request is still running.
  • invalid_idempotent_request (409): the key was used with a different payload.
  • rate_limit_exceeded (429)
  • daily_quota_exceeded (429): the sandbox, daily limit or a tenant’s daily_limit was reached.
  • monthly_quota_exceeded (429): the plan’s monthly limit was reached (Free plan).
  • invalid_from_address (403): the sender domain is not verified.
  • invalid_access (422; 403 when a team that is not trusted tries to unpause a tenant paused for its bounce or complaint rate)
  • invalid_parameter (422)
  • sending_paused (403): sending is paused for the team, or for the tenant named by tenant_id, after a bounce or complaint spike or a manual pause.
  • security_error (451)
  • application_error (500)
  • internal_server_error (500)
string
Allowed values: missing_api_key invalid_api_key restricted_api_key validation_error not_found method_not_allowed invalid_idempotency_key concurrent_idempotent_requests invalid_idempotent_request rate_limit_exceeded daily_quota_exceeded monthly_quota_exceeded invalid_from_address invalid_access invalid_parameter sending_paused security_error application_error internal_server_error
message
required
string

Examples

{
"statusCode": 422,
"name": "validation_error",
"message": "`subject`: Invalid input: expected string, received undefined"
}

An error. Common statuses: 400 invalid_idempotency_key; 401 missing_api_key or restricted_api_key; 403 invalid_api_key, invalid_from_address, sending_paused (team or tenant) or invalid_access; 404 not_found; 409 invalid_idempotent_request or concurrent_idempotent_requests; 422 validation_error (also: tenant_id conflicts with the domain’s tenant; deleting a tenant that still has domains); 429 quota errors.

Media typeapplication/json
object
statusCode
required
integer
name
required

Machine-readable error name.

  • missing_api_key (401): no bearer token.
  • invalid_api_key (403): unknown or malformed key.
  • restricted_api_key (401): the key is sending_access (or limited to another domain).
  • validation_error (422): invalid request. Also used with 403 for plan limits and test-domain restrictions.
  • not_found (404): the resource does not exist or belongs to another team.
  • method_not_allowed (405)
  • invalid_idempotency_key (400): key length outside 1 to 256.
  • concurrent_idempotent_requests (409): the original request is still running.
  • invalid_idempotent_request (409): the key was used with a different payload.
  • rate_limit_exceeded (429)
  • daily_quota_exceeded (429): the sandbox, daily limit or a tenant’s daily_limit was reached.
  • monthly_quota_exceeded (429): the plan’s monthly limit was reached (Free plan).
  • invalid_from_address (403): the sender domain is not verified.
  • invalid_access (422; 403 when a team that is not trusted tries to unpause a tenant paused for its bounce or complaint rate)
  • invalid_parameter (422)
  • sending_paused (403): sending is paused for the team, or for the tenant named by tenant_id, after a bounce or complaint spike or a manual pause.
  • security_error (451)
  • application_error (500)
  • internal_server_error (500)
string
Allowed values: missing_api_key invalid_api_key restricted_api_key validation_error not_found method_not_allowed invalid_idempotency_key concurrent_idempotent_requests invalid_idempotent_request rate_limit_exceeded daily_quota_exceeded monthly_quota_exceeded invalid_from_address invalid_access invalid_parameter sending_paused security_error application_error internal_server_error
message
required
string

Examples

{
"statusCode": 422,
"name": "validation_error",
"message": "`subject`: Invalid input: expected string, received undefined"
}

Too many requests (rate_limit_exceeded), or a daily or monthly sending quota was reached (daily_quota_exceeded also means a tenant’s daily_limit).

Media typeapplication/json
object
statusCode
required
integer
name
required

Machine-readable error name.

  • missing_api_key (401): no bearer token.
  • invalid_api_key (403): unknown or malformed key.
  • restricted_api_key (401): the key is sending_access (or limited to another domain).
  • validation_error (422): invalid request. Also used with 403 for plan limits and test-domain restrictions.
  • not_found (404): the resource does not exist or belongs to another team.
  • method_not_allowed (405)
  • invalid_idempotency_key (400): key length outside 1 to 256.
  • concurrent_idempotent_requests (409): the original request is still running.
  • invalid_idempotent_request (409): the key was used with a different payload.
  • rate_limit_exceeded (429)
  • daily_quota_exceeded (429): the sandbox, daily limit or a tenant’s daily_limit was reached.
  • monthly_quota_exceeded (429): the plan’s monthly limit was reached (Free plan).
  • invalid_from_address (403): the sender domain is not verified.
  • invalid_access (422; 403 when a team that is not trusted tries to unpause a tenant paused for its bounce or complaint rate)
  • invalid_parameter (422)
  • sending_paused (403): sending is paused for the team, or for the tenant named by tenant_id, after a bounce or complaint spike or a manual pause.
  • security_error (451)
  • application_error (500)
  • internal_server_error (500)
string
Allowed values: missing_api_key invalid_api_key restricted_api_key validation_error not_found method_not_allowed invalid_idempotency_key concurrent_idempotent_requests invalid_idempotent_request rate_limit_exceeded daily_quota_exceeded monthly_quota_exceeded invalid_from_address invalid_access invalid_parameter sending_paused security_error application_error internal_server_error
message
required
string

Example

{
"statusCode": 429,
"name": "rate_limit_exceeded",
"message": "Too many requests. You can only make 10 requests per second."
}
retry-after
integer

Seconds to wait before retrying.

ratelimit-limit
integer

Requests allowed per second for your team.

ratelimit-remaining
integer

Requests left in the current one-second window.

ratelimit-reset
integer

Seconds until the window resets.