Saved lists
The Saved lists endpoints of the Kenso API.
List a saved list's members
/v1/saved-lists/{savedListId}/memberssaved-lists.list-membersNeeds the saved_lists feature on your workspace. Until it is on, calls answer 404.
Members in id order. limit 1-100 (default 50); cursor is the previous page's nextCursor. q (up to 200 characters) matches a part of the full name, the title or the company name, any case, and is ignored when shorter than 2 characters. country, seniority, industry and headcountBand match the stored value exactly (take them from the list's counts breakdowns); title matches a part of the title, any case; hasSendableEmail is true or false. Opted-out members never show. includeTotal=true adds pagination.total, the filtered count; with no filter (and no q) on a library list it is the list's stored member count, the same number as counts.members. With q on a large list that count reads every row of it, so leave it off to page fast. A member never carries an email or a phone: emailCount and phoneCount say how many the list holds, an email identity key shows as em: plus the member id, and a custom field holding an email or a phone is left out. Each member on the page counts one row of the workspace's apiReadRows quota; past it, 429 quota_exceeded. Requires the Search page (view).
Parameters
400 workspace_required).Response 200
data is a list of SavedListMemberModel. Each item has these fields. The response also carries pagination.
curl -X GET "https://api.ken.so/v1/saved-lists/812/members" \ -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,
"identityKey": "string",
"firstName": "string",
"lastName": "string",
"title": "string",
"seniority": "string",
"companyName": "string",
"companyDomain": "example.com",
"industry": "string",
"headcountBand": "string",
"country": "string",
"state": "string",
"city": "string",
"linkedinUrl": "https://example.com",
"hasSendableEmail": true,
"emailCount": 1,
"phoneCount": 1,
"sources": [
"string"
],
"custom": {
"key": "string"
}
}
],
"pagination": {
"nextCursor": "eyJpZCI6ODE1fQ",
"hasMore": true,
"total": 1,
"isTotalCapped": true
}
}Remove a member from a saved list
/v1/saved-lists/{savedListId}/members/{memberId}saved-lists.remove-memberNeeds the saved_lists feature on your workspace. Until it is on, calls answer 404.
Own lists only: a list shared with the workspace, a library list, another user's private list or a member of another list is 404. Recounts the list. 204 on success. Requires the Search page (edit).
Parameters
400 workspace_required).Response 204
curl -X DELETE "https://api.ken.so/v1/saved-lists/812/members/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
List saved lists
/v1/saved-listssaved-lists.listNeeds the saved_lists feature on your workspace. Until it is on, calls answer 404.
scope: own (default; the workspace's lists, private ones only for their owner user), shared (lists other workspaces shared with this one through an accepted invite) or library (approved library lists). kind (people or companies), q (name contains, any case) and icpTag (one tag, exact) filter; slug with scope=library returns the one library list with that slug, or none. limit 1-100 (default 50) and cursor page the list in id order; pagination.total counts every match. On a shared or library list each source shows its type, status and counts but not its parameters. Requires search view.
Parameters
400 workspace_required).Response 200
data is a list of SavedListModel. Each item has these fields. The response also carries pagination.
curl -X GET "https://api.ken.so/v1/saved-lists" \ -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,
"kind": "people",
"visibility": "private",
"access": "owner",
"name": "string",
"description": "string",
"slug": "string",
"icpTags": [
"string"
],
"libraryState": "none",
"publicPageEnabled": true,
"ownerUserId": 812,
"createdByUserId": 812,
"rightsConfirmedAt": "2026-09-23T15:02:11Z",
"hasCsvMembers": true,
"counts": {
"members": 1,
"sendableEmails": 1,
"byCountry": {
"key": 1
},
"bySeniority": {
"key": 1
},
"byIndustry": {
"key": 1
},
"byHeadcountBand": {
"key": 1
}
},
"sources": [
{
"id": 812,
"sourceType": "search_filters",
"parameters": null,
"status": "pending",
"statusMessage": "string",
"addedByUserId": 812,
"lastRefreshedAt": "2026-09-23T15:02:11Z",
"lastRefreshAdded": 1,
"createdAt": "2026-09-23T15:02:11Z"
}
],
"lastRefreshedAt": "2026-09-23T15:02:11Z",
"submittedAt": "2026-09-23T15:02:11Z",
"reviewedAt": "2026-09-23T15:02:11Z",
"reviewReason": "string",
"submittedByWorkspaceName": "string",
"createdAt": "2026-09-23T15:02:11Z",
"updatedAt": "2026-09-23T15:02:11Z"
}
],
"pagination": {
"nextCursor": "eyJpZCI6ODE1fQ",
"hasMore": true,
"total": 1,
"isTotalCapped": true
}
}Create a saved list
/v1/saved-listssaved-lists.createNeeds the saved_lists feature on your workspace. Until it is on, calls answer 404.
Body: name (1-200), kind (people or companies), optional description (up to 2000), visibility (workspace, the default, or private: only you see it; needs a signed-in user) and icpTags (up to 20, each up to 50 characters). The list starts empty and belongs to you. Returns 201. Requires search edit.
Parameters
400 workspace_required).Request body
application/json, optional.
Response 201
data is a SavedListModel.
curl -X POST "https://api.ken.so/v1/saved-lists" \
-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",
"kind": "string",
"description": "string",
"visibility": "string",
"icpTags": [
"string"
]
}'{
"success": true,
"data": {
"id": 812,
"kind": "people",
"visibility": "private",
"access": "owner",
"name": "string",
"description": "string",
"slug": "string",
"icpTags": [
"string"
],
"libraryState": "none",
"publicPageEnabled": true,
"ownerUserId": 812,
"createdByUserId": 812,
"rightsConfirmedAt": "2026-09-23T15:02:11Z",
"hasCsvMembers": true,
"counts": {
"members": 1,
"sendableEmails": 1,
"byCountry": {
"key": 1
},
"bySeniority": {
"key": 1
},
"byIndustry": {
"key": 1
},
"byHeadcountBand": {
"key": 1
}
},
"sources": [
{
"id": 812,
"sourceType": "search_filters",
"parameters": null,
"status": "pending",
"statusMessage": "string",
"addedByUserId": 812,
"lastRefreshedAt": "2026-09-23T15:02:11Z",
"lastRefreshAdded": 1,
"createdAt": "2026-09-23T15:02:11Z"
}
],
"lastRefreshedAt": "2026-09-23T15:02:11Z",
"submittedAt": "2026-09-23T15:02:11Z",
"reviewedAt": "2026-09-23T15:02:11Z",
"reviewReason": "string",
"submittedByWorkspaceName": "string",
"createdAt": "2026-09-23T15:02:11Z",
"updatedAt": "2026-09-23T15:02:11Z"
}
}Get a saved list
/v1/saved-lists/{savedListId}saved-lists.getNeeds the saved_lists feature on your workspace. Until it is on, calls answer 404.
A list of this workspace, a list shared with it through an accepted invite, or an approved library list, with its counts and sources. Anything else is 404. Requires search view.
Parameters
400 workspace_required).Response 200
data is a SavedListModel.
curl -X GET "https://api.ken.so/v1/saved-lists/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,
"kind": "people",
"visibility": "private",
"access": "owner",
"name": "string",
"description": "string",
"slug": "string",
"icpTags": [
"string"
],
"libraryState": "none",
"publicPageEnabled": true,
"ownerUserId": 812,
"createdByUserId": 812,
"rightsConfirmedAt": "2026-09-23T15:02:11Z",
"hasCsvMembers": true,
"counts": {
"members": 1,
"sendableEmails": 1,
"byCountry": {
"key": 1
},
"bySeniority": {
"key": 1
},
"byIndustry": {
"key": 1
},
"byHeadcountBand": {
"key": 1
}
},
"sources": [
{
"id": 812,
"sourceType": "search_filters",
"parameters": null,
"status": "pending",
"statusMessage": "string",
"addedByUserId": 812,
"lastRefreshedAt": "2026-09-23T15:02:11Z",
"lastRefreshAdded": 1,
"createdAt": "2026-09-23T15:02:11Z"
}
],
"lastRefreshedAt": "2026-09-23T15:02:11Z",
"submittedAt": "2026-09-23T15:02:11Z",
"reviewedAt": "2026-09-23T15:02:11Z",
"reviewReason": "string",
"submittedByWorkspaceName": "string",
"createdAt": "2026-09-23T15:02:11Z",
"updatedAt": "2026-09-23T15:02:11Z"
}
}Update a saved list
/v1/saved-lists/{savedListId}saved-lists.updateNeeds the saved_lists feature on your workspace. Until it is on, calls answer 404.
Any of name, description (null clears it), visibility (workspace or private; only the list's owner can make it private) and icpTags ([] clears them). Absent fields stay. Only this workspace's lists; a shared or library list is 404. Requires search edit.
Parameters
400 workspace_required).Request body
application/json, optional.
Response 200
data is a SavedListModel.
curl -X PATCH "https://api.ken.so/v1/saved-lists/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",
"description": "string",
"visibility": "string",
"icpTags": [
"string"
]
}'{
"success": true,
"data": {
"id": 812,
"kind": "people",
"visibility": "private",
"access": "owner",
"name": "string",
"description": "string",
"slug": "string",
"icpTags": [
"string"
],
"libraryState": "none",
"publicPageEnabled": true,
"ownerUserId": 812,
"createdByUserId": 812,
"rightsConfirmedAt": "2026-09-23T15:02:11Z",
"hasCsvMembers": true,
"counts": {
"members": 1,
"sendableEmails": 1,
"byCountry": {
"key": 1
},
"bySeniority": {
"key": 1
},
"byIndustry": {
"key": 1
},
"byHeadcountBand": {
"key": 1
}
},
"sources": [
{
"id": 812,
"sourceType": "search_filters",
"parameters": null,
"status": "pending",
"statusMessage": "string",
"addedByUserId": 812,
"lastRefreshedAt": "2026-09-23T15:02:11Z",
"lastRefreshAdded": 1,
"createdAt": "2026-09-23T15:02:11Z"
}
],
"lastRefreshedAt": "2026-09-23T15:02:11Z",
"submittedAt": "2026-09-23T15:02:11Z",
"reviewedAt": "2026-09-23T15:02:11Z",
"reviewReason": "string",
"submittedByWorkspaceName": "string",
"createdAt": "2026-09-23T15:02:11Z",
"updatedAt": "2026-09-23T15:02:11Z"
}
}Delete a saved list
/v1/saved-lists/{savedListId}saved-lists.deleteNeeds the saved_lists feature on your workspace. Until it is on, calls answer 404.
Soft delete of one of this workspace's lists. A library copy approved from it stays. Returns 204. A shared or library list is 404. Requires search edit.
Parameters
400 workspace_required).Response 204
curl -X DELETE "https://api.ken.so/v1/saved-lists/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
Copy a saved list into a new list of this workspace
/v1/saved-lists/{savedListId}/copysaved-lists.copyNeeds the saved_lists feature on your workspace. Until it is on, calls answer 404.
Copies any list you can read (your own, one shared with you, or a library list) into a new workspace list that belongs to you. Optional body: name (default "<name> (copy)") and memberFilters (country, seniority, title contains, industry, headcountBand, hasSendableEmail) to copy only matching members. Opted-out members are never copied. At most 500,000 members (400 too_many_members). Returns 201 with the new list. Requires search edit.
Parameters
400 workspace_required).Request body
application/json, optional.
Response 201
data is a SavedListModel.
curl -X POST "https://api.ken.so/v1/saved-lists/812/copy" \
-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",
"memberFilters": {
"country": "string",
"seniority": "string",
"title": "string",
"industry": "string",
"headcountBand": "string",
"hasSendableEmail": true
}
}'{
"success": true,
"data": {
"id": 812,
"kind": "people",
"visibility": "private",
"access": "owner",
"name": "string",
"description": "string",
"slug": "string",
"icpTags": [
"string"
],
"libraryState": "none",
"publicPageEnabled": true,
"ownerUserId": 812,
"createdByUserId": 812,
"rightsConfirmedAt": "2026-09-23T15:02:11Z",
"hasCsvMembers": true,
"counts": {
"members": 1,
"sendableEmails": 1,
"byCountry": {
"key": 1
},
"bySeniority": {
"key": 1
},
"byIndustry": {
"key": 1
},
"byHeadcountBand": {
"key": 1
}
},
"sources": [
{
"id": 812,
"sourceType": "search_filters",
"parameters": null,
"status": "pending",
"statusMessage": "string",
"addedByUserId": 812,
"lastRefreshedAt": "2026-09-23T15:02:11Z",
"lastRefreshAdded": 1,
"createdAt": "2026-09-23T15:02:11Z"
}
],
"lastRefreshedAt": "2026-09-23T15:02:11Z",
"submittedAt": "2026-09-23T15:02:11Z",
"reviewedAt": "2026-09-23T15:02:11Z",
"reviewReason": "string",
"submittedByWorkspaceName": "string",
"createdAt": "2026-09-23T15:02:11Z",
"updatedAt": "2026-09-23T15:02:11Z"
}
}Invite an email address to a saved list
/v1/saved-lists/{savedListId}/invitessaved-lists.create-inviteNeeds the saved_lists feature on your workspace. Until it is on, calls answer 404.
Body {email}. Creates a read-only grant with status pending and emails the address a link (https://app.ken.so/lists/accept/{token}); the invitee picks which of their workspaces receives the list. A list with CSV-uploaded members needs POST /v1/saved-lists/{savedListId}/rights-confirmation first, else 409 rights_confirmation_required. A private list cannot be shared (409 invalid_state). A second invite to an address with a pending invite on the list is 409 conflict. The grant is created even when the email cannot be sent. Returns 201. Requires the Search page at edit and the share feature.
Parameters
400 workspace_required).Request body
application/json, optional.
Response 201
data is a SavedListGrantModel.
curl -X POST "https://api.ken.so/v1/saved-lists/812/invites" \
-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 '{
"email": "[email protected]"
}'{
"success": true,
"data": {
"id": 812,
"savedListId": 812,
"inviteeEmail": "[email protected]",
"status": "pending",
"receivingWorkspaceId": 812,
"receivingWorkspaceName": "string",
"invitedByUserId": 812,
"acceptedAt": "2026-09-23T15:02:11Z",
"revokedAt": "2026-09-23T15:02:11Z",
"createdAt": "2026-09-23T15:02:11Z"
}
}List a saved list's grants
/v1/saved-lists/{savedListId}/grantssaved-lists.list-grantsNeeds the saved_lists feature on your workspace. Until it is on, calls answer 404.
Every grant of one of the workspace's lists, pending, accepted and revoked, in id order (hasMore is always false). An accepted or revoked grant names the receiving workspace. Requires the Search page at view.
Parameters
400 workspace_required).Response 200
data is a list of SavedListGrantModel. Each item has these fields. The response also carries pagination.
curl -X GET "https://api.ken.so/v1/saved-lists/812/grants" \ -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,
"savedListId": 812,
"inviteeEmail": "[email protected]",
"status": "pending",
"receivingWorkspaceId": 812,
"receivingWorkspaceName": "string",
"invitedByUserId": 812,
"acceptedAt": "2026-09-23T15:02:11Z",
"revokedAt": "2026-09-23T15:02:11Z",
"createdAt": "2026-09-23T15:02:11Z"
}
],
"pagination": {
"nextCursor": "eyJpZCI6ODE1fQ",
"hasMore": true,
"total": 1,
"isTotalCapped": true
}
}Revoke a saved-list grant
/v1/saved-lists/{savedListId}/grants/{grantId}saved-lists.revoke-grantNeeds the saved_lists feature on your workspace. Until it is on, calls answer 404.
Status revoked: the receiving workspace stops reading the list; contacts it already copied into campaigns stay. Revoking a revoked grant is fine. Returns 204. Requires the Search page at edit and the share feature.
Parameters
400 workspace_required).Response 204
curl -X DELETE "https://api.ken.so/v1/saved-lists/812/grants/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
Confirm the right to share a saved list's uploaded data
/v1/saved-lists/{savedListId}/rights-confirmationsaved-lists.confirm-rightsNeeds the saved_lists feature on your workspace. Until it is on, calls answer 404.
The owner confirms "I have the right to share this data" for a list with CSV-uploaded members; sharing and library submission need it. Records who and when (the latest confirmation wins) and returns the list. Needs a user (a session or an API key that belongs to a user), else 403. Requires the Search page at edit and the share feature.
Parameters
400 workspace_required).Response 200
data is a SavedListRightsModel.
curl -X POST "https://api.ken.so/v1/saved-lists/812/rights-confirmation" \ -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,
"kind": "people",
"visibility": "private",
"access": "string",
"name": "string",
"description": "string",
"slug": "string",
"icpTags": [
"string"
],
"libraryState": "none",
"publicPageEnabled": true,
"ownerUserId": 812,
"createdByUserId": 812,
"rightsConfirmedAt": "2026-09-23T15:02:11Z",
"hasCsvMembers": true,
"counts": {
"members": 1,
"sendableEmails": 1,
"byCountry": {
"key": 1
},
"bySeniority": {
"key": 1
},
"byIndustry": {
"key": 1
},
"byHeadcountBand": {
"key": 1
}
},
"sources": [
{
"id": 812,
"sourceType": "search_filters",
"parameters": null,
"status": "pending",
"statusMessage": "string",
"addedByUserId": 812,
"lastRefreshedAt": "2026-09-23T15:02:11Z",
"lastRefreshAdded": 1,
"createdAt": "2026-09-23T15:02:11Z"
}
],
"lastRefreshedAt": "2026-09-23T15:02:11Z",
"submittedAt": "2026-09-23T15:02:11Z",
"reviewedAt": "2026-09-23T15:02:11Z",
"reviewReason": "string",
"createdAt": "2026-09-23T15:02:11Z",
"updatedAt": "2026-09-23T15:02:11Z"
}
}Add a source to a saved list
/v1/saved-lists/{savedListId}/sourcessaved-lists.create-sourceNeeds the saved_lists feature on your workspace. Until it is on, calls answer 404.
Body { sourceType, parameters }. search_filters: a people-search body (paging keys are dropped, at least one filter is required); search_selection: { personIds }, 1 to 1,000 picked people; saved_search: { savedSearchId }, resolved as you each time it runs; campaign: { campaignId }, the campaign's contacts (also needs campaigns view); list: { savedListId }, another list you can read. A company list takes only a list source; a list has at most 50 sources. Returns 202 with the source in pending; poll it until done or failed (statusMessage says why). Requires search edit.
Parameters
400 workspace_required).Request body
application/json, optional.
Response 202
data is a SavedListSourceModel.
curl -X POST "https://api.ken.so/v1/saved-lists/812/sources" \
-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 '{
"sourceType": "string",
"parameters": null
}'{
"success": true,
"data": {
"id": 812,
"sourceType": "search_filters",
"parameters": null,
"status": "pending",
"statusMessage": "string",
"addedByUserId": 812,
"lastRefreshedAt": "2026-09-23T15:02:11Z",
"lastRefreshAdded": 1,
"createdAt": "2026-09-23T15:02:11Z"
}
}Get one source of a saved list
/v1/saved-lists/{savedListId}/sources/{sourceId}saved-lists.get-sourceNeeds the saved_lists feature on your workspace. Until it is on, calls answer 404.
Poll this after adding or refreshing a source: status is pending, running, done or failed, lastRefreshAdded counts the members the last run added. Requires search view.
Parameters
400 workspace_required).Response 200
data is a SavedListSourceModel.
curl -X GET "https://api.ken.so/v1/saved-lists/812/sources/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,
"sourceType": "search_filters",
"parameters": null,
"status": "pending",
"statusMessage": "string",
"addedByUserId": 812,
"lastRefreshedAt": "2026-09-23T15:02:11Z",
"lastRefreshAdded": 1,
"createdAt": "2026-09-23T15:02:11Z"
}
}Refresh one Search source of a saved list
/v1/saved-lists/{savedListId}/sources/{sourceId}/refreshsaved-lists.refresh-sourceNeeds the saved_lists feature on your workspace. Until it is on, calls answer 404.
Re-runs a search_filters, search_selection or saved_search source and adds new matches; members that no longer match stay. A campaign or list source answers 400 not_refreshable. Returns 202 with the source. Requires search edit.
Parameters
400 workspace_required).Response 202
data is a SavedListSourceModel.
curl -X POST "https://api.ken.so/v1/saved-lists/812/sources/812/refresh" \ -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,
"sourceType": "search_filters",
"parameters": null,
"status": "pending",
"statusMessage": "string",
"addedByUserId": 812,
"lastRefreshedAt": "2026-09-23T15:02:11Z",
"lastRefreshAdded": 1,
"createdAt": "2026-09-23T15:02:11Z"
}
}Refresh every Search source of a saved list
/v1/saved-lists/{savedListId}/refreshsaved-lists.refreshNeeds the saved_lists feature on your workspace. Until it is on, calls answer 404.
Re-runs the list's Search sources and adds new matches; campaign, list and CSV sources are not re-run and no member is removed. Returns 202 with the Search sources. Requires search edit.
Parameters
400 workspace_required).Response 202
data is a list of SavedListSourceModel. Each item has these fields.
curl -X POST "https://api.ken.so/v1/saved-lists/812/refresh" \ -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,
"sourceType": "search_filters",
"parameters": null,
"status": "pending",
"statusMessage": "string",
"addedByUserId": 812,
"lastRefreshedAt": "2026-09-23T15:02:11Z",
"lastRefreshAdded": 1,
"createdAt": "2026-09-23T15:02:11Z"
}
]
}Submit a list to the library
/v1/saved-lists/{savedListId}/submissionssaved-lists.submitNeeds the saved_lists feature on your workspace. Until it is on, calls answer 404.
Puts one of the workspace's own lists in libraryStatesubmitted, credited to the workspace and the signed-in person, for a Kenso review. Nothing reaches the library until staff approve it; approval copies the list, so later edits change only the workspace's list and the owner resubmits. icpTags and description replace the list's when given. 409 rights_confirmation_required while the list holds uploaded CSV data (or a CSV upload is still running) without a rights confirmation; 409 already_submitted while a submission waits. A list of another workspace, a list shared with this workspace, a library list and another member's private list are 404. Needs Search edit, the share permission and a signed-in person (a workspace API key is 403).
Parameters
400 workspace_required).Request body
application/json, optional.
Response 200
data is a SavedListSubmissionModel.
curl -X POST "https://api.ken.so/v1/saved-lists/812/submissions" \
-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 '{
"icpTags": [
"string"
],
"description": "string"
}'{
"success": true,
"data": {
"id": 812,
"kind": "people",
"visibility": "private",
"access": "string",
"name": "string",
"description": "string",
"slug": "string",
"icpTags": [
"string"
],
"libraryState": "none",
"publicPageEnabled": true,
"ownerUserId": 812,
"createdByUserId": 812,
"rightsConfirmedAt": "2026-09-23T15:02:11Z",
"hasCsvMembers": true,
"counts": {
"members": 1,
"sendableEmails": 1,
"byCountry": {
"key": 1
},
"bySeniority": {
"key": 1
},
"byIndustry": {
"key": 1
},
"byHeadcountBand": {
"key": 1
}
},
"sources": [
{
"id": 812,
"sourceType": "search_filters",
"parameters": null,
"status": "pending",
"statusMessage": "string",
"addedByUserId": 812,
"lastRefreshedAt": "2026-09-23T15:02:11Z",
"lastRefreshAdded": 1,
"createdAt": "2026-09-23T15:02:11Z"
}
],
"lastRefreshedAt": "2026-09-23T15:02:11Z",
"submittedAt": "2026-09-23T15:02:11Z",
"reviewedAt": "2026-09-23T15:02:11Z",
"reviewReason": "string",
"createdAt": "2026-09-23T15:02:11Z",
"updatedAt": "2026-09-23T15:02:11Z"
}
}Add a CSV's rows to a saved list
/v1/saved-lists/{savedListId}/uploadssaved-lists.create-uploadNeeds the saved_lists feature on your workspace. Until it is on, calls answer 404.
Multipart: the CSV in field file (at most 400 MB and 100,000 rows) and, optionally, columnMappings: the JSON array the contact-import upload takes, for example [{"csvColumn":"Email","targetField":"email"},{"csvColumn":"Deal size","targetField":"custom_variable","customVariableName":"deal_size"}]. Without it the columns map by their headers, as on the campaign upload. Kenso checks the file and answers 202 with a csv source in pending, then adds the rows in the background: read the source until it is done or failed; its parameters then carry rowCount, inserted, merged and rejected (rows with no LinkedIn URL, email or name and company domain; for a company list, no domain or company page). Uploaded emails enter unverified, every phone is kept, and personal columns (birth date, gender, age, personal email and the like) are never stored. Only the workspace's own lists: a shared or library list is 404. Requires Search edit and the Import feature.
Parameters
400 workspace_required).Response 202
data is a SavedListSourceModel.
curl -X POST "https://api.ken.so/v1/saved-lists/812/uploads" \ -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,
"sourceType": "search_filters",
"parameters": null,
"status": "pending",
"statusMessage": "string",
"addedByUserId": 812,
"lastRefreshedAt": "2026-09-23T15:02:11Z",
"lastRefreshAdded": 1,
"createdAt": "2026-09-23T15:02:11Z"
}
}