Kenso

Tags

Tag definitions, and assigning them to records one at a time or in bulk.

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

entityType (campaign, contact, mailbox, domain, reply, account, linkedin_account, person) lists the tags that can go on that type: every user tag, plus system tags and sender configs whose scope includes it. With entityId, the list is the tags assigned to that campaign, contact, mailbox, domain, account, LinkedIn account, or person. systemKey lists only the workspace's system tag with that key, created on first use: systemKey=champion returns the Champion tag a person carries to be watched for a job change. Reply and LinkedIn conversation assignments use POST /v1/tags/{tagId}/assignments. includeUsage=true adds usage to each tag: live assignment counts in this workspace (campaignCount, contactCount, replyCount for email messages, linkedinConversationCount, inboxCount, domainCount, accountCount, linkedinAccountCount). Without it usage is absent. entityType=campaign&includeEntityIds=true adds entityIds to each tag: the ids of the workspace's live campaigns carrying it, so every campaign's tags take one call. Another entityType with it is 400 validation_failed; without it entityIds is absent.

Parameters

Name
In
Type
Required
Description
Limit
In: query
integer (int32)
optional
Cursor
In: query
string
optional
EntityType
In: query
string
optional
EntityId
In: query
integer (int64)
optional
IncludeUsage
In: query
boolean
optional
true adds usage (assignment counts per entity type) to every tag on the page.
IncludeEntityIds
In: query
boolean
optional
With entityType=campaign, true adds entityIds (the live campaigns carrying it) to every tag on the page.
SystemKey
In: query
string
optional
Only the workspace's system tag with this key, created on first use: champion finds the Champion tag for people.
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 TagModel. Each item has these fields. The response also carries pagination.

Field
Type
Description
id
integer (int64)
name
string
description
string
color
string
type
string
entityTypes
array of string
isConfig
boolean
isSystem
boolean
systemKey
string
createdAt
string (date-time)
updatedAt
string (date-time)
usage
TagUsageModel
Live assignments of a tag in the workspace. Deleted assignments and deleted targets do not count.
entityIds
array of integer (int64)
Only with entityType=campaign&includeEntityIds=true; absent otherwise. The ids, ascending, of the workspace's live campaigns that carry the tag.
Request
curl -X GET "https://api.ken.so/v1/tags" \
  -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": 341,
      "name": "Hot lead",
      "description": "Asked for a call or pricing",
      "color": "#FFD6A5",
      "type": "contact",
      "entityTypes": [
        "contact",
        "reply"
      ],
      "isConfig": false,
      "isSystem": false,
      "createdAt": "2026-09-23T15:02:11Z",
      "updatedAt": "2026-10-14T09:41:27Z"
    }
  ],
  "pagination": {
    "nextCursor": "eyJpZCI6ODE1fQ",
    "hasMore": true,
    "total": 1,
    "isTotalCapped": true
  }
}

Requires the workspace settings permission (owners, admins and editors by default). entityTypes (campaign, contact, mailbox, domain, reply, account, linkedin_account, person) is the scopes the tag lists under; omitted or empty means every scope. Any tag that is not a system tag can be assigned to any entity type whatever its scopes. A name already used in the workspace (case-insensitive) is 400 validation_failed. color defaults to #E4D0FF.

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
description
string
optional
color
string
optional
entityTypes
array of string
optional
Omitted or empty: every entity type, account and linkedin_account included.

Response 201

data is a TagModel.

Field
Type
Description
id
integer (int64)
name
string
description
string
color
string
type
string
entityTypes
array of string
isConfig
boolean
isSystem
boolean
systemKey
string
createdAt
string (date-time)
updatedAt
string (date-time)
usage
TagUsageModel
Live assignments of a tag in the workspace. Deleted assignments and deleted targets do not count.
entityIds
array of integer (int64)
Only with entityType=campaign&includeEntityIds=true; absent otherwise. The ids, ascending, of the workspace's live campaigns that carry the tag.
Request
curl -X POST "https://api.ken.so/v1/tags" \
  -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": "Hot lead",
  "description": "Asked for a call or pricing",
  "color": "#FFD6A5",
  "entityTypes": [
    "contact",
    "reply"
  ]
}'
Response 201
{
  "success": true,
  "data": {
    "id": 341,
    "name": "Hot lead",
    "description": "Asked for a call or pricing",
    "color": "#FFD6A5",
    "type": "contact",
    "entityTypes": [
      "contact",
      "reply"
    ],
    "isConfig": false,
    "isSystem": false,
    "createdAt": "2026-09-23T15:02:11Z",
    "updatedAt": "2026-10-14T09:41:27Z"
  }
}

