API Documentation Everything you need to integrate Voyager into your automation workflows. 250+ REST endpoints across 14 domains. All endpoints use the base URL https://li.scaleabm.org.
Quickstart Get from zero to your first API call in five steps.
Try it instantly -- no account needed
Use the sandbox API key demo_key to explore the API with realistic fake data. No LinkedIn session, cookies, or signup required. All responses include "sandbox": true.
Copy
curl https://li.scaleabm.org/api/profile/sarah-chen \
-H "Authorization: Bearer demo_key"
Copy
curl "https://li.scaleabm.org/api/search/people?keywords=engineering" \
-H "Authorization: Bearer demo_key"
Copy
curl -X POST https://li.scaleabm.org/api/send \
-H "Authorization: Bearer demo_key" \
-H "Content-Type: application/json" \
-d '{"profileUrl": "https://www.linkedin.com/in/sarah-chen/", "message": "Hello from sandbox!"}'
Works with the SDKs too -- just set apiKey: 'demo_key'. Any key starting with demo_ activates sandbox mode.
1
Get your API key. Your admin provisions a tenant and gives you an API key with the voy_ prefix. Keep it secret.
2
Sync your LinkedIn cookies. Export li_at and JSESSIONID from your browser (the Chrome extension does this automatically) and push them to Voyager.
Copy
curl -X POST https://li.scaleabm.org/api/session \
-H "Authorization: Bearer voy_YOUR_KEY" \
-H "X-User-Id: your-username" \
-H "Content-Type: application/json" \
-d '{
"cookies": [
{"name": "li_at", "value": "AQEDAx...", "domain": ".linkedin.com"},
{"name": "JSESSIONID", "value": "\"ajax:123...\"", "domain": ".linkedin.com"}
],
"userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)..."
}'
Copy
{
"success" : true ,
"userId" : "your-username" ,
"cookieCount" : 2 ,
"sessionValid" : true
}
3
Verify your session. Confirm your LinkedIn session is healthy.
Copy curl -H "Authorization: Bearer voy_YOUR_KEY" \
-H "X-User-Id: your-username" \
https://li.scaleabm.org/api/session/capabilities
Copy {
"success" : true ,
"linkedInSessionValid" : true ,
"canSend" : true ,
"canConnect" : true ,
"canPost" : true ,
"usage" : { "messagesSent" : 0 , "secondsSinceLastAction" : 3600 }
}
4
Get your profile. Fetch your own LinkedIn profile to confirm everything works.
Copy curl -H "Authorization: Bearer voy_YOUR_KEY" \
-H "X-User-Id: your-username" \
https://li.scaleabm.org/api/profile/me
Copy {
"success" : true ,
"data" : {
"profile" : {
"vanityName" : "johndoe" ,
"fullName" : "John Doe" ,
"headline" : "VP Engineering at Acme" ,
"location" : "San Francisco, CA"
},
"positions" : [{ "title" : "VP Engineering" , "companyName" : "Acme" }],
"education" : [{ "school" : "MIT" , "degree" : "BS Computer Science" }]
}
}
5
Search people. Find prospects at a target company.
Copy curl -H "Authorization: Bearer voy_YOUR_KEY" \
-H "X-User-Id: your-username" \
"https://li.scaleabm.org/api/search/people?keywords=engineering&company=google&count=5"
Copy {
"success" : true ,
"data" : {
"total" : 5 ,
"results" : [
{
"fullName" : "Jane Smith" ,
"headline" : "Staff Engineer at Google" ,
"profileUrl" : "https://www.linkedin.com/in/janesmith/" ,
"connectionDegree" : "2nd"
}
]
}
}
Sandbox / Demo Mode Sandbox mode lets you explore the full API surface with realistic fake data. No LinkedIn account, cookies, or browser extension needed.
How it works Use demo_key (or any key starting with demo_) as your API key. All read endpoints return realistic but fictional LinkedIn data (profiles, search results, conversations, posts, notifications). All write endpoints (send, connect, like, comment, post) return a success response with a note that no action was actually performed. Every sandbox response includes "sandbox": true so your code can detect demo mode. No X-User-Id header required for sandbox requests. Sandbox profiles Eight fictional profiles are available by vanity name. Requesting an unknown vanity name returns a deterministic profile from the set.
Copy
sarah-chen, james-murphy, priya-sharma, marcus-johnson,
emma-wilson, david-kim, rachel-foster, alex-tanaka
SDK usage Copy
const voyager = new VoyagerClient({ apiKey: 'demo_key' });
const profile = await voyager.getProfile('sarah-chen' );
console.log(profile.sandbox);
Copy
client = VoyagerClient(api_key="demo_key" )
profile = client.get_profile("sarah-chen" )
assert profile["sandbox" ] == True
Authentication Every request must include an API key and a user ID. Voyager uses a multi-tenant model: your API key identifies the tenant, and the X-User-Id header selects a specific LinkedIn account within that tenant.
Required Headers Header Value Description Authorization Bearer voy_... Tenant API key. Starts with voy_ prefix. X-User-Id String Selects the LinkedIn account within the tenant to use for this request. Content-Type application/json Required for POST/PUT/PATCH requests with a JSON body.
API Key Format All tenant API keys start with the voy_ prefix followed by 48 hex characters. Keys are SHA-256 hashed at rest and cannot be recovered -- store them securely.
Copy
voy_e4ef47140bea2bceddfd111855a042442642bab793427044
Admin vs Tenant Auth Admin routes (under /api/admin/*) use a separate ADMIN_SECRET header. Tenant API keys only grant access to the tenant's own data and actions. Admin operations include tenant CRUD, user management, and API key provisioning.
Copy
curl -H "Authorization: Bearer ADMIN_SECRET_HERE" \
https://li.scaleabm.org/api/admin/tenants
Sessions & Cookies Voyager operates LinkedIn sessions via browser cookies. You must sync your LinkedIn cookies before making any LinkedIn API calls.
Required Cookies Cookie Required Purpose li_at required Primary LinkedIn authentication token. Expires every ~1 year. JSESSIONID required CSRF token used for Voyager API calls. Value is quoted (e.g., "ajax:123..."). li_a SalesNav Sales Navigator session token. Required for all /api/salesnav/* endpoints. li_ep_auth_context SalesNav Enterprise profile context. Base64-encoded URN used for the x-li-identity header.
User Agent Always include your userAgent string when syncing cookies. Voyager uses it to match request fingerprints -- mismatched user agents can trigger LinkedIn's session validation and cause immediate cookie expiry.
Session Sync Endpoint Copy curl -X POST https://li.scaleabm.org/api/session \
-H "Authorization: Bearer voy_YOUR_KEY" \
-H "X-User-Id: your-username" \
-H "Content-Type: application/json" \
-d '{
"cookies": [
{"name": "li_at", "value": "AQEDAx...", "domain": ".linkedin.com"},
{"name": "JSESSIONID", "value": "\"ajax:123...\"", "domain": ".linkedin.com"}
],
"userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36"
}'
The response includes sessionValid -- a boolean confirming whether the cookies work with LinkedIn. If false, re-export fresh cookies from your browser.
Session Validation Copy curl -H "Authorization: Bearer voy_YOUR_KEY" \
-H "X-User-Id: your-username" \
https://li.scaleabm.org/api/session/capabilities
Returns session health, all capability flags (canSend, canConnect, canPost, etc.), usage counters, and operating hours info.
Cookie Hot-Swap You can update cookies at any time by calling POST /api/session again. Voyager swaps cookies in-place without recreating the browser context. The operation is safe even while background polling is active.
Response Envelope All API responses follow a consistent JSON envelope. This makes it easy to write generic response handlers across all 250+ endpoints.
Success Response Copy {
"success" : true ,
"statusCode" : 200 ,
"message" : "Profile fetched" ,
"data" : {
}
}
Error Response Copy {
"success" : false ,
"statusCode" : 400 ,
"message" : "profileUrl is required" ,
"errors" : [
"profileUrl is required"
]
}
Envelope Fields Field Type Description success boolean Whether the request succeeded statusCode number HTTP status code (mirrors the response status) message string Human-readable summary of the result data object Endpoint-specific payload (only on success) errors string[] Array of error messages (only on failure)
Profiles Profile endpoints use LinkedIn's REST API for fast, reliable data retrieval. All return synchronous JSON responses.
GET /api/profile/me Fetch the logged-in user's own profile, including current positions and education.
Copy curl -H "Authorization: Bearer voy_YOUR_KEY" \
-H "X-User-Id: your-username" \
https://li.scaleabm.org/api/profile/me
GET /api/profile/:vanityName Fetch any LinkedIn profile by vanity name (the slug after /in/). Returns profile data, positions, and education.
Copy curl -H "Authorization: Bearer voy_YOUR_KEY" \
-H "X-User-Id: your-username" \
https://li.scaleabm.org/api/profile/johndoe
Copy {
"success" : true ,
"data" : {
"profile" : {
"vanityName" : "johndoe" ,
"fullName" : "John Doe" ,
"headline" : "VP Engineering at Acme" ,
"entityUrn" : "urn:li:fsd_profile:ACoAAA..." ,
"location" : "San Francisco, CA" ,
"connectionDegree" : "2nd"
},
"positions" : [
{ "title" : "VP Engineering" , "companyName" : "Acme" , "companyId" : "12345" }
],
"education" : [
{ "school" : "MIT" , "degree" : "BS" , "field" : "Computer Science" }
]
}
}
GET /api/profile/:vanity/contact Retrieve contact info: email, phone, Twitter, websites. Only available for connections or profiles with public contact info.
Copy curl -H "Authorization: Bearer voy_YOUR_KEY" \
-H "X-User-Id: your-username" \
https://li.scaleabm.org/api/profile/johndoe/contact
GET /api/profile/:vanity/skills Get endorsed skills with endorsement counts.
Copy curl -H "Authorization: Bearer voy_YOUR_KEY" \
-H "X-User-Id: your-username" \
https://li.scaleabm.org/api/profile/johndoe/skills
GET /api/profile/:vanity/network Get follower, connection, and following counts.
Copy curl -H "Authorization: Bearer voy_YOUR_KEY" \
-H "X-User-Id: your-username" \
https://li.scaleabm.org/api/profile/johndoe/network
Copy {
"success" : true ,
"data" : {
"followersCount" : 4280 ,
"connectionsCount" : 500 ,
"followingCount" : 312
}
}
GET /api/profile/viewers See who has viewed your LinkedIn profile.
Copy curl -H "Authorization: Bearer voy_YOUR_KEY" \
-H "X-User-Id: your-username" \
https://li.scaleabm.org/api/profile/viewers
POST /api/profiles/read Batch-fetch up to 25 profiles in a single call. Returns per-item success/error.
Copy curl -X POST https://li.scaleabm.org/api/profiles/read \
-H "Authorization: Bearer voy_YOUR_KEY" \
-H "X-User-Id: your-username" \
-H "Content-Type: application/json" \
-d '{
"profiles": [
{"vanityName": "johndoe"},
{"profileUrl": "https://www.linkedin.com/in/janesmith/"}
]
}'
Copy {
"success" : true ,
"data" : {
"count" : 2 ,
"results" : [
{ "input" : { "vanityName" : "johndoe" }, "success" : true , "data" : { "..." } },
{ "input" : { "profileUrl" : "..." }, "success" : true , "data" : { "..." } }
]
}
}
GET /api/profile/:vanity/email Extract a member's email address. Uses multi-strategy resolution: contact info, FullProfileWithEntities decoration, and profile data enrichment.
Copy curl -H "Authorization: Bearer voy_YOUR_KEY" \
-H "X-User-Id: your-username" \
https://li.scaleabm.org/api/profile/johndoe/email
Copy {
"success" :
true ,
"data" : {
"email" :
"[email protected] " ,
"source" :
"contact-info"
}
}
GET /api/profile/:vanity/posts Get a person's recent posts and activity via REST. Returns structured post data including content, engagement counts, and timestamps synchronously.
Copy curl -H "Authorization: Bearer voy_YOUR_KEY" \
-H "X-User-Id: your-username" \
"https://li.scaleabm.org/api/profile/johndoe/posts?count=10"
Copy {
"success" : true ,
"data" : {
"posts" : [
{
"postUrl" : "https://www.linkedin.com/feed/update/urn:li:activity:7175..." ,
"text" : "Excited about our latest launch..." ,
"likeCount" : 142 ,
"commentCount" : 23 ,
"timestamp" : "2026-03-28T14:30:00Z"
}
]
}
}
GET /api/profile/:vanity/recommendations Get endorsements and recommendations for a profile.
Copy curl -H "Authorization: Bearer voy_YOUR_KEY" \
-H "X-User-Id: your-username" \
https://li.scaleabm.org/api/profile/johndoe/recommendations
Copy {
"success" : true ,
"data" : {
"recommendations" : [
{
"recommenderName" : "Jane Smith" ,
"relationship" : "Managed John directly" ,
"text" : "John is an exceptional engineer..."
}
]
}
}
GET /api/member-badges Detect Premium, OpenProfile, and Influencer badges on a LinkedIn profile.
Copy curl -H "Authorization: Bearer voy_YOUR_KEY" \
-H "X-User-Id: your-username" \
"https://li.scaleabm.org/api/member-badges?profileUrl=https://www.linkedin.com/in/johndoe/"
Copy {
"success" : true ,
"data" : {
"premium" : true ,
"openProfile" : true ,
"influencer" : false ,
"jobSeeker" : false
}
}
GET /api/relationship/status Check connection degree, pending invitations, and messaging eligibility for a profile.
Copy curl -H "Authorization: Bearer voy_YOUR_KEY" \
-H "X-User-Id: your-username" \
"https://li.scaleabm.org/api/relationship/status?profileUrl=https://www.linkedin.com/in/johndoe/"
Copy {
"success" : true ,
"data" : {
"connected" : false ,
"connectionDegree" : "2nd" ,
"openProfile" : true ,
"canMessageDirectly" : true ,
"canConnect" : true ,
"pendingInvitationSent" : false
}
}
GET /api/relationship/insights Get mutual connections and warm introduction paths for a profile.
Copy curl -H "Authorization: Bearer voy_YOUR_KEY" \
-H "X-User-Id: your-username" \
"https://li.scaleabm.org/api/relationship/insights?profileUrl=https://www.linkedin.com/in/johndoe/"
Copy {
"success" : true ,
"data" : {
"mutualConnections" : [
{ "fullName" : "Alice Chen" , "profileUrl" : "https://www.linkedin.com/in/alicechen/" }
],
"sharedGroups" : [],
"sharedCompanies" : ["Acme Corp" ]
}
}
Messaging Read conversations, send messages, and manage your LinkedIn inbox programmatically.
GET /api/conversations List recent conversations. Supports category filtering and cursor-based pagination.
Param Type Description limit number Max conversations to return (default 20) category string INBOX, PRIMARY_INBOX, SECONDARY_INBOX, ARCHIVED_INBOX, SPAM_INBOX nextCursor string Cursor from previous response for pagination
Copy curl -H "Authorization: Bearer voy_YOUR_KEY" \
-H "X-User-Id: your-username" \
"https://li.scaleabm.org/api/conversations?limit=10&category=PRIMARY_INBOX"
POST /api/send Send a message to a LinkedIn profile. Uses a 4-phase delivery pipeline: conversation cache, participant query, conversation list scan, and new conversation creation.
Field Type Description profileUrl required string LinkedIn profile URL of the recipient message required string Message text recipientUrn string If known, skip all resolution and send directly confirmInThread boolean Wait for message to appear in conversation thread queue boolean Queue the send for operating-hours delivery
Copy curl -X POST https://li.scaleabm.org/api/send \
-H "Authorization: Bearer voy_YOUR_KEY" \
-H "X-User-Id: your-username" \
-H "Content-Type: application/json" \
-d '{"profileUrl": "https://www.linkedin.com/in/janesmith/", "message": "Hi Jane!"}'
Copy {
"success" : true ,
"data" : {
"method" : "api-conv-scan"
}
}
POST /api/conversations/:conversationId/read Mark a conversation as read.
Copy curl -X POST https://li.scaleabm.org/api/conversations/urn:li:msg_conversation:123/read \
-H "Authorization: Bearer voy_YOUR_KEY" \
-H "X-User-Id: your-username"
GET /api/conversations/drafts Retrieve unsent message drafts across all conversations.
Copy curl -H "Authorization: Bearer voy_YOUR_KEY" \
-H "X-User-Id: your-username" \
https://li.scaleabm.org/api/conversations/drafts
Copy {
"success" : true ,
"data" : {
"drafts" : [
{
"conversationId" : "urn:li:msg_conversation:456" ,
"recipientName" : "Jane Smith" ,
"draftText" : "Hi Jane, following up on..." ,
"lastModified" : "2026-04-01T09:15:00Z"
}
]
}
}
GET /api/conversations/:id/participants Get the list of participants in a conversation, including their profile URNs and names.
Copy curl -H "Authorization: Bearer voy_YOUR_KEY" \
-H "X-User-Id: your-username" \
https://li.scaleabm.org/api/conversations/urn:li:msg_conversation:456/participants
Copy {
"success" : true ,
"data" : {
"participants" : [
{ "fullName" : "Jane Smith" , "profileUrn" : "urn:li:fsd_profile:ACoAAA..." },
{ "fullName" : "John Doe" , "profileUrn" : "urn:li:fsd_profile:ACoAAB..." }
]
}
}
GET /api/conversations/:id/seen Check read receipts for a conversation. Returns when each participant last saw the messages.
Copy curl -H "Authorization: Bearer voy_YOUR_KEY" \
-H "X-User-Id: your-username" \
https://li.scaleabm.org/api/conversations/urn:li:msg_conversation:456/seen
Copy {
"success" : true ,
"data" : {
"receipts" : [
{
"participantName" : "Jane Smith" ,
"seenAt" : "2026-04-02T16:45:00Z"
}
]
}
}
Posts & Engagement Read posts, create content, and engage with reactions and comments. All endpoints return synchronous REST responses.
GET /api/posts Fetch posts from a LinkedIn profile via REST. Returns structured JSON synchronously.
Param Type Description profileUrl required string LinkedIn profile URL limit number Max posts to return (default 20)
Copy curl -H "Authorization: Bearer voy_YOUR_KEY" \
-H "X-User-Id: your-username" \
"https://li.scaleabm.org/api/posts?profileUrl=https://www.linkedin.com/in/johndoe/&limit=5"
Returns 200 with a posts[] array. Empty array if the profile has no public posts or LinkedIn returned no data.
GET /api/notifications Fetch engagement notifications (likes, comments, mentions on your content).
Copy curl -H "Authorization: Bearer voy_YOUR_KEY" \
-H "X-User-Id: your-username" \
"https://li.scaleabm.org/api/notifications?count=10"
GET /api/reactions Fetch reactions on a post. Returns structured reaction data synchronously via REST.
Copy curl -H "Authorization: Bearer voy_YOUR_KEY" \
-H "X-User-Id: your-username" \
"https://li.scaleabm.org/api/reactions?count=20"
POST /api/post Create a new LinkedIn post.
Copy curl -X POST https://li.scaleabm.org/api/post \
-H "Authorization: Bearer voy_YOUR_KEY" \
-H "X-User-Id: your-username" \
-H "Content-Type: application/json" \
-d '{"text": "Excited to share our latest product launch! #startup"}'
Copy {
"success" : true ,
"data" : {
"method" : "api" ,
"postUrn" : "urn:li:share:7175..." ,
"postUrl" : "https://www.linkedin.com/feed/update/urn:li:activity:7175..."
}
}
POST /api/like React to a LinkedIn post. Supports all 6 reaction types.
Field Type Description postUrl required string LinkedIn post URL (must contain activity ID) reactionType string LIKE, CELEBRATE, LOVE, INSIGHTFUL, FUNNY, CURIOUS (default: LIKE) unlike boolean Set to true to remove the reaction
Copy curl -X POST https://li.scaleabm.org/api/like \
-H "Authorization: Bearer voy_YOUR_KEY" \
-H "X-User-Id: your-username" \
-H "Content-Type: application/json" \
-d '{"postUrl": "https://www.linkedin.com/feed/update/urn:li:activity:7175.../", "reactionType": "INSIGHTFUL"}'
POST /api/comment Comment on a LinkedIn post.
Copy curl -X POST https://li.scaleabm.org/api/comment \
-H "Authorization: Bearer voy_YOUR_KEY" \
-H "X-User-Id: your-username" \
-H "Content-Type: application/json" \
-d '{"postUrl": "https://www.linkedin.com/feed/update/urn:li:activity:7175.../", "comment": "Great insight, thanks for sharing!"}'
DELETE /api/comment Delete a comment by its URN.
Copy curl -X DELETE https://li.scaleabm.org/api/comment \
-H "Authorization: Bearer voy_YOUR_KEY" \
-H "X-User-Id: your-username" \
-H "Content-Type: application/json" \
-d '{"commentUrn": "urn:li:comment:(activity:7175...,12345)"}'
Connections Manage your LinkedIn network: send requests, accept invitations, follow, and remove connections.
POST /api/connect Send a connection request. Optionally include a personalized note (max 300 chars).
Copy curl -X POST https://li.scaleabm.org/api/connect \
-H "Authorization: Bearer voy_YOUR_KEY" \
-H "X-User-Id: your-username" \
-H "Content-Type: application/json" \
-d '{"profileUrl": "https://www.linkedin.com/in/janesmith/", "message": "Hi Jane, would love to connect!"}'
POST /api/connect/accept Accept a pending connection request.
Copy curl -X POST https://li.scaleabm.org/api/connect/accept \
-H "Authorization: Bearer voy_YOUR_KEY" \
-H "X-User-Id: your-username" \
-H "Content-Type: application/json" \
-d '{"invitationUrn": "urn:li:invitation:123456", "sharedSecret": "abc123"}'
GET /api/connect/received List pending inbound connection requests. Returns invitation URNs and shared secrets for acceptance.
Copy curl -H "Authorization: Bearer voy_YOUR_KEY" \
-H "X-User-Id: your-username" \
https://li.scaleabm.org/api/connect/received
Copy {
"success" : true ,
"data" : {
"count" : 3 ,
"invitations" : [
{
"invitationUrn" : "urn:li:invitation:789..." ,
"sharedSecret" : "xK9m..." ,
"from" : { "fullName" : "Bob Wilson" , "profileUrn" : "urn:li:fsd_profile:ACoAA..." },
"message" : "Hi, saw your talk at the conference!"
}
]
}
}
POST /api/follow Follow or unfollow a LinkedIn profile.
Copy
curl -X POST https://li.scaleabm.org/api/follow \
-H "Authorization: Bearer voy_YOUR_KEY" \
-H "X-User-Id: your-username" \
-H "Content-Type: application/json" \
-d '{"profileUrl": "https://www.linkedin.com/in/janesmith/"}'
curl -X POST https://li.scaleabm.org/api/follow \
-H "Authorization: Bearer voy_YOUR_KEY" \
-H "X-User-Id: your-username" \
-H "Content-Type: application/json" \
-d '{"profileUrl": "https://www.linkedin.com/in/janesmith/", "unfollow": true}'
DELETE /api/connection Remove an existing connection.
Copy curl -X DELETE https://li.scaleabm.org/api/connection \
-H "Authorization: Bearer voy_YOUR_KEY" \
-H "X-User-Id: your-username" \
-H "Content-Type: application/json" \
-d '{"profileUrl": "https://www.linkedin.com/in/janesmith/"}'
Search Search LinkedIn for people, content, and jobs. Company names are auto-resolved to LinkedIn IDs.
GET /api/search/people Search for people by keywords, company, and connection degree.
Param Type Description keywords string Search keywords (at least one of keywords or company required) company string Company universal name (auto-resolved to company ID) network string Connection degree filter: F (1st), S (2nd), O (3rd+) start number Pagination offset (default 0) count number Results per page (default 10)
Copy curl -H "Authorization: Bearer voy_YOUR_KEY" \
-H "X-User-Id: your-username" \
"https://li.scaleabm.org/api/search/people?keywords=CTO&company=stripe&network=S&count=10"
Copy {
"success" : true ,
"data" : {
"total" : 10 ,
"results" : [
{
"fullName" : "Alice Chen" ,
"headline" : "CTO at Stripe" ,
"profileUrl" : "https://www.linkedin.com/in/alicechen/" ,
"location" : "San Francisco Bay Area" ,
"connectionDegree" : "2nd"
}
],
"_meta" : { "keywords" : "CTO" , "company" : "stripe" , "companyId" : "1115" , "network" : "S" }
}
}
GET /api/search/jobs Search LinkedIn job postings by keywords and location.
Param Type Description keywords required string Job search keywords location string Location filter (e.g., "London") start number Pagination offset (default 0) count number Results per page (default 25)
Copy curl -H "Authorization: Bearer voy_YOUR_KEY" \
-H "X-User-Id: your-username" \
"https://li.scaleabm.org/api/search/jobs?keywords=senior%20engineer&location=London&count=10"
GET /api/search/jobs/:jobId Get detailed job posting information by job ID.
Copy curl -H "Authorization: Bearer voy_YOUR_KEY" \
-H "X-User-Id: your-username" \
https://li.scaleabm.org/api/search/jobs/3847291056
GET /api/search/jobs/:jobId/hiring-team Get the hiring team for a specific job posting. Returns the recruiter, hiring manager, and other team members associated with the role.
Copy curl -H "Authorization: Bearer voy_YOUR_KEY" \
-H "X-User-Id: your-username" \
https://li.scaleabm.org/api/search/jobs/3847291056/hiring-team
Copy {
"success" : true ,
"data" : {
"hiringTeam" : [
{
"fullName" : "Sarah Chen" ,
"title" : "Technical Recruiter" ,
"profileUrl" : "https://www.linkedin.com/in/sarah-chen/" ,
"role" : "recruiter"
}
]
}
}
SalesNav API Access Sales Navigator functionality via dedicated API endpoints. Requires SalesNav cookies (li_a and li_ep_auth_context) synced alongside your regular LinkedIn cookies.
SalesNav Cookie Requirements In addition to li_at and JSESSIONID, SalesNav endpoints require:
li_a -- Sales Navigator session token li_ep_auth_context -- Enterprise profile context (decoded to build the x-li-identity header) The Chrome extension captures these automatically when you visit Sales Navigator.
POST /api/salesnav/search Search SalesNav by keywords. Returns enriched lead results with company, title, and connection degree.
Copy curl -X POST https://li.scaleabm.org/api/salesnav/search \
-H "Authorization: Bearer voy_YOUR_KEY" \
-H "X-User-Id: your-username" \
-H "Content-Type: application/json" \
-d '{"keywords": "VP Engineering fintech London", "maxResults": 25}'
GET /api/salesnav/leads/:leadId Fetch a SalesNav lead profile with enriched data.
Copy curl -H "Authorization: Bearer voy_YOUR_KEY" \
-H "X-User-Id: your-username" \
https://li.scaleabm.org/api/salesnav/leads/ACwAAEiWqEgB5mPALw1Krx0RwqIlLn6c-V39-GQ
GET /api/salesnav/leads/:leadId/timeline Get a lead's activity timeline from SalesNav.
Copy curl -H "Authorization: Bearer voy_YOUR_KEY" \
-H "X-User-Id: your-username" \
"https://li.scaleabm.org/api/salesnav/leads/ACwAAEiWqEgB5mPALw1Krx0RwqIlLn6c-V39-GQ/timeline?count=10"
GET /api/salesnav/leads/:leadId/insights Get lead posts/comments insights from SalesNav.
Copy curl -H "Authorization: Bearer voy_YOUR_KEY" \
-H "X-User-Id: your-username" \
https://li.scaleabm.org/api/salesnav/leads/ACwAAEiWqEgB5mPALw1Krx0RwqIlLn6c-V39-GQ/insights
GET /api/salesnav/accounts/:accountId Fetch a SalesNav company account profile.
Copy curl -H "Authorization: Bearer voy_YOUR_KEY" \
-H "X-User-Id: your-username" \
https://li.scaleabm.org/api/salesnav/accounts/warmly
GET /api/salesnav/accounts/:accountId/employees Get employees of a SalesNav account. Returns employee data synchronously via REST.
Copy curl -H "Authorization: Bearer voy_YOUR_KEY" \
-H "X-User-Id: your-username" \
"https://li.scaleabm.org/api/salesnav/accounts/warmly/employees?limit=50"
GET /api/salesnav/alerts Fetch SalesNav alerts (saved lead updates, job changes, etc.).
Copy curl -H "Authorization: Bearer voy_YOUR_KEY" \
-H "X-User-Id: your-username" \
"https://li.scaleabm.org/api/salesnav/alerts?start=0&count=25"
GET /api/salesnav/inbox Fetch SalesNav InMail inbox.
Copy curl -H "Authorization: Bearer voy_YOUR_KEY" \
-H "X-User-Id: your-username" \
"https://li.scaleabm.org/api/salesnav/inbox?start=0&count=25"
GET /api/salesnav/viewers See who viewed your SalesNav profile.
Copy curl -H "Authorization: Bearer voy_YOUR_KEY" \
-H "X-User-Id: your-username" \
"https://li.scaleabm.org/api/salesnav/viewers?start=0&count=25"
Account Intelligence Deep account research endpoints powered by SalesNav data. Build dossiers, track headcount trends, find lookalike companies, and map decision-maker org charts.
GET /api/salesnav/companies/:id/dossier Generate an AI-powered account dossier with company overview, key metrics, recent news, and strategic insights.
Copy curl -H "Authorization: Bearer voy_YOUR_KEY" \
-H "X-User-Id: your-username" \
https://li.scaleabm.org/api/salesnav/companies/12345678/dossier
Copy {
"success" : true ,
"data" : {
"dossier" : {
"companyName" : "Acme Corp" ,
"industry" : "Computer Software" ,
"headcount" : 1250 ,
"headquarters" : "San Francisco, CA" ,
"recentNews" : ["..." ],
"keyInsights" : ["..." ]
}
}
}
GET /api/salesnav/companies/:id/insights Track employee headcount growth trends, department distribution, and hiring velocity.
Copy curl -H "Authorization: Bearer voy_YOUR_KEY" \
-H "X-User-Id: your-username" \
https://li.scaleabm.org/api/salesnav/companies/12345678/insights
Copy {
"success" : true ,
"data" : {
"headcountGrowth" : {
"current" : 1250 ,
"sixMonthsAgo" : 1100 ,
"growthRate" : "13.6%"
},
"departments" : [
{ "name" : "Engineering" , "count" : 420 },
{ "name" : "Sales" , "count" : 280 }
]
}
}
GET /api/salesnav/companies/:id/similar Find lookalike companies based on industry, size, and characteristics.
Copy curl -H "Authorization: Bearer voy_YOUR_KEY" \
-H "X-User-Id: your-username" \
https://li.scaleabm.org/api/salesnav/companies/12345678/similar
Copy {
"success" : true ,
"data" : {
"similar" : [
{
"companyName" : "Similar Corp" ,
"industry" : "Computer Software" ,
"headcount" : 980 ,
"accountId" : "87654321"
}
]
}
}
GET /api/salesnav/companies/:id/relationship-map Get org charts and relationship maps showing decision-maker hierarchy at a company.
Copy curl -H "Authorization: Bearer voy_YOUR_KEY" \
-H "X-User-Id: your-username" \
https://li.scaleabm.org/api/salesnav/companies/12345678/relationship-map
Copy {
"success" : true ,
"data" : {
"relationships" : [
{
"fullName" : "Alice Chen" ,
"title" : "CTO" ,
"reportsTo" : "CEO" ,
"connectionDegree" : "2nd"
}
]
}
}
GET /api/salesnav/leads/:id/job-changes Track job change triggers for a SalesNav lead. Detects role changes, company moves, and promotions.
Copy curl -H "Authorization: Bearer voy_YOUR_KEY" \
-H "X-User-Id: your-username" \
https://li.scaleabm.org/api/salesnav/leads/ACwAAEiWqEgB5mPALw/job-changes
Copy {
"success" : true ,
"data" : {
"changes" : [
{
"type" : "new_role" ,
"previousTitle" : "VP Engineering" ,
"currentTitle" : "CTO" ,
"company" : "Acme Corp" ,
"detectedAt" : "2026-03-20T00:00:00Z"
}
]
}
}
GET /api/salesnav/personas Retrieve configured buyer personas from SalesNav for targeted lead discovery.
Copy curl -H "Authorization: Bearer voy_YOUR_KEY" \
-H "X-User-Id: your-username" \
https://li.scaleabm.org/api/salesnav/personas
Copy {
"success" : true ,
"data" : {
"personas" : [
{
"name" : "Engineering Leaders" ,
"titles" : ["CTO" , "VP Engineering" , "Head of Engineering" ],
"industries" : ["Computer Software" ],
"matchCount" : 2400
}
]
}
}
GET /api/salesnav/credits Check your InMail credit balance and usage.
Copy curl -H "Authorization: Bearer voy_YOUR_KEY" \
-H "X-User-Id: your-username" \
https://li.scaleabm.org/api/salesnav/credits
Copy {
"success" : true ,
"data" : {
"inmailCredits" : {
"remaining" : 35 ,
"total" : 50 ,
"resetsAt" : "2026-05-01T00:00:00Z"
}
}
}
Connections & Network Monitor your connection request balance, track sent invitations, and explore your LinkedIn network.
GET /api/connect/balance Check your weekly connection request balance. LinkedIn limits the number of connection requests you can send per week.
Copy curl -H "Authorization: Bearer voy_YOUR_KEY" \
-H "X-User-Id: your-username" \
https://li.scaleabm.org/api/connect/balance
Copy {
"success" : true ,
"data" : {
"weeklyLimit" : 100 ,
"sent" : 42 ,
"remaining" : 58 ,
"resetsAt" : "2026-04-07T00:00:00Z"
}
}
GET /api/invitations/summary Get a summary of your invitation activity -- sent, received, accepted, and pending counts.
Copy curl -H "Authorization: Bearer voy_YOUR_KEY" \
-H "X-User-Id: your-username" \
https://li.scaleabm.org/api/invitations/summary
Copy {
"success" : true ,
"data" : {
"sent" : 142 ,
"received" : 38 ,
"pending" : 12 ,
"accepted" : 98
}
}
GET /api/invitations/sent List all sent connection invitations with their status (pending, accepted, withdrawn).
Copy curl -H "Authorization: Bearer voy_YOUR_KEY" \
-H "X-User-Id: your-username" \
https://li.scaleabm.org/api/invitations/sent
Copy {
"success" : true ,
"data" : {
"invitations" : [
{
"recipientName" : "Jane Smith" ,
"profileUrl" : "https://www.linkedin.com/in/janesmith/" ,
"status" : "pending" ,
"sentAt" : "2026-04-01T10:00:00Z"
}
]
}
}
GET /api/contacts/suggested Get LinkedIn's suggested contacts -- people you may know based on your network.
Copy curl -H "Authorization: Bearer voy_YOUR_KEY" \
-H "X-User-Id: your-username" \
https://li.scaleabm.org/api/contacts/suggested
Copy {
"success" : true ,
"data" : {
"suggestions" : [
{
"fullName" : "Bob Wilson" ,
"headline" : "Product Manager at Stripe" ,
"profileUrl" : "https://www.linkedin.com/in/bobwilson/" ,
"mutualConnections" : 12
}
]
}
}
GET /api/network/summary Get an overview of your LinkedIn network including invitation, connection, and social proof counts.
Copy curl -H "Authorization: Bearer voy_YOUR_KEY" \
-H "X-User-Id: your-username" \
https://li.scaleabm.org/api/network/summary
Copy {
"success" : true ,
"data" : {
"connections" : 500 ,
"pendingInvitations" : 12 ,
"profileViews" : 89 ,
"searchAppearances" : 42
}
}
Lookup & Resolution Resolve LinkedIn typeahead values for use in search filters. These endpoints return structured lookup data for geos, industries, titles, companies, schools, functions, and groups.
GET /api/lookup/geos Search geographic locations for use in search filters. Returns LinkedIn geo URNs.
Copy curl -H "Authorization: Bearer voy_YOUR_KEY" \
-H "X-User-Id: your-username" \
"https://li.scaleabm.org/api/lookup/geos?q=London"
GET /api/lookup/industries Search industries for use in search filters. Returns LinkedIn industry URNs.
Copy curl -H "Authorization: Bearer voy_YOUR_KEY" \
-H "X-User-Id: your-username" \
"https://li.scaleabm.org/api/lookup/industries?q=software"
GET /api/lookup/titles Search job titles for use in search filters.
Copy curl -H "Authorization: Bearer voy_YOUR_KEY" \
-H "X-User-Id: your-username" \
"https://li.scaleabm.org/api/lookup/titles?q=CTO"
GET /api/lookup/companies Search companies for use in search filters. Returns LinkedIn company URNs.
Copy curl -H "Authorization: Bearer voy_YOUR_KEY" \
-H "X-User-Id: your-username" \
"https://li.scaleabm.org/api/lookup/companies?q=stripe"
GET /api/lookup/schools Search schools for use in search filters.
Copy curl -H "Authorization: Bearer voy_YOUR_KEY" \
-H "X-User-Id: your-username" \
"https://li.scaleabm.org/api/lookup/schools?q=MIT"
GET /api/lookup/functions Search job functions for use in search filters.
Copy curl -H "Authorization: Bearer voy_YOUR_KEY" \
-H "X-User-Id: your-username" \
"https://li.scaleabm.org/api/lookup/functions?q=engineering"
GET /api/lookup/groups Search LinkedIn groups for use in search filters.
Copy curl -H "Authorization: Bearer voy_YOUR_KEY" \
-H "X-User-Id: your-username" \
"https://li.scaleabm.org/api/lookup/groups?q=product+management"
Copy
{
"success" : true ,
"data" : {
"results" : [
{ "id" : "102257491" , "text" : "London, England, United Kingdom" }
]
}
}
Account Capability (Multi-Account Meter) The capability endpoint provides a single-call health check and usage meter across all linked LinkedIn accounts in a tenant. Use it to make policy decisions about which account to route work through.
GET /api/accounts/capability Returns capability flags and usage meters for all accounts in the tenant, or a specific account when X-User-Id is provided.
Copy curl -H "Authorization: Bearer voy_YOUR_KEY" \
https://li.scaleabm.org/api/accounts/capability
Copy {
"success" : true ,
"data" : {
"accounts" : [
{
"userId" : "alice" ,
"sessionValid" : true ,
"canSend" : true ,
"canConnect" : true ,
"usage" : {
"messagesSent" : 22 ,
"connectionsRequested" : 8 ,
"profilesViewed" : 45
}
}
]
}
}
Playbook: Lead Discovery A step-by-step workflow for finding and qualifying leads at a target company.
Step 1: Search people at the target company Find decision-makers by keywords and company name.
Copy curl -H "Authorization: Bearer voy_YOUR_KEY" \
-H "X-User-Id: your-username" \
"https://li.scaleabm.org/api/search/people?keywords=VP%20Engineering&company=stripe&count=10"
Step 2: Enrich with full profiles Batch-fetch profiles for all candidates to get education, positions, and contact info.
Copy curl -X POST https://li.scaleabm.org/api/profiles/read \
-H "Authorization: Bearer voy_YOUR_KEY" \
-H "X-User-Id: your-username" \
-H "Content-Type: application/json" \
-d '{"profiles": [{"vanityName": "alicechen"}, {"vanityName": "bobwilson"}]}'
Step 3: Check their recent posts See what each prospect is publishing to understand their priorities and interests.
Copy curl -H "Authorization: Bearer voy_YOUR_KEY" \
-H "X-User-Id: your-username" \
"https://li.scaleabm.org/api/posts?profileUrl=https://www.linkedin.com/in/alicechen/&limit=5"
Step 4: Qualify based on engagement Check relationship status and whether you can message directly or need to connect first.
Copy curl -H "Authorization: Bearer voy_YOUR_KEY" \
-H "X-User-Id: your-username" \
"https://li.scaleabm.org/api/relationship/status?profileUrl=https://www.linkedin.com/in/alicechen/"
Copy {
"success" : true ,
"data" : {
"connected" : false ,
"connectionDegree" : "2nd" ,
"openProfile" : true ,
"canMessageDirectly" : true ,
"canConnect" : true
}
}
Playbook: Warm Outreach A workflow for connecting with prospects and sending follow-up messages after they accept.
Step 1: Find leads via search Use people search to build a prospect list at your target company.
Copy curl -H "Authorization: Bearer voy_YOUR_KEY" \
-H "X-User-Id: your-username" \
"https://li.scaleabm.org/api/search/people?keywords=product%20manager&company=salesforce&network=S"
Step 2: Send connection requests Send personalized connection requests to each prospect. Space requests 30-60 seconds apart.
Copy curl -X POST https://li.scaleabm.org/api/connect \
-H "Authorization: Bearer voy_YOUR_KEY" \
-H "X-User-Id: your-username" \
-H "Content-Type: application/json" \
-d '{"profileUrl": "https://www.linkedin.com/in/prospect/", "message": "Hi, your work on product-led growth is impressive!"}'
Step 3: Monitor acceptances Poll the events feed to detect when prospects accept your connection request.
Copy curl -H "Authorization: Bearer voy_YOUR_KEY" \
-H "X-User-Id: your-username" \
"https://li.scaleabm.org/api/events?types=connection.received&since=2026-03-16T00:00:00Z"
Step 4: Send follow-up message Once they accept, send a personalized follow-up message within 24 hours.
Copy curl -X POST https://li.scaleabm.org/api/send \
-H "Authorization: Bearer voy_YOUR_KEY" \
-H "X-User-Id: your-username" \
-H "Content-Type: application/json" \
-d '{"profileUrl": "https://www.linkedin.com/in/prospect/", "message": "Thanks for connecting! I noticed you work on product analytics at Salesforce..."}'
Rate Limiting Guidance Space connection requests 30-60 seconds apart Limit to 20-30 connection requests per day on a new account Space messages 15-30 seconds apart Limit to 50-80 messages per day Use /api/session/capabilities to monitor your usage counters Playbook: Content Intelligence Monitor prospect posts, track engagement signals, and use strategic commenting to build rapport.
Monitor prospect posts Periodically fetch the latest posts from your target prospects. Track new content via post URNs to avoid re-processing.
Copy curl -H "Authorization: Bearer voy_YOUR_KEY" \
-H "X-User-Id: your-username" \
"https://li.scaleabm.org/api/posts?profileUrl=https://www.linkedin.com/in/prospect/&limit=3"
Track engagement signals Check your notifications for likes, comments, and mentions -- these are buying signals when they come from prospects.
Copy curl -H "Authorization: Bearer voy_YOUR_KEY" \
-H "X-User-Id: your-username" \
"https://li.scaleabm.org/api/notifications?count=20"
Strategic commenting Leave thoughtful, value-adding comments on prospect posts to build visibility and rapport before direct outreach.
Copy curl -X POST https://li.scaleabm.org/api/comment \
-H "Authorization: Bearer voy_YOUR_KEY" \
-H "X-User-Id: your-username" \
-H "Content-Type: application/json" \
-d '{"postUrl": "https://www.linkedin.com/feed/update/urn:li:activity:7175.../", "comment": "Really interesting perspective on scaling engineering teams. We found a similar pattern at our company -- context switching was the #1 bottleneck."}'
Combine this with the Lead Discovery playbook: search for prospects, monitor their content, engage meaningfully, then connect.
Async Jobs A small number of long-running operations (batch SalesNav list exports, multi-profile batch posts) return 202 Accepted with a job ID. Most endpoints are synchronous REST and return results immediately. Poll the job endpoint to get async results.
202 Response Copy {
"success" : true ,
"data" : {
"jobId" : "a1b2c3d4-e5f6-7890-abcd-ef1234567890" ,
"status" : "pending" ,
"pollUrl" : "/api/jobs/a1b2c3d4-e5f6-7890-abcd-ef1234567890"
}
}
Polling Copy curl -H "Authorization: Bearer voy_YOUR_KEY" \
-H "X-User-Id: your-username" \
https://li.scaleabm.org/api/jobs/a1b2c3d4-e5f6-7890-abcd-ef1234567890
Job Statuses Status Meaning pending Job is queued, not yet started running Job is actively executing completed Job finished successfully. Result in job.result. failed Job failed. Error details in job.error.
Completed Job Response Copy {
"success" : true ,
"data" : {
"job" : {
"id" : "a1b2c3d4-..." ,
"status" : "completed" ,
"action" : "salesnav/lists/export" ,
"startedAt" : "2026-03-17T10:00:00.000Z" ,
"completedAt" : "2026-03-17T10:00:12.345Z" ,
"result" : { "success" : true , "leads" : ["..." ] }
}
}
}
List Jobs Copy curl -H "Authorization: Bearer voy_YOUR_KEY" \
-H "X-User-Id: your-username" \
"https://li.scaleabm.org/api/jobs?limit=10&status=completed"
Rate Limiting Voyager acts as infrastructure -- it reports usage counters but does not enforce daily limits. Your orchestrating agent should decide policy based on account age, trust score, and campaign context.
Recommended Daily Limits Action New Account (< 30 days) Established Account Connection requests 15-20 50-80 Messages 30-50 80-150 Profile views 50-80 150-250 Post likes 30-50 100-200 Comments 10-20 30-50 Posts created 1-2 3-5 InMails 5 20-50 (depends on plan)
Recommended Delays Between Actions Action Pair Minimum Delay Between connection requests 30-60 seconds Between messages 15-30 seconds Between profile views 5-15 seconds Between likes 3-10 seconds
Monitoring Usage Copy curl -H "Authorization: Bearer voy_YOUR_KEY" \
-H "X-User-Id: your-username" \
https://li.scaleabm.org/api/session/capabilities
The usage object in the response reports messagesSent, connectionsRequested, profilesViewed, accountAgeDays, and secondsSinceLastAction.
GET /api/session/activity Daily activity counters for external rate policy decisions.
Copy curl -H "Authorization: Bearer voy_YOUR_KEY" \
-H "X-User-Id: your-username" \
https://li.scaleabm.org/api/session/activity
Returns today's date and counters: messagesSent, connectionsRequested, profilesViewed. Use this for lightweight polling in orchestration agents.
Error Handling All error responses follow the standard response envelope with success: false and an errors array.
Error Response Format Copy {
"success" : false ,
"statusCode" : 400 ,
"message" : "profileUrl and message are required" ,
"errors" : ["profileUrl and message are required" ]
}
Status Codes Code Meaning Action 400 Bad Request Check required parameters and their formats 401 Unauthorized / Session Expired Check API key. If SESSION_EXPIRED, re-sync cookies via POST /api/session 403 Forbidden LinkedIn rejected the action (not connected, profile restricted, etc.) 404 Not Found Resource does not exist (job, profile, company) 409 Conflict User session not active -- sync cookies first 422 Unprocessable LinkedIn API returned an unexpected error. Check the error field for details. 429 Too Many Requests LinkedIn rate-limited the request. Wait and retry with exponential backoff. 500 Internal Server Error Unexpected server error. Report to admin.
Session Expired Recovery When you receive a 401 with SESSION_EXPIRED error:
Open LinkedIn in your browser and confirm you are logged in Export fresh cookies via the Chrome extension (or manually) Call POST /api/session with the new cookies Check sessionValid: true in the response before retrying Batch Operations Batch endpoints let you process multiple items in a single call, reducing overhead. All follow the same pattern: send an array of inputs, get per-item results.
Available Batch Endpoints Endpoint Method Max Items Description /api/profiles/read POST 25 Batch profile fetch /api/profiles/posts/read POST 10 Batch posts fetch /api/relationships/read POST 20 Batch relationship status /api/salesnav/leads/read POST 10 Batch SalesNav lead profiles /api/salesnav/accounts/read POST 5 Batch SalesNav accounts /api/salesnav/lists/read POST 5 Batch SalesNav list export (async job)
Example: Batch Profile Fetch Copy curl -X POST https://li.scaleabm.org/api/profiles/read \
-H "Authorization: Bearer voy_YOUR_KEY" \
-H "X-User-Id: your-username" \
-H "Content-Type: application/json" \
-d '{
"profiles": [
{"vanityName": "johndoe"},
{"vanityName": "janesmith"},
{"profileUrl": "https://www.linkedin.com/in/alicechen/"}
]
}'
Copy {
"success" : true ,
"data" : {
"count" : 3 ,
"results" : [
{
"input" : { "vanityName" : "johndoe" },
"success" : true ,
"data" : {
"vanityName" : "johndoe" ,
"fullName" : "John Doe" ,
"headline" : "VP Engineering at Acme" ,
"positions" : ["..." ],
"education" : ["..." ]
}
},
{
"input" : { "vanityName" : "janesmith" },
"success" : true ,
"data" : { "..." }
},
{
"input" : { "profileUrl" : "https://www.linkedin.com/in/alicechen/" },
"success" : false ,
"error" : "This profile can't be accessed"
}
]
}
}
Example: Batch Relationship Check Copy curl -X POST https://li.scaleabm.org/api/relationships/read \
-H "Authorization: Bearer voy_YOUR_KEY" \
-H "X-User-Id: your-username" \
-H "Content-Type: application/json" \
-d '{
"profiles": [
{"vanityName": "johndoe"},
{"vanityName": "janesmith"}
]
}'
MCP Server Voyager exposes 34 LinkedIn tools via the Model Context Protocol (MCP). Connect Claude Code, Claude Desktop, or any MCP-compatible client to give your AI agent full LinkedIn capabilities.
Setup for Claude Code Add the following to your .mcp.json in the project root:
Copy {
"mcpServers" : {
"voyager" : {
"command" : "bun" ,
"args" : ["run" , "src/mcp-server.ts" ],
"env" : {
"VOYAGER_API_URL" : "https://li.scaleabm.org" ,
"VOYAGER_API_KEY" : "voy_YOUR_KEY" ,
"VOYAGER_USER_ID" : "your-user-id"
}
}
}
}
Available Tools The MCP server exposes 34 tools organized into 10 categories:
Category Tools Description Profile 3 Fetch own profile, any profile by vanity name, batch profiles Search 5 People search, company search, job search, content search, SalesNav search Messaging 4 List conversations, send messages, read threads, mark as read Connections 4 Send connection requests, list pending, accept/reject invitations Engagement 6 Like, comment, react, view reactions, view comments, endorse skills Posts & Feed 2 Create posts, fetch feed items Companies 3 Company profiles, employee lists, company updates Groups 2 List groups, group members Session 2 Sync cookies, check session capabilities SalesNav 3 Lead search with 22 filters, typeahead resolution, lead profiles
Environment Variables Variable Required Description VOYAGER_API_KEY required Your tenant API key (starts with voy_) VOYAGER_API_URL no Base URL of the Voyager instance. Defaults to https://li.scaleabm.org VOYAGER_USER_ID no Default user ID for requests. Can be overridden per tool call.
Usage Example Once configured, your AI agent can call Voyager tools directly:
Copy
WebSocket Relay When the Chrome extension is active, LinkedIn API requests route through the user's real browser -- same cookies, same IP, zero bot detection. Falls back to server-side REST when Chrome is closed.
How It Works 1
The Chrome extension opens a WebSocket connection to /api/relay.
2
Authenticates with its API key and user ID.
3
The server sends LinkedIn API requests over the WebSocket instead of using server-side HTTP.
4
The extension executes fetch() with credentials: "include" inside the real browser.
5
The browser attaches real cookies from the real IP -- indistinguishable from normal LinkedIn usage.
6
No LinkedIn tab needed -- just Chrome running with the extension installed.
Status Endpoints GET /api/relay/check Check whether a relay connection is active for the current tenant and user. Tenant-scoped (requires API key + user ID).
Copy curl -H "Authorization: Bearer voy_YOUR_KEY" \
-H "X-User-Id: your-username" \
https://li.scaleabm.org/api/relay/check
Copy {
"success" : true ,
"data" : {
"relayConnected" : true ,
"userId" : "your-username" ,
"connectedSince" : "2026-03-22T10:30:00Z"
}
}
GET /api/admin/relay/status List all active relay connections across all tenants. Requires admin authentication.
Copy curl -H "Authorization: Bearer ADMIN_SECRET" \
https://li.scaleabm.org/api/admin/relay/status
Copy {
"success" : true ,
"data" : {
"connections" : [
{
"tenantId" : "32e365dc" ,
"userId" : "charissfyrakis" ,
"connectedSince" : "2026-03-22T10:30:00Z"
}
]
}
}
Extension Badge The Chrome extension displays a blue "R" badge on its icon when the relay connection is active. The badge disappears when disconnected, giving you a quick visual indicator of relay status.
WebSocket Protocol The relay uses a simple JSON message protocol over WebSocket:
Copy
→ { "type" : "auth" , "apiKey" : "voy_..." , "userId" : "your-username" }
← { "type" : "auth_ok" }
← { "type" : "request" , "id" : "req_1" , "url" : "https://www.linkedin.com/voyager/api/..." , "method" : "GET" , "headers" : {} }
→ { "type" : "response" , "id" : "req_1" , "status" : 200 , "body" : { "..." } }
← { "type" : "ping" }
→ { "type" : "pong" }