Email domains Live
Register a domain you own (such as acme.com) and verify the DNS records that let message.com send outbound replies as you and receive inbound tickets at your custom local-parts. Required for any custom_domain inbound address.
List domains
Code samples
curl 'https://app.message.com/api/v1/email-domains' \
-H 'Authorization: Bearer YOUR_WORKSPACE_JWT'const res = await fetch('https://app.message.com/api/v1/email-domains', {
headers: { Authorization: 'Bearer ' + token }
});
const { domains } = await res.json();import requests
r = requests.get(
"https://app.message.com/api/v1/email-domains",
headers={"Authorization": f"Bearer {token}"},
)
domains = r.json()["domains"]require "net/http"
require "json"
uri = URI("https://app.message.com/api/v1/email-domains")
res = Net::HTTP.start(uri.host, uri.port, use_ssl: true) do |http|
req = Net::HTTP::Get.new(uri)
req["Authorization"] = "Bearer #{token}"
http.request(req)
end
domains = JSON.parse(res.body)["domains"]<?php
$ctx = stream_context_create([
"http" => ["method" => "GET", "header" => "Authorization: Bearer $token"]
]);
$domains = json_decode(file_get_contents("https://app.message.com/api/v1/email-domains", false, $ctx), true)["domains"];Add a domain
Registers a new domain and returns the DNS records you must add at your registrar. Domain status begins as pending and flips to verified when all records are reachable.
| Field | Type | Description |
|---|---|---|
| domainrequired | string | The apex domain. We register the apex; subdomains inherit. |
{ "domain": "acme.com" }{
"id": "uuid",
"domain": "acme.com",
"status": "verified",
"dnsRecords": [
{ "type": "MX", "host": "@", "value": "10 mx.message.com", "verified": true },
{ "type": "TXT", "host": "@", "value": "v=spf1 include:_spf.message.com ~all", "verified": true },
{ "type": "CNAME", "host": "msg._domainkey", "value": "msg.dkim.message.com", "verified": true }
],
"createdAt": "2026-05-13T15:00:00Z"
}Get one domain
Returns the domain record with the live DNS verification state for each record.
Re-check DNS
Forces a re-check against your authoritative DNS. We poll every five minutes automatically; use this endpoint when you have just changed DNS and want immediate feedback.
Remove a domain
Removes the domain registration and unbinds any inbound addresses that depended on it. Outbound replies revert to the workspace default [email protected].
DNS records
Three records, all on the apex:
- MX. Points inbound mail to
mx.message.com. Required for ticket creation. - SPF (TXT). Authorises our outbound IPs to send as your domain.
- DKIM (CNAME). Signs outbound mail with our key. Improves deliverability significantly.
- DMARC (optional). Strongly recommended at
p=quarantineor higher. See the DMARC RFC.
Most failures here are propagation delays. Allow up to 24 hours after editing DNS before assuming a record is wrong.
Errors
| Code | When |
|---|---|
400 invalid_body | Domain string is not a valid DNS apex. |
403 forbidden | Agent role is not admin. |
409 conflict | Domain already registered to another workspace. |
422 dns_unverified | Action requires verified DNS; one or more records still pending. |
Common pitfalls
- Adding an MX record without removing the old one. Multiple MX records of equal priority cause unpredictable routing. Either remove the old MX or set ours to lower preference.
- Forgetting DKIM. Without DKIM, expect Gmail and Microsoft 365 to spam-foldering your outbound replies.
- Verifying a subdomain instead of the apex. We require the apex. If you want inbound only on
support.acme.com, registeracme.comand use a subdomain inbound address.