Kenso

Blocklist rules

Rules that block contacts by pattern.

Contacts and lists5 endpointsKen-Version: 2026-11-02AuthenticationWorkspacesErrors

List blocklist rules

GET/v1/blocklist-rulesblocklist-rules.list

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

Try it on developer.ken.so

Every rule in position order (at most 20), each with stages, accountTypes, crmLifecycles, crmList (with the members and readAt of its last read) and matches: the accounts its stages (and release window, releaseAfterDays) or account types match now (each once), the domains and people (emails) it blocks and the CRM records it matches, enabled or not. The first enabled rule that matches a domain or email gives its entry the reason. Requires ReadAccess.

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 BlocklistRuleModel. Each item has these fields. The response also carries pagination.

Field
Type
Description
id
integer (int64)
name
string
stages
array of string
accountTypes
array of string
reason
string
enabled
boolean
position
integer (int32)
releaseAfterDays
integer (int32)
crmConnectionId
integer (int64)
crmLifecycles
array of string
crmList
BlocklistRuleCrmListModel
matches
BlocklistRuleMatchesModel
createdAt
string (date-time)
updatedAt
string (date-time)
Request
curl -X GET "https://api.ken.so/v1/blocklist-rules" \
  -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,
      "name": "string",
      "stages": [
        "string"
      ],
      "accountTypes": [
        "string"
      ],
      "reason": "string",
      "enabled": true,
      "position": 1,
      "releaseAfterDays": 1,
      "crmConnectionId": 812,
      "crmLifecycles": [
        "string"
      ],
      "crmList": {
        "externalId": "string",
        "name": "string",
        "objectType": "string",
        "members": 1,
        "readAt": "2026-09-23T15:02:11Z"
      },
      "matches": {
        "accounts": 1,
        "domains": 1,
        "people": 1,
        "crmRecords": 1
      },
      "createdAt": "2026-09-23T15:02:11Z",
      "updatedAt": "2026-09-23T15:02:11Z"
    }
  ],
  "pagination": {
    "nextCursor": "eyJpZCI6ODE1fQ",
    "hasMore": true,
    "total": 1,
    "isTotalCapped": true
  }
}

Create a blocklist rule

POST/v1/blocklist-rulesblocklist-rules.create

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

Try it on developer.ken.so

Body: name (1-100), stages (up to 20 keys from GET /v1/opportunity-stages, none archived, else 400 out_of_range), accountTypes (account types to match: client, lost, churned, partner, competitor, investor, do_not_contact; never prospect), reason (1-200, goes on every entry the rule adds), enabled (default true) and releaseAfterDays (1-3650, default none: an account matched by stage comes off that many days after its deal in the stages closed; a deal with no close date and a match by type never release), crmLifecycles (up to 5 of lead, prospect, opportunity, customer, churned: CRM records in those stages) and crmListId (a contact or company list of the connected CRM, at most 10,000 members). The CRM criteria bind the workspace's connected CRM (crmConnectionId) and fail as on the preview (not_enabled, invalid_state, unsupported, out_of_range, 503, 429). A rule needs at least one stage, account type, CRM lifecycle stage or a CRM list (400 validation_failed otherwise); it matches an account with a live opportunity in one of its stages or whose type is one of its account types, and the CRM records in its lifecycle stages or on its list. The rule goes last and its list is read right away. An enabled rule's domains and people are on the blocklist when this returns; a domain or email any entry already lists keeps that entry, and a free email domain is never blocked. A workspace's 21st rule is 409 conflict. Returns 201. Requires workspace settings access.

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
name
string
optional
stages
array of string
optional
accountTypes
array of string
optional
reason
string
optional
enabled
boolean
optional
releaseAfterDays
integer (int32)
optional
crmListId
string
optional
crmLifecycles
array of string
optional

Response 201

data is a BlocklistRuleModel.

