Quickstart

Quickstart

Prerequisites

You need two things:

  1. An API key (voy_ prefix) — create one in the dashboard or deploy your own instance
  2. LinkedIn session cookies from your browser — easiest path is the Voyager Chrome extension, which auto-syncs them and keeps them fresh

Set up these variables for the examples below:

export BASE=https://li.scaleabm.org
export KEY=voy_YOUR_API_KEY
export USER=your-username

1. Sync your LinkedIn session

If you’re using the Chrome extension, cookies are already synced — skip to step 2. Otherwise, export them from your browser and POST them yourself:

curl -X POST "$BASE/api/session" \
-H "Authorization: Bearer $KEY" \
-H "X-User-Id: $USER" \
-H "Content-Type: application/json" \
-d '{
"cookies": [
{"name": "li_at", "value": "YOUR_LI_AT_VALUE", "domain": ".linkedin.com"},
{"name": "JSESSIONID", "value": "YOUR_JSESSIONID", "domain": ".linkedin.com"}
],
"userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36"
}'

li_at and JSESSIONID are the minimum required. Include li_a and li_ep_auth_context to enable Sales Navigator access. Always include userAgent — sessions without it may fail LinkedIn’s fingerprint checks.

Response:

{
"success": true,
"statusCode": 200,
"message": null,
"data": {
"userId": "your-username",
"cookieCount": 4,
"userAgent": "Mozilla/5.0 ...",
"sessionValid": true,
"sessionError": null
},
"errors": null
}

2. Verify your session

curl -H "Authorization: Bearer $KEY" \
-H "X-User-Id: $USER" \
"$BASE/api/session/capabilities"

Response:

{
"success": true,
"statusCode": 200,
"message": null,
"data": {
"linkedInSessionValid": true,
"salesNavSessionValid": true,
"canSend": true,
"canConnect": true,
"canPost": true,
"canGetReliableConnectionDegree": true,
"usage": {
"messagesSent": 0,
"connectionsRequested": 0,
"profilesViewed": 0,
"accountAgeDays": 365,
"secondsSinceLastAction": 3600
},
"relayConnected": true,
"warnings": []
},
"errors": null
}

Every endpoint wraps its payload in the same { success, statusCode, message, data, errors } envelope. The endpoint-specific fields live under data. If you’re migrating from an older client, change res.profile to res.data.profile.

3. Get your own profile

curl -H "Authorization: Bearer $KEY" \
-H "X-User-Id: $USER" \
"$BASE/api/profile/me"

Response:

{
"success": true,
"statusCode": 200,
"message": null,
"data": {
"profile": {
"fullName": "Jane Smith",
"headline": "VP Engineering at Acme Corp",
"vanityName": "janesmith",
"location": "San Francisco Bay Area",
"positions": [
{
"title": "VP Engineering",
"companyName": "Acme Corp",
"startDate": { "year": 2023, "month": 1 }
}
],
"education": [
{
"school": "Stanford University",
"degree": "MS Computer Science",
"startYear": 2015,
"endYear": 2017
}
]
}
},
"errors": null
}

4. Search for people

curl -H "Authorization: Bearer $KEY" \
-H "X-User-Id: $USER" \
"$BASE/api/search/people?keywords=CEO+Warmly&count=5"

5. Look up any profile

curl -H "Authorization: Bearer $KEY" \
-H "X-User-Id: $USER" \
"$BASE/api/profile/williamhgates"

6. Paste any LinkedIn URL

Don’t want to figure out which endpoint matches which URL shape? POST /api/fetch takes any LinkedIn URL (SRP, profile, company, post, group, event) and dispatches to the right underlying call, auto-paginating search results up to maxResults.

curl -X POST "$BASE/api/fetch" \
-H "Authorization: Bearer $KEY" -H "X-User-Id: $USER" \
-H "Content-Type: application/json" \
-d '{
"url": "https://www.linkedin.com/search/results/content/?keywords=AI%20agents",
"maxResults": 500
}'

The response echoes kind (search-content, profile, post, company, …) so your agent can branch on URL type without a second round-trip. For post URLs, pass "includeEngagers": true to also pull reactions + comments inline. SalesNav URLs aren’t supported — use the SalesNav endpoints directly.

Or: skip REST, wire it into your agent via MCP

If you’re building an agent in Claude Code, Claude Desktop, or Cursor, the MCP server exposes the same 45 operations as natural tool calls — your agent just says “find Cambridge alumni at Anthropic” and the LLM picks the right tool and parameters.

What’s next?