LinkedIn accounts
The LinkedIn accounts your campaigns send from, and hosted sessions to connect them.
List LinkedIn accounts in the current workspace
/v1/linkedin-accountslinkedin-accounts.listParameters
400 workspace_required).Response 200
data is a list of LinkedInAccountModel. Each item has these fields. The response also carries pagination.
visit, invite, message, inmail, withdraw, follow, reaction, comment or endorse. Omitted with it.status.POST /v1/tags/{tagId}/assignments and entityType: linkedin_account. Only GET /v1/linkedin-accounts, GET /v1/linkedin-accounts/{linkedinAccountId} and its PATCH carry it, and they omit it when the tags could not be read. Other lists of this model, such as a campaign's LinkedIn accounts, never carry it.curl -X GET "https://api.ken.so/v1/linkedin-accounts" \ -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,
"displayName": "string",
"publicIdentifier": "string",
"profileUrl": "https://example.com",
"profileImageUrl": "https://example.com",
"headline": "string",
"status": "string",
"timezone": "string",
"workingHours": "string",
"dailyInviteCap": 1,
"dailyMessageCap": 1,
"dailyVisitCap": 1,
"createdAt": "2026-09-23T15:02:11Z",
"createdDatetime": "2026-09-23T15:02:11Z",
"updatedAt": "2026-09-23T15:02:11Z",
"unipileAccountId": "string",
"statusChangedAt": "2026-09-23T15:02:11Z",
"invitesToday": 1,
"messagesToday": 1,
"visitsToday": 1,
"invitesSent30d": 1,
"acceptRate": 0.5,
"usedBy": {
"campaigns": [
{
"id": 812,
"name": "string",
"status": "string"
}
],
"accounts": true
},
"lastActionAt": "2026-09-23T15:02:11Z",
"lastActionType": "string",
"pausedAt": "2026-09-23T15:02:11Z",
"connectedByMemberId": 812,
"importConnections": true,
"importConnectionsChangedAt": "2026-09-23T15:02:11Z",
"workingHoursSchedule": {
"mon": {
"open": true,
"start": "string",
"end": "string"
},
"tue": {
"open": true,
"start": "string",
"end": "string"
},
"wed": {
"open": true,
"start": "string",
"end": "string"
},
"thu": {
"open": true,
"start": "string",
"end": "string"
},
"fri": {
"open": true,
"start": "string",
"end": "string"
},
"sat": {
"open": true,
"start": "string",
"end": "string"
},
"sun": {
"open": true,
"start": "string",
"end": "string"
}
},
"products": {
"premium": true,
"salesNavigator": true,
"recruiter": true,
"checkedAt": "2026-09-23T15:02:11Z"
},
"invitesLast7Days": 1,
"weeklyInviteCap": 1,
"pendingInvites": 1,
"pendingInviteCap": 1,
"health": {
"status": "string",
"acceptRate": 0.5,
"sample": 1,
"changedAt": "2026-09-23T15:02:11Z"
},
"rampStage": 1,
"rampInviteCap": 1,
"safetyEnabled": true,
"tagIds": [
812
]
}
],
"pagination": {
"nextCursor": "eyJpZCI6ODE1fQ",
"hasMore": true,
"total": 1,
"isTotalCapped": true
}
}Start a hosted connect or reconnect session
/v1/linkedin-accounts/connect-sessionslinkedin-accounts.create-connect-sessionOmit the account id to connect a new seat. linkedInAccountId or linkedinAccountId reconnects that seat. A client seat (Delivery view, approve_own_sends) connects only its own LinkedIn: reconnecting a seat another member connected is 403 forbidden with not_your_linkedin, and a new seat while it holds one is 409 conflict with reconnect_instead. Requires Delivery edit, or approve_own_sends (declared [WorkspaceMember]; the action decides, DEV-1811). importConnections: true on a new seat imports its connections into Accounts once it connects, while linkedin_connections_import is on (ignored otherwise); a reconnect ignores it and keeps the stored setting.
Parameters
400 workspace_required).Request body
application/json, optional.
Response 201
data is a LinkedInConnectSessionModel.
curl -X POST "https://api.ken.so/v1/linkedin-accounts/connect-sessions" \
-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 '{
"linkedInAccountId": 812,
"importConnections": true
}'{
"success": true,
"data": {
"linkedInAccountId": 812,
"url": "https://example.com"
}
}Return one LinkedIn account in the current workspace
/v1/linkedin-accounts/{linkedinAccountId}linkedin-accounts.getParameters
400 workspace_required).Response 200
data is a LinkedInAccountModel.
visit, invite, message, inmail, withdraw, follow, reaction, comment or endorse. Omitted with it.status.POST /v1/tags/{tagId}/assignments and entityType: linkedin_account. Only GET /v1/linkedin-accounts, GET /v1/linkedin-accounts/{linkedinAccountId} and its PATCH carry it, and they omit it when the tags could not be read. Other lists of this model, such as a campaign's LinkedIn accounts, never carry it.curl -X GET "https://api.ken.so/v1/linkedin-accounts/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,
"displayName": "string",
"publicIdentifier": "string",
"profileUrl": "https://example.com",
"profileImageUrl": "https://example.com",
"headline": "string",
"status": "string",
"timezone": "string",
"workingHours": "string",
"dailyInviteCap": 1,
"dailyMessageCap": 1,
"dailyVisitCap": 1,
"createdAt": "2026-09-23T15:02:11Z",
"createdDatetime": "2026-09-23T15:02:11Z",
"updatedAt": "2026-09-23T15:02:11Z",
"unipileAccountId": "string",
"statusChangedAt": "2026-09-23T15:02:11Z",
"invitesToday": 1,
"messagesToday": 1,
"visitsToday": 1,
"invitesSent30d": 1,
"acceptRate": 0.5,
"usedBy": {
"campaigns": [
{
"id": 812,
"name": "string",
"status": "string"
}
],
"accounts": true
},
"lastActionAt": "2026-09-23T15:02:11Z",
"lastActionType": "string",
"pausedAt": "2026-09-23T15:02:11Z",
"connectedByMemberId": 812,
"importConnections": true,
"importConnectionsChangedAt": "2026-09-23T15:02:11Z",
"workingHoursSchedule": {
"mon": {
"open": true,
"start": "string",
"end": "string"
},
"tue": {
"open": true,
"start": "string",
"end": "string"
},
"wed": {
"open": true,
"start": "string",
"end": "string"
},
"thu": {
"open": true,
"start": "string",
"end": "string"
},
"fri": {
"open": true,
"start": "string",
"end": "string"
},
"sat": {
"open": true,
"start": "string",
"end": "string"
},
"sun": {
"open": true,
"start": "string",
"end": "string"
}
},
"products": {
"premium": true,
"salesNavigator": true,
"recruiter": true,
"checkedAt": "2026-09-23T15:02:11Z"
},
"invitesLast7Days": 1,
"weeklyInviteCap": 1,
"pendingInvites": 1,
"pendingInviteCap": 1,
"health": {
"status": "string",
"acceptRate": 0.5,
"sample": 1,
"changedAt": "2026-09-23T15:02:11Z"
},
"rampStage": 1,
"rampInviteCap": 1,
"safetyEnabled": true,
"tagIds": [
812
]
}
}Update a LinkedIn account
/v1/linkedin-accounts/{linkedinAccountId}linkedin-accounts.updateAbsent fields stay unchanged.
Requires Delivery edit access (owners, admins and editors by default). paused: true pauses outreach from the account (campaign invites, messages, InMails, profile visits, withdrawals, approved Accounts notes) and sets pausedAt (kept when it is already paused); paused: false resumes it and clears pausedAt. Paused actions wait and are never failed or moved to email. The autonomous reply agent's sends are held too. A person's replies from the Inbox and inbox sync keep running. timezone takes an IANA id (empty clears it) and workingHoursSchedule all seven days; invalid values are 400 validation_failed naming the field. importConnections switches the seat's connections import: 400 validation_failed with feature_off while linkedin_connections_import is off, 403 forbidden unless the caller connected the seat or is a workspace admin; importConnectionsChangedAt moves only when the value changes.
Parameters
400 workspace_required).Request body
application/json, optional.
Europe/Bucharest. An empty string clears it (UTC).true pauses outreach from the account (campaign invites, messages, InMails, profile visits, withdrawals, approved Accounts notes) and keeps the original pausedAt when it is already paused. false resumes it, and its waiting actions continue where they stopped. The autonomous reply agent's sends wait too. A person's replies from the Inbox and inbox sync keep running while paused. Omit or send null to leave the pause unchanged.true imports the seat's connections into Accounts as people and accounts; false stops new imports and keeps what was imported. Only the member who connected the seat or a workspace admin may send it, and only while linkedin_connections_import is on. Omit or send null to leave it unchanged.Response 200
data is a LinkedInAccountModel.
visit, invite, message, inmail, withdraw, follow, reaction, comment or endorse. Omitted with it.status.POST /v1/tags/{tagId}/assignments and entityType: linkedin_account. Only GET /v1/linkedin-accounts, GET /v1/linkedin-accounts/{linkedinAccountId} and its PATCH carry it, and they omit it when the tags could not be read. Other lists of this model, such as a campaign's LinkedIn accounts, never carry it.curl -X PATCH "https://api.ken.so/v1/linkedin-accounts/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 '{
"displayName": "string",
"timezone": "string",
"workingHours": "string",
"workingHoursSchedule": {
"mon": {
"open": true,
"start": "string",
"end": "string"
},
"tue": {
"open": true,
"start": "string",
"end": "string"
},
"wed": {
"open": true,
"start": "string",
"end": "string"
},
"thu": {
"open": true,
"start": "string",
"end": "string"
},
"fri": {
"open": true,
"start": "string",
"end": "string"
},
"sat": {
"open": true,
"start": "string",
"end": "string"
},
"sun": {
"open": true,
"start": "string",
"end": "string"
}
},
"dailyInviteCap": 1,
"dailyMessageCap": 1,
"dailyVisitCap": 1,
"paused": true,
"importConnections": true
}'{
"success": true,
"data": {
"id": 812,
"displayName": "string",
"publicIdentifier": "string",
"profileUrl": "https://example.com",
"profileImageUrl": "https://example.com",
"headline": "string",
"status": "string",
"timezone": "string",
"workingHours": "string",
"dailyInviteCap": 1,
"dailyMessageCap": 1,
"dailyVisitCap": 1,
"createdAt": "2026-09-23T15:02:11Z",
"createdDatetime": "2026-09-23T15:02:11Z",
"updatedAt": "2026-09-23T15:02:11Z",
"unipileAccountId": "string",
"statusChangedAt": "2026-09-23T15:02:11Z",
"invitesToday": 1,
"messagesToday": 1,
"visitsToday": 1,
"invitesSent30d": 1,
"acceptRate": 0.5,
"usedBy": {
"campaigns": [
{
"id": 812,
"name": "string",
"status": "string"
}
],
"accounts": true
},
"lastActionAt": "2026-09-23T15:02:11Z",
"lastActionType": "string",
"pausedAt": "2026-09-23T15:02:11Z",
"connectedByMemberId": 812,
"importConnections": true,
"importConnectionsChangedAt": "2026-09-23T15:02:11Z",
"workingHoursSchedule": {
"mon": {
"open": true,
"start": "string",
"end": "string"
},
"tue": {
"open": true,
"start": "string",
"end": "string"
},
"wed": {
"open": true,
"start": "string",
"end": "string"
},
"thu": {
"open": true,
"start": "string",
"end": "string"
},
"fri": {
"open": true,
"start": "string",
"end": "string"
},
"sat": {
"open": true,
"start": "string",
"end": "string"
},
"sun": {
"open": true,
"start": "string",
"end": "string"
}
},
"products": {
"premium": true,
"salesNavigator": true,
"recruiter": true,
"checkedAt": "2026-09-23T15:02:11Z"
},
"invitesLast7Days": 1,
"weeklyInviteCap": 1,
"pendingInvites": 1,
"pendingInviteCap": 1,
"health": {
"status": "string",
"acceptRate": 0.5,
"sample": 1,
"changedAt": "2026-09-23T15:02:11Z"
},
"rampStage": 1,
"rampInviteCap": 1,
"safetyEnabled": true,
"tagIds": [
812
]
}
}Delete a LinkedIn account
/v1/linkedin-accounts/{linkedinAccountId}linkedin-accounts.deleteReturns 204. Requires Delivery edit access (owners, admins and editors by default).
Parameters
400 workspace_required).Response 204
curl -X DELETE "https://api.ken.so/v1/linkedin-accounts/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