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 theworkspace_idtool argument (MCP). - · On REST you can instead send a
X-Workspace-Idheader. 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.
/workspacesList every workspace in your organization (e.g. one per client).
/workspacesCreate a new workspace. Returns the new workspace (use its id as workspace_id on later calls).
namestringrequired· Display name, e.g. the client's company.{ "name": "Acme Inc." }/workspaces/{id}Rename a workspace.
namestringrequired· New name.{ "name": "Acme (EMEA)" }/workspaces/{id}Permanently delete a workspace and all its data (disconnects its LinkedIn accounts, cancels its seats). Cannot be undone.
/accountsList connected LinkedIn accounts in the target workspace.
/accounts/connectGet a hosted-auth URL to connect a new LinkedIn account into the target workspace.
/listsList all lead lists in the target workspace.
/lists/ai-searchBuild a list from a natural-language audience. Runs in the background.
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
}/lists/urlBuild a list from a LinkedIn or Sales Navigator search URL.
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"
}/lists/{id}Get a list and its leads.
/lists/{id}/addTop up a list with more prospects from its saved search.
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" }/lists/{id}Delete a list and its leads.
/sequencesList all sequences with their stats.
/sequencesCreate a sequence. A sequence is an ordered list of steps the runner executes per prospect under your safety limits.
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.
/sequences/{id}Get a sequence with stats and enrollments.
/sequences/{id}Edit steps, rename, or change status (activate / pause).
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" }/sequences/{id}Delete a sequence and its enrollments.
/sequences/{id}/enrollEnroll a whole list into the sequence. Auto-activates it.
list_iduuidrequired· The list to enroll.{ "list_id": "8f3a...-uuid" }/sequences/{id}/enrollments/{eid}Pause, resume or stop one prospect.
action"pause" | "resume" | "stop"required· What to do with this enrollment.{ "action": "pause" }/inboxReply conversations from your campaign prospects (replies + accepted invites).
/inbox/{lead_id}/threadFull message thread for a prospect.
/inbox/{lead_id}/replyReply to a prospect who answered.
textstringrequired· The message to send.{ "text": "Thanks! Here's a quick overview ..." }