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:

1{
2 "success": true,
3 "statusCode": 200,
4 "message": null,
5 "data": {
6 "userId": "your-username",
7 "cookieCount": 4,
8 "userAgent": "Mozilla/5.0 ...",
9 "sessionValid": true,
10 "sessionError": null
11 },
12 "errors": null
13}

2. Verify your session

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

Response:

1{
2 "success": true,
3 "statusCode": 200,
4 "message": null,
5 "data": {
6 "linkedInSessionValid": true,
7 "salesNavSessionValid": true,
8 "canSend": true,
9 "canConnect": true,
10 "canPost": true,
11 "canGetReliableConnectionDegree": true,
12 "usage": {
13 "messagesSent": 0,
14 "connectionsRequested": 0,
15 "profilesViewed": 0,
16 "accountAgeDays": 365,
17 "secondsSinceLastAction": 3600
18 },
19 "relayConnected": true,
20 "warnings": []
21 },
22 "errors": null
23}

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:

1{
2 "success": true,
3 "statusCode": 200,
4 "message": null,
5 "data": {
6 "profile": {
7 "fullName": "Jane Smith",
8 "headline": "VP Engineering at Acme Corp",
9 "vanityName": "janesmith",
10 "location": "San Francisco Bay Area",
11 "positions": [
12 {
13 "title": "VP Engineering",
14 "companyName": "Acme Corp",
15 "startDate": { "year": 2023, "month": 1 }
16 }
17 ],
18 "education": [
19 {
20 "school": "Stanford University",
21 "degree": "MS Computer Science",
22 "startYear": 2015,
23 "endYear": 2017
24 }
25 ]
26 }
27 },
28 "errors": null
29}

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?