Field
Type
Description
id
integer (int64)
name
string
stages
array of string
accountTypes
array of string
reason
string
enabled
boolean
position
integer (int32)
releaseAfterDays
integer (int32)
crmConnectionId
integer (int64)
crmLifecycles
array of string
crmList
BlocklistRuleCrmListModel
matches
BlocklistRuleMatchesModel
createdAt
string (date-time)
updatedAt
string (date-time)
Request
curl -X POST "https://api.ken.so/v1/blocklist-rules" \
  -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 '{
  "name": "string",
  "stages": [
    "string"
  ],
  "accountTypes": [
    "string"
  ],
  "reason": "string",
  "enabled": true,
  "releaseAfterDays": 1,
  "crmListId": "string",
  "crmLifecycles": [
    "string"
  ]
}'
Response 201
{
  "success": true,
  "data": {
    "id": 812,
    "name": "string",
    "stages": [
      "string"
    ],
    "accountTypes": [
      "string"
    ],
    "reason": "string",
    "enabled": true,
    "position": 1,
    "releaseAfterDays": 1,
    "crmConnectionId": 812,
    "crmLifecycles": [
      "string"
    ],
    "crmList": {
      "externalId": "string",
      "name": "string",
      "objectType": "string",
      "members": 1,
      "readAt": "2026-09-23T15:02:11Z"
    },
    "matches": {
      "accounts": 1,
      "domains": 1,
      "people": 1,
      "crmRecords": 1
    },
    "createdAt": "2026-09-23T15:02:11Z",
    "updatedAt": "2026-09-23T15:02:11Z"
  }
}

Preview what a blocklist rule would block

GET/v1/blocklist-rules/previewblocklist-rules.preview

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

Try it on developer.ken.so

stages is a comma-separated list of up to 20 stage keys from GET /v1/opportunity-stages; an unknown or archived key is 400 out_of_range. accountTypes is a comma-separated list of account types (client, lost, churned, partner, competitor, investor, do_not_contact; prospect or an unknown type is 400 out_of_range). Send at least one of the two, or a CRM criterion: crmLifecycles is a comma-separated list of up to 5 CRM lifecycle stages (lead, prospect, opportunity, customer, churned) and crmListId a contact or company list of the connected CRM (GET /v1/crm-connections/{connectionId}/lists, at most 10,000 members, read live now and never stored). A CRM criterion while blocklist_rules_crm is off is 400 not_enabled; with no connected CRM 400 invalid_state; on a CRM Kenso cannot read lists or lifecycle stages from 400 unsupported; an unknown or too large list 400 out_of_range; a CRM that is not reachable or rate limited 503 or 429. Returns the accounts with a live opportunity in one of the stages or of one of the types (each once), the distinct domains and people (emails) a rule would block, the CRM records it matches (crmRecords), how many of the domains and people a blocklist entry already lists (alreadyBlocked, any source), up to 10 accounts by id with one of their domains, up to 10 CRM records with the email or domain each blocks (crmSample), and what is left out: accounts and CRM companies with no domain, CRM contacts with neither a company domain nor an email (skipped.noEmail) and free email domains. Optional releaseAfterDays (1-3650) previews a release window: an account matched by stage counts only while one of its deals in the stages closed less than that many days ago or has no close date (a match by type or from the CRM never releases), and skipped.released counts the accounts it already let go. Never writes. Requires ReadAccess (accounts view), since it names accounts.

Parameters

Name
In
Type
Required
Description
Stages
In: query
string
optional
Comma-separated stage keys from GET /v1/opportunity-stages, up to 20.
AccountTypes
In: query
string
optional
Comma-separated account types: client, lost, churned, partner, competitor, investor, do_not_contact.
ReleaseAfterDays
In: query
integer (int32)
optional
1 to 3650: previews a release window on the stage matches.
CrmListId
In: query
string
optional
A contact or company list of the connected CRM, from GET /v1/crm-connections/{connectionId}/lists; read live, never stored.
CrmLifecycles
In: query
string
optional
Comma-separated CRM lifecycle stages, up to 5: lead, prospect, opportunity, customer, churned.
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 BlocklistRulePreviewModel.