Parameters

Name
In
Type
Required
Description
tagId
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 TagModel.

Field
Type
Description
id
integer (int64)
name
string
description
string
color
string
type
string
entityTypes
array of string
isConfig
boolean
isSystem
boolean
systemKey
string
createdAt
string (date-time)
updatedAt
string (date-time)
usage
TagUsageModel
Live assignments of a tag in the workspace. Deleted assignments and deleted targets do not count.
entityIds
array of integer (int64)
Only with entityType=campaign&includeEntityIds=true; absent otherwise. The ids, ascending, of the workspace's live campaigns that carry the tag.
Request
curl -X GET "https://api.ken.so/v1/tags/812" \
  -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": 341,
    "name": "Hot lead",
    "description": "Asked for a call or pricing",
    "color": "#FFD6A5",
    "type": "contact",
    "entityTypes": [
      "contact",
      "reply"
    ],
    "isConfig": false,
    "isSystem": false,
    "createdAt": "2026-09-23T15:02:11Z",
    "updatedAt": "2026-10-14T09:41:27Z"
  }
}

Absent fields stay unchanged. null description clears it. Requires the workspace settings permission (owners, admins and editors by default).

Parameters

Name
In
Type
Required
Description
tagId
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: object.

Response 200

data is a TagModel.

Field
Type
Description
id
integer (int64)
name
string
description
string
color
string
type
string
entityTypes
array of string
isConfig
boolean
isSystem
boolean
systemKey
string
createdAt
string (date-time)
updatedAt
string (date-time)
usage
TagUsageModel
Live assignments of a tag in the workspace. Deleted assignments and deleted targets do not count.
entityIds
array of integer (int64)
Only with entityType=campaign&includeEntityIds=true; absent otherwise. The ids, ascending, of the workspace's live campaigns that carry the tag.
Request
curl -X PATCH "https://api.ken.so/v1/tags/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 '{}'
Response 200
{
  "success": true,
  "data": {
    "id": 341,
    "name": "Hot lead",
    "description": "Asked for a call or pricing",
    "color": "#FFD6A5",
    "type": "contact",
    "entityTypes": [
      "contact",
      "reply"
    ],
    "isConfig": false,
    "isSystem": false,
    "createdAt": "2026-09-23T15:02:11Z",
    "updatedAt": "2026-10-14T09:41:27Z"
  }
}

Delete a tag definition

DELETE/v1/tags/{tagId}tags.delete

Try it on developer.ken.so

Soft-deletes the definition and its assignments. Requires the workspace settings permission (owners, admins and editors by default).

Parameters

Name
In
Type
Required
Description
tagId
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/tags/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

Assign a tag to an entity

POST/v1/tags/{tagId}/assignmentstags.assign

Try it on developer.ken.so

entityType is campaign, contact, mailbox, domain, account, or linkedin_account or person with entityId. reply uses messageId. linkedin_conversation uses conversationId. A tag that is not a system tag can be assigned to any entity type; a system tag only to its scopes. Assigning a tag the entity already has succeeds and changes nothing. An entity outside the workspace, or a deleted one, is 404 not_found. Mailbox, domain and LinkedIn account tags need Delivery edit; person tags need Accounts edit, like account tags. The route itself needs workspace membership.

Parameters

Name
In
Type
Required
Description
tagId
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
entityType
string
optional
entityId
integer (int64)
optional
messageId
string
optional
conversationId
string
optional

Response 200

data is a TagAssignmentModel.

