Docs API Reference Playground Pricing Extension Dashboard

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.

# Fetch a sandbox profile curl https://li.scaleabm.org/api/profile/sarah-chen \ -H "Authorization: Bearer demo_key"
# Search sandbox people curl "https://li.scaleabm.org/api/search/people?keywords=engineering" \ -H "Authorization: Bearer demo_key"
# Simulate sending a message (nothing actually sent) 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.

# Sync cookies + user agent 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)..." }'
# Expected response { "success": true, "userId": "your-username", "cookieCount": 2, "sessionValid": true }
3

Verify your session. Confirm your LinkedIn session is healthy.

curl -H "Authorization: Bearer voy_YOUR_KEY" \ -H "X-User-Id: your-username" \ https://li.scaleabm.org/api/session/capabilities
{ "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.

curl -H "Authorization: Bearer voy_YOUR_KEY" \ -H "X-User-Id: your-username" \ https://li.scaleabm.org/api/profile/me
{ "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.

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"
{ "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.

# Available vanity names: sarah-chen, james-murphy, priya-sharma, marcus-johnson, emma-wilson, david-kim, rachel-foster, alex-tanaka

SDK usage

# TypeScript / JavaScript const voyager = new VoyagerClient({ apiKey: 'demo_key' }); const profile = await voyager.getProfile('sarah-chen'); console.log(profile.sandbox); // true
# Python 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

HeaderValueDescription
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.

# Example key 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.

# Admin request example 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

CookieRequiredPurpose
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

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

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

{ "success": true, "statusCode": 200, "message": "Profile fetched", "data": { // endpoint-specific payload } }

Error Response

{ "success": false, "statusCode": 400, "message": "profileUrl is required", "errors": [ "profileUrl is required" ] }

Envelope Fields

FieldTypeDescription
successbooleanWhether the request succeeded
statusCodenumberHTTP status code (mirrors the response status)
messagestringHuman-readable summary of the result
dataobjectEndpoint-specific payload (only on success)
errorsstring[]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.

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.

curl -H "Authorization: Bearer voy_YOUR_KEY" \ -H "X-User-Id: your-username" \ https://li.scaleabm.org/api/profile/johndoe
{ "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.

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.

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.

curl -H "Authorization: Bearer voy_YOUR_KEY" \ -H "X-User-Id: your-username" \ https://li.scaleabm.org/api/profile/johndoe/network
{ "success": true, "data": { "followersCount": 4280, "connectionsCount": 500, "followingCount": 312 } }

GET /api/profile/viewers

See who has viewed your LinkedIn profile.

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.

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/"} ] }'
{ "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.

curl -H "Authorization: Bearer voy_YOUR_KEY" \ -H "X-User-Id: your-username" \ https://li.scaleabm.org/api/profile/johndoe/email
{ "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.

curl -H "Authorization: Bearer voy_YOUR_KEY" \ -H "X-User-Id: your-username" \ "https://li.scaleabm.org/api/profile/johndoe/posts?count=10"
{ "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.

curl -H "Authorization: Bearer voy_YOUR_KEY" \ -H "X-User-Id: your-username" \ https://li.scaleabm.org/api/profile/johndoe/recommendations
{ "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.

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/"
{ "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.

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/"
{ "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.

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/"
{ "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.

ParamTypeDescription
limitnumberMax conversations to return (default 20)
categorystringINBOX, PRIMARY_INBOX, SECONDARY_INBOX, ARCHIVED_INBOX, SPAM_INBOX
nextCursorstringCursor from previous response for pagination
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.

FieldTypeDescription
profileUrl requiredstringLinkedIn profile URL of the recipient
message requiredstringMessage text
recipientUrnstringIf known, skip all resolution and send directly
confirmInThreadbooleanWait for message to appear in conversation thread
queuebooleanQueue the send for operating-hours delivery
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!"}'
{ "success": true, "data": { "method": "api-conv-scan" } }

POST /api/conversations/:conversationId/read

Mark a conversation as read.

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.

curl -H "Authorization: Bearer voy_YOUR_KEY" \ -H "X-User-Id: your-username" \ https://li.scaleabm.org/api/conversations/drafts
{ "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.

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
{ "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.

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
{ "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.

ParamTypeDescription
profileUrl requiredstringLinkedIn profile URL
limitnumberMax posts to return (default 20)
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).

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.

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.

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"}'
{ "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.

FieldTypeDescription
postUrl requiredstringLinkedIn post URL (must contain activity ID)
reactionTypestringLIKE, CELEBRATE, LOVE, INSIGHTFUL, FUNNY, CURIOUS (default: LIKE)
unlikebooleanSet to true to remove the reaction
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.

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.

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).

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.

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.

curl -H "Authorization: Bearer voy_YOUR_KEY" \ -H "X-User-Id: your-username" \ https://li.scaleabm.org/api/connect/received
{ "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.

# Follow 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 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.

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/"}'

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.

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.

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.

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.

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.

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.

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.).

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.

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.

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.

curl -H "Authorization: Bearer voy_YOUR_KEY" \ -H "X-User-Id: your-username" \ https://li.scaleabm.org/api/salesnav/companies/12345678/dossier
{ "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.

curl -H "Authorization: Bearer voy_YOUR_KEY" \ -H "X-User-Id: your-username" \ https://li.scaleabm.org/api/salesnav/companies/12345678/insights
{ "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.

curl -H "Authorization: Bearer voy_YOUR_KEY" \ -H "X-User-Id: your-username" \ https://li.scaleabm.org/api/salesnav/companies/12345678/similar
{ "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.

curl -H "Authorization: Bearer voy_YOUR_KEY" \ -H "X-User-Id: your-username" \ https://li.scaleabm.org/api/salesnav/companies/12345678/relationship-map
{ "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.

curl -H "Authorization: Bearer voy_YOUR_KEY" \ -H "X-User-Id: your-username" \ https://li.scaleabm.org/api/salesnav/leads/ACwAAEiWqEgB5mPALw/job-changes
{ "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.

curl -H "Authorization: Bearer voy_YOUR_KEY" \ -H "X-User-Id: your-username" \ https://li.scaleabm.org/api/salesnav/personas
{ "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.

curl -H "Authorization: Bearer voy_YOUR_KEY" \ -H "X-User-Id: your-username" \ https://li.scaleabm.org/api/salesnav/credits
{ "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.

curl -H "Authorization: Bearer voy_YOUR_KEY" \ -H "X-User-Id: your-username" \ https://li.scaleabm.org/api/connect/balance
{ "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.

curl -H "Authorization: Bearer voy_YOUR_KEY" \ -H "X-User-Id: your-username" \ https://li.scaleabm.org/api/invitations/summary
{ "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).

curl -H "Authorization: Bearer voy_YOUR_KEY" \ -H "X-User-Id: your-username" \ https://li.scaleabm.org/api/invitations/sent
{ "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.

curl -H "Authorization: Bearer voy_YOUR_KEY" \ -H "X-User-Id: your-username" \ https://li.scaleabm.org/api/contacts/suggested
{ "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.

curl -H "Authorization: Bearer voy_YOUR_KEY" \ -H "X-User-Id: your-username" \ https://li.scaleabm.org/api/network/summary
{ "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.

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.

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.

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.

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.

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.

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.

curl -H "Authorization: Bearer voy_YOUR_KEY" \ -H "X-User-Id: your-username" \ "https://li.scaleabm.org/api/lookup/groups?q=product+management"
# All lookup endpoints return the same shape { "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.

curl -H "Authorization: Bearer voy_YOUR_KEY" \ https://li.scaleabm.org/api/accounts/capability
{ "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.

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.

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.

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.

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/"
{ "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.

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.

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.

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.

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.

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.

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.

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

{ "success": true, "data": { "jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "status": "pending", "pollUrl": "/api/jobs/a1b2c3d4-e5f6-7890-abcd-ef1234567890" } }

Polling

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

StatusMeaning
pendingJob is queued, not yet started
runningJob is actively executing
completedJob finished successfully. Result in job.result.
failedJob failed. Error details in job.error.

Completed Job Response

{ "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

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

ActionNew Account (< 30 days)Established Account
Connection requests15-2050-80
Messages30-5080-150
Profile views50-80150-250
Post likes30-50100-200
Comments10-2030-50
Posts created1-23-5
InMails520-50 (depends on plan)

Recommended Delays Between Actions

Action PairMinimum Delay
Between connection requests30-60 seconds
Between messages15-30 seconds
Between profile views5-15 seconds
Between likes3-10 seconds

Monitoring Usage

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.

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

{ "success": false, "statusCode": 400, "message": "profileUrl and message are required", "errors": ["profileUrl and message are required"] }

Status Codes

CodeMeaningAction
400Bad RequestCheck required parameters and their formats
401Unauthorized / Session ExpiredCheck API key. If SESSION_EXPIRED, re-sync cookies via POST /api/session
403ForbiddenLinkedIn rejected the action (not connected, profile restricted, etc.)
404Not FoundResource does not exist (job, profile, company)
409ConflictUser session not active -- sync cookies first
422UnprocessableLinkedIn API returned an unexpected error. Check the error field for details.
429Too Many RequestsLinkedIn rate-limited the request. Wait and retry with exponential backoff.
500Internal Server ErrorUnexpected server error. Report to admin.

Session Expired Recovery

When you receive a 401 with SESSION_EXPIRED error:

  1. Open LinkedIn in your browser and confirm you are logged in
  2. Export fresh cookies via the Chrome extension (or manually)
  3. Call POST /api/session with the new cookies
  4. 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

EndpointMethodMax ItemsDescription
/api/profiles/readPOST25Batch profile fetch
/api/profiles/posts/readPOST10Batch posts fetch
/api/relationships/readPOST20Batch relationship status
/api/salesnav/leads/readPOST10Batch SalesNav lead profiles
/api/salesnav/accounts/readPOST5Batch SalesNav accounts
/api/salesnav/lists/readPOST5Batch SalesNav list export (async job)

Example: Batch Profile Fetch

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/"} ] }'
{ "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

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:

{ "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:

CategoryToolsDescription
Profile3Fetch own profile, any profile by vanity name, batch profiles
Search5People search, company search, job search, content search, SalesNav search
Messaging4List conversations, send messages, read threads, mark as read
Connections4Send connection requests, list pending, accept/reject invitations
Engagement6Like, comment, react, view reactions, view comments, endorse skills
Posts & Feed2Create posts, fetch feed items
Companies3Company profiles, employee lists, company updates
Groups2List groups, group members
Session2Sync cookies, check session capabilities
SalesNav3Lead search with 22 filters, typeahead resolution, lead profiles

Environment Variables

VariableRequiredDescription
VOYAGER_API_KEYrequiredYour tenant API key (starts with voy_)
VOYAGER_API_URLnoBase URL of the Voyager instance. Defaults to https://li.scaleabm.org
VOYAGER_USER_IDnoDefault user ID for requests. Can be overridden per tool call.

Usage Example

Once configured, your AI agent can call Voyager tools directly:

# In Claude Code, the agent can now do things like: # "Search for engineering managers at Stripe" # "Send a connection request to /in/janesmith with a note" # "Get my latest conversations" # All routed through the MCP server to Voyager's REST API.

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).

curl -H "Authorization: Bearer voy_YOUR_KEY" \ -H "X-User-Id: your-username" \ https://li.scaleabm.org/api/relay/check
{ "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.

curl -H "Authorization: Bearer ADMIN_SECRET" \ https://li.scaleabm.org/api/admin/relay/status
{ "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:

// 1. Client authenticates after connecting → { "type": "auth", "apiKey": "voy_...", "userId": "your-username" } ← { "type": "auth_ok" } // 2. Server sends API requests for the extension to execute ← { "type": "request", "id": "req_1", "url": "https://www.linkedin.com/voyager/api/...", "method": "GET", "headers": {} } // 3. Extension executes fetch and returns the response → { "type": "response", "id": "req_1", "status": 200, "body": { "..." } } // 4. Keepalive ping/pong (every 30s) ← { "type": "ping" } → { "type": "pong" }