Field
Type
Description
accounts
integer (int32)
domains
integer (int32)
people
integer (int32)
crmRecords
integer (int32)
alreadyBlocked
integer (int32)
sample
array of BlocklistRuleSampleModel
crmSample
array of BlocklistRuleCrmSampleModel
skipped
BlocklistRuleSkippedModel
Request
curl -X GET "https://api.ken.so/v1/blocklist-rules/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": {
    "accounts": 1,
    "domains": 1,
    "people": 1,
    "crmRecords": 1,
    "alreadyBlocked": 1,
    "sample": [
      {
        "accountId": 812,
        "name": "string",
        "domain": "example.com"
      }
    ],
    "crmSample": [
      {
        "externalId": "string",
        "name": "string",
        "value": "string"
      }
    ],
    "skipped": {
      "noDomain": 1,
      "noEmail": 1,
      "freeMail": 1,
      "released": 1
    }
  }
}

Update a blocklist rule

PATCH/v1/blocklist-rules/{ruleId}blocklist-rules.update

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

Try it on developer.ken.so

Any of name, stages, accountTypes, reason, enabled, position (0-based; past the last rule moves it last, and the rest renumber), releaseAfterDays (1-3650, or null so the rule never releases), crmLifecycles and crmListId (null clears the list; a new list is read right away). Absent fields stay; only releaseAfterDays and crmListId can be null. stages, accountTypes or crmLifecycles may be [] while the rule keeps another criterion. Setting a CRM criterion binds the connected CRM and fails as on create; clearing both clears crmConnectionId. The blocklist follows right away: entries no enabled rule matches any more come off, and entries whose first matching rule changed take its reason. Another workspace's rule is 404. Requires workspace settings access.

Parameters

Name
In
Type
Required
Description
ruleId
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).

Request body

application/json, optional.

Field
Type
Required
Description
name
string
optional
stages
array of string
optional
accountTypes
array of string
optional
reason
string
optional
enabled
boolean
optional
position
integer (int32)
optional
releaseAfterDays
integer (int32)
optional
crmListId
string
optional
crmLifecycles
array of string
optional

Response 200

data is a BlocklistRuleModel.

Field
Type
Description
id
integer (int64)
name
string
stages
array of string
accountTypes
array of string
reason
string
enabled
boolean
position
integer (int32)
releaseAfterDays
integer (int32)
crmConnectionId
integer (int64)
crmLifecycles
array of string
crmList
BlocklistRuleCrmListModel
matches
BlocklistRuleMatchesModel
createdAt
string (date-time)
updatedAt
string (date-time)
Request
curl -X PATCH "https://api.ken.so/v1/blocklist-rules/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 '{
  "name": "string",
  "stages": [
    "string"
  ],
  "accountTypes": [
    "string"
  ],
  "reason": "string",
  "enabled": true,
  "position": 1,
  "releaseAfterDays": 1,
  "crmListId": "string",
  "crmLifecycles": [
    "string"
  ]
}'
Response 200
{
  "success": true,
  "data": {
    "id": 812,
    "name": "string",
    "stages": [
      "string"
    ],
    "accountTypes": [
      "string"
    ],
    "reason": "string",
    "enabled": true,
    "position": 1,
    "releaseAfterDays": 1,
    "crmConnectionId": 812,
    "crmLifecycles": [
      "string"
    ],
    "crmList": {
      "externalId": "string",
      "name": "string",
      "objectType": "string",
      "members": 1,
      "readAt": "2026-09-23T15:02:11Z"
    },
    "matches": {
      "accounts": 1,
      "domains": 1,
      "people": 1,
      "crmRecords": 1
    },
    "createdAt": "2026-09-23T15:02:11Z",
    "updatedAt": "2026-09-23T15:02:11Z"
  }
}

Delete a blocklist rule

DELETE/v1/blocklist-rules/{ruleId}blocklist-rules.delete

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

Try it on developer.ken.so

Soft delete; the rest renumber. Entries only this rule matched come off the blocklist right away. Returns 204. Another workspace's rule is 404. Requires workspace settings access.

Parameters

Name
In
Type
Required
Description
ruleId
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 204

Request
curl -X DELETE "https://api.ken.so/v1/blocklist-rules/812" \
  -H "Authorization: Bearer $KEN_API_KEY" \
  -H "Ken-Version: 2026-11-02" \
  -H "X-Ken-Workspace-Id: $KEN_WORKSPACE_ID"
Response 204
HTTP/1.1 204 No Content