Domains
Your sending domains: settings, health, tracking DNS and nameserver checks.
Parameters
400 workspace_required).Response 200
data is a list of DomainModel. Each item has these fields. The response also carries pagination.
isPrimary on an inbox). Derived on read.curl -X GET "https://api.ken.so/v1/domains" \ -H "Authorization: Bearer $KEN_API_KEY" \ -H "Ken-Version: 2026-11-02" \ -H "X-Ken-Workspace-Id: $KEN_WORKSPACE_ID"
{
"success": true,
"data": [
{
"id": 812,
"name": "string",
"status": "string",
"source": "string",
"expirationDate": "2026-09-23T15:02:11Z",
"daysLeft": 1,
"isExpiring": true,
"autoRenew": true,
"autoRenewEligible": true,
"registrar": "string",
"dnsProvider": "string",
"clickRateTrackingEnabled": true,
"trackingDnsStatus": "string",
"maskingEnabled": true,
"rampUpDays": 1,
"rampUp": {
"days": 1,
"dayIndex": 1,
"isComplete": true
},
"redirectUrl404": "string",
"openPixelHostname": "string",
"openPixelStatus": "string",
"campaignPixelHost": {
"status": "string",
"hostname": "string",
"requiredRecord": {
"type": "string",
"name": "string",
"value": "string"
}
},
"catchAllEmail": "[email protected]",
"hasError": true,
"statusReason": "string",
"isPrimary": true,
"tagIds": [
812
],
"retirement": {
"state": "string",
"captureUntil": "2026-09-23T15:02:11Z",
"releasedAt": "2026-09-23T15:02:11Z",
"renewalEndsWindowEarly": true
},
"replacedBy": {
"id": 812,
"name": "string"
}
}
],
"pagination": {
"nextCursor": "eyJpZCI6ODE1fQ",
"hasMore": true,
"total": 1,
"isTotalCapped": true
}
}Apply one field update to up to 1,000 domains
/v1/domains/bulk-updatedomains.bulk-updateRequires WriteAccess. Auto-renew requires Delivery edit and the Billing feature. Masking and catch-all require SuperAdmin. websiteMode (redirect or page) records the person's answer to "rebuild or redirect"; it cannot be cleared.
Parameters
400 workspace_required).Request body
application/json, optional: object.
Response 200
data is a DomainBulkResult.
curl -X POST "https://api.ken.so/v1/domains/bulk-update" \
-H "Authorization: Bearer $KEN_API_KEY" \
-H "Ken-Version: 2026-11-02" \
-H "X-Ken-Workspace-Id: $KEN_WORKSPACE_ID" \
-H "Content-Type: application/json" \
-d '{}'{
"success": true,
"data": {
"updatedCount": 1,
"failed": [
{
"id": 812,
"message": "string"
}
]
}
}Return one domain in the current workspace
/v1/domains/{domainId}domains.getParameters
400 workspace_required).Response 200
data is a DomainModel.
isPrimary on an inbox). Derived on read.curl -X GET "https://api.ken.so/v1/domains/812" \ -H "Authorization: Bearer $KEN_API_KEY" \ -H "Ken-Version: 2026-11-02" \ -H "X-Ken-Workspace-Id: $KEN_WORKSPACE_ID"
{
"success": true,
"data": {
"id": 812,
"name": "string",
"status": "string",
"source": "string",
"expirationDate": "2026-09-23T15:02:11Z",
"daysLeft": 1,
"isExpiring": true,
"autoRenew": true,
"autoRenewEligible": true,
"registrar": "string",
"dnsProvider": "string",
"clickRateTrackingEnabled": true,
"trackingDnsStatus": "string",
"maskingEnabled": true,
"rampUpDays": 1,
"rampUp": {
"days": 1,
"dayIndex": 1,
"isComplete": true
},
"redirectUrl404": "string",
"openPixelHostname": "string",
"openPixelStatus": "string",
"campaignPixelHost": {
"status": "string",
"hostname": "string",
"requiredRecord": {
"type": "string",
"name": "string",
"value": "string"
}
},
"catchAllEmail": "[email protected]",
"hasError": true,
"statusReason": "string",
"isPrimary": true,
"tagIds": [
812
],
"retirement": {
"state": "string",
"captureUntil": "2026-09-23T15:02:11Z",
"releasedAt": "2026-09-23T15:02:11Z",
"renewalEndsWindowEarly": true
},
"replacedBy": {
"id": 812,
"name": "string"
}
}
}Absent fields stay unchanged. Null clears text fields and tag ids.
Requires WriteAccess. Auto-renew requires Delivery edit and the Billing feature. Masking and catch-all require SuperAdmin. websiteMode (redirect or page) records the person's answer to "rebuild or redirect"; it cannot be cleared.
Parameters
400 workspace_required).Request body
application/json, optional: object.
Response 200
data is a DomainModel.
isPrimary on an inbox). Derived on read.curl -X PATCH "https://api.ken.so/v1/domains/812" \
-H "Authorization: Bearer $KEN_API_KEY" \
-H "Ken-Version: 2026-11-02" \
-H "X-Ken-Workspace-Id: $KEN_WORKSPACE_ID" \
-H "Content-Type: application/json" \
-d '{}'{
"success": true,
"data": {
"id": 812,
"name": "string",
"status": "string",
"source": "string",
"expirationDate": "2026-09-23T15:02:11Z",
"daysLeft": 1,
"isExpiring": true,
"autoRenew": true,
"autoRenewEligible": true,
"registrar": "string",
"dnsProvider": "string",
"clickRateTrackingEnabled": true,
"trackingDnsStatus": "string",
"maskingEnabled": true,
"rampUpDays": 1,
"rampUp": {
"days": 1,
"dayIndex": 1,
"isComplete": true
},
"redirectUrl404": "string",
"openPixelHostname": "string",
"openPixelStatus": "string",
"campaignPixelHost": {
"status": "string",
"hostname": "string",
"requiredRecord": {
"type": "string",
"name": "string",
"value": "string"
}
},
"catchAllEmail": "[email protected]",
"hasError": true,
"statusReason": "string",
"isPrimary": true,
"tagIds": [
812
],
"retirement": {
"state": "string",
"captureUntil": "2026-09-23T15:02:11Z",
"releasedAt": "2026-09-23T15:02:11Z",
"renewalEndsWindowEarly": true
},
"replacedBy": {
"id": 812,
"name": "string"
}
}
}Returns 204. Requires WriteAccess.
Parameters
400 workspace_required).Response 204
curl -X DELETE "https://api.ken.so/v1/domains/812" \ -H "Authorization: Bearer $KEN_API_KEY" \ -H "Ken-Version: 2026-11-02" \ -H "X-Ken-Workspace-Id: $KEN_WORKSPACE_ID"
HTTP/1.1 204 No Content
Return the latest health snapshot for one domain
/v1/domains/{domainId}/healthdomains.get-healthBlacklist, mail DNS, bounce, placement, nameserver, and certificate state. spfStatus, dkimStatus, dmarcStatus and mxStatus are pass, fail or unknown, omitted before the first check. They and the blacklist come from the last health snapshot (the daily health sweep, or POST /v1/domain-health-checks, a 202 job) dated by checkedAt, and do not change until the next check runs. Rates are fractions from 0 to 1. A domain outside the workspace is not_found.
Parameters
400 workspace_required).Response 200
data is a DomainHealthModel.
curl -X GET "https://api.ken.so/v1/domains/812/health" \ -H "Authorization: Bearer $KEN_API_KEY" \ -H "Ken-Version: 2026-11-02" \ -H "X-Ken-Workspace-Id: $KEN_WORKSPACE_ID"
{
"success": true,
"data": {
"domainId": 812,
"name": "string",
"blacklistStatus": "string",
"listedCount": 1,
"listedZones": [
"string"
],
"checkedAt": "2026-09-23T15:02:11Z",
"spfStatus": "string",
"dkimStatus": "string",
"dmarcStatus": "string",
"mxStatus": "string",
"hasSpf": true,
"hasDkim": true,
"hasDmarc": true,
"hasMx": true,
"isChecked": true,
"dkimSelector": "string",
"bounceRate": 0.5,
"bounceStatus": "string",
"bounceCheckedAt": "2026-09-23T15:02:11Z",
"bounceEmailCount": 1,
"bouncedEmailCount": 1,
"inboxRate": 0.5,
"spamRate": 0.5,
"placementStatus": "string",
"placementCompletedAt": "2026-09-23T15:02:11Z",
"infraguardStatus": "string",
"nameserverStatus": "string",
"nameservers": [
"string"
],
"sslStatus": "string",
"sslExpiresAt": "2026-09-23T15:02:11Z",
"ipAbuseScore": 1
}
}Return tracking DNS state for one domain
/v1/domains/{domainId}/dnsdomains.get-dnsParameters
400 workspace_required).Response 200
data is a DomainDnsModel.
curl -X GET "https://api.ken.so/v1/domains/812/dns" \ -H "Authorization: Bearer $KEN_API_KEY" \ -H "Ken-Version: 2026-11-02" \ -H "X-Ken-Workspace-Id: $KEN_WORKSPACE_ID"
{
"success": true,
"data": {
"trackingStatus": "string",
"clickRateTrackingEnabled": true,
"openPixelHostname": "string",
"openPixelStatus": "string",
"lastError": "string",
"checkedAt": "2026-09-23T15:02:11Z"
}
}Verify Kenso tracking DNS for one domain
/v1/domains/{domainId}/verify-dnsdomains.verify-dnsRequires WriteAccess.
Parameters
400 workspace_required).Response 200
data is a DomainDnsModel.
curl -X POST "https://api.ken.so/v1/domains/812/verify-dns" \ -H "Authorization: Bearer $KEN_API_KEY" \ -H "Ken-Version: 2026-11-02" \ -H "X-Ken-Workspace-Id: $KEN_WORKSPACE_ID"
{
"success": true,
"data": {
"trackingStatus": "string",
"clickRateTrackingEnabled": true,
"openPixelHostname": "string",
"openPixelStatus": "string",
"lastError": "string",
"checkedAt": "2026-09-23T15:02:11Z"
}
}Check imported-domain nameservers against the Kenso Cloudflare zone
/v1/domains/{domainId}/check-nameserversdomains.check-nameserversRequires Delivery edit access (owners, admins and editors by default).
Parameters
400 workspace_required).Response 200
data is a DomainNameserverCheckModel.
curl -X POST "https://api.ken.so/v1/domains/812/check-nameservers" \ -H "Authorization: Bearer $KEN_API_KEY" \ -H "Ken-Version: 2026-11-02" \ -H "X-Ken-Workspace-Id: $KEN_WORKSPACE_ID"
{
"success": true,
"data": {
"domainId": 812,
"name": "string",
"status": "string",
"zoneStatus": "string",
"activated": true,
"expectedNameservers": [
"string"
],
"waitingForCredits": true,
"requiredMillicredits": 1,
"availableMillicredits": 1
}
}