HeyReach runs LinkedIn sequences: connection requests, messages and follow-ups, throttled to stay inside what LinkedIn tolerates. Your agent builds the list and loads it into a campaign you already created. Replies come back where you can read them.
HeyReach is the LinkedIn half of activation. Pair it with an email sequencer to work both channels at once.
A skill is a whole pipeline your agent already knows. These ones call HeyReach as part of the run.
use whenyou have the list and now you need a cadence built, loaded and ready, with nothing going out until you say so
use whenyou have a list to approach on LinkedIn through HeyReach and you do not want the sender's account restricted because of it
use whencampaigns are running or finished across one or more sequencers and nobody has looked at which ones earn replies and which only use up the list
use whena campaign is running and replies are arriving faster than anyone reads them
Every tool ships with a written playbook, and the agent loads it before the first call. Auth, rate limits, what each call costs, which actions need your approval, and the mistakes worth avoiding. It is the difference between an agent that knows the tool and one that guesses at it.
Read the HeyReach docs →HOW in lib/heyreach.py. Paths CONFIRMED (Postman docs + community audit, 2026-06-01) — PascalCase actions under /api/public, X-API-KEY. No public OpenAPI (/swagger redirect-loops). Methods: check_api_key, get_all_campaigns, get_campaign, pause_campaign, resume_campaign, add_leads_to_campaign, get_lead, get_conversations, get_overall_stats, get_all_lists, create_empty_list, get_my_network (+ add_leads_to_list V2 analog — verify on pilot). No create-via-API / delete / send-message endpoints exist. Index: reference/docs/heyreach/raw/endpoints.md.
https://api.heyreach.io/api/public · Auth: header X-API-KEY (env HEYREACH_API_KEY; never hardcode). check_api_key() = safe read-only pilot.get_all_campaigns/get_all_lists), then add leads.add_leads_to_campaign drives real LinkedIn outreach — approval-gate (pilot a few, confirm, then batch). Confirm stats after writes.Campaigns: get_all_campaigns, get_campaign, add_leads_to_campaign, pause_campaign, resume_campaign. Lists: get_all_lists, create_empty_list, add_leads_to_list. Inbox: get_conversations. Else → generic request().
LinkedIn activation layer: sourced/enriched LinkedIn profiles → add to a list or campaign → outreach. Pairs with email sequencers (Instantly/Smartlead) for multichannel.
Field-shape note: these are vendor-native operational notes. The client returns the raw vendor JSON and uses the method names in this file — read field shapes accordingly (no normalized-wrapper /
result.data.prefix).
campaign_id. Always list_campaigns and resolve the exact target before inserts.linkedin_url (+ optional first_name/last_name/email).lib/heyreach.pyImport: from lib.heyreach import HeyReach → instantiate HeyReach() (reads key from env). Base: https://api.heyreach.io/api/public. Generic passthrough: request(method, path, *, params, json).
add_leads_to_campaign(campaign_id: int, leads: list[dict], **opts) -> Any — POST /campaign/AddLeadsToCampaignV2 — enroll LinkedIn leads into a (pre-created) campaign.add_leads_to_list(list_id: int, leads: list[dict]) -> Anycheck_api_key() -> Any — GET /auth/CheckApiKey — validate the key (safe read-only pilot).create_empty_list(name: str, **opts) -> Anyget_all_campaigns(offset: int = 0, limit: int = 100, **filters) -> Any — POST /campaign/GetAll — list campaigns (paged via offset/limit).get_all_lists(offset: int = 0, limit: int = 100, **filters) -> Anyget_campaign(campaign_id: int) -> Anyget_conversations(**filters) -> Any — POST /inbox/GetConversationsV2 — LinkedIn inbox conversations.get_lead(payload: dict) -> Any — POST /lead/GetLead — fetch a lead (by linkedin url / id).get_my_network(sender_id: int, **opts) -> Any — POST /MyNetwork/GetMyNetworkForSender — a sender's LinkedIn network.get_overall_stats(**filters) -> Any — POST /stats/GetOverallStats — account/campaign aggregate stats.pause_campaign(campaign_id: int) -> Anyresume_campaign(campaign_id: int) -> Any