Domains and events
Domains and DNS records
You can only send from domains you've verified. Chebu gives you the records and checks them.
Domains you add in the Chebu app for your team's mail can send through the API once verified, and domains you add here show up in the app. Adding a domain counts toward your plan's included domains.
DNS records
| Record | Type | Name | Value |
|---|---|---|---|
| DKIM | TXT | chebu._domainkey | p=… (your domain's public key) |
| MAIL FROM | MX | bounce | Priority 10, host shown in your dashboard |
| MAIL FROM SPF | TXT | bounce | v=spf1 include:_spf.chebu.email ~all |
| DMARC | TXT | _dmarc | v=DMARC1; p=none; |
- DKIM signs every email so receivers can tell it really came from your domain.
- MAIL FROM sets the bounce address to a subdomain of yours (
bounceby default), so SPF aligns with your domain. - DMARC tells receivers what to do with mail that fails those checks. Start with
p=noneand tighten it once reports look clean.
Add a domain
name is required. region picks the sending region, custom_return_path changes the MAIL FROM subdomain from bounce, and tracking starts off unless you turn it on. The response includes the records to add.
/domainscurl -X POST https://api.chebu.io/domains \
-H "Authorization: Bearer $CHEBU_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "northwind.studio",
"region": "us-east-1",
"custom_return_path": "bounce",
"open_tracking": false,
"click_tracking": false
}'{
"object": "domain",
"id": "d91cd9bd-1176-453e-8fc1-35364d380206",
"name": "northwind.studio",
"status": "not_started",
"region": "us-east-1",
"created_at": "2026-09-27T09:12:40.201Z",
"open_tracking": false,
"click_tracking": false,
"tls": "opportunistic",
"records": [
{
"record": "DKIM",
"name": "chebu._domainkey",
"type": "TXT",
"ttl": "Auto",
"status": "not_started",
"value": "p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx8Qm…IDAQAB"
},
{
"record": "MX",
"name": "bounce",
"type": "MX",
"ttl": "Auto",
"status": "not_started",
"value": "feedback.<shown in your dashboard>",
"priority": 10
},
{
"record": "SPF",
"name": "bounce",
"type": "TXT",
"ttl": "Auto",
"status": "not_started",
"value": "v=spf1 include:_spf.chebu.email ~all"
},
{
"record": "DMARC",
"name": "_dmarc",
"type": "TXT",
"ttl": "Auto",
"status": "not_started",
"value": "v=DMARC1; p=none;"
}
]
}Verify a domain
Chebu checks new domains on its own, often for the first time within a minute and then less often for up to 72 hours. Call verify after you've added the records to check right away.
/domains/d91cd9bd-1176-453e-8fc1-35364d380206/verifycurl -X POST https://api.chebu.io/domains/d91cd9bd-1176-453e-8fc1-35364d380206/verify \
-H "Authorization: Bearer $CHEBU_API_KEY"{
"object": "domain",
"id": "d91cd9bd-1176-453e-8fc1-35364d380206"
}| Status | Meaning |
|---|---|
not_started | Just added. Chebu starts checking within a minute. |
pending | Waiting for the records to appear in DNS. |
verified | Ready to send. |
partially_verified | Some records check out and others don't yet. |
failed | The records weren't found in time. Fix them and verify again. |
temporary_failure | A DNS lookup failed for now. Chebu retries. |
Retrieve and list domains
/domains/d91cd9bd-1176-453e-8fc1-35364d380206curl https://api.chebu.io/domains/d91cd9bd-1176-453e-8fc1-35364d380206 \
-H "Authorization: Bearer $CHEBU_API_KEY"{
"object": "domain",
"id": "d91cd9bd-1176-453e-8fc1-35364d380206",
"name": "northwind.studio",
"status": "not_started",
"region": "us-east-1",
"created_at": "2026-09-27T09:12:40.201Z",
"open_tracking": false,
"click_tracking": false,
"tls": "opportunistic",
"records": [
{
"record": "DKIM",
"name": "chebu._domainkey",
"type": "TXT",
"ttl": "Auto",
"status": "not_started",
"value": "p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx8Qm…IDAQAB"
},
{
"record": "MX",
"name": "bounce",
"type": "MX",
"ttl": "Auto",
"status": "not_started",
"value": "feedback.<shown in your dashboard>",
"priority": 10
},
{
"record": "SPF",
"name": "bounce",
"type": "TXT",
"ttl": "Auto",
"status": "not_started",
"value": "v=spf1 include:_spf.chebu.email ~all"
},
{
"record": "DMARC",
"name": "_dmarc",
"type": "TXT",
"ttl": "Auto",
"status": "not_started",
"value": "v=DMARC1; p=none;"
}
]
}/domainscurl https://api.chebu.io/domains \
-H "Authorization: Bearer $CHEBU_API_KEY"{
"object": "list",
"data": [
{
"object": "domain",
"id": "d91cd9bd-1176-453e-8fc1-35364d380206",
"name": "northwind.studio",
"status": "verified",
"region": "us-east-1",
"created_at": "2026-09-27T09:12:40.201Z"
}
]
}Tracking and TLS
open_trackingadds a tiny image to HTML emails, so you getemail.openedevents.click_trackingroutes links through Chebu, so you getemail.clickedevents.tlsisopportunisticby default: Chebu uses TLS whenever the receiving server supports it. Setenforcedto only deliver over TLS, and bounce otherwise.
/domains/d91cd9bd-1176-453e-8fc1-35364d380206curl -X PATCH https://api.chebu.io/domains/d91cd9bd-1176-453e-8fc1-35364d380206 \
-H "Authorization: Bearer $CHEBU_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"open_tracking": true,
"click_tracking": true,
"tls": "enforced"
}'{
"object": "domain",
"id": "d91cd9bd-1176-453e-8fc1-35364d380206"
}Delete a domain
You can't send from a domain once it's deleted. Emails already sent aren't affected.
/domains/d91cd9bd-1176-453e-8fc1-35364d380206curl -X DELETE https://api.chebu.io/domains/d91cd9bd-1176-453e-8fc1-35364d380206 \
-H "Authorization: Bearer $CHEBU_API_KEY"{
"object": "domain",
"id": "d91cd9bd-1176-453e-8fc1-35364d380206",
"deleted": true
}