LinkedIn automation APIAutomate LinkedIn outreach from your own code.
Create sequences as JSON, enroll leads from any tool, and get a webhook for every invite, accept and reply. The SalesMix app runs on this same API, so nothing is held back.
{ "name": "Founders · Series A", "type": "dynamic", "accounts": "rotate:all", "steps": [ { "visit_profile": {} }, { "connect": { "note": "Hi {{first_name}}" } }, { "if": "connected", "then": ["message", "wait:3d", "like"], "else": { "if": "open_profile", "then": "inmail", "else": "email" } } ] }
Your first LinkedIn reply in three API calls.
Create a key
In Settings → API keys. Keys are scoped to a workspace, so agencies can hand each client its own.
Create a sequence
Send the steps as JSON to POST /v1/sequences, or build it on the canvas and grab its id.
Enroll leads and listen
Push leads to /v1/sequences/:id/leads and register a webhook for message.replied.
# Enroll leads straight from your Clay table, CRM or script curl https://api.salesmix.com/v1/sequences/seq_8Fk2/leads \ -H "Authorization: Bearer $SALESMIX_KEY" \ -H "Idempotency-Key: clay-row-4471" \ -d '{ "leads": [{ "linkedin_url": "https://linkedin.com/in/juliatan", "first_name": "Julia", "company": "Brightpath", "custom": { "signal": "hiring_sdrs" } }], "start": "now" }' # → 202 Accepted { "enrolled": 1, "skipped_duplicates": 0 }
import SalesMix from "@salesmix/node"; const sm = new SalesMix(process.env.SALESMIX_KEY); await sm.sequences.leads.add("seq_8Fk2", { leads: [{ linkedin_url: "https://linkedin.com/in/juliatan", first_name: "Julia", company: "Brightpath", }], start: "now", }); sm.webhooks.on("message.replied", async (e) => { if (e.intent === "interested") await pushToCRM(e.lead); });
from salesmix import SalesMix sm = SalesMix(api_key=os.environ["SALESMIX_KEY"]) sm.sequences.leads.add( "seq_8Fk2", leads=[{ "linkedin_url": "https://linkedin.com/in/juliatan", "first_name": "Julia", "company": "Brightpath", }], start="now", ) for convo in sm.conversations.list(intent="interested"): print(convo.lead.name, convo.last_message.text)
// claude_desktop_config.json (or Cursor, or any MCP client) { "mcpServers": { "salesmix": { "url": "https://mcp.salesmix.com", "headers": { "Authorization": "Bearer $SALESMIX_KEY" } } } } › "Find everyone who replied 'interested' this week and draft a follow-up. Send them to Approvals." ✓ conversations.list(intent="interested") → 23 ✓ approvals.create × 23 → queued
LinkedIn API endpoints
Base URL https://api.salesmix.com/v1. JSON in, JSON out. Bearer-token auth. Machine-readable: openapi.json.
/accountsList connected LinkedIn accounts and their limits/accounts/:idUpdate daily limits, working hours, warm-up/sequencesCreate a sequence from JSON steps/sequences/:idFetch a sequence, its steps and stats/sequences/:id/launchStart or resume sending/sequences/:id/pausePause without losing progress/sequences/:id/leadsEnroll up to 1,000 leads per call/leadsFilter by status, sequence, account or intent/sequences/:id/leads/:lead_idRemove a lead from a sequence/conversationsUnified inbox across every account/conversations/:id/replyReply as the original account/approvalsQueue a draft for human review/approvals/:id/approveApprove, optionally with edits/webhooksSubscribe a URL to events/analytics/funnelFunnel by sequence, account or stepYour code hears about it instantly.
Every event is a signed POST with the lead, the account, the sequence and the step attached. Failed deliveries retry with backoff.
lead.enrolledA lead joined a sequenceconnection.sentAn invite went outmessage.sentA LinkedIn message or InMail was sentmessage.repliedThe lead replied, with an intent labellead.intent_changedIntent moved, e.g. to interestedemail.handoffLead handed to your email sequencerapproval.requestedA draft is waiting for reviewsequence.completedA lead reached an End stepaccount.limit_reachedAn account hit its daily cap- message.replied · Julia Tan · intent=interested200
- connection.sent · Priya Raman · sender=dana200
- approval.requested · draft_5Hq · step 3200
- email.handoff · Tom Becker → sequencer200
- lead.enrolled · 48 leads · seq_8Fk2200
import { createHmac, timingSafeEqual } from "node:crypto"; export function verify(raw, header, secret) { const [t, sig] = header.split(","); const mac = createHmac("sha256", secret) .update(`${t}.${raw}`).digest("hex"); return timingSafeEqual(Buffer.from(mac), Buffer.from(sig)); }
Give your agent the keys. Keep a human on the lock.
The SalesMix MCP server exposes sequences, leads, conversations and approvals as tools. Connect Claude, Cursor or your own agent and ask for outcomes in plain language. Read the MCP server guide →
- “Enroll everyone from this Clay view into the Series A sequence.”
- “Which step in Agency Q4 loses the most people?”
- “Draft replies to this week's interested leads and queue them for approval.”
you › Which sequence has the best reply rate this month, and move its stalled leads into a new follow-up? ⏺ salesmix.analytics_funnel(period="30d") ⏺ salesmix.leads_list(status="connected", replied=false) ⏺ salesmix.sequences_create(from="seq_8Fk2", name="Nudge") ⏺ salesmix.approvals_create × 41 agent › Founders · Series A leads with 18% replies. I built "Nudge" from it and queued 41 drafts in Approvals. Nothing sends until you approve.
Built so your integration just works.
Bearer keys per workspace
Create, scope and revoke keys in Settings. Keys never cross workspaces.
Cursor-based lists
Every list returns next_cursor. No page drift while new replies arrive.
Headers tell you where you stand
X-RateLimit-Remaining on every response, and a clear 429 with Retry-After.
Errors you can act on
A stable code, a human message and the field that caused it.
LinkedIn limits are enforced for you
The API queues actions; accounts still send at a human pace inside their own caps.
API questions
Is there an official LinkedIn API for outreach?
LinkedIn’s official APIs are limited to approved partners and don’t cover sending connection requests or messages for most companies. The SalesMix API runs outreach through the LinkedIn accounts you connect to SalesMix, with each account paced inside its own limits.
What can I do with the SalesMix API?
Everything the app does: list and configure LinkedIn accounts, create sequences from JSON, launch and pause them, enroll and remove leads, read and reply to conversations, queue drafts for approval, subscribe to webhooks and query funnel analytics.
Is the API included in every plan?
Yes. The REST API, webhooks and the MCP server are on every plan. There are no per-call fees, and the 7-day free trial includes full API access. See pricing.
Will API calls make my LinkedIn accounts send too fast?
No. The API queues work; it doesn’t bypass pacing. Every action still goes out at a human pace inside the account’s daily limits and working hours, however many leads you enroll at once.
What if I retry a request from Clay, n8n or Zapier?
Send an Idempotency-Key header and a retried request returns the original result instead of enrolling the same lead twice. Leads are also deduplicated by LinkedIn profile URL.
Do you have an OpenAPI spec or SDKs?
Yes. The spec is at /openapi.json, and there are SDKs for Node.js and Python. You can generate a client in any other language from the spec.
Keep exploring
Unlimited LinkedIn accounts, one API, $1,000/mo.
API, webhooks and the MCP server come with every plan. No per-call fees. 7-day free trial, cancel anytime.