List conversations
List recent LinkedIn conversations using DB-first approach with LinkedIn API fallback. Supports multi-account batch queries, label/unread filtering. Auto-detects Sales Navigator accounts and merges Sales Nav threads with standard conversations.
/conversationsCode Examples
curl -X GET 'https://api.connectsafely.ai/linkedin/conversations' \ -H 'Authorization: Bearer <your_api_key>'List recent LinkedIn conversations using DB-first approach with LinkedIn API fallback. Supports multi-account batch queries, label/unread filtering. Auto-detects Sales Navigator accounts and merges Sales Nav threads with standard conversations.
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
accountId | query | No | string | Single LinkedIn account ID |
linkedinAccountIds | query | No | string | Comma-separated account IDs for multi-account batch |
count | query | No | number | Number of conversations. Served from our cache, so up to 100 is honoured. Pages that fall through to LinkedIn are capped at 25 by LinkedIn itself (a higher count is silently clamped there), so a deep page may return fewer rows than a shallow one for the same count. |
nextCursor | query | No | string | Pagination cursor — pass back the nextCursor from the previous response verbatim; never construct one. A plain timestamp pages our cache, a linkedin:-prefixed one continues the walk on LinkedIn. Drive the walk by nextCursor (or hasMore, which now always agrees with it) and stop when it is null. On a FILTERED listing (unreadOnly, labeledOnly, labelId, archived, snoozed, source=sales_navigator) the walk ends at the edge of our cache and returns nextCursor: null — LinkedIn cannot continue a filtered walk, so ending is deliberate rather than returning rows that do not match your filter. |
labelId | query | No | string | Filter by label ID |
labeledOnly | query | No | boolean | Only labeled conversations |
Request Body
No request body.
Responses
| Status | Description |
|---|---|
| 200 | Conversations list |
| 401 | Unauthorized |
| 404 | Account not found |
| 500 | Server error |
200 Response Parameters
| Name | Type | Description |
|---|---|---|
success | boolean | |
conversations | array | |
accounts | array | |
nextCursor | string | |
hasMore | boolean | |
fromCache | boolean | true when this response was served from our cache without contacting LinkedIn during the request. false when the request refreshed from LinkedIn first. The rows always come from our store either way — this reports how fresh they are, not where they were read from. |
200 Example
{
"success": true,
"conversations": [
{
"conversationUrn": "urn:li:example:123456",
"conversationId": "conv_abcdef123456",
"lastActivityAt": "example_value",
"unreadCount": 25,
"participants": [],
"latestMessage": {},
"source": "example_value",
"salesNavThreadId": "12345"
}
],
"accounts": [
{
"id": "12345",
"name": "example_value"
}
],
"nextCursor": "example_value",
"hasMore": true,
"fromCache": true
}401 Response Parameters
| Name | Type | Description |
|---|---|---|
error | string |
401 Example
{
"error": "example_value"
}404 Response Parameters
| Name | Type | Description |
|---|---|---|
error | string |
404 Example
{
"error": "example_value"
}500 Response Parameters
| Name | Type | Description |
|---|---|---|
error | string |
500 Example
{
"error": "example_value"
}LinkedIn Messaging API
Send LinkedIn messages via API, retrieve conversations, and build automated outreach sequences. Supports typing indicators and delivery tracking.
Check if a conversation exists with a profile
Check whether the authenticated LinkedIn account already has an existing conversation with a target profile. Returns the conversation URN if one exists. Single LinkedIn API call (no message history fetched). Useful as a precheck before sending a connection request or message to avoid duplicate outreach.
