Outbound site
The Outbound site endpoints of the Kenso API.
Return what people see on one domain: its website mode and each hostname's page status
/v1/domains/{domainId}/websiteoutbound-site.domain-getNeeds the domain_pages feature on your workspace. Until it is on, calls answer 404.
mode is unset (nobody answered: the domain keeps its redirect), redirect or page. currentVersionId is the workspace's live page version, null until the first publish. hostnames lists the apex first, then www, each with attachPath (worker_route, custom_hostname or null when unsupported), dnsWriter, status (detached, attaching, active, detaching or failed), sslStatus, unsupportedReason and checkedAt; empty until Kenso has checked the domain. Requires ReadAccess and the domain_pages feature.
Parameters
400 workspace_required).Response 200
data is a DomainWebsiteModel.
unset (nobody answered: today's redirect), redirect or page.www. Empty until Kenso has checked the domain.curl -X GET "https://api.ken.so/v1/domains/812/website" \ -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,
"mode": "string",
"currentVersionId": 812,
"hostnames": [
{
"hostname": "string",
"attachPath": "string",
"dnsWriter": "string",
"status": "string",
"sslStatus": "string",
"unsupportedReason": "string",
"checkedAt": "2026-09-23T15:02:11Z",
"lastError": "string",
"stopped": true
}
]
}
}Return the workspace's outbound site
/v1/outbound-siteoutbound-site.getNeeds the domain_pages feature on your workspace. Until it is on, calls answer 404.
A read never creates it: a workspace without one gets null fields and showMainSiteLink: true. mainSiteUrl, brandName, contactEmail, legalName and postalAddress fill the page's slots; effectiveMainSiteUrl is mainSiteUrl, else the workspace website, and a Kenso brand site other than getken.ai (ken.so, getken.dev, ...) becomes the Kenso cold root https://getken.ai. currentVersion is the version every page-mode domain serves (null before the first build). latestRun is the newest build, with statusqueued, running, succeeded, failed or canceled. Requires delivery view.
Parameters
400 workspace_required).Response 200
data is a OutboundSiteModel.
curl -X GET "https://api.ken.so/v1/outbound-site" \ -H "Authorization: Bearer $KEN_API_KEY" \ -H "Ken-Version: 2026-11-02" \ -H "X-Ken-Workspace-Id: $KEN_WORKSPACE_ID"
{
"success": true,
"data": {
"mainSiteUrl": "https://example.com",
"effectiveMainSiteUrl": "https://example.com",
"brandName": "string",
"contactEmail": "[email protected]",
"legalName": "string",
"postalAddress": "string",
"showMainSiteLink": true,
"currentVersion": {
"id": 812,
"source": "string",
"note": "string",
"htmlBytes": 1,
"assetBytes": 1,
"rounds": 1,
"model": "string",
"isBelowThreshold": true,
"isCurrent": true,
"runId": 812,
"createdByUserId": 812,
"createdAt": "2026-09-23T15:02:11Z"
},
"latestRun": {
"id": 812,
"status": "string",
"trigger": "string",
"note": "string",
"versionId": 812,
"error": "string",
"requestedByUserId": 812,
"createdAt": "2026-09-23T15:02:11Z",
"startedAt": "2026-09-23T15:02:11Z",
"finishedAt": "2026-09-23T15:02:11Z"
}
}
}Change the outbound site's fields
/v1/outbound-siteoutbound-site.updateNeeds the domain_pages feature on your workspace. Until it is on, calls answer 404.
A field left out keeps its value; null or a blank string clears a text field. mainSiteUrl an absolute http or https URL (at most 2048), brandName and legalName at most 200 characters, contactEmail one address, postalAddress at most 500, showMainSiteLink true or false. A bad field is 400 validation_failed with one detail per field and nothing is saved. The first write creates the outbound site. When a version is live the page updates at once, without a rebuild; if that update fails the change stays saved and the answer is 503 service_unavailable, so send it again. Example: {"contactEmail": "[email protected]", "showMainSiteLink": false}. Requires delivery edit.
Parameters
400 workspace_required).Request body
application/json, optional.
Response 200
data is a OutboundSiteModel.
curl -X PATCH "https://api.ken.so/v1/outbound-site" \
-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 '{
"mainSiteUrl": "https://example.com",
"brandName": "string",
"contactEmail": "[email protected]",
"legalName": "string",
"postalAddress": "string",
"showMainSiteLink": true
}'{
"success": true,
"data": {
"mainSiteUrl": "https://example.com",
"effectiveMainSiteUrl": "https://example.com",
"brandName": "string",
"contactEmail": "[email protected]",
"legalName": "string",
"postalAddress": "string",
"showMainSiteLink": true,
"currentVersion": {
"id": 812,
"source": "string",
"note": "string",
"htmlBytes": 1,
"assetBytes": 1,
"rounds": 1,
"model": "string",
"isBelowThreshold": true,
"isCurrent": true,
"runId": 812,
"createdByUserId": 812,
"createdAt": "2026-09-23T15:02:11Z"
},
"latestRun": {
"id": 812,
"status": "string",
"trigger": "string",
"note": "string",
"versionId": 812,
"error": "string",
"requestedByUserId": 812,
"createdAt": "2026-09-23T15:02:11Z",
"startedAt": "2026-09-23T15:02:11Z",
"finishedAt": "2026-09-23T15:02:11Z"
}
}
}Rebuild the page from the live website
/v1/outbound-site/refreshoutbound-site.refreshNeeds the domain_pages feature on your workspace. Until it is on, calls answer 404.
Queues a build and answers 202 with the run; the page changes when the run succeeds. An optional note (at most 1000 characters) is an instruction for the rebuild, such as {"note": "drop the pricing section"}. 409 run_in_progress while a build is queued or running; 409 website_missing when neither mainSiteUrl nor the workspace website is set. Each queued build counts on the workspace's outboundSiteRefresh quota: 3 a day and 10 in 30 days. Past it, 429 quota_exceeded with Retry-After, the limit in error.details[0].limit and the reset time in quotaResetAt, repeated on error.details[0] as resetAt and retryAfterSeconds; nothing is queued. Automatic rebuilds (a first page, a website change, a content change) and restores are not counted. Requires delivery edit.
Parameters
400 workspace_required).Request body
application/json, optional.
Response 202
data is a OutboundSiteRunModel.
curl -X POST "https://api.ken.so/v1/outbound-site/refresh" \
-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 '{
"note": "string"
}'{
"success": true,
"data": {
"id": 812,
"status": "string",
"trigger": "string",
"note": "string",
"versionId": 812,
"error": "string",
"requestedByUserId": 812,
"createdAt": "2026-09-23T15:02:11Z",
"startedAt": "2026-09-23T15:02:11Z",
"finishedAt": "2026-09-23T15:02:11Z"
}
}List the page versions
/v1/outbound-site/versionsoutbound-site.versions-listNeeds the domain_pages feature on your workspace. Until it is on, calls answer 404.
Newest first, at most 200, in one page. isCurrent marks the live one. Requires delivery view.
Parameters
400 workspace_required).Response 200
data is a list of OutboundSiteVersionModel. Each item has these fields. The response also carries pagination.
curl -X GET "https://api.ken.so/v1/outbound-site/versions" \ -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,
"source": "string",
"note": "string",
"htmlBytes": 1,
"assetBytes": 1,
"rounds": 1,
"model": "string",
"isBelowThreshold": true,
"isCurrent": true,
"runId": 812,
"createdByUserId": 812,
"createdAt": "2026-09-23T15:02:11Z"
}
],
"pagination": {
"nextCursor": "eyJpZCI6ODE1fQ",
"hasMore": true,
"total": 1,
"isTotalCapped": true
}
}Make a version live again
/v1/outbound-site/versions/{versionId}/restoreoutbound-site.versions-restoreNeeds the domain_pages feature on your workspace. Until it is on, calls answer 404.
Adds a restored copy of the version, makes it current and updates every page-mode domain at once. Restoring the current version only updates the domains again. 409 version_html_missing when the version's page is no longer stored. 503 service_unavailable means send it again; when its message says the live page did not update, the restore itself was saved. Returns the outbound site. Requires delivery edit.
Parameters
400 workspace_required).Response 200
data is a OutboundSiteModel.
curl -X POST "https://api.ken.so/v1/outbound-site/versions/812/restore" \ -H "Authorization: Bearer $KEN_API_KEY" \ -H "Ken-Version: 2026-11-02" \ -H "X-Ken-Workspace-Id: $KEN_WORKSPACE_ID"
{
"success": true,
"data": {
"mainSiteUrl": "https://example.com",
"effectiveMainSiteUrl": "https://example.com",
"brandName": "string",
"contactEmail": "[email protected]",
"legalName": "string",
"postalAddress": "string",
"showMainSiteLink": true,
"currentVersion": {
"id": 812,
"source": "string",
"note": "string",
"htmlBytes": 1,
"assetBytes": 1,
"rounds": 1,
"model": "string",
"isBelowThreshold": true,
"isCurrent": true,
"runId": 812,
"createdByUserId": 812,
"createdAt": "2026-09-23T15:02:11Z"
},
"latestRun": {
"id": 812,
"status": "string",
"trigger": "string",
"note": "string",
"versionId": 812,
"error": "string",
"requestedByUserId": 812,
"createdAt": "2026-09-23T15:02:11Z",
"startedAt": "2026-09-23T15:02:11Z",
"finishedAt": "2026-09-23T15:02:11Z"
}
}
}Return a link to the live page as one domain serves it
/v1/outbound-site/previewoutbound-site.previewNeeds the domain_pages feature on your workspace. Until it is on, calls answer 404.
url is a signed link on Kenso's edge, valid until expiresAt (one hour), that renders the current version with the slots filled for domainId; frame it, and fetch a new link before it expires. 404 when the domain is not the workspace's or nothing is published yet; 503 when previews are not configured. Requires delivery view. In a demo workspace, url is the filled page itself, a data:text/html URL.
Parameters
400 workspace_required).Response 200
data is a OutboundSitePreviewLink.
curl -X GET "https://api.ken.so/v1/outbound-site/preview" \ -H "Authorization: Bearer $KEN_API_KEY" \ -H "Ken-Version: 2026-11-02" \ -H "X-Ken-Workspace-Id: $KEN_WORKSPACE_ID"
{
"success": true,
"data": {
"url": "https://example.com",
"expiresAt": "2026-09-23T15:02:11Z"
}
}