Account API

Domains API

Add a sending domain and poll its DNS verification.

View as Markdown ↗

Either key. A project key manages its own project's domains at /v1/domains; an all-access key does the same for any project by naming it in the path. Setting up sending is the first thing a project does, so it doesn't need the wider credential. How keys and scopes work.

Endpoints

With a project key — no project id, because the key already says which one:

GET/v1/domains
POST/v1/domains
GET/v1/domains/{domain_id}
DELETE/v1/domains/{domain_id}
GET/v1/domains/{domain_id}/dns-check
POST/v1/domains/{domain_id}/dkim/key-length
POST/v1/domains/{domain_id}/tracking
DELETE/v1/domains/{domain_id}/tracking

With an all-access key, naming the project:

GET/v1/projects/{project_id}/domains
POST/v1/projects/{project_id}/domains
GET/v1/projects/{project_id}/domains/{domain_id}
DELETE/v1/projects/{project_id}/domains/{domain_id}
GET/v1/projects/{project_id}/domains/{domain_id}/dns-check
POST/v1/projects/{project_id}/domains/{domain_id}/dkim/key-length

Same bodies, same responses. Add the domain a project sends from and publish the DNS records that come back. Until one is verified, sends use the shared testing domain — see Sending domains for why that matters.

Two limits

The account's email address must be confirmed before a domain can be added — each one creates a real sending identity, so we ask you to prove the mailbox first. And a project holds up to 25 domains.

List a project's domains

cURL
# project key
curl https://emailbump.com/api/v1/domains \
  -H "Authorization: Bearer ebk_your_key"

# all-access key
curl https://emailbump.com/api/v1/projects/PROJECT_ID/domains \
  -H "Authorization: Bearer ebk_all_access_key"

Returns every sending domain on the project with its verification state and the DNS records it needs. Check this before setting a From address: mail from a domain that isn’t verified doesn’t land anywhere good.

Add a domain

Body parameters

domainstringrequired

The domain to send from, e.g. mail.acme.com.

cURL
# project key
curl -X POST https://emailbump.com/api/v1/domains \
  -H "Authorization: Bearer ebk_your_key" \
  -H "Content-Type: application/json" \
  -d '{ "domain": "mail.acme.com" }'

# all-access key
curl -X POST https://emailbump.com/api/v1/projects/7a10…/domains \
  -H "Authorization: Bearer ebk_all_access_key" \
  -H "Content-Type: application/json" \
  -d '{ "domain": "mail.acme.com" }'

The response carries the DKIM and mail-from records to publish at your DNS provider, exactly as they should be entered.

Branded link tracking

Until you turn this on, links in your mail are rewritten through Email Bump's shared tracking domain. That works — clicks are recorded and nothing breaks — but someone hovering a link sees our domain rather than yours.

cURL
curl -X POST https://emailbump.com/api/v1/domains/DOMAIN_ID/tracking \
  -H "Authorization: Bearer ebk_your_key"

DELETE on the same path turns it off and returns you to the shared domain.

Re-enabling with POST reuses any retained certificate and CDN distribution. If both exist and the certificate is issued, tracking_status can move straight to deploying. Keep the existing DNS records published; no new records are needed when they still match. If the certificate is pending, provisioning was incomplete, or a provider check fails, keep polling and follow the returned status and DNS records.

Two records, arriving at different times

For a first-time setup, dns_records only ever contains the record that exists yet. Call POST. tracking_status normally moves to cert_pending; an already-issued certificate can let it advance to deploying immediately. Poll GET /v1/domains/{id} to refresh provisioning state. While certificate validation is needed, a record with purpose: "Link tracking" and step: "certificate" appears — publish it if returned. When it validates a second appears with step: "routing" — publish that too, and tracking_status becomes active. A certificate and a CDN distribution have to be provisioned, so tens of minutes is normal. Links keep flowing through the shared tracking domain until it finishes.

Check verification

Poll the domain until it reports verified. DNS usually propagates in minutes, though some providers take up to 48 hours.

cURL
curl https://emailbump.com/api/v1/projects/7a10…/domains/DOMAIN_ID \
  -H "Authorization: Bearer ebk_all_access_key"

