Domains
Add sending domains, configure DNS records, and verify ownership.
One-click Cloudflare DNS setup
If your domain uses Cloudflare DNS, SMTPfast can configure DKIM, SPF, DMARC, and the MAIL FROM bounce subdomain in one step via Cloudflare Domain Connect. No copy-pasting DNS records.
- Add the domain in SMTPfast. SMTPfast detects you are on Cloudflare from the NS records.
- On the domain detail page, click Connect Cloudflare. A new tab opens at
dash.cloudflare.comshowing every DNS record SMTPfast wants to add for this domain. - Approve. Cloudflare writes the records, then redirects you back to SMTPfast.
- Click Verify Now on the detail page. Status flips to verified within a few minutes.
For every other provider (GoDaddy, IONOS, Squarespace, Namecheap, Route 53, etc.) the manual DNS records below still work. We are rolling out one-click setup to additional providers as their Domain Connect templates get onboarded.
/v1/domainsAdd a new sending domain. Returns the DNS records you need to configure.
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| domain | string | Yes | The domain name to add (e.g. yourapp.com) |
Request Body
{
"domain": "yourapp.com"
}Response
{
"id": "dom_xyz789",
"domain": "yourapp.com",
"status": "pending",
"dns_records": [
{
"type": "CNAME",
"name": "abc123._domainkey.yourapp.com",
"value": "abc123.dkim.amazonses.com",
"purpose": "DKIM authentication"
},
{
"type": "CNAME",
"name": "def456._domainkey.yourapp.com",
"value": "def456.dkim.amazonses.com",
"purpose": "DKIM authentication"
},
{
"type": "CNAME",
"name": "ghi789._domainkey.yourapp.com",
"value": "ghi789.dkim.amazonses.com",
"purpose": "DKIM authentication"
},
{
"type": "TXT",
"name": "yourapp.com",
"value": "v=spf1 include:amazonses.com ~all",
"purpose": "SPF authorization"
},
{
"type": "TXT",
"name": "_dmarc.yourapp.com",
"value": "v=DMARC1; p=none;",
"purpose": "DMARC policy"
},
{
"type": "MX",
"name": "bounce.yourapp.com",
"value": "feedback-smtp.us-east-1.amazonses.com",
"priority": 10,
"purpose": "MAIL FROM bounce delivery"
},
{
"type": "TXT",
"name": "bounce.yourapp.com",
"value": "v=spf1 include:amazonses.com ~all",
"purpose": "MAIL FROM SPF"
}
],
"created_at": "2026-04-01T10:00:00.000Z"
}/v1/domainsList all domains on your account with their verification status.
Response
{
"object": "list",
"has_more": false,
"data": [
{
"id": "dom_xyz789",
"domain": "yourapp.com",
"status": "verified",
"dkim_status": "verified",
"spf_status": "verified",
"dmarc_status": "verified",
"verified_at": "2026-04-01T10:15:00Z",
"created_at": "2026-04-01T10:00:00Z",
"receiving_enabled": false,
"receiving_status": "disabled"
}
]
}/v1/domains/:idGet full details for a domain including its DNS records and verification status.
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| id | string | Yes | The domain ID |
Response
{
"id": "dom_xyz789",
"domain": "yourapp.com",
"status": "verified",
"created_at": "2026-04-01T10:00:00Z",
"verified_at": "2026-04-01T10:15:00Z",
"dns_records": [
{
"type": "CNAME",
"name": "abc123._domainkey.yourapp.com",
"value": "abc123.dkim.amazonses.com",
"status": "verified"
},
{
"type": "CNAME",
"name": "def456._domainkey.yourapp.com",
"value": "def456.dkim.amazonses.com",
"status": "verified"
},
{
"type": "CNAME",
"name": "ghi789._domainkey.yourapp.com",
"value": "ghi789.dkim.amazonses.com",
"status": "verified"
},
{
"type": "TXT",
"name": "_dmarc.yourapp.com",
"value": "v=DMARC1; p=none;",
"status": "verified"
}
]
}/v1/domains/:id/verifyTrigger a verification check for the domain. SMTPfast will query your DNS records and update the status.
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| id | string | Yes | The domain ID |
Response
{
"domain": "yourapp.com",
"status": "pending",
"verification_phase": "dns_missing",
"checks": {
"dkim": "pending",
"spf": "verified",
"dmarc": "pending",
"mail_from": "pending"
},
"mail_from_domain": "bounce.yourapp.com",
"ses_configured": true,
"dkim_check_restarted": false,
"message": "Some required DNS records are not visible or do not match yet. Check the DNS table for the live status of each record."
}Claiming a domain another account holds
A domain belongs to one account. If someone added your domain before you (a former contractor, an old account, a typo on their side) and never verified it, adding it returns 409 with code: "domain_claimable" and a TXT record bound to your team. Publish that record, call the claim endpoint, and the domain moves to you in its unverified state; you then publish the DKIM, SPF and DMARC records as usual. The previous holder is told by email and any mail they still had queued through the domain is cancelled. A domain the other account verified at any point in the past cannot be claimed this way; contact support.
/v1/domains/claimThe TXT record to publish before claiming a domain. Requires the domain:read scope.
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| domain | string | Yes | The domain to claim (query parameter) |
Response
{
"domain": "acme.com",
"record": { "type": "TXT", "name": "_smtpfast-claim.acme.com", "value": "smtpfast-claim=3f9a...", "ttl": "Auto" }
}/v1/domains/claimCheck the TXT record and move the domain to your team. Requires the domain:write scope. Limited to 20 checks per hour per team.
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| domain | string | Yes | The domain to claim |
Request Body
{ "domain": "acme.com" }Response
{
"id": "dom_xyz789",
"domain": "acme.com",
"status": "pending",
"created_at": "2026-09-03T09:00:00.000Z",
"message": "Domain claimed. Publish its DNS records to verify it for sending."
}DNS Record Types
DKIM (CNAME records)
DomainKeys Identified Mail cryptographically signs outgoing emails so receiving servers can verify they came from your domain. SMTPfast provides three SES DKIM CNAME records.
SPF (TXT record)
Sender Policy Framework tells receiving servers which mail servers are allowed to send email on behalf of your domain. SMTPfast should be included in your existing SPF record if one already exists. Do not publish multiple SPF TXT records for the same hostname; merge providers into one record instead.
DMARC (TXT record)
Domain-based Message Authentication, Reporting, and Conformance defines how receiving servers should handle emails that fail SPF or DKIM checks. A basic p=none policy is recommended to start, then tighten to p=quarantine or p=reject once you confirm everything works.
MAIL FROM (MX and TXT records)
SMTPfast uses a bounce subdomain such as bounce.yourapp.com so bounce handling and SPF alignment match your sending domain. Two records are needed on the bounce subdomain: an MX pointing at SES (so receivers can deliver bounce reports) and a SPF TXT authorising SES on the bounce subdomain itself.
Troubleshooting
Status stuck on “DNS records visible, waiting for SES”
SES has seen your DKIM records and is finishing identity verification on its own schedule (typically minutes, sometimes up to a few hours). Click Verify Now on the domain detail page to refresh status. No action needed.
MAIL FROM shows “Failed” even though the records are in DNS
SES does not auto-retry MAIL FROM verification once it has marked the configuration failed. Click Verify Now in the SMTPfast UI; it re-arms the MAIL FROM identity behind the scenes which kicks SES into a fresh check. Status moves back to pending, then to verified within a few minutes if the records are correct.
DKIM stays on “Failed” for several hours
Confirm the three CNAME records are present and resolvable (most DNS providers proxy CNAMEs by default; on Cloudflare, ensure the cloud icon next to each DKIM CNAME is grey, not orange). If the records are correct and DKIM still shows as Failed, contact us at [email protected] and we will retry verification on the SES side.
I want to delete a domain and start over
The domain detail page has a Danger zone at the bottom of the Configuration tab. Deleting removes the SES identity, all DKIM tokens, and verification state. Any API key still sending from that domain stops working immediately. Re-adding the same domain afterwards generates fresh DKIM tokens, so the existing CNAMEs in DNS need to be replaced.
Delete and one-click DNS
Delete a domain, or let the domain owner add the DNS records on Cloudflare with one approval.
/v1/domains/{id}Delete a domain and its sending identity. Owners and admins only.
Response
{ "success": true, "domain": "yourapp.com" }/v1/domains/{id}/domain-connect/cloudflareGet a Domain Connect link that adds the sending records on Cloudflare after the owner approves.
/v1/domains/{id}/domain-connect/cloudflare-inboundGet a Domain Connect link that adds the MX record for receiving.
Custom link domains
By default the open pixel, tracked links and unsubscribe links in your email point at smtpfa.st. Add a link domain such as links.example.com and they use your own hostname instead, so links match your brand and pass "link domain matches sending domain" checks.
- Link domains are on paid plans. The hostname must be a subdomain of one of your verified sending domains. Each sending domain can have one link domain.
- Publish one CNAME record pointing the hostname at
links.smtpfa.st. SMTPfast gets a TLS certificate for it through Cloudflare, usually within minutes, and checks the status for you. If your DNS is on Cloudflare, the record can stay DNS only. - While the link domain is active, every email whose From address is on the same domain (for example [email protected] or [email protected]) uses it for the open pixel, click tracking, the unsubscribe link and the List-Unsubscribe header. Everything else about the email stays the same.
- Links in email you sent before keep working, on smtpfa.st and on the link domain, as long as the link domain exists. Deleting it takes it out of use at once. On the free plan, new email uses smtpfa.st links, also when a link domain was added on a paid plan before.
- Each record in dns_records has a status. Once the link domain is active, the CNAME is verified (keep it, certificate renewals need it) and a TXT record is not_needed, so you can remove it.
- The hostname serves tracking and unsubscribe links only. Every other path answers 404.
In the dashboard, open the domain and use the Link domain tab. The API needs the domain:read and domain:write scopes; adding and deleting a link domain needs an owner or admin.
/v1/link-domainsAdd a link domain. Returns the DNS records to publish. Limited to 5 per hour per team.
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| hostname | string | Yes | A subdomain of a verified sending domain, e.g. links.example.com |
Request Body
{ "hostname": "links.example.com" }Response
{
"object": "link_domain",
"id": "cmlink123",
"hostname": "links.example.com",
"domain_id": "dom_xyz789",
"domain": "example.com",
"status": "pending",
"ssl_status": "pending_validation",
"last_error": "custom hostname does not CNAME to this zone.",
"dns_records": [
{
"type": "CNAME",
"name": "links.example.com",
"value": "links.smtpfa.st",
"ttl": "Auto",
"purpose": "Points the link domain at SMTPfast",
"required": true,
"status": "pending"
},
{
"type": "TXT",
"name": "_cf-custom-hostname.links.example.com",
"value": "5cc2a1b6-0d8e-4c5f-9e6a-1f2b3c4d5e6f",
"ttl": "Auto",
"purpose": "Hostname ownership (optional, activates the hostname before the CNAME is live)",
"required": false,
"status": "pending"
}
],
"verified_at": null,
"last_checked_at": "2026-10-11T09:00:00.000Z",
"created_at": "2026-10-11T09:00:00.000Z"
}/v1/link-domainsList your link domains. available is false when the feature is not available; included_in_plan is false on the free plan.
Response
{
"object": "list",
"has_more": false,
"available": true,
"included_in_plan": true,
"data": []
}/v1/link-domains/:idGet one link domain with its status and DNS records, as of the last check.
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| id | string | Yes | The link domain ID |
/v1/link-domains/:id/refreshAsk Cloudflare for the current status now. Pending link domains are checked every few minutes and active ones daily, so this is only needed right after you publish the record. It also restarts checks on a failed link domain.
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| id | string | Yes | The link domain ID |
Response
{
"object": "link_domain",
"id": "cmlink123",
"hostname": "links.example.com",
"domain_id": "dom_xyz789",
"domain": "example.com",
"status": "active",
"ssl_status": "active",
"last_error": null,
"dns_records": [
{
"type": "CNAME",
"name": "links.example.com",
"value": "links.smtpfa.st",
"ttl": "Auto",
"purpose": "Points the link domain at SMTPfast",
"required": true,
"status": "verified"
},
{
"type": "TXT",
"name": "_cf-custom-hostname.links.example.com",
"value": "5cc2a1b6-0d8e-4c5f-9e6a-1f2b3c4d5e6f",
"ttl": "Auto",
"purpose": "Hostname ownership (optional, activates the hostname before the CNAME is live)",
"required": false,
"status": "not_needed"
}
],
"verified_at": "2026-10-11T09:04:00.000Z",
"last_checked_at": "2026-10-11T09:04:00.000Z",
"created_at": "2026-10-11T09:00:00.000Z"
}/v1/link-domains/:idDelete a link domain. Email goes back to smtpfa.st links at once. Owners and admins only.
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| id | string | Yes | The link domain ID |
Response
{ "object": "link_domain", "id": "cmlink123", "deleted": true }