Field
Type
Description
tagId
integer (int64)
entityType
string
entityId
integer (int64)
messageId
string
conversationId
string
Request
curl -X POST "https://api.ken.so/v1/tags/812/assignments" \
  -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 '{
  "entityType": "string",
  "entityId": 812,
  "messageId": "msg_ZW1haWw6NDAyMjg0LjJAZXhhbXBsZS5jb20",
  "conversationId": "string"
}'
Response 200
{
  "success": true,
  "data": {
    "tagId": 812,
    "entityType": "string",
    "entityId": 812,
    "messageId": "msg_ZW1haWw6NDAyMjg0LjJAZXhhbXBsZS5jb20",
    "conversationId": "string"
  }
}

Remove a tag assignment

DELETE/v1/tags/{tagId}/assignmentstags.unassign

Try it on developer.ken.so

Query parameters, not a body: entityType plus entityId, messageId, or conversationId. A missing entityType is validation_failed. The route needs workspace membership; the entity type adds its page edit access, as on assign.

Parameters

Name
In
Type
Required
Description
tagId
In: path
integer (int64)
required
EntityType
In: query
string
optional
EntityId
In: query
integer (int64)
optional
MessageId
In: query
string
optional
ConversationId
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 TagAssignmentModel.

Field
Type
Description
tagId
integer (int64)
entityType
string
entityId
integer (int64)
messageId
string
conversationId
string
Request
curl -X DELETE "https://api.ken.so/v1/tags/812/assignments" \
  -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": {
    "tagId": 812,
    "entityType": "string",
    "entityId": 812,
    "messageId": "msg_ZW1haWw6NDAyMjg0LjJAZXhhbXBsZS5jb20",
    "conversationId": "string"
  }
}

Assign a tag to up to 1,000 entities in one call

POST/v1/tags/{tagId}/assignments/bulk-createtags.bulk-assign

Try it on developer.ken.so

Each item has the shape of the single assignment body. Items run one at a time in request order through the same path as POST /v1/tags/{tagId}/assignments. An entity outside the workspace is not_found and is not written. results is in request order; status is assigned, not_found, validation_failed, or failed. The whole request is rejected, with nothing written, when items is empty, has more than 1,000 entries, or has a null entry. A tag outside the workspace is 404. The route needs workspace membership; each item's entity type adds its page edit access, as on assign.

Parameters

Name
In
Type
Required
Description
tagId
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
items
array of TagAssignmentRequest
optional

Response 200

data is a TagAssignmentBulkResult.

Field
Type
Description
succeeded
integer (int32)
failed
integer (int32)
results
array of TagAssignmentBulkItemResult
Request
curl -X POST "https://api.ken.so/v1/tags/812/assignments/bulk-create" \
  -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 '{
  "items": [
    {
      "entityType": "string",
      "entityId": 812,
      "messageId": "msg_ZW1haWw6NDAyMjg0LjJAZXhhbXBsZS5jb20",
      "conversationId": "string"
    }
  ]
}'
Response 200
{
  "success": true,
  "data": {
    "succeeded": 1,
    "failed": 1,
    "results": [
      {
        "index": 1,
        "status": "string",
        "error": "string"
      }
    ]
  }
}

Remove a tag from up to 1,000 entities in one call

POST/v1/tags/{tagId}/assignments/bulk-deletetags.bulk-unassign

Try it on developer.ken.so

Same body, validation, and per-item behavior as bulk-create, through the same path as DELETE /v1/tags/{tagId}/assignments. A successful item is removed. The route needs workspace membership; each item's entity type adds its page edit access, as on assign.

Parameters

Name
In
Type
Required
Description
tagId
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
items
array of TagAssignmentRequest
optional

Response 200

data is a TagAssignmentBulkResult.

Field
Type
Description
succeeded
integer (int32)
failed
integer (int32)
results
array of TagAssignmentBulkItemResult
Request
curl -X POST "https://api.ken.so/v1/tags/812/assignments/bulk-delete" \
  -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 '{
  "items": [
    {
      "entityType": "string",
      "entityId": 812,
      "messageId": "msg_ZW1haWw6NDAyMjg0LjJAZXhhbXBsZS5jb20",
      "conversationId": "string"
    }
  ]
}'
Response 200
{
  "success": true,
  "data": {
    "succeeded": 1,
    "failed": 1,
    "results": [
      {
        "index": 1,
        "status": "string",
        "error": "string"
      }
    ]
  }
}