API Documentation

Drive LinkOutreach from your own code, Claude, or ChatGPT. The REST API and the MCP server share one auth model: an organization API key. Every endpoint below is also an MCP tool.

Authentication

Create a key in Integrations. It is scoped to your whole organization. Send it as a Bearer token.

curl https://linkoutreach.co/api/v1/accounts \
  -H "Authorization: Bearer sk_lis_..."

Base URL: https://linkoutreach.co/api/v1. All bodies are JSON · send Content-Type: application/json.

Workspaces & multiple accounts

Your organization can hold many workspaces (for an agency, one per client) · each is fully isolated: its own LinkedIn accounts, lists, sequences and inbox. One key manages them all.

  • · List or create workspaces with GET / POST /workspaces.
  • · Target a specific workspace on any call by adding ?workspace_id=<id> (REST) or the workspace_id tool argument (MCP).
  • · On REST you can instead send a X-Workspace-Id header. With no selector, calls hit your default (oldest) workspace.
# create a client workspace
curl -X POST https://linkoutreach.co/api/v1/workspaces \
  -H "Authorization: Bearer sk_lis_..." -H "Content-Type: application/json" \
  -d '{ "name": "Acme Inc." }'

# then work inside it (note ?workspace_id=)
curl "https://linkoutreach.co/api/v1/lists?workspace_id=<id>" \
  -H "Authorization: Bearer sk_lis_..."

MCP (Claude, Cursor, ChatGPT)

Add the MCP server as a connector. Sign in when prompted, then Authorize · no API key to paste. Every endpoint below becomes a tool, and each carries an optional workspace_id argument so the assistant can pick which client to act on.

https://linkoutreach.co/mcp

Endpoints

Everything in the app is controllable here. {id} means a path value. Fields marked required must be present.

Workspaces
GET/workspaces

List every workspace in your organization (e.g. one per client).

POST/workspaces

Create a new workspace. Returns the new workspace (use its id as workspace_id on later calls).

Body fields
namestringrequired· Display name, e.g. the client's company.
{ "name": "Acme Inc." }
PATCH/workspaces/{id}

Rename a workspace.

Body fields
namestringrequired· New name.
{ "name": "Acme (EMEA)" }
DELETE/workspaces/{id}

Permanently delete a workspace and all its data (disconnects its LinkedIn accounts, cancels its seats). Cannot be undone.

Accounts
GET/accounts

List connected LinkedIn accounts in the target workspace.

POST/accounts/connect

Get a hosted-auth URL to connect a new LinkedIn account into the target workspace.

Lists
GET/lists

List all lead lists in the target workspace.

POST/lists/ai-search

Build a list from a natural-language audience. Runs in the background.

Body fields
querystringrequired· Who to target, in plain English.
namestringoptional· List name. Defaults to the query.
targetnumberoptional· How many leads to pull (capped by your plan; default ~500).
{
  "query": "CTOs at French SaaS companies, 50-200 employees",
  "name": "French SaaS CTOs",
  "target": 100
}
POST/lists/url

Build a list from a LinkedIn or Sales Navigator search URL.

Body fields
urlstringrequired· A LinkedIn /search or Sales Navigator /sales/search URL.
namestringoptional· List name.
targetnumberoptional· How many leads to pull.
{
  "url": "https://www.linkedin.com/sales/search/people?query=...",
  "name": "Imported search"
}
GET/lists/{id}

Get a list and its leads.

POST/lists/{id}/add

Top up a list with more prospects from its saved search.

Body fields
countnumberoptional· How many to add (default 50).
mode"same" | "similar"optional· same = more from the same search; similar = lookalikes. Default same.
{ "count": 50, "mode": "same" }
DELETE/lists/{id}

Delete a list and its leads.

Sequences
GET/sequences

List all sequences with their stats.

POST/sequences

Create a sequence. A sequence is an ordered list of steps the runner executes per prospect under your safety limits.

Body fields
namestringrequired· Sequence name.
stepsStep[]optional· Ordered steps. Each step is one of the types below.
{
  "name": "CTO Outbound",
  "steps": [
    { "type": "invite",  "note": "Hi {{first_name}}, loved your post on scaling." },
    { "type": "wait",    "days": 2 },
    { "type": "message", "body": "Thanks for connecting, {{first_name}}! ..." }
  ]
}

Step types: invite { note? } · wait { days } · message { body }. Use {{first_name}}, {{last_name}}, {{company}}, {{job_title}} as placeholders. Set "ai": true on an invite/message to AI-personalize it (Pro). Invite notes max ~280 chars.

GET/sequences/{id}

Get a sequence with stats and enrollments.

PATCH/sequences/{id}

Edit steps, rename, or change status (activate / pause).

Body fields
namestringoptional· Rename.
stepsStep[]optional· Replace the steps.
status"draft" | "active" | "rollout" | "paused"optional· active = send. rollout = stop sending new invites, but keep running the sequence for people who already got one. paused = freeze everything.
{ "status": "active" }
DELETE/sequences/{id}

Delete a sequence and its enrollments.

POST/sequences/{id}/enroll

Enroll a whole list into the sequence. Auto-activates it.

Body fields
list_iduuidrequired· The list to enroll.
{ "list_id": "8f3a...-uuid" }
POST/sequences/{id}/enrollments/{eid}

Pause, resume or stop one prospect.

Body fields
action"pause" | "resume" | "stop"required· What to do with this enrollment.
{ "action": "pause" }
Inbox
GET/inbox

Reply conversations from your campaign prospects (replies + accepted invites).

GET/inbox/{lead_id}/thread

Full message thread for a prospect.

POST/inbox/{lead_id}/reply

Reply to a prospect who answered.

Body fields
textstringrequired· The message to send.
{ "text": "Thanks! Here's a quick overview ..." }