There is no public /v1 POST /verify endpoint. This GET re-polls the provider; background checks also run. Use the returned verification state, not elapsed time, to decide when it is ready.

See which record is missing

Verification is one bit: verified or not. When it stays pending, dns-check resolves each record and says which one is the reason.

cURL
curl https://emailbump.com/api/v1/domains/DOMAIN_ID/dns-check \
  -H "Authorization: Bearer ebk_your_key"
200 response
{
  "records": [ ... ],
  "missing": [
    {
      "type": "CNAME",
      "host": "hrgx55svace3aeq43mxk3hmjhtrcjlic._domainkey.acme.com",
      "value": "hrgx55svace3aeq43mxk3hmjhtrcjlic.dkim.amazonses.com",
      "purpose": "DKIM",
      "state": "missing"
    }
  ],
  "next": "Publish the 1 record in `missing` at your DNS provider, then check again. DNS usually propagates within minutes but can take up to 72 hours.",
  "all_found": false,
  "lookups_failed": false
}

missing is the work that is left, already filtered: the records you still have to publish, in full, so a client can print the fix without walking records itself. A record whose lookup failed never appears in it — unknown is not work. next is that same answer as one line of English, safe to show a person as-is.

Every record in records comes back with a state:

Record state

foundstateoptional

The record is published and matches what we expect.

missingstateoptional

The lookup succeeded and the record is not there. If DNS returned something else, `actual` shows what.

unknownstateoptional

The lookup itself did not complete — a resolver timeout, rate limit or SERVFAIL. This says nothing about your record. Do not change DNS on the strength of it; check again in a moment.

unknown is not missing

lookups_failed is true when any record came back unknown. When it is, all_found: false means “we could not finish checking”, not “something is wrong”. Treating the two the same is how correct DNS gets edited into broken DNS.

all_found covers the required records only. The optional branded-tracking CNAMEs arrive one at a time, so counting them would keep it false for every domain part-way through tracking setup. They can still show up in missing — they really are unpublished — carrying optional: true, and next names them separately so nobody reads a pending tracking record as a failed verification.

Your own DMARC policy counts

The DMARC record we publish is a suggested default (p=none). If you already publish any v=DMARC1 policy, that row comes back found — a stricter policy is not a missing record. Never replace a working p=reject with our default, and never add a second DMARC TXT: two of them invalidate each other.

DKIM key length

Sets the domain’s DKIM key length to 1024 or 2048 bits. Changing it is what makes the provider generate new key material.

cURL
curl -X POST https://emailbump.com/api/v1/domains/DOMAIN_ID/dkim/key-length \
  -H "Authorization: Bearer ebk_your_key" \
  -H "Content-Type: application/json" \
  -d '{"bits": 2048}'
Keep the returned DKIM records published

Easy DKIM manages signing keys behind its CNAMEs. Use the exact records returned for this identity and region, and recheck the domain response after a change. Do not remove selectors because a lookup is inconclusive. See AWS's Easy DKIM management guide.

Unsupported lengths, requests for the current or already-requested length, and provider-refused changes return 400 with a reason. The provider restricts how frequently key length can change; inspect that reason before retrying.

This is not a selector-rotation endpoint

It changes key length, not a requested set of DNS tokens. Do not delete a working domain to troubleshoot DKIM: deletion interrupts sending and can leave branded-tracking infrastructure behind. Diagnose the returned DNS state or contact support first.

Remove a domain

Deletes the domain and the sending identity behind it. Mail stops going out as that brand immediately and the records the customer published go dead. There is no undo.

Branded tracking is not torn down

If the domain had branded link tracking active, its CDN distribution survives the delete and keeps claiming links.yourdomain.com. The response returns its id as orphaned_cloudfront_distribution. Re-adding the domain works, but re-enabling branded tracking on it will fail until that distribution is removed — worth knowing before you use delete + re-add to get new DKIM records.

cURL
curl -X DELETE https://emailbump.com/api/v1/domains/DOMAIN_ID \
  -H "Authorization: Bearer ebk_your_key"