The LinkedIn messaging API for DMs, InMails and invites.
Send a LinkedIn message, InMail or connection request over HTTP — plus replies, reactions and follows. 9 engagement actions behind one identity-aware API. Connect a seat with a cookie or with email and password; engagement runs in direct mode on that identity. We manage rate limits and ramp-up.
Edges is not related to LinkedIn and is not an official LinkedIn product.
- Engagement actions
- 9
- invite · message · InMail
- Uptime
- 99%+
- status page
- Customers
- 100+
- shipping in production
- Access
- 1 key
- enrich then send
// used by
// 9 engagement actions
Every LinkedIn action a person takes — as an API call.
Identity-bound. Rate-aware. Idempotent. Direct mode on a connected seat — cookie or email + password.
Send connection invite
With optional note. Idempotent on recipient + identity. Returns the connection state when delivered.
linkedin-connect-profile
Send message
Direct message to a 1st-degree connection. Returns receipt + thread id for reply tracking.
linkedin-message-profile
Send InMail
Premium / Sales Nav InMail to anyone. Optional subject, body, and call-to-action button.
linkedin-inmail-profile
Reply in thread
Continue an existing conversation. Read-receipt aware; can mark read before responding.
linkedin-extract-messages
React to post
Like, celebrate, support, etc. Reactions are queued through the identity's rate budget.
linkedin-like-post
Comment on post
Public comment from a connected identity. Returns the comment URN for replies.
linkedin-comment-post
Follow profile / company
Follow without connecting — useful for signal subscription and activity surfacing.
linkedin-follow-profile
Pull inbox
Sync threads, unread counts, last-message snippets across all your connected identities.
linkedin-extract-conversations
Withdraw invite
Pull pending connection requests after N days to keep the inbox clean.
linkedin-withdraw-invitation
// endpoint reference
Four calls that cover outreach.
Same runner as every other Action — POST /v1/actions/{slug}/run/live. Async runs take a callback URL instead of a packaged message.received bus.
Direct message a 1st-degree connection from a connected seat. Returns a thread id you persist and reuse for follow-ups. Free with an engagement identity.
POST/v1/actions/linkedin-message-profile/run/live
curl -X POST \
"https://api.edges.run/v1/actions/linkedin-message-profile/run/live" \
-H "Content-Type: application/json" \
-H "X-API-Key: $EDGES_API_KEY" \
-d '{
"input": {
"linkedin_profile_url": "https://www.linkedin.com/in/jane-doe"
},
"parameters": {
"message": "Hey Jane — saw you joined Acme last week."
},
"identity_ids": ["<IDENTITY_UID>"]
}'{
"is_sent": true,
"linkedin_profile_id": 123456789,
"linkedin_thread_id": "2-OTFhNjRhZDUtY2M4ZS00OGM4LWJjYTctYTQwYjc5NmY3ZmJkXzAxMg==",
"linkedin_thread_url": "https://www.linkedin.com/messaging/thread/2-…/",
"linkedin_message_id": "2-MSG-EXAMPLE",
"delivered_at": "2026-08-17T12:24:00.000Z"
}// Official API vs Edges
Partner OAuth, or a seat you already run.
LinkedIn Help and Microsoft Learn document the official partner path. This table is for teams shopping a third-party messaging API.
| Topic | Official LinkedIn API | Edges |
|---|---|---|
| Access | OAuth through a LinkedIn partner application. | Connected seat — cookie, email + password, or Chrome extension. Direct mode on that identity. |
| Approval | Partner / Community Management application and review. | No LinkedIn partner approval. You connect a seat you already operate. |
| Messaging coverage | Community Management API is built for pages and orgs, not member DMs at product depth. | DMs, connection invites, InMails, inbox extract — the member outreach surface. |
| Sales Navigator | Separate partner products. Not bundled with a public messaging API. | First-class actions on the same key and identity. |
| Rate shaping | Quotas LinkedIn publishes for approved apps. | Per-identity daily budgets, automatic ramp-up, 429s with Retry-After. |
| ToS posture | In-policy for the approved use case. | Third-party. You own compliance; we pace, ramp, and stop on risk signals. |
Edges is not related to LinkedIn and is not an official LinkedIn product.
// Identity pool
Per-seat limits. Automatic ramping. No ban roulette.
Each LinkedIn account is an identity in the pool. We enforce per-identity rate budgets, warm new identities gradually, and stop sending when LinkedIn signals risk.
| Identity | Tier | Today's send budget | Status | Reply rate |
|---|---|---|---|---|
| JDJane Doeid_01 · seasoned · 18mo | Sales Nav | 21 / 30 | active | 38% |
| RMRaj Mehtaid_02 · seasoned · 14mo | Sales Nav | 29 / 30 | active | 31% |
| AKAnna Kimid_03 · ramping · 3wk | Free | 5 / 10 | ramping | — |
| LSLeo Schmidtid_04 · seasoned · 22mo | Premium | 20 / 20 · paused | paused | 42% |
// daily limits · classic / sales nav
| Action | Classic | Sales Nav |
|---|---|---|
| Connectlinkedin-connect-profile | 25 / day | 30 / day |
| Messagelinkedin-message-profile | 50 / day | 250 / day |
| InMaillinkedin-inmail-profile | Plan credits | Plan credits |
| Visitlinkedin-visit-profile | 80 / day | 500 / day |
| Connection noteslinkedin-connect-profile | 5 / month, then dropped | Note attached |
Limits are per connected identity, not per API key. New seats ramp automatically. On 429 the API returns Retry-After and X-RateLimit-* headers so you back off cleanly. Action limits in the docs ↗
// Sequence pattern
A 5-touch sequence is a 5-call workflow.
Invite → wait → message → wait → InMail fallback. The workflow engine handles scheduling; you write the copy.
// Built for
Four outreach jobs, one messaging API.
Same identity, same rate budget, same callback path. The product shape changes; the Action catalog does not.
- // AI sales agents
Tool-use for outreach
The agent resolves a profile, sends an invite or DM, and keys the next touch on the thread id. Same Actions catalog as the rest of your LinkedIn stack.
linkedin-connect-profilelinkedin-message-profilecallback - // prospecting
Invite → wait → message
A 5-touch sequence is five Action calls. Per-seat limits and ramp-up sit in the identity pool so SDRs do not babysit daily caps.
linkedin-connect-profilelinkedin-message-profilelinkedin-inmail-profile - // recruiting
InMail and pipeline follow-up
Premium / Recruiter InMail to anyone, then DM once they connect. Inbox extract keeps replies in your ATS, not a second inbox.
linkedin-inmail-profilelinkedin-extract-conversations - // CS re-engagement
Silent customers, named seats
Pull threads, diff last activity, send a follow-up from the CSM's identity. Outreach only makes sense coming from a real, named account.
linkedin-extract-conversationslinkedin-message-profile
// FAQ
Messaging, answered.
Rate-limit policy, identity warmup, and ToS posture in our docs.
Does Edges handle LinkedIn connection requests and DMs?
Yes. The Edges Actions API covers the outreach surface most product teams need: sending connection requests (with or without a note), direct messages on existing 1st-degree conversations, follow-up messages, and reading inbox threads. Each capability is a typed action with documented inputs and JSON responses, so you integrate it the same way you integrate any other internal microservice.
How does the managed session pool work — do I need to provide LinkedIn cookies?
For messaging and other engagement actions, yes — you connect a LinkedIn identity, either by passing a cookie or by logging in with email and password. Those actions run in `direct` mode against that connected seat: you don't send DMs or connection requests from the managed session pool, because outreach only makes sense coming from a real, named account. The managed pool is for reads (profiles, companies, search). Once the seat is connected, we still handle rate limits and ramp-up on it.
How do I connect a LinkedIn seat — cookie, email and password, or Chrome extension?
Three paths, same result: a connected identity that engagement Actions run against in `direct` mode. Pass a cookie, log in with email and password, or use the Edges Chrome extension. Reads (profiles, companies, search) can stay on the managed session pool; outreach never does.
Can I send InMails via API?
Yes, InMail sending is exposed as an action for accounts that have InMail credits on their LinkedIn plan (Recruiter, Sales Navigator, or Premium). You pass the recipient, subject, and body, and Edges routes the send through the linked account. Responses to InMails land in the same conversation object you can poll via extract-conversations Actions (live or async with callbacks).
Can I DM 2nd-degree or 3rd-degree connections?
Not as a regular DM. LinkedIn only lets you message 1st-degree connections in the inbox. Send a connection request first (linkedin-connect-profile), then message after they accept. To reach someone you are not connected to, use InMail on a Premium, Sales Navigator, or Recruiter seat that still has credits.
How does Edges compare to Unipile for LinkedIn messaging?
Unipile is a unified inbox API — LinkedIn as one channel among email and WhatsApp. Edges is LinkedIn-native: DMs, InMails, invites, search, and enrichment share the same auth, identity pool, and rate shaping. We manage session health and per-seat limits (ramp-up, daily budgets, 429s) so you don't have to; Unipile leaves that operational surface to you. You also get Sales Navigator, scheduled timing patterns built with Actions, and a typed action catalog Unipile doesn't ship. Side-by-side: https://edges.run/compare/unipile
How does Edges compare to Phantombuster for outreach?
Phantombuster runs scheduled browser phantoms. Edges is a versioned HTTP API: typed Actions, structured errors, callbacks, CI mocks. Reads can run on the managed session pool; outreach runs on a seat you connect, with per-identity rate budgets and ramp-up. Side-by-side: https://edges.run/compare/phantombuster
What rate limits should I expect?
Rate shaping is enforced per connected account, not per API key. Published daily defaults: connect 25 Classic / 30 Sales Nav; message 50 / 250; profile visits 80 / 500; InMail follows your LinkedIn plan credits. Classic accounts can attach a personalized connection note on 5 invites per month — after that LinkedIn drops the note silently. New identities ramp automatically. The API returns 429 with Retry-After and X-RateLimit-* headers so you can back off cleanly.
Does messaging consume credits?
Engagement Actions — connect, message, InMail, extract-conversations, reactions — are free when you run them with an engagement identity. Set type: "engagement" when you create the identity. You still pay for the seat you connect and you still sit inside per-identity LinkedIn limits. Reads (profiles, companies, search) use the credit pool.
Can I use this for automated outbound — is it compliant with LinkedIn's ToS?
LinkedIn's terms prohibit certain patterns of automated scraping and spam but allow a range of legitimate integrations; interpretation depends heavily on your specific use case, volume, and how you handle user consent. Edges provides rate shaping, per-account pacing, and opt-out-friendly primitives that make it easier to stay inside acceptable patterns, but ToS compliance ultimately rests with you as the operator. We recommend running a legal review before you ship high-volume outbound and instrumenting your own abuse signals on top of ours.
How does the official LinkedIn Messaging API compare to Edges?
The official path is OAuth through a LinkedIn partner application — typically the Community Management API, which is built for pages and organizations, not member DMs, invites, and InMails at product depth. Partner approval is a separate process with its own wait and scope. Edges is a third-party Actions API on a seat you connect (cookie, email + password, or Chrome extension). You get DMs, invites, InMails, inbox extract, and Sales Nav on one key, without LinkedIn partner approval. You own ToS compliance; we pace and ramp.
Is Edges an official LinkedIn partner?
No. Edges is not related to LinkedIn and is not an official LinkedIn product. We do not offer OAuth through LinkedIn's partner program. You connect a LinkedIn identity you already operate, and engagement Actions run in direct mode on that seat.
Should we build LinkedIn messaging in-house instead of buying an API?
Building means you own selectors, sessions, anti-bot posture, per-seat pacing, and a parsing layer per LinkedIn surface — plus on-call when LinkedIn changes a page. Edges already runs that operational layer: identity pool, ramp-up, 429 semantics, typed Actions. Year-one math and the hybrid pattern (Edges for production outreach, in-house for one-off research) are on https://edges.run/build-vs-buy
How do I track replies and follow-ups?
Every outbound send returns a linkedin_thread_id. Persist it and reuse it for follow-up sends so reporting stays keyed to one conversation. To pick up replies, schedule linkedin-extract-conversations (async or schedule) and deliver via callback.url, or poll GET /v1/runs/{run_uid}/outputs and diff threads in your app. There is no packaged message.received event.
Do you support webhook events for new messages?
Not as a packaged message.received event bus. Async and schedule Action runs (including extract-conversations) deliver results to your callback URL, or you poll GET /runs/{run_uid}/outputs. For ongoing inbox sync, schedule linkedin-extract-conversations and diff threads in your app — same callback / outputs path as every other Action. Integration webhooks cover AUTH_EXPIRED on the connected seat, not inbound DMs.
How do callbacks differ from a message.received webhook?
A message.received bus would push each inbound DM as it lands. Edges does not ship that. You schedule or run linkedin-extract-conversations, pass callback.url with on: "final" (or "all"), then fetch GET /v1/runs/{run_uid}/outputs and diff. Same callback contract as every other Action — documented at https://docs.edges.run/v1/runs/callbacks
Does LinkedIn have an official messaging or send-message API?
No. LinkedIn's official (Marketing / Partner) API does not expose general 1:1 messaging — there's no public endpoint to send a DM, InMail, or connection request for most developers. Edges fills that gap: send messages, InMails, and invites on a LinkedIn seat you connect, as a REST API with managed pacing. Start with Message LinkedIn Profile.
Is there a LinkedIn connection request (invitation) API?
Yes. Send connection requests — with or without a note — via Connect LinkedIn Profile, and manage the queue by bulk-accepting or withdrawing pending invitations with Accept pending LinkedIn invitations. Every call runs on your connected seat with per-identity pacing.
Can AI agents send LinkedIn messages via API?
Yes — Edges is a REST Actions API built for agents. A single call sends a DM, InMail, or connection request on your connected seat, and per-seat rate limits with automatic ramp-up keep an agent from burning the account. Replies come back via webhooks and callbacks, so an agent can run a full multi-touch sequence with Workflows.
Ship outreach you don't have to babysit.
One free identity, every engagement endpoint live, sequences scheduled.