Kenso

Outbound site

The Outbound site endpoints of the Kenso API.

Deliverability7 endpointsKen-Version: 2026-11-02AuthenticationWorkspacesErrors

Return what people see on one domain: its website mode and each hostname's page status

GET/v1/domains/{domainId}/websiteoutbound-site.domain-get

Needs the domain_pages feature on your workspace. Until it is on, calls answer 404.

Try it on developer.ken.so

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

Name
In
Type
Required
Description
domainId
In: path
integer (int64)
required
Ken-Version
In: header
string, one of: 2026-11-02, 1.1
required
The API version: a dated version (YYYY-MM-DD), or 1.1, another name for the first dated version. Without it the request uses your API key's pinned version; an unpinned key reaches the legacy shape of the same path. 1.0 selects the legacy shape explicitly.
X-Ken-Workspace-Id
In: header
integer (int64)
optional
Workspace to act in. Required when your credential can reach more than one workspace (otherwise 400 workspace_required).

Response 200

data is a DomainWebsiteModel.

Field
Type
Description
domainId
integer (int64)
mode
string
unset (nobody answered: today's redirect), redirect or page.
currentVersionId
integer (int64)
The workspace's live page version, null while no page was ever published.
hostnames
array of DomainWebsiteHostnameModel
Apex first, then www. Empty until Kenso has checked the domain.
Request
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"
Response 200
{
  "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

GET/v1/outbound-siteoutbound-site.get

Needs the domain_pages feature on your workspace. Until it is on, calls answer 404.

Try it on developer.ken.so

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

Name
In
Type
Required
Description
Ken-Version
In: header
string, one of: 2026-11-02, 1.1
required
The API version: a dated version (YYYY-MM-DD), or 1.1, another name for the first dated version. Without it the request uses your API key's pinned version; an unpinned key reaches the legacy shape of the same path. 1.0 selects the legacy shape explicitly.
X-Ken-Workspace-Id
In: header
integer (int64)
optional
Workspace to act in. Required when your credential can reach more than one workspace (otherwise 400 workspace_required).

Response 200

data is a OutboundSiteModel.

Field
Type
Description
mainSiteUrl
string
effectiveMainSiteUrl
string
brandName
string
contactEmail
string
legalName
string
postalAddress
string
showMainSiteLink
boolean
currentVersion
OutboundSiteVersionModel
latestRun
OutboundSiteRunModel
Request
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"
Response 200
{
  "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

PATCH/v1/outbound-siteoutbound-site.update

Needs the domain_pages feature on your workspace. Until it is on, calls answer 404.

Try it on developer.ken.so

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

Name
In
Type
Required
Description
Ken-Version
In: header
string, one of: 2026-11-02, 1.1
required
The API version: a dated version (YYYY-MM-DD), or 1.1, another name for the first dated version. Without it the request uses your API key's pinned version; an unpinned key reaches the legacy shape of the same path. 1.0 selects the legacy shape explicitly.
X-Ken-Workspace-Id
In: header
integer (int64)
optional
Workspace to act in. Required when your credential can reach more than one workspace (otherwise 400 workspace_required).

Request body

application/json, optional.

Field
Type
Required
Description
mainSiteUrl
string
optional
brandName
string
optional
contactEmail
string
optional
legalName
string
optional
postalAddress
string
optional
showMainSiteLink
boolean
optional

Response 200

data is a OutboundSiteModel.

Field
Type
Description
mainSiteUrl
string
effectiveMainSiteUrl
string
brandName
string
contactEmail
string
legalName
string
postalAddress
string
showMainSiteLink
boolean
currentVersion
OutboundSiteVersionModel
latestRun
OutboundSiteRunModel
Request
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
}'
Response 200
{
  "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

POST/v1/outbound-site/refreshoutbound-site.refresh

Needs the domain_pages feature on your workspace. Until it is on, calls answer 404.

Try it on developer.ken.so

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

Name
In
Type
Required
Description
Ken-Version
In: header
string, one of: 2026-11-02, 1.1
required
The API version: a dated version (YYYY-MM-DD), or 1.1, another name for the first dated version. Without it the request uses your API key's pinned version; an unpinned key reaches the legacy shape of the same path. 1.0 selects the legacy shape explicitly.
X-Ken-Workspace-Id
In: header
integer (int64)
optional
Workspace to act in. Required when your credential can reach more than one workspace (otherwise 400 workspace_required).

Request body

application/json, optional.

Field
Type
Required
Description
note
string
optional
An instruction for the rebuild, such as "drop the pricing section". At most 1000 characters.

Response 202

data is a OutboundSiteRunModel.

Field
Type
Description
id
integer (int64)
status
string
trigger
string
note
string
versionId
integer (int64)
error
string
requestedByUserId
integer (int64)
createdAt
string (date-time)
startedAt
string (date-time)
finishedAt
string (date-time)
Request
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"
}'
Response 202
{
  "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

GET/v1/outbound-site/versionsoutbound-site.versions-list

Needs the domain_pages feature on your workspace. Until it is on, calls answer 404.

Try it on developer.ken.so

Newest first, at most 200, in one page. isCurrent marks the live one. Requires delivery view.

Parameters

Name
In
Type
Required
Description
Ken-Version
In: header
string, one of: 2026-11-02, 1.1
required
The API version: a dated version (YYYY-MM-DD), or 1.1, another name for the first dated version. Without it the request uses your API key's pinned version; an unpinned key reaches the legacy shape of the same path. 1.0 selects the legacy shape explicitly.
X-Ken-Workspace-Id
In: header
integer (int64)
optional
Workspace to act in. Required when your credential can reach more than one workspace (otherwise 400 workspace_required).

Response 200

data is a list of OutboundSiteVersionModel. Each item has these fields. The response also carries pagination.

Field
Type
Description
id
integer (int64)
source
string
note
string
htmlBytes
integer (int64)
assetBytes
integer (int64)
rounds
integer (int32)
model
string
isBelowThreshold
boolean
isCurrent
boolean
runId
integer (int64)
createdByUserId
integer (int64)
createdAt
string (date-time)
Request
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"
Response 200
{
  "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

POST/v1/outbound-site/versions/{versionId}/restoreoutbound-site.versions-restore

Needs the domain_pages feature on your workspace. Until it is on, calls answer 404.

Try it on developer.ken.so

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

Name
In
Type
Required
Description
versionId
In: path
integer (int64)
required
Ken-Version
In: header
string, one of: 2026-11-02, 1.1
required
The API version: a dated version (YYYY-MM-DD), or 1.1, another name for the first dated version. Without it the request uses your API key's pinned version; an unpinned key reaches the legacy shape of the same path. 1.0 selects the legacy shape explicitly.
X-Ken-Workspace-Id
In: header
integer (int64)
optional
Workspace to act in. Required when your credential can reach more than one workspace (otherwise 400 workspace_required).

Response 200

data is a OutboundSiteModel.

Field
Type
Description
mainSiteUrl
string
effectiveMainSiteUrl
string
brandName
string
contactEmail
string
legalName
string
postalAddress
string
showMainSiteLink
boolean
currentVersion
OutboundSiteVersionModel
latestRun
OutboundSiteRunModel
Request
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"
Response 200
{
  "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

GET/v1/outbound-site/previewoutbound-site.preview

Needs the domain_pages feature on your workspace. Until it is on, calls answer 404.

Try it on developer.ken.so

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

Name
In
Type
Required
Description
domainId
In: query
integer (int64)
optional
Ken-Version
In: header
string, one of: 2026-11-02, 1.1
required
The API version: a dated version (YYYY-MM-DD), or 1.1, another name for the first dated version. Without it the request uses your API key's pinned version; an unpinned key reaches the legacy shape of the same path. 1.0 selects the legacy shape explicitly.
X-Ken-Workspace-Id
In: header
integer (int64)
optional
Workspace to act in. Required when your credential can reach more than one workspace (otherwise 400 workspace_required).

Response 200

data is a OutboundSitePreviewLink.

Field
Type
Description
url
string
expiresAt
string (date-time)
Request
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"
Response 200
{
  "success": true,
  "data": {
    "url": "https://example.com",
    "expiresAt": "2026-09-23T15:02:11Z"
  }
}