Integrations

Clay LinkedIn Integration

Send LinkedIn invites and messages from your reps' connected accounts, triggered from any Clay table. The same endpoints work from Zapier, Make, n8n, or a plain curl.

1What it does

Clay finds and enriches the row. Salescadia sends the LinkedIn touch and logs it back to your CRM. Point a Clay column at Salescadia and each row can fire a real connection invite or a direct message from a specific rep's own connected LinkedIn account.
  • Route sends off Clay's waterfall. Matched title, an intent signal, a fresh job change → send the invite. Any Clay column can drive it.
  • Personalize per row. The invite note or message body can pull from any Clay column.
  • Distribute across your reps. Set sender_email per row to route each send to that rep's LinkedIn (round-robin, by territory, or matched to the account owner).
  • Attribution stays intact. Every touch is logged in Salescadia's CRM against the right rep and campaign, so replies and booked meetings tie back correctly no matter what Clay is doing.
The same endpoints work from Zapier, Make, n8n, or a plain curl — anything that can send an HTTP request.

2Who should use it

Teams already running Clay (or another tool that can call an HTTP endpoint) that want to drive LinkedIn outreach from that data without exporting to a separate sender. You need admin access on your Salescadia organization to create an API key, and at least one rep with a connected LinkedIn account. Every send runs under a rep's own connected LinkedIn account. Salescadia never sends from a shared or scraped account — that is the pattern that keeps accounts inside LinkedIn's limits.

3How to set it up

  1. In Salescadia, open Settings → API keys and create a new key. Grant the write scope (needed for invites and messages; read alone is enough for lookups). Copy the mm_live_... value — it is shown once.
  2. Have each sending rep connect LinkedIn at Settings → Connections.
  3. In Clay, add an HTTP API enrichment column: method POST, URL https://www.salescadia.com/api/v1/clay/linkedin/invite, headers Authorization: Bearer mm_live_YOUR_KEY and Content-Type: application/json.
  4. Set the JSON body and map your Clay columns into it:
{
  "linkedin_url": "{{linkedin_url}}",
  "note": "Hey {{first_name}}, saw you're heading up growth at {{company}} — mind connecting?",
  "sender_email": "{{account_owner_email}}"
}
Clay substitutes any {{column}} token per row. The rep in sender_email sends the invite; leave it blank to fall back to the most-recently-connected account.

4The three endpoints

All three share the same auth (Authorization: Bearer mm_live_...) and return a flat JSON response, so every field maps to its own Clay column.
  • POST /api/v1/clay/linkedin/invite (write scope) — send one connection invitation with an optional note (up to 300 characters). Returns already_connected: true as a safe no-op if you are already connected.
  • POST /api/v1/clay/linkedin/message (write scope) — send one direct message to a 1st-degree connection. Returns not_connected_yet if they have not accepted an invite, so you can chain it behind an invite column.
  • POST /api/v1/clay/linkedin/lookup (read scope) — resolve a LinkedIn URL to structured fields (name, headline, network distance, already-connected) without sending anything. Use it to gate the invite and message columns.

5Common patterns

  • Round-robin across reps. Add a Clay column that picks sender_email from your rep list by row index. Salescadia routes each send to that rep's LinkedIn.
  • Only send when eligible. Call /lookup first, filter to rows where already_connected is false and the person is in network, then call /invite on the rest — so you never waste a send.
  • Follow up after acceptance. On a scheduled Clay run, call /lookup for previously-invited rows, filter to already_connected: true, then call /message with your follow-up copy.
Salescadia also tracks acceptances and replies natively, so a meeting booked back into the platform stays attributed to the right rep and campaign regardless of what Clay does.

6Rate limits and safety

Sends are subject to the same per-account safety Salescadia's own sequencer uses, so bulk Clay runs never turn into unsafe LinkedIn volume:
  • Per-account caps. Each rep has a daily invite and message budget (with a warmup ramp for new accounts). Clay can send in bulk; Salescadia throttles to each rep's remaining budget and skips the rest, returned with an explanatory reason.
  • Auto-pause on restriction. If LinkedIn restricts a rep's account, Salescadia immediately pauses all further sends for that account — across Clay, the sequencer, and manual sends — and returns account_restricted until they reconnect.
  • Do-not-contact. Anyone on your organization's do-not-contact list is suppressed before a send happens.

7Troubleshooting

Every non-success response includes a reason you can branch on in Clay:
  • not_authenticated — the API key is missing or wrong. Send Authorization: Bearer mm_live_....
  • not_authorized — the key lacks the write scope needed for invites and messages. Add it in Settings → API keys.
  • no_sendersender_email did not match a rep whose LinkedIn is connected. Check the address and that the rep has connected.
  • bad_url — the value was not a linkedin.com/in/<slug> profile URL.
  • not_connected_yet — you tried to message someone who has not accepted an invite. Send or wait on an invite first.
  • account_restricted — LinkedIn paused the sender's account; sends are held until they reconnect.
  • suppressed — the person is on your do-not-contact list.