mail

POST /v1/mail/services/{mailServiceId}/provider

Move a domain's email to a different provider.

All mail endpoints

All developer docs →

Authentication

Send an API key as a bearer token. The key must carry the mail.manage permission; a key without it is refused with 403, not 404.

This endpoint takes no organisation id. Your key already identifies the organisation it belongs to, and the response is scoped to it.

Try it

Replace anything in angle brackets with your own values, and the key placeholder with a key from your dashboard.

curl -X POST https://api.zinndigital.com/v1/mail/services/{mailServiceId}/provider \
  -H "Authorization: Bearer zdk_live_…" \
  -H "Content-Type: application/json" \
  -d '{ "provider": <MailProvider> }'

Signed in? The API console in your dashboard fills in your real organisation id and your own key, and runs the request against the live API so you can see the actual response. Open this endpoint in the API console

Details

Repoints this domain at another mail provider — our own email, Google Workspace or Microsoft 365 — and, when moving away from ours, destroys the mailboxes we were hosting for it. ⛔ Not the same as DELETE, and the difference is the post-condition. A delete ends with no mail service at all; a switch ends with a live one on the new provider, publishing that provider's records. Using the delete for this would leave the domain with no email a moment after the customer chose some. The order is the safety property: the DNS records are repointed FIRST, and the mailboxes destroyed second. The reverse loses mail — between a destroy and a repoint the MX still names mailboxes that no longer exist, and everything sent in that window bounces. Doing it this way costs a brief period in which both could receive, which is the harmless failure. confirm_fqdn — the domain typed back — is required when the switch destroys mailboxes we run, and ignored otherwise. Owner ruling 2026-08-14: type the domain, no grace period. The mailboxes and their contents are gone at the vendor the moment this runs. ⛔ 422, writing nothing and changing nothing, when the domain's DNS is managed by an external app (dns_managed_externally on the platform domain, docs/845 §9). Switching to the provider a domain is already on is a no-op that returns the service, so a retry is idempotent. Requires mail.manage.

Parameters

NameTypeRequiredWhat it is
mailServiceId (path)UuidYesEmail service ID (UUIDv7).

Request body

NameTypeRequiredWhat it is
providerMailProviderYesWhich provider serves a domain's mail. custom is the reseller's own provider (W40-MAIL, owner ruling 2026-09-06): a white-label reseller sells mail they buy elsewhere,…
provider_configMailProviderConfig | nullNoRequired in effect when provider is custom (an empty MX list is refused); ignored otherwise. A custom → custom call with different values is a re-declaration — the…
confirm_fqdnstringNoThe domain, typed back by the customer. Required when the switch destroys mailboxes we host — i.e. when moving away from zinn on a domain that has any — and ignored…

Response

NameTypeRequiredWhat it is
idUuidYesUUIDv7 identifier — sortable by creation time (docs/02 §8).
fqdnstringYesThe domain the mailboxes are on.
provider_configMailProviderConfig | nullNoThe custom provider's declared values, served back so the domain screen can show and edit what was declared. null on every other provider, whose values are documented and…
siteMailServiceSite | nullNoThe site currently serving this domain, or null when no site does. Derived from the hostname, never stored: mail attaches to a domain and a domain outlives the site on it,…
mailbox_provisioningMailboxProvisioningYesWhether we pre-create a starter mailbox on this domain. managed — we make one when the domain is provisioned (the Footprint-Free/PBN line and our own fleet); self_service…
mail_onlybooleanYesThis domain uses us for mail and nothing else — an active mail service on a hostname no website of ours serves. Published as one server-side answer because more than one…
domain_idUuid | nullNoThe registered domain this serves, when we hold the registration.
statusMailServiceStatusYesA mail service's lifecycle state.
providerMailProviderYesWhich provider serves a domain's mail. custom is the reseller's own provider (W40-MAIL, owner ruling 2026-09-06): a white-label reseller sells mail they buy elsewhere,…
mailbox_quota_mbintegerYesSize of each mailbox in MB, captured when the service was created.
mailbox_limitintegerYesMailboxes allowed on this domain; -1 is uncapped. Captured when the service was created; a later downgrade is enforced against the live plan as well, so the number actually…
mailboxes_usedintegerYesHow many mailboxes currently consume the allowance.
dns_applied_atobjectNoWhen the mail DNS was last published. null means never — mailboxes that exist but receive nothing, which is the one state a customer must be told about.
awaiting_delegationbooleanNotrue when the service's mail records are STAGED in our zone and the domain is still delegated elsewhere (a domain moving to us before its nameserver change): mailboxes,…
created_atstringYes—

Errors this endpoint can return

401 · 403 · 404 · 409 · 422 · 429 · 503