Kenso

AI line holds

Contacts the AI line check held because their personalization lines failed it: list them and approve one to send its lines as they are.

AI2 endpointsKen-Version: 2026-11-02AuthenticationWorkspacesErrors

List the contacts the AI line check held in a campaign

GET/v1/campaigns/{campaignId}/ai-line-holdsai-line-holds.list

Try it on developer.ken.so

Newest hold first, with the reasons and the lines each hold keeps. Pages with limit (1 to 200, default 50) and cursor. A contact appears until it is approved or regenerated. A campaign outside the workspace is not_found. Requires ReadAccess.

Parameters

Name
In
Type
Required
Description
campaignId
In: path
integer (int64)
required
limit
In: query
integer (int32)
optional
cursor
In: query
string
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 list of AiLineHoldModel. Each item has these fields. The response also carries pagination.

Field
Type
Description
contactId
integer (int64)
The held contact.
reasons
array of string
Why the lines were held, the first the main reason: ungrounded (a fact the lead's data does not support), not_specific, tone (a phrase a person would not say), or too_long. Clients tolerate new values.
heldAt
string (date-time)
When the contact was held.
lines
array of AiLineHoldLineModel
The lines the hold keeps for review. Approving makes them the lines the contact sends.
Request
curl -X GET "https://api.ken.so/v1/campaigns/812/ai-line-holds?limit=1" \
  -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": [
    {
      "contactId": 812,
      "reasons": [
        "string"
      ],
      "heldAt": "2026-09-23T15:02:11Z",
      "lines": [
        {
          "id": 812,
          "promptId": 812,
          "variable": "string",
          "text": "string",
          "segmentId": 812,
          "stepOrder": 1
        }
      ]
    }
  ],
  "pagination": {
    "nextCursor": "eyJpZCI6ODE1fQ",
    "hasMore": true,
    "total": 1,
    "isTotalCapped": true
  }
}

Approve a held contact's lines

POST/v1/campaigns/{campaignId}/ai-line-holds/{contactId}/approveai-line-holds.approve

Try it on developer.ken.so

The lines the hold keeps become the contact's personalization lines and the contact counts as personalized, so it can send. Not charged. A contact with no hold in the campaign (never held, already approved, or regenerated) is not_held (409). When the contact already has a live line for one of the held variables the approval is conflict (409) and nothing changes; regenerate the contact instead. A campaign or contact outside the workspace, or a contact not in this campaign, is not_found. Requires WriteAccess.

Parameters

Name
In
Type
Required
Description
campaignId
In: path
integer (int64)
required
contactId
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 AiLineHoldApprovalModel.

Field
Type
Description
contactId
integer (int64)
The released contact.
restoredLineCount
integer (int32)
The held lines that became the contact's live lines.
Request
curl -X POST "https://api.ken.so/v1/campaigns/812/ai-line-holds/812/approve" \
  -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": {
    "contactId": 812,
    "restoredLineCount": 1
  }
}