For AI agents: a documentation index is available at the root level at /llms.txt and /llms-full.txt. Append /llms.txt to any URL for a page-level index, or .md for the markdown version of any page.
DashboardGet API Key
GuidesAPI ReferenceCommon Patterns
  • Getting Started
    • Welcome
    • Introduction
    • Quickstart
    • Authentication
  • Core Concepts
    • Sessions & Cookies
    • Profiles
    • Messaging
    • Posts & Engagement
    • Connections
    • Search
    • SalesNav
    • SalesNav Filters
  • Playbooks
    • Multi-Step Workflows
    • Query Patterns
  • Workflow Guides
    • Lead Discovery
    • Warm Outreach
    • Content Intelligence
    • Company Research
    • Job Market Intelligence
    • Webhooks
  • Integration
    • MCP Server
    • WebSocket Relay
DashboardGet API Key
On this page
  • Quickstart
  • Prerequisites
  • 1. Sync your LinkedIn session
  • 2. Verify your session
  • 3. Get your own profile
  • 4. Search for people
  • 5. Look up any profile
  • 6. Paste any LinkedIn URL
  • Or: skip REST, wire it into your agent via MCP
  • What’s next?
Getting Started

Quickstart

Was this page helpful?
Previous

Authentication

Next
Built with

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?

Authentication

API keys, headers, and the Chrome extension

MCP Server

Wire Voyager into Claude Code, Claude Desktop, or Cursor

Profiles

Read any LinkedIn profile with full career data

Lead Discovery Guide

Find decision-makers at any company