HeyReach coverage
Every endpoint in HeyReach's public API reference and how outbound-sdk reaches it: a normalized read, a native read, excluded with a reason, or a write.
Inventoried on 2026-11-14 from HeyReach’s public API reference at https://docs.heyreach.io: the page index (llms.txt) and the machine-readable reference (openapi.json), checked against the Postman collection the docs link to (published 2026-09-16, 88 requests, every one of them also in the reference). The reference documents 106 endpoints, all on https://api.heyreach.io/api/public: 17 are used by normalized reads, 25 are in the native catalog (packages/outbound-sdk/src/heyreach/native.ts), 3 are excluded and 61 are writes.
The five /management/organizations reads belong to the Organization Management API. They need the organization API key in place of a workspace key and answer 401 without it. HeyReach documents no sister service on another host.
Two of the excluded rows return secrets. The third, a voice message’s audio file, returns a file and not JSON: the request engine reads every response as text, so a binary body cannot be returned intact. It becomes a native read once the engine can hand back bytes.
Two reads stay in the native catalog and are also used by a normalized read: lookup by profile or email (leads.lookup) asks POST /campaign/GetCampaignsForLead for the campaigns and, for an email address, POST /list/GetListsForLead for a list to find the profile in.
| Method | Path | Reads | Coverage | Through |
|---|---|---|---|---|
GET |
/auth/CheckApiKey |
Whether the API key works | native | checkApiKey |
POST |
/blacklist/AddCompanies |
Adds companies to the blacklist | write | |
POST |
/blacklist/AddLeads |
Adds leads to the blacklist | write | |
POST |
/blacklist/GetCompanies |
Blacklisted companies | normalized | blocklist |
POST |
/blacklist/GetLeads |
Blacklisted leads | normalized | blocklist |
POST |
/blacklist/RemoveCompanies |
Removes companies from the blacklist | write | |
POST |
/blacklist/RemoveLeads |
Removes leads from the blacklist | write | |
POST |
/campaign/AddLeadsToCampaign |
Adds leads to a campaign | write | |
POST |
/campaign/AddLeadsToCampaignV2 |
Adds leads to a campaign and reports the counts | write | |
POST |
/campaign/AddLinkedInAccountsToCampaign |
Adds senders to a campaign | write | |
POST |
/campaign/Create |
Creates a campaign | write | |
POST |
/campaign/CreateCampaignFromTemplate |
Creates a campaign from another campaign | write | |
POST |
/campaign/CreateV2 |
Creates a campaign with voice message versions | write | |
POST |
/campaign/GetAll |
Campaigns, filtered by status, sender or name | normalized | campaigns.list, campaigns.status |
GET |
/campaign/GetById |
One campaign with its progress counts and sender ids | normalized | campaigns.get, senders.byCampaign |
GET |
/campaign/GetCampaignSequence |
A campaign’s sequence tree | normalized | sequence |
GET |
/campaign/GetCampaignSequenceV2 |
A campaign’s sequence tree with voice message versions | native | campaignSequenceV2 |
POST |
/campaign/GetCampaignsForLead |
The campaigns one lead is in | native | campaignsForLead |
POST |
/campaign/GetLeadsFromCampaign |
A campaign’s leads with their status | normalized | leads.byCampaign, leads.since |
POST |
/campaign/Pause |
Pauses a campaign | write | |
POST |
/campaign/RemoveLinkedInAccountsFromCampaign |
Removes senders from a campaign | write | |
POST |
/campaign/Resume |
Resumes a campaign | write | |
POST |
/campaign/StartCampaign |
Starts a campaign | write | |
POST |
/campaign/StopLeadInCampaign |
Stops one lead in a campaign | write | |
POST |
/campaign/UpdateAccounts |
Replaces a campaign’s senders | write | |
PATCH |
/campaign/UpdateLeadCustomFields/campaigns/{campaignId}/leads/custom-fields |
Changes a campaign lead’s custom fields | write | |
POST |
/campaign/UpdateSchedule |
Changes a campaign’s schedule | write | |
POST |
/campaign/UpdateSequence |
Replaces a campaign’s sequence | write | |
POST |
/campaign/UpdateSequenceV2 |
Replaces a campaign’s sequence, voice versions included | write | |
POST |
/campaign/UpdateSettings |
Changes a campaign’s name, list and exclusions | write | |
POST |
/enrichment/enrich-email |
Starts an email-enrichment job for a lead | write | |
GET |
/enrichment/enrich-email/check-job/{jobId} |
The state and result of an email-enrichment job | native | enrichEmailJob |
GET |
/inbox/GetChatroom/{accountId}/{conversationId} |
One conversation with all its messages | normalized | messages.byThread |
POST |
/inbox/GetConversationsV2 |
Conversations with messages, paged by offset | native | conversationsV2 |
POST |
/inbox/GetConversationsV3 |
Conversations with messages, paged by cursor and bounded by date | normalized | messages.list, messages.since, replies.list, replies.since, leads.timeline |
GET |
/inbox/GetVoiceMessageAudio/{accountId}/{conversationId}/{messageId} |
A voice message’s audio file | excluded | Not one of the three accepted reasons: it returns an audio file, not JSON, and the request engine reads every body as text, so the bytes cannot be handed back intact; the transcript and duration are in the conversation reads. |
POST |
/inbox/SendMessage |
Sends a message in a conversation | write | |
POST |
/inbox/SetSeenStatus |
Marks a conversation seen or unseen | write | |
POST |
/lead/AddTags |
Adds tags to a lead | write | |
POST |
/lead/GetLead |
One lead’s profile, by profile URL | normalized | leads.get, leads.lookup |
POST |
/lead/GetTags |
One lead’s tags | normalized | leads.get |
POST |
/lead/ReplaceTags |
Replaces a lead’s tags | write | |
POST |
/lead_tags/CreateTags |
Creates workspace tags | write | |
POST |
/li_account/Connect |
Connects a LinkedIn account with credentials | write | |
POST |
/li_account/ConnectWithCookies |
Connects a LinkedIn account with cookies | write | |
GET |
/li_account/GetAccountProxy/{accountId} |
A LinkedIn account’s proxy | excluded | It returns secrets: the host, username and password of a custom proxy. |
GET |
/li_account/GetAccountStatus/{accountId} |
A LinkedIn account’s connection status | normalized | senders.health |
POST |
/li_account/GetAll |
LinkedIn accounts | normalized | senders.list, senders.byCampaign |
GET |
/li_account/GetById |
One LinkedIn account | normalized | senders.get |
GET |
/li_account/GetProxyCountries |
Supported proxy countries | native | proxyCountries |
POST |
/li_account/Reconnect |
Reconnects a LinkedIn account | write | |
POST |
/li_account/ReloginRecruiter |
Signs an account back in to Recruiter | write | |
POST |
/li_account/ReloginSalesNavigator |
Signs an account back in to Sales Navigator | write | |
DELETE |
/li_account/RemoveAccount/{accountId} |
Removes a LinkedIn account | write | |
POST |
/li_account/Resync |
Starts a resync of an account’s inbox | write | |
POST |
/li_account/SubmitPin |
Submits a LinkedIn verification PIN | write | |
POST |
/li_account/UpdateInboxConfiguration |
Changes how an account’s inbox is scraped | write | |
POST |
/li_account/UpdateProxy |
Changes an account’s proxy | write | |
POST |
/list/AddLeadsToList |
Adds leads to a list | write | |
POST |
/list/AddLeadsToListV2 |
Adds leads to a list and reports the counts | write | |
POST |
/list/CreateEmptyList |
Creates an empty list | write | |
DELETE |
/list/DeleteLeadsFromList |
Deletes leads from a list by member id | write | |
DELETE |
/list/DeleteLeadsFromListByProfileUrl |
Deletes leads from a list by profile URL | write | |
POST |
/list/GetAll |
Lead and company lists | normalized | lists.list |
GET |
/list/GetById |
One lead or company list | native | listById |
POST |
/list/GetCompaniesFromList |
The companies in a company list | native | companiesFromList |
POST |
/list/GetLeadsFromList |
The leads in a lead list | normalized | lists.leads, leads.since, leads.lookup |
POST |
/list/GetListsForLead |
The lists one lead is in | native | listsForLead |
PATCH |
/list/UpdateLeadCustomFields/lists/{listId}/leads/custom-fields |
Changes a list lead’s custom fields | write | |
GET |
/management/organizations/api-keys/workspaces/{workspaceId} |
A workspace’s API and integration keys | excluded | It returns secrets: every API and integration key of the workspace. |
POST |
/management/organizations/api-keys/workspaces/{workspaceId} |
Generates a new API key for a workspace | write | |
POST |
/management/organizations/linkedin-accounts |
LinkedIn accounts across every workspace | native | organizationLinkedInAccounts |
POST |
/management/organizations/linkedin-accounts/MoveToWorkspace |
Moves a LinkedIn account to another workspace | write | |
DELETE |
/management/organizations/linkedin-accounts/{linkedInAccountId} |
Deletes a LinkedIn account | write | |
POST |
/management/organizations/users |
Users of the organization, invited ones included | native | organizationUsers |
POST |
/management/organizations/users/invite/admins |
Invites admins | write | |
POST |
/management/organizations/users/invite/managers |
Invites managers to workspaces | write | |
POST |
/management/organizations/users/invite/members |
Invites members with permissions | write | |
POST |
/management/organizations/users/workspaces/{workspaceId} |
Users of one workspace with roles and permissions | native | workspaceUsers |
GET |
/management/organizations/users/{userId} |
One user with roles and permissions | native | organizationUser |
GET |
/management/organizations/workspaces |
Workspaces with seat limits and seats used | native | organizationWorkspaces |
POST |
/management/organizations/workspaces |
Creates a workspace | write | |
PATCH |
/management/organizations/workspaces/{workspaceId} |
Changes a workspace’s name or seat limit | write | |
POST |
/MyNetwork/GetMyNetworkForSender |
One sender’s LinkedIn connections | native | myNetworkForSender |
POST |
/MyNetwork/IsConnection |
Whether a lead is a connection of a sender | native | isConnection |
POST |
/stats/GetOverallStats |
Totals and daily counts for the workspace, a campaign or a sender | normalized | stats.workspace, stats.campaign, stats.byDay, stats.bySender |
POST |
/stats/GetOverallStatsByCampaign |
Totals and daily counts, one row per campaign | native | statsByCampaign |
POST |
/voice/BulkCommit |
Assigns voices to several senders at once | write | |
POST |
/voice/CreateCustomVoice |
Clones a voice from an uploaded sample | write | |
DELETE |
/voice/DeleteCustomVoice/{id} |
Deletes a cloned voice | write | |
GET |
/voice/GetElevenLabsConnection |
The workspace’s ElevenLabs connection status | native | elevenLabsConnection |
GET |
/voice/GetElevenLabsVoices |
Imported ElevenLabs voices | native | elevenLabsVoices |
GET |
/voice/GetSenderVoice/{accountId} |
The voice assigned to a sender | native | senderVoice |
GET |
/voice/GetStaticClip/{clipId} |
One uploaded voice clip, metadata and transcript | native | staticClip |
GET |
/voice/GetStaticClips |
Uploaded voice clips, metadata and transcripts | native | staticClips |
GET |
/voice/GetVoices |
Predefined and cloned voices | native | voices |
GET |
/voice/GetVoiceUsage/{id} |
The senders a voice is assigned to | native | voiceUsage |
POST |
/voice/RefreshElevenLabsLibrary |
Re-imports the ElevenLabs voice library | write | |
DELETE |
/voice/RemoveSenderVoice/{accountId} |
Removes a sender’s voice | write | |
PUT |
/voice/SetSenderVoice/{accountId} |
Assigns a voice to a sender | write | |
POST |
/voice/UploadStaticClip |
Uploads a voice clip | write | |
POST |
/webhooks/CreateWebhook |
Creates a webhook | write | |
DELETE |
/webhooks/DeleteWebhook |
Deletes a webhook | write | |
POST |
/webhooks/GetAllWebhooks |
Webhooks | normalized | webhooks.list |
GET |
/webhooks/GetWebhookById |
One webhook | native | webhookById |
PATCH |
/webhooks/UpdateWebhook |
Changes a webhook | write |