Add a domain
Send from your own domain by adding a few DNS records. We check them for you.
Sending from your own domain (hello@acme.ng) is what makes mailbox providers trust your email. Adding one takes a few DNS records at your domain registrar, such as Whogohost, Qservers, Truehost, Cloudflare, Namecheap or GoDaddy.
1. Add the domain
const domain = await pm.domains.create({ name: "acme.ng" });
for (const r of domain.records) console.log(r.type, r.host, r.value);You can use a subdomain such as mail.acme.ng if your main domain's email is handled elsewhere. Your existing email (Google Workspace, Zoho and so on) keeps working either way.
2. Add the records
The response, and the domain's page in the dashboard, list each record to add:
| Purpose | Type | What it does |
|---|---|---|
dkim | CNAME (three of them) | Signs your email so receivers know it's really from you |
mail_from_mx, mail_from_spf | MX and TXT on bounce.acme.ng | Lets bounces come back to us, and passes SPF for your domain |
dmarc | TXT on _dmarc.acme.ng | Tells receivers what to do with mail that fails the checks. Recommended; we suggest p=none to start |
tracking_cname | CNAME | Only if you turn on open or click tracking |
Copy the host and value exactly. Some registrars add your domain to the host automatically: if the host is abc._domainkey.acme.ng and the form already shows .acme.ng, enter only abc._domainkey.
3. Check
We check new domains automatically for 72 hours. To check now (at most once a minute):
const checked = await pm.domains.verify(domain.id);
for (const r of checked.records) console.log(r.purpose, r.status, r.found_value);curl -X POST https://api.padimail.app/v1/domains/dom_01JB.../verify -H "Authorization: Bearer $PADIMAIL_API_KEY"Each record shows verified, not_found (not visible yet: DNS can take up to an hour, occasionally longer) or mismatch (a record exists but with a different value, shown in found_value). When the required records are verified the domain becomes verified and you get a domain.verified webhook. A domain still unverified after 72 hours is marked failed; fix the records and check again.
Tracking
Open and click tracking are off by default. Turn them on per domain:
await pm.domains.update(domain.id, { open_tracking: true, click_tracking: true });Opens are approximate: some mail apps load images for privacy whether or not the email is read.
Remove a domain
DELETE /v1/domains/{id} stops sending from it at once, and cancels its scheduled emails.