Domain Verification
Verify your domain to send emails and improve deliverability. You can manage domains through the Dashboard or the API.
Why Verify?
- Required to send production emails
- Improves inbox placement
- Enables DKIM signing
- Protects your brand
Add Your Domain
Via Dashboard
- Navigate to Domains in the sidebar
- Click Add Domain
- Enter your sending domain (e.g.,
mail.yourapp.com) - Zyphr returns the DNS records you need to add
Via API
curl -X POST https://api.zyphr.dev/v1/domains \
-H "X-API-Key: zy_live_your_key" \
-H "Content-Type: application/json" \
-d '{ "domain": "mail.yourapp.com" }'
const domain = await zyphr.domains.create({
domain: 'mail.yourapp.com',
});
// domain.dns_records contains the records to add
console.log(domain.dns_records);
The response includes all DNS records you need to configure.
Add DNS Records
Add the following records to your DNS provider:
DKIM Records (3 CNAME records):
selector1._domainkey.mail.yourapp.com → dkim1.zyphr.dev
selector2._domainkey.mail.yourapp.com → dkim2.zyphr.dev
selector3._domainkey.mail.yourapp.com → dkim3.zyphr.dev
SPF Record (TXT):
v=spf1 include:spf.zyphr.dev ~all
DMARC Record (TXT):
v=DMARC1; p=none; rua=mailto:dmarc@zyphr.dev
This is the record the dashboard generates for you. The rua= address points at
Zyphr so we receive the aggregate reports and show them to you under
Email → Deliverability — see DMARC reports below for what
we store and how to change it.
DMARC reports
If your DMARC record points its rua= address at Zyphr, mailbox providers send
us daily aggregate reports about your domain, and we surface them under
Email → Deliverability.
What the reports tell you
Each report names every source that sent mail using your domain and whether that mail passed SPF and DKIM alignment. That is the most direct answer to "why is my mail going to spam" — a source failing authentication is mail claiming to be you that receivers could not verify.
You will see a daily pass/fail trend, a per-domain breakdown, and per-source results. Expanding a domain also splits results by receiver, which matters: a domain that passes at one provider and fails at another usually has an alignment problem specific to how that provider evaluates it.
What we store, and for how long
| Stored | Source IP addresses, per-source message counts, SPF/DKIM results, the disposition the receiver applied, and the From domains in the report |
| Not stored | Message content, subjects, and recipient addresses — aggregate reports do not contain them |
| Retention | Parsed results 13 months. The original report file is also kept for 100 days so it can be re-processed if needed — it expires before the results it produced |
| Scope | Reports are stored against the project that owns the domain. No other customer can see them |
An aggregate report lists every system sending mail as your domain — your own infrastructure, other vendors you use, and anyone spoofing you. That breadth is what makes the data useful, and it means the report includes systems Zyphr never touched.
If you would rather we did not receive this, point rua= at your own address
instead — see below. Reports for domains we do not host are discarded without
being stored.
Sending reports somewhere else
The record we generate points rua= at Zyphr, which is what makes the
Deliverability view work. You are not locked into it — the reporting address
lives in your DNS, so you can change it at any time.
To send reports to your own mailbox instead:
v=DMARC1; p=none; rua=mailto:dmarc@yourdomain.com
Or list both, and get them in each place:
v=DMARC1; p=none; rua=mailto:dmarc@zyphr.dev,mailto:dmarc@yourdomain.com
A domain that publishes more than one v=DMARC1 record has no DMARC policy
at all — receivers discard all of them (RFC 7489). If you already have a DMARC
record, edit it rather than adding a second one. Zyphr flags this on the
Domains page if it detects it.
Verify Your Domain
After adding DNS records (may take up to 48 hours to propagate):
Via Dashboard
- Go to Domains in the sidebar
- Find your domain and click Verify
- Zyphr checks your DNS records
- Once verified, the status updates to Verified
Via API
curl -X POST https://api.zyphr.dev/v1/domains/DOMAIN_ID/check \
-H "X-API-Key: zy_live_your_key"
const result = await zyphr.domains.verify('DOMAIN_ID');
console.log(result.status); // 'verified' or 'pending'
List Domains
Via Dashboard
Navigate to Domains in the sidebar to see all your domains with their verification status.
Via API
curl https://api.zyphr.dev/v1/domains \
-H "X-API-Key: zy_live_your_key"
const { data: domains } = await zyphr.domains.list();
Set Default Domain
Via Dashboard
On the Domains page, click the menu on a verified domain and select Set as Default.
Via API
curl -X POST https://api.zyphr.dev/v1/domains/DOMAIN_ID/default \
-H "X-API-Key: zy_live_your_key"
Delete a Domain
Via Dashboard
On the Domains page, click the menu on a domain and select Delete.
Via API
curl -X DELETE https://api.zyphr.dev/v1/domains/DOMAIN_ID \
-H "X-API-Key: zy_live_your_key"
Domain Status
| Status | Description |
|---|---|
pending | Awaiting DNS records |
verifying | DNS check in progress |
verified | Ready to send |
failed | Verification failed |
Plan Limits
| Plan | Max Domains |
|---|---|
| Free | 1 |
| Starter | 5 |
| Professional | 25 |
| Enterprise | Unlimited |