---
title: "HeyReach API: pricing, rate limits & MCP | ONEGTMLAB"
description: "HeyReach API: Cloud LinkedIn outreach sequencer built for many sender accounts: per-sender pricing, unified inbox, a full REST API including campaign…"
canonical: https://www.onegtmlab.dev/tool-directory/linkedin-outreach/heyreach
---

# HeyReach API: pricing, rate limits & MCP | ONEGTMLAB

[](/)

[

Book a call

](/book)

![](/_astro/heyreach.CErc6v03_Z8B3F7.webp)

API review

# HeyReach API review

Cloud LinkedIn outreach sequencer built for many sender accounts: per-sender pricing, unified inbox, a full REST API including campaign build and launch, webhooks, and an official hosted MCP. API and MCP are on every plan. Best for multi-sender LinkedIn campaigns with automatic sender rotation and hard per-account limits.

Verified 25 Oct 2026 · 88 endpoints listed · Official MCP server

[

See pricing

](#pricing)[

HeyReach API docs

](https://docs.heyreach.io/llms.txt)

At a glance

Category

Sending

Pricing model

Per seat

Free tier

Growth: 14-day free trial, no card, with 3 LinkedIn accounts

Entry price

$48/mo, billed annually Growth, 10-50 senders (volume rate)

Auth

API key

Official MCP

Yes

Best for

Multi-sender LinkedIn campaigns with automatic sender rotation and hard per-account limits

[heyreach.io ↗](https://www.heyreach.io)[Pricing page ↗](https://www.heyreach.io/pricing)

## What a call costs

The actions you pay for, as HeyReach prices them.

Action

Cost

Per

Multi-brand white-label (Unlimited)

$500

per add-on brand

## Pricing, plan by plan

US dollars, as HeyReach's pricing page shows them on 25 Oct 2026. Monthly and annual billing are shown apart.

Free tier Growth: 14-day free trial, no card, with 3 LinkedIn accounts; Agency and Unlimited: 30-day free trial on request (pricing FAQ). Early stage program: heavily discounted plan if under $250,000 ARR, fewer than 5 people and not yet a customer (price not published).

### Growth

$79/mo

billed monthly

$64/mo

billed annually

per sender per month (1-9 senders); quarterly $72/seat/mo ($214 billed quarterly), yearly $64/seat/mo ($759 billed yearly); Growth is capped at 50 senders; 100 enrichment credits per sender (a one-time allocation, top-ups available); unlimited campaigns; API, webhooks and MCP included

API includedPlan details

add senders

### Growth, 10-50 senders (volume rate)

$59/mo

billed monthly

$48/mo

billed annually

per sender per month once 10 or more senders are selected (page calculator: rate2 $59, tierBreak 10, max 50); yearly price = ceil($59 x 0.8) as computed by the page; quarterly ceil($59 x 0.9) = $54

API includedPlan details

add senders

### Agency (25 senders)

$999/mo

billed monthly

$800/mo

billed annually

25 senders; quarterly $900/mo ($2,698 billed quarterly), yearly $800/mo ($9,591 billed yearly); 1,000 enrichment credits (one-time); white-label included; bring your own proxies; API, webhooks and MCP included

API included

### Agency (50 senders)

$1,399/mo

billed monthly

$1,120/mo

billed annually

50 senders; 1,000 enrichment credits (one-time); white-label; bring your own proxies. $1,399/mo from the page JSON-LD offer; quarterly ceil($1,399 x 0.9) = $1,260/mo and yearly ceil($1,399 x 0.8) = $1,120/mo as computed by the page script

API included

### Unlimited

$2,999/mo

billed monthly

$2,399/mo

billed annually

unlimited senders under a fair-use cap of 300 senders; quarterly $2,699/mo ($8,097 billed quarterly), yearly $2,399/mo ($28,790 billed yearly); 3,000 enrichment credits (one-time); multi-brand white-label add-on $500 each

API included

### Done for you

Custom quote

managed service, custom pricing

## Rate limits

300 requests per minute, all workspace-API requests share one limit; 429 when exceeded.

More on limitsLess

The Organization API has its own separate 300/min limit.

## How to get an API key

HeyReach uses API key. The steps below follow HeyReach's own docs.

1.  Create a HeyReach account. API access starts on the Growth, 10-50 senders (volume rate) plan.
2.  Workspace API key from HeyReach settings (keys never expire, can be deleted or deactivated). Organization API (workspaces, users, keys) needs a separate Organization API key from Organization settings, admins only.
3.  Send it with every request: header (X-API-KEY).
4.  Make a first call: CheckApiKey, Check If your API key is working. Keep the key in an environment variable, never in the command.
    
    ```
    curl -X GET "https://api.heyreach.io/api/public/auth/CheckApiKey" \
      -H "X-API-KEY: $HEYREACH_API_KEY"
    ```
    

## Where the docs live

What

Where

Documentation

[docs.heyreach.io/hey-reach-api](https://docs.heyreach.io/hey-reach-api)

API reference

[docs.heyreach.io/llms.txt](https://docs.heyreach.io/llms.txt)

OpenAPI spec

[docs.heyreach.io/openapi.json](https://docs.heyreach.io/openapi.json)

llms.txt

[docs.heyreach.io/llms.txt](https://docs.heyreach.io/llms.txt)

Base URL

`https://api.heyreach.io/api/public`

MCP server

`https://mcp.heyreach.io/mcp`

SDKs

heyreach CLI

## Strengths and limits

### Where it fits

-   Multi-sender LinkedIn campaigns with automatic sender rotation and hard per-account limits
-   Programmatic campaign build: list -> leads -> campaign/Create -> UpdateSequence -> StartCampaign
-   Reply capture via webhooks into a CRM or Supabase
-   LinkedIn + email multichannel through native Instantly / Smartlead / EmailBison steps

### Where it falls short

-   Email sending itself (it hands leads to Instantly, Smartlead or EmailBison)
-   Clients who have churned off it
-   Restructuring a running campaign's sequence: the structure is frozen once started

### Worth knowing

-   The published OpenAPI servers entry is broken (''), and its paths start with '//api/public'. The real base is `https://api.heyreach.io/api/public`.
-   Workspace keys and Organization keys are different. Workspace-management endpoints reject the normal key. Each has its own 300/min limit.
-   Connecting LinkedIn accounts by API (Connect / ConnectWithCookies) requires the separate 'Account Login API' feature.
-   Lead adds are capped at 100 per request; use the V2 endpoints, which return added/updated/failed counts.
-   GetConversationsV2 hits a deep-paging limit on large inboxes; V3 is cursor-based.

13 moreShow fewer

-   Terms s.2.4(a)-(b) bar renting, providing access to or sublicensing the Services to a third party and incorporating them into any product or service provided to a third party; s.2.5 lets HeyReach monitor and limit API calls if it believes usage breaches the agreement or harms the service.
-   Our experience: variables are SINGLE braces {FIRST\_NAME}; {{double}} ships the literal braces to the prospect. Always set fallbackMessage.
-   Our experience: campaign/Create needs linkedInUserListId (not listId); the sequence is a nested node tree, not a steps array; every node after an action needs actionDelay >= 3 HOUR or UpdateSequence returns 400/500.
-   Our experience: AddLeadsToListV2 can return addedLeadsCount:0, failedLeadsCount:0 and add nothing (2 of 519 silently dropped). Always reconcile the list count and URL-decode /in/<slug> before diffing.
-   Our experience: custom-field shapes differ. List write is customUserFields \[{name,value}\], campaign write is \[{fieldName,fieldValue}\], read-back is top-level customFields \[{name,value}\].
-   Our experience: the sequence structure is frozen once a campaign has ever started; only payload text can be edited while PAUSED.
-   Our experience: the sender check endpoint is /li\_account/GetAll (/linkedinaccount/GetAll 404s); verify authIsValid and isValidNavigator before InMail steps. A campaign silently goes FAILED when all senders disconnect.
-   Our experience: webhook recent\_messages is an oldest-first rolling window that can carry several new messages and repeats old ones with slightly different creation\_time. Dedupe on content + direction within ~90 s; is\_reply is the authoritative direction.
-   Docs now list POST /campaign/StartCampaign. Our 2026-08-04 note said there was no REST start (we launched via the heyreach CLI), so this endpoint is newer than that note.
-   GET /auth/CheckApiKey returns 200 with an EMPTY body (content-length 0); the status code is the only signal. Responses carry no X-RateLimit-\* headers, so the 300/min budget must be tracked client-side.
-   Docs pages and the OpenAPI spec are generated and mark nearly every body field 'required' (e.g. keyword on li\_account/GetAll); our GetAll calls with keyword '' worked. Treat the required flags as unreliable.
-   Enrichment credits are a ONE-TIME allocation per subscription (100 per Growth sender, 1,000 Agency, 3,000 Unlimited), not a monthly refill; top-ups are sold separately.
-   campaign/GetAll items: the live response carries excludeInOtherCampaigns, excludeHasOtherAccConversations, excludeContactedFromSenderInOtherCampaign, excludeFromLeadBlacklist, excludeFromCompanyBlacklist, organizationUnitId and startedAt, while the docs' item type still lists excludeAlreadyMessagedGlobal / excludeFirstConnection\* / excludeNoProfilePicture. Code against the live field names.

### Our take

We run LinkedIn campaigns on HeyReach for several clients and build them through the API in a fixed order: create the list, add the leads, create the campaign, then set the sequence. What we learned: variables use single braces such as {FIRST\_NAME} and double braces ship literal braces to the prospect, every step after an action needs a delay of at least 3 hours, and the add-leads call can accept a request while adding nobody, so we reconcile the list count and send one test message to a team profile before every launch. Reply webhooks carry a rolling window of recent messages, so the same message arrives more than once and has to be deduplicated.

## Who should use it

Use HeyReach for

Multi-sender LinkedIn campaigns with automatic sender rotation and hard per-account limits

Look elsewhere for

Email sending itself (it hands leads to Instantly, Smartlead or EmailBison)

## If HeyReach is not the answer

Other LinkedIn outreach tools in this directory, each with its own review.

[

![](/_astro/emailbison.fVnRcAh4_Z1AVftg.webp)

EmailBison

Email sending

From $599/mo

Best for agencies and teams sending hundreds of thousands of emails a month that want dedicated IPs and no per-seat or per-lead….

EmailBison API review →](/tool-directory/sending/emailbison)[

![](/_astro/instantly.w1WoNFJP.svg)

Instantly

Email sending

From $9/moOfficial MCP

Best for cheapest entry to API-driven cold email: API v2 is on every paid Outreach plan from Growth, and in our test it also….

Instantly API review →](/tool-directory/sending/instantly-ai)[

![](/_astro/smartlead.DCswj1gL_Z2nVbYs.webp)

Smartlead

Email sending

From $32/moOfficial MCP

Best for agencies running many client workspaces off one account.

Smartlead API review →](/tool-directory/sending/smartlead)

## Before you build

Four things to settle first, each read off HeyReach's own pages.

-   **Confirm the API is on your plan**API access starts on the Growth, 10-50 senders (volume rate) plan. Free tier: Growth: 14-day free trial, no card, with 3 LinkedIn accounts.
    
-   **Keep the key out of your code**API key. It is sent as: header (X-API-KEY).
    
-   **Design around the rate limit**300 requests per minute, all workspace-API requests share one limit; 429 when exceeded.
    
-   **Know the catch before you scale**The published OpenAPI servers entry is broken (''), and its paths start with '//api/public'. The real base is `https://api.heyreach.io/api/public`.
    

## Want us to build it for you?

Tell us what you want HeyReach to do in your stack. We will show you how we would wire it into your data, outbound or CRM, and what we would check first.

[

Book a call

](/book)[

See case studies

](/case-studies)

Read from [heyreach.io/pricing](https://www.heyreach.io/pricing), [docs.heyreach.io/llms.txt](https://docs.heyreach.io/llms.txt) and [docs.heyreach.io/hey-reach-api](https://docs.heyreach.io/hey-reach-api). Verified 25 Oct 2026.

All 88 endpointsFor developers: method, path, what it does and what it costs.

**Base URL:** `https://api.heyreach.io/api/public`

**Bulk and async:** Lead add 100 per request (V2 returns added/updated/failed counts); list/campaign lead reads up to 1000 per page.

**Webhooks:** One eventType per webhook, optionally filtered to campaignIds. Delivered payload event\_type arrives lowercase snake\_case. Must deactivate (isActive:false) before delete. Events: CONNECTION\_REQUEST\_SENT, CONNECTION\_REQUEST\_ACCEPTED, MESSAGE\_SENT, MESSAGE\_REPLY\_RECEIVED, INMAIL\_SENT, INMAIL\_REPLY\_RECEIVED, FOLLOW\_SENT, LIKED\_POST, VIEWED\_PROFILE, CAMPAIGN\_COMPLETED, LEAD\_TAG\_UPDATED, EVERY\_MESSAGE\_REPLY\_RECEIVED

Filter endpoints

88 endpoints

Method

Path

What it does

Cost

GET

`/auth/CheckApiKey`

CheckApiKey, Check If your API key is working.

Not stated

POST

`/li_account/GetAll`

GetAll, Get a paginated collection of all LinkedIn accounts. Get up to 100 accounts per request.

Not stated

GET

`/li_account/GetById`

GetById, Get a LinkedIn account by id

Not stated

DELETE

`/li_account/RemoveAccount/{accountId}`

RemoveAccount, Remove a LinkedIn account. With force=true the account is first removed from all active campaigns before deletion.

Not stated

POST

`/li_account/Connect`

Connect, Connect a LinkedIn account using username and password. Returns immediately; poll GetAccountStatus to track progress.

requires the 'Account Login API' feature

POST

`/li_account/ConnectWithCookies`

ConnectWithCookies, Connect a LinkedIn account using session cookies. Member id is auto-extracted by authenticating with the cookies.

requires the 'Account Login API' feature

GET

`/li_account/GetAccountStatus/{accountId}`

GetAccountStatus, Get the current connection status of a LinkedIn account. Cached for 10 seconds.

Not stated

POST

`/li_account/SubmitPin`

SubmitPin, Submit a PIN for an account awaiting PIN verification. 409 if the account is not awaiting a PIN.

Not stated

POST

`/li_account/Reconnect`

Reconnect, Reconnect an existing LinkedIn account using its stored credentials. Returns immediately; poll GetAccountStatus.

Not stated

POST

`/li_account/ReloginSalesNavigator`

ReloginSalesNavigator, Re-authenticate the Sales Navigator session. Account must be connected and have an active Sales Navigator subscription.

Not stated

POST

`/li_account/ReloginRecruiter`

ReloginRecruiter, Re-authenticate the Recruiter session. Account must be connected and have an active LinkedIn Recruiter subscription.

Not stated

POST

`/li_account/Resync`

Resync, Resync the profile of a LinkedIn account. Returns immediately; poll GetAccountStatus.

Not stated

GET

`/li_account/GetProxyCountries`

GetProxyCountries, Get all supported proxy country codes usable when connecting an account.

Not stated

GET

`/li_account/GetAccountProxy/{accountId}`

GetAccountProxy, Get the proxy assigned to a LinkedIn account. Returns only the country code for platform-managed proxies, or full connection details for custom proxies.

Not stated

POST

`/li_account/UpdateProxy`

UpdateProxy, Update the proxy assigned to a LinkedIn account. Provide either proxyCountryCode (platform-managed) or customProxy (your own).

Not stated

POST

`/li_account/UpdateInboxConfiguration`

UpdateInboxConfiguration, Update the inbox scrape configuration. Controls how far back inbox messages are synced when the account connects.

Not stated

GET

`/list/GetById`

GetById, Get a lead or company list by Id

Not stated

POST

`/list/GetAll`

GetAll, Get a paginated collection of all company and lead lists. Get up to 100 lists per request.

Not stated

POST

`/list/GetLeadsFromList`

GetLeadsFromList, Get a paginated collection of leads from a lead list. Get up to 1000 leads per request.

Not stated

DELETE

`/list/DeleteLeadsFromList`

DeleteLeadsFromList, Deletes the specified leads from a lead list.

Not stated

DELETE

`/list/DeleteLeadsFromListByProfileUrl`

DeleteLeadsFromListByProfileUrl, Deletes the specified leads from a lead list by LinkedIn profile url.

Not stated

POST

`/list/GetCompaniesFromList`

GetCompaniesFromList, Get a paginated collection of companies from a company list. Get up to 1000 companies per request.

Not stated

POST

`/list/AddLeadsToList`

AddLeadsToList, Add leads to a lead list. Add up to 100 leads per request.

Not stated

POST

`/list/AddLeadsToListV2`

AddLeadsToListV2, Add leads to a lead list. Add up to 100 leads per request.

Not stated

POST

`/list/GetListsForLead`

GetListsForLead, Retrieves the lists associated with a specific lead.

Not stated

POST

`/list/CreateEmptyList`

CreateEmptyList, Create an empty lead or company list. You pass the list name and the list type (USER\_LIST or COMPANY\_LIST).

Not stated

PATCH

`/list/UpdateLeadCustomFields/lists/{listId}/leads/custom-fields`

UpdateLeadCustomFields, Update (upsert) custom fields on a lead in a list. Keys are field names, values are field values.

Not stated

POST

`/lead/GetLead`

GetLead, Retrieves the details of a specific lead based on their LinkedIn profile URL.

Not stated

POST

`/lead/AddTags`

AddTags, Adds tags to the lead. Existing tags will not be changed.

Not stated

POST

`/lead/GetTags`

GetTags, Gets the tags for a lead.

Not stated

POST

`/lead/ReplaceTags`

ReplaceTags, Removes the existing tags and replaces them with the new tags.

Not stated

POST

`/lead_tags/CreateTags`

CreateTags, Create one or multiple tags for your workspace. You can assign these tags to leads.

Not stated

POST

`/campaign/GetAll`

GetAll, Get a paginated collection of all campaigns. Get up to 100 campaigns per request.

Not stated

GET

`/campaign/GetById`

GetById, Get a Campaign by id

Not stated

POST

`/campaign/Resume`

Resume, Resumes the specified campaign.

Not stated

POST

`/campaign/Pause`

Pause, Pauses the specified campaign.

Not stated

POST

`/campaign/AddLeadsToCampaign`

AddLeadsToCampaign, Add leads to a campaign. Add up to 100 leads per request.

Not stated

POST

`/campaign/AddLeadsToCampaignV2`

AddLeadsToCampaignV2, Add leads to a campaign. Add up to 100 leads per request.

Not stated

POST

`/campaign/StopLeadInCampaign`

StopLeadInCampaign, Stops the progression of a lead in a campaign.

Not stated

POST

`/campaign/GetLeadsFromCampaign`

GetLeadsFromCampaign, Gets the leads in a campaign (the "Lead Analytics" screen); shows only Pending leads about to start executing actions.

Not stated

[](/)

© 2026 ONEGTMLAB Private Limited. All rights reserved.

COMPANY

[

Why Us

](/#why-us)[

Process

](/#timeline)[

Blogs

](/blogs)[

About

](/about)[

Clients

](/clients)[

Free resources

](/free-resources)[

Newsletter

](/newsletter)

Services

[

GTM Engineering

](/ai-gtm-engineering)[

Account-Based Marketing

](/services/account-based-marketing)[

Paid Media

](/services/paid-media)[

Content Engineering

](/linkedin-personal-branding)[

RevOps

](/services/revops)[

SEO, AEO & GEO

](/services/seo-aeo-geo)[

All services

](/services)

![](/_astro/wordmark-3d.CMEfGdYr.svg)
