A sending domain is a domain your email is sent from, with the DNS records that prove you own it. Nothing sends email from an address until its domain is verified here, and a domain can be verified in only one workspace, so use a subdomain for staging.
Endpoints
| Endpoint | Request |
|---|---|
| List sending domains | GET /v1/sending-domains |
| Add a sending domain | POST /v1/sending-domains |
| Retrieve a sending domain | GET /v1/sending-domains/{id} |
| Delete a sending domain | DELETE /v1/sending-domains/{id} |
| Check a sending domain | POST /v1/sending-domains/{id}/check |
| Retrieve a sending domain's usage | GET /v1/sending-domains/{id}/usage |
| Ask for a sending domain review again | POST /v1/sending-domains/{id}/review |
The SendingDomain object
{
"id": "0192f3f0-1a2b-7c3d-8e4f-5a6b7c8d9e0f",
"domain": "mail.acme-shop.com",
"status": "pending",
"failureReason": null,
"lastCheckedAt": "2026-10-01T09:45:00.000Z",
"dnsRecords": [
{
"purpose": "ownership",
"type": "TXT",
"name": "kirora1._domainkey.mail.acme-shop.com",
"host": "kirora1._domainkey.mail",
"value": "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA7v3k2x",
"matches": false,
"reason": "No TXT record found at kirora1._domainkey.mail.acme-shop.com"
},
{
"purpose": "mailFrom",
"type": "MX",
"name": "bounce.mail.acme-shop.com",
"host": "bounce.mail",
"value": "10 feedback-smtp.eu-central-1.amazonses.com",
"matches": false,
"reason": "No MX record found at bounce.mail.acme-shop.com"
},
{
"purpose": "mailFrom",
"type": "TXT",
"name": "bounce.mail.acme-shop.com",
"host": "bounce.mail",
"value": "v=spf1 include:amazonses.com ~all",
"matches": false,
"reason": "No TXT record found at bounce.mail.acme-shop.com"
}
],
"checks": {
"ownership": "pending",
"dkim": "pending",
"mailFrom": "pending",
"dmarc": null,
"bimi": null
},
"review": {
"status": "not_requested",
"declineReason": null
},
"createdAt": "2026-10-01T09:30:00.000Z",
"updatedAt": "2026-10-01T09:45:00.000Z"
}idstringrequireduuid
domainstringrequiredstatusstringrequiredWhether the domain can send:
pendinguntil its DNS records are all found;awaiting_review, you own it but a person at Kirora has not cleared it to send yet, and it is set up the moment they do (reviewsays more);verified, it can send;verification_lost, it was verified but a record has since gone missing, and nothing sends from it until the record is back;failed, seefailureReason;quarantined, the domain is already set up by another account, so nothing sends from it until Kirora support reviews it.one of
pending,awaiting_review,verified,verification_lost,failed,quarantinedfailureReasonstring | nullrequiredWhy verification failed, when it has.
lastCheckedAtstring | nullrequiredWhen DNS was last checked.
date-time
dnsRecordsSendingDomainDnsRecord[]requiredThe records to publish at your DNS host, the ownership record first.
7 child attributes
purposestringrequiredownership: proves you control the domain, and holds the key that signs its mail;dkim: another signing key record;mailFrom: thebounce.subdomain that receives bounces and aligns SPF.one of
ownership,dkim,mailFromtypestringrequiredone of
CNAME,TXT,MXnamestringrequiredThe full hostname to publish the record at.
hoststringrequiredThe name without the registered domain, which most DNS hosts ask for, since they add the domain themselves:
sel._domainkeyforsel._domainkey.example.com,@for the domain itself.valuestringrequiredWhat the record must contain.
matchesbooleanrequiredWhether the last check found the record as given.
reasonstring | nullrequiredWhy it does not match, such as what DNS holds there; null when it does.
checksobjectrequiredEach check's state, for showing progress;
statusis what decides.5 child attributes
ownershipstringrequiredWhether proof that you control the domain has been found in DNS.
one of
pending,verifieddkimstringrequiredThe DKIM signing records.
one of
pending,verified,failedmailFromstringrequiredThe
bounce.(MAIL FROM) records.one of
pending,verified,faileddmarcobject | nullrequiredThe DMARC record covering the domain, which marketing email needs; null before the first check.
4 child attributes
statusstringrequiredWhether a usable DMARC record was found.
one of
valid,missing,invalid,unknownpolicystring | nullrequiredThe policy the DMARC record sets.
one of
none,quarantine,rejectpolicyDomainstring | nullrequiredThe domain the DMARC record was found on.
inheritedbooleanrequiredTrue when the record is the parent domain's, not the domain's own.
bimiobject | nullrequiredBIMI, for the brand's logo beside its email: guidance, never a requirement. Mailboxes show it only with DMARC at
quarantineorreject. Null until a check reads it.3 child attributes
statusstringrequiredWhether
default._bimi.<domain>holds a BIMI record.one of
present,missing,unknownlogoUrlstring | nullrequiredIts logo (
l=): an SVG Tiny PS file over HTTPS.certificateUrlstring | nullrequiredIts mark certificate (
a=, a VMC or CMC), which Gmail and Apple Mail need before showing the logo; Yahoo can show it without one.
reviewobjectrequiredIts sending review (
SENDING_REVIEW_REQUIRED).2 child attributes
statusstringrequiredWhether a person at Kirora has cleared the domain to send; until then it has no provider identity (
statusisawaiting_reviewonce you own it), and nothing sends from it, not even a test.not_requested: proven yours, waiting for the workspace's sending profile (website, what it sends, how contacts agreed), which asks for review once filled in.in_review: waiting for a person, usually within a day. A subdomain of an approved domain is approved when proven.one of
not_requested,in_review,approved,declineddeclineReasonstring | nullrequiredWhy it was declined; null unless
declined.
createdAtstringrequireddate-time
updatedAtstringrequireddate-time