PadiMail Docs
Domains

Add a domain

Send from your own domain by adding a few DNS records. We check them for you.

NeedsTier 1: IndividualYou can add a domain and verify its records at any tier. Sending from it to anyone needs Tier 1.

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:

PurposeTypeWhat it does
dkimCNAME (three of them)Signs your email so receivers know it's really from you
mail_from_mx, mail_from_spfMX and TXT on bounce.acme.ngLets bounces come back to us, and passes SPF for your domain
dmarcTXT on _dmarc.acme.ngTells receivers what to do with mail that fails the checks. Recommended; we suggest p=none to start
tracking_cnameCNAMEOnly 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.

Was this page helpful?

On this page