Shares
Share campaigns and results with your clients.
List the workspace's share links, newest first
/v1/sharesshares.listNeeds the share feature on your workspace. Until it is on, calls answer 404.
Filters: campaignId, accountId (shares with that account's plan) and status (comma-separated: not_opened, viewed, n_of_m_approved, changes_requested, approved). Revoked shares are left out. changesRequestedCount counts every live share with changes requested, whatever the filters. url is empty unless the caller has Share page edit and the share feature. Requires the Share page.
Parameters
400 workspace_required).Response 200
data is a list of ShareModel. Each item has these fields. The response also carries pagination, changesRequestedCount.
https://<app host>/s/<token>.curl -X GET "https://api.ken.so/v1/shares" \ -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",
"company": "string",
"url": "https://example.com",
"campaignId": 812,
"campaignName": "string",
"accountIds": [
812
],
"kinds": [
"string"
],
"permission": "string",
"expiry": "string",
"expiresAt": "2026-09-23T15:02:11Z",
"isExpired": true,
"holdLaunch": true,
"recurringReport": true,
"recipients": [
"string"
],
"status": "string",
"approvedCount": 1,
"kindCount": 1,
"changesRequestedCount": 1,
"kindStatuses": [
{
"kind": "string",
"status": "string"
}
],
"viewCount": 1,
"firstViewedAt": "2026-09-23T15:02:11Z",
"lastViewedAt": "2026-09-23T15:02:11Z",
"submittedAt": "2026-09-23T15:02:11Z",
"submittedByName": "string",
"lastReportSentAt": "2026-09-23T15:02:11Z",
"createdByUserId": 812,
"createdAt": "2026-09-23T15:02:11Z",
"lastActivityAt": "2026-09-23T15:02:11Z",
"items": [
{
"id": 812,
"kind": "string",
"title": "string",
"status": "string",
"approvalItemId": 812,
"decidedAt": "2026-09-23T15:02:11Z",
"decidedByName": "string",
"decisionComment": "string",
"commentCount": 1
}
],
"comments": [
{
"id": 812,
"shareItemId": 812,
"anchor": "string",
"body": "string",
"authorName": "string",
"createdAt": "2026-09-23T15:02:11Z"
}
],
"access": [
{
"label": "string",
"value": "string"
}
],
"activity": [
{
"id": 812,
"type": "string",
"shareItemId": 812,
"actorKind": "string",
"actorName": "string",
"actorUserId": 812,
"data": null,
"createdAt": "2026-09-23T15:02:11Z"
}
],
"alreadyEmailedRecipients": [
"string"
]
}
],
"pagination": {
"nextCursor": "eyJpZCI6ODE1fQ",
"hasMore": true,
"total": 1,
"isTotalCapped": true
},
"changesRequestedCount": 1
}Create a share link
/v1/sharesshares.createNeeds the share feature on your workspace. Until it is on, calls answer 404.
Body: items (one or more of leads, copy, settings, icp, report, plan), campaignId (required unless only plans), accountIds (1-100, required with plan), permission (view, comment, approve), expiry (7_days, 30_days default, never), recipients (up to 20), holdLaunch (approve plus leads, copy or settings), recurringReport (with report), optional name (defaults to "<campaign> · <items>") and company (defaults to the workspace name). Freezes each item's snapshot now. Copy is one item and leads one item per active segment; on an approve share they are the workspace's own external approval items, so a decision on the share also satisfies the launch gate. A campaign with no copy or no active segment answers 400 with an items detail coded empty. Every recipient emailed counts against the workspace's daily share email cap: past it the create answers 429 quota_exceeded (detail code share_email_quota) and creates nothing. Requires Share page edit and the share feature.
Parameters
400 workspace_required).Request body
application/json, optional.
Response 201
data is a ShareModel.
https://<app host>/s/<token>.curl -X POST "https://api.ken.so/v1/shares" \
-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",
"company": "string",
"campaignId": 812,
"accountIds": [
812
],
"items": [
"string"
],
"permission": "string",
"expiry": "string",
"recipients": [
"string"
],
"holdLaunch": true,
"recurringReport": true
}'{
"success": true,
"data": {
"id": 812,
"name": "string",
"company": "string",
"url": "https://example.com",
"campaignId": 812,
"campaignName": "string",
"accountIds": [
812
],
"kinds": [
"string"
],
"permission": "string",
"expiry": "string",
"expiresAt": "2026-09-23T15:02:11Z",
"isExpired": true,
"holdLaunch": true,
"recurringReport": true,
"recipients": [
"string"
],
"status": "string",
"approvedCount": 1,
"kindCount": 1,
"changesRequestedCount": 1,
"kindStatuses": [
{
"kind": "string",
"status": "string"
}
],
"viewCount": 1,
"firstViewedAt": "2026-09-23T15:02:11Z",
"lastViewedAt": "2026-09-23T15:02:11Z",
"submittedAt": "2026-09-23T15:02:11Z",
"submittedByName": "string",
"lastReportSentAt": "2026-09-23T15:02:11Z",
"createdByUserId": 812,
"createdAt": "2026-09-23T15:02:11Z",
"lastActivityAt": "2026-09-23T15:02:11Z",
"items": [
{
"id": 812,
"kind": "string",
"title": "string",
"status": "string",
"approvalItemId": 812,
"decidedAt": "2026-09-23T15:02:11Z",
"decidedByName": "string",
"decisionComment": "string",
"commentCount": 1
}
],
"comments": [
{
"id": 812,
"shareItemId": 812,
"anchor": "string",
"body": "string",
"authorName": "string",
"createdAt": "2026-09-23T15:02:11Z"
}
],
"access": [
{
"label": "string",
"value": "string"
}
],
"activity": [
{
"id": 812,
"type": "string",
"shareItemId": 812,
"actorKind": "string",
"actorName": "string",
"actorUserId": 812,
"data": null,
"createdAt": "2026-09-23T15:02:11Z"
}
],
"alreadyEmailedRecipients": [
"string"
]
}
}Preview a share before creating it, as the reviewer will see it
/v1/shares/previewshares.preview-draftNeeds the share feature on your workspace. Until it is on, calls answer 404.
Takes the body of POST /v1/shares and answers the public payload of GET /v1/public/shares/{token} for the share it would create, from the same snapshot builders: copy rendered for sample leads, the lead lists, settings, ICP, report and account plans. Saves nothing and emails no one. Items are numbered from 1 and not reviewed, except copy and lead lists of an approve share whose version is already approved. Answers what create answers for a bad body. Requires Share page edit and the share feature.
Parameters
400 workspace_required).Request body
application/json, optional.
Response 200
data is a SharePublicModel.
curl -X POST "https://api.ken.so/v1/shares/preview" \
-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",
"company": "string",
"campaignId": 812,
"accountIds": [
812
],
"items": [
"string"
],
"permission": "string",
"expiry": "string",
"recipients": [
"string"
],
"holdLaunch": true,
"recurringReport": true
}'{
"success": true,
"data": {
"brand": {
"productName": "string",
"logoUrl": "https://example.com",
"faviconUrl": "https://example.com"
},
"workspaceName": "string",
"workspaceLogoUrl": "https://example.com",
"workspaceIconUrl": "https://example.com",
"shareName": "string",
"company": "string",
"senderName": "string",
"campaignName": "string",
"permission": "string",
"expiresAt": "2026-09-23T15:02:11Z",
"holdLaunch": true,
"isSubmitted": true,
"submittedAt": "2026-09-23T15:02:11Z",
"submittedByName": "string",
"status": "string",
"approvedCount": 1,
"kindCount": 1,
"items": [
{
"id": 812,
"kind": "string",
"title": "string",
"status": "string",
"canUndo": true,
"decidedAt": "2026-09-23T15:02:11Z",
"decidedByName": "string",
"decisionComment": "string",
"snapshot": null,
"comments": [
{
"id": 812,
"shareItemId": 812,
"anchor": "string",
"body": "string",
"authorName": "string",
"createdAt": "2026-09-23T15:02:11Z"
}
]
}
]
}
}Get a share link with its items, comments, access rows and log
/v1/shares/{shareId}shares.getNeeds the share feature on your workspace. Until it is on, calls answer 404.
url is empty unless the caller has Share page edit and the share feature. Requires the Share page.
Parameters
400 workspace_required).Response 200
data is a ShareModel.
https://<app host>/s/<token>.curl -X GET "https://api.ken.so/v1/shares/812" \ -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",
"company": "string",
"url": "https://example.com",
"campaignId": 812,
"campaignName": "string",
"accountIds": [
812
],
"kinds": [
"string"
],
"permission": "string",
"expiry": "string",
"expiresAt": "2026-09-23T15:02:11Z",
"isExpired": true,
"holdLaunch": true,
"recurringReport": true,
"recipients": [
"string"
],
"status": "string",
"approvedCount": 1,
"kindCount": 1,
"changesRequestedCount": 1,
"kindStatuses": [
{
"kind": "string",
"status": "string"
}
],
"viewCount": 1,
"firstViewedAt": "2026-09-23T15:02:11Z",
"lastViewedAt": "2026-09-23T15:02:11Z",
"submittedAt": "2026-09-23T15:02:11Z",
"submittedByName": "string",
"lastReportSentAt": "2026-09-23T15:02:11Z",
"createdByUserId": 812,
"createdAt": "2026-09-23T15:02:11Z",
"lastActivityAt": "2026-09-23T15:02:11Z",
"items": [
{
"id": 812,
"kind": "string",
"title": "string",
"status": "string",
"approvalItemId": 812,
"decidedAt": "2026-09-23T15:02:11Z",
"decidedByName": "string",
"decisionComment": "string",
"commentCount": 1
}
],
"comments": [
{
"id": 812,
"shareItemId": 812,
"anchor": "string",
"body": "string",
"authorName": "string",
"createdAt": "2026-09-23T15:02:11Z"
}
],
"access": [
{
"label": "string",
"value": "string"
}
],
"activity": [
{
"id": 812,
"type": "string",
"shareItemId": 812,
"actorKind": "string",
"actorName": "string",
"actorUserId": 812,
"data": null,
"createdAt": "2026-09-23T15:02:11Z"
}
],
"alreadyEmailedRecipients": [
"string"
]
}
}Update a share link
/v1/shares/{shareId}shares.updateNeeds the share feature on your workspace. Until it is on, calls answer 404.
Absent fields stay unchanged.
Fields: name, company, recipients (replaces the list), expiry (counted from creation), holdLaunch, recurringReport. What is shared and the permission are fixed: create a new share to change them. Each email address recipients adds counts against the workspace's daily share email cap, since it gets the later reminders and weekly reports: past it the update answers 429 quota_exceeded (share_email_quota) and changes nothing. Requires Share page edit and the share feature.
Parameters
400 workspace_required).Request body
application/json, optional.
Response 200
data is a ShareModel.
https://<app host>/s/<token>.curl -X PATCH "https://api.ken.so/v1/shares/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",
"company": "string",
"recipients": [
"string"
],
"expiry": "string",
"holdLaunch": true,
"recurringReport": true
}'{
"success": true,
"data": {
"id": 812,
"name": "string",
"company": "string",
"url": "https://example.com",
"campaignId": 812,
"campaignName": "string",
"accountIds": [
812
],
"kinds": [
"string"
],
"permission": "string",
"expiry": "string",
"expiresAt": "2026-09-23T15:02:11Z",
"isExpired": true,
"holdLaunch": true,
"recurringReport": true,
"recipients": [
"string"
],
"status": "string",
"approvedCount": 1,
"kindCount": 1,
"changesRequestedCount": 1,
"kindStatuses": [
{
"kind": "string",
"status": "string"
}
],
"viewCount": 1,
"firstViewedAt": "2026-09-23T15:02:11Z",
"lastViewedAt": "2026-09-23T15:02:11Z",
"submittedAt": "2026-09-23T15:02:11Z",
"submittedByName": "string",
"lastReportSentAt": "2026-09-23T15:02:11Z",
"createdByUserId": 812,
"createdAt": "2026-09-23T15:02:11Z",
"lastActivityAt": "2026-09-23T15:02:11Z",
"items": [
{
"id": 812,
"kind": "string",
"title": "string",
"status": "string",
"approvalItemId": 812,
"decidedAt": "2026-09-23T15:02:11Z",
"decidedByName": "string",
"decisionComment": "string",
"commentCount": 1
}
],
"comments": [
{
"id": 812,
"shareItemId": 812,
"anchor": "string",
"body": "string",
"authorName": "string",
"createdAt": "2026-09-23T15:02:11Z"
}
],
"access": [
{
"label": "string",
"value": "string"
}
],
"activity": [
{
"id": 812,
"type": "string",
"shareItemId": 812,
"actorKind": "string",
"actorName": "string",
"actorUserId": 812,
"data": null,
"createdAt": "2026-09-23T15:02:11Z"
}
],
"alreadyEmailedRecipients": [
"string"
]
}
}Revoke a share link
/v1/shares/{shareId}shares.revokeNeeds the share feature on your workspace. Until it is on, calls answer 404.
The link then answers 410 share_inactive. Decisions already made stay. Returns 204. Requires Share page edit and the share feature.
Parameters
400 workspace_required).Response 204
curl -X DELETE "https://api.ken.so/v1/shares/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
Remind the share's recipients
/v1/shares/{shareId}/remindersshares.remindNeeds the share feature on your workspace. Until it is on, calls answer 404.
Emails the link to every recipient that is an email address again and logs share_reminder_sent. Returns 202 with recipientCount, the addresses emailed. An expired share answers 410 share_expired; a share without recipients 400; a share whose recipients are only names 409 no_email_recipients. One reminder per share every 24 hours: another within that answers 429 quota_exceeded (detail code reminder_cooldown) with Retry-After, and so does a reminder past the workspace's daily share email cap (share_email_quota). Nothing is sent then. Requires Share page edit and the share feature.
Parameters
400 workspace_required).Response 202
data is a ShareReminderModel.
curl -X POST "https://api.ken.so/v1/shares/812/reminders" \ -H "Authorization: Bearer $KEN_API_KEY" \ -H "Ken-Version: 2026-11-02" \ -H "X-Ken-Workspace-Id: $KEN_WORKSPACE_ID"
{
"success": true,
"data": {
"shareId": 812,
"recipientCount": 1,
"remindedAt": "2026-09-23T15:02:11Z",
"alreadyEmailedRecipients": [
"string"
]
}
}Preview the share as the reviewer sees it
/v1/shares/{shareId}/previewshares.previewNeeds the share feature on your workspace. Until it is on, calls answer 404.
The public payload of GET /v1/public/shares/{token}, without counting a view. Works on an expired share. Requires the Share page.
Parameters
400 workspace_required).Response 200
data is a SharePublicModel.
curl -X GET "https://api.ken.so/v1/shares/812/preview" \ -H "Authorization: Bearer $KEN_API_KEY" \ -H "Ken-Version: 2026-11-02" \ -H "X-Ken-Workspace-Id: $KEN_WORKSPACE_ID"
{
"success": true,
"data": {
"brand": {
"productName": "string",
"logoUrl": "https://example.com",
"faviconUrl": "https://example.com"
},
"workspaceName": "string",
"workspaceLogoUrl": "https://example.com",
"workspaceIconUrl": "https://example.com",
"shareName": "string",
"company": "string",
"senderName": "string",
"campaignName": "string",
"permission": "string",
"expiresAt": "2026-09-23T15:02:11Z",
"holdLaunch": true,
"isSubmitted": true,
"submittedAt": "2026-09-23T15:02:11Z",
"submittedByName": "string",
"status": "string",
"approvedCount": 1,
"kindCount": 1,
"items": [
{
"id": 812,
"kind": "string",
"title": "string",
"status": "string",
"canUndo": true,
"decidedAt": "2026-09-23T15:02:11Z",
"decidedByName": "string",
"decisionComment": "string",
"snapshot": null,
"comments": [
{
"id": 812,
"shareItemId": 812,
"anchor": "string",
"body": "string",
"authorName": "string",
"createdAt": "2026-09-23T15:02:11Z"
}
]
}
]
}
}