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
  • Messaging
  • Send a Message
  • How Message Sending Works
  • Send InMail
  • List Conversations
  • Conversation Categories
  • Pagination
  • Read Messages in a Conversation
  • Mark as Read
  • Export Full Inbox
  • Event-Driven Messaging
  • Recommended Pacing
  • Related
Core Concepts

Messaging

Was this page helpful?
Previous

Posts & Engagement

Next
Built with

Messaging

Voyager provides full messaging capabilities — send messages to connections and Open Profiles, read conversations, manage your inbox, export messages over a rolling window, and send InMail to non-connections.

Every Voyager response is wrapped in the standard envelope { success, statusCode, message, data, errors }. The JSON examples below show only the endpoint-specific payload — in your client, access it as res.data.<field>, not res.<field>. See Introduction for the full envelope shape.

Send a Message

$curl -X POST "$BASE/api/send" \
> -H "Authorization: Bearer $KEY" \
> -H "X-User-Id: $USER" \
> -H "Content-Type: application/json" \
> -d '{
> "profileUrl": "https://www.linkedin.com/in/janesmith/",
> "message": "Hi Jane, great connecting with you. Would love to chat about your work at Acme."
> }'
1{
2 "success": true,
3 "method": "api-direct"
4}

How Message Sending Works

Voyager uses a multi-phase approach to find or create the right conversation:

  1. Phase 0 — Cache lookup: If you’ve messaged this person before, Voyager has the conversation ID cached for instant delivery
  2. Phase 1 — Participant query: REST API lookup by recipient URN
  3. Phase 1.5 — Conversation scan: Scans recent conversations and matches by participant profile ID
  4. Phase 2 — New conversation: Creates a new conversation thread

For faster repeat sends, include recipientUrn from a previous profile lookup. This lets Voyager skip URN resolution entirely.

$# Faster send with cached URN
$curl -X POST "$BASE/api/send" \
> -H "Authorization: Bearer $KEY" \
> -H "X-User-Id: $USER" \
> -H "Content-Type: application/json" \
> -d '{
> "profileUrl": "https://www.linkedin.com/in/janesmith/",
> "message": "Following up on our conversation...",
> "recipientUrn": "urn:li:fsd_profile:ABC123"
> }'

Send InMail

Send InMail to non-connections (requires InMail credits on LinkedIn):

$curl -X POST "$BASE/api/send-inmail" \
> -H "Authorization: Bearer $KEY" \
> -H "X-User-Id: $USER" \
> -H "Content-Type: application/json" \
> -d '{
> "profileUrl": "https://www.linkedin.com/in/targetperson/",
> "subject": "Quick question about your platform work",
> "message": "Hi, I noticed your recent talk on distributed systems..."
> }'

List Conversations

$curl -H "Authorization: Bearer $KEY" \
> -H "X-User-Id: $USER" \
> "$BASE/api/conversations?limit=20&category=PRIMARY_INBOX"

Conversation Categories

CategoryDescription
INBOXAll conversations
PRIMARY_INBOXPrimary inbox (default LinkedIn view)
SECONDARY_INBOXOther / secondary messages
ARCHIVED_INBOXArchived conversations
SPAM_INBOXSpam / filtered messages

Pagination

Conversations use cursor-based pagination:

$# First page
$curl -H "Authorization: Bearer $KEY" \
> -H "X-User-Id: $USER" \
> "$BASE/api/conversations?limit=20"
$
$# Next page (use nextCursor from previous response)
$curl -H "Authorization: Bearer $KEY" \
> -H "X-User-Id: $USER" \
> "$BASE/api/conversations?limit=20&nextCursor=CURSOR_VALUE"

Read Messages in a Conversation

$curl -H "Authorization: Bearer $KEY" \
> -H "X-User-Id: $USER" \
> "$BASE/api/conversations/CONVERSATION_URN?limit=50"

Or by profile URL:

$curl -H "Authorization: Bearer $KEY" \
> -H "X-User-Id: $USER" \
> "$BASE/api/messages?profileUrl=https://www.linkedin.com/in/janesmith/&limit=20"

Mark as Read

$curl -X POST "$BASE/api/conversations/CONVERSATION_ID/read" \
> -H "Authorization: Bearer $KEY" \
> -H "X-User-Id: $USER"

Export Full Inbox

Export your complete inbox history:

$curl -H "Authorization: Bearer $KEY" \
> -H "X-User-Id: $USER" \
> "$BASE/api/export/inbox?months=3&categories=PRIMARY_INBOX"

Event-Driven Messaging

Instead of polling for new messages, use webhooks:

$# Create a webhook for incoming messages
$curl -X POST "$BASE/api/webhooks" \
> -H "Authorization: Bearer $KEY" \
> -H "X-User-Id: $USER" \
> -H "Content-Type: application/json" \
> -d '{
> "url": "https://your-server.com/webhook",
> "events": ["message_received"],
> "secret": "your-hmac-secret"
> }'

Or poll the event feed:

$curl -H "Authorization: Bearer $KEY" \
> -H "X-User-Id: $USER" \
> "$BASE/api/events?types=message.received&since=2026-03-17T00:00:00Z&limit=50"

Recommended Pacing

LinkedIn monitors messaging frequency. Recommended intervals:

  • Between messages: 30-60 seconds
  • Daily limit: No hard cap, but stay under 50-100 for new accounts
  • New connections: Wait at least a few hours after connecting before messaging

Sending too many messages too quickly can trigger LinkedIn’s spam detection, which may temporarily restrict your account’s messaging ability.

Related

  • Connections — Connect before messaging non-Open Profiles
  • Webhooks — Real-time message notifications
  • Rate Limiting — Usage tracking and recommended intervals