Skip to main content

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

  1. Navigate to Domains in the sidebar
  2. Click Add Domain
  3. Enter your sending domain (e.g., mail.yourapp.com)
  4. 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

StoredSource IP addresses, per-source message counts, SPF/DKIM results, the disposition the receiver applied, and the From domains in the report
Not storedMessage content, subjects, and recipient addresses — aggregate reports do not contain them
RetentionParsed 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
ScopeReports are stored against the project that owns the domain. No other customer can see them
Reports describe more than the mail we send

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
Publish exactly one DMARC record

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

  1. Go to Domains in the sidebar
  2. Find your domain and click Verify
  3. Zyphr checks your DNS records
  4. 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

StatusDescription
pendingAwaiting DNS records
verifyingDNS check in progress
verifiedReady to send
failedVerification failed

Plan Limits

PlanMax Domains
Free1
Starter5
Professional25
EnterpriseUnlimited