Blocklist rules
Rules that block contacts by pattern.
List blocklist rules
/v1/blocklist-rulesblocklist-rules.listNeeds the blocklist_rules feature on your workspace. Until it is on, calls answer 404.
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
400 workspace_required).Response 200
data is a list of BlocklistRuleModel. Each item has these fields. The response also carries pagination.
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"
{
"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
/v1/blocklist-rulesblocklist-rules.createNeeds the blocklist_rules feature on your workspace. Until it is on, calls answer 404.
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
400 workspace_required).Request body
application/json, optional.
Response 201
data is a BlocklistRuleModel.
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"
]
}'{
"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
/v1/blocklist-rules/previewblocklist-rules.previewNeeds the blocklist_rules feature on your workspace. Until it is on, calls answer 404.
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
GET /v1/opportunity-stages, up to 20.GET /v1/crm-connections/{connectionId}/lists; read live, never stored.400 workspace_required).Response 200
data is a BlocklistRulePreviewModel.
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"
{
"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
/v1/blocklist-rules/{ruleId}blocklist-rules.updateNeeds the blocklist_rules feature on your workspace. Until it is on, calls answer 404.
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
400 workspace_required).Request body
application/json, optional.
Response 200
data is a BlocklistRuleModel.
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"
]
}'{
"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
/v1/blocklist-rules/{ruleId}blocklist-rules.deleteNeeds the blocklist_rules feature on your workspace. Until it is on, calls answer 404.
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
400 workspace_required).Response 204
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"
HTTP/1.1 204 No Content