Skip to main content
This page takes you from an API key to a person in a running campaign, with curl. Every call here is in the API reference, with all its fields.

Set up

You need an API key. “API keys come with a paid plan (Software or Custom).” Only the workspace owner or an admin can make one. See API keys. Find your base URL in Settings › API & MCP, under REST API. Then set two variables in your terminal:
Every request sends the key in the X-API-Key header. A key works only in its own workspace, with the rights of the workspace owner. Keep it private.

Names in the API

The API uses a few older names. They mean the same as the words in the app:

1. Add a person

The answer is 201 with the person’s id in lead_id, and action set to created, or updated if they were already in your workspace. Nothing is sent to anyone. Add ?test=true to check a row without saving it. For up to 100 people at once, people without a LinkedIn URL, and every answer you can get, see Zapier, Make, n8n and your own code.

2. List people

The body is a list of people. The X-Total-Count header holds how many match in total. To get the next page, add limit to skip: skip=20, then skip=40. To find one person by their LinkedIn URL:

3. Add people to a campaign

Find the campaign’s id first:
Then check what adding people would do. This changes nothing:
would_add is how many would start. skipped lists who wouldn’t, with the reason. start says when the first ones would start. Now add them, up to 200 per call:
The real answer has a count for every reason a person can be skipped. Do not contact always applies. Send "force": true to add someone who is already running in another campaign. Adding people doesn’t send anything by itself. The campaign’s schedule, sender limits and approvals decide when each message goes. If the campaign is a draft or paused, nothing goes until it runs. You can start it with POST /workflows/{workflow_id}/activate, unless its approval setting is one only a signed-in person can start. To add a whole list, use POST /lead-lists/{list_id}/enroll with the campaign’s workflow_id.

4. Read the results

The campaign’s numbers:
totals counts people by where they are. kpis holds invites sent and accepted, messages, replies and their rates. Each person and what happened to them:
The answer has items and total. Each item says where the person is (where_label), what’s next (next_label), and whether they replied. One person, step by step, in plain words:
To get told the moment someone replies instead of asking, use Webhooks.

Pagination

limit is 50 when you leave it out.

Errors

Errors come back as JSON with a detail field. It is a sentence, or an object with a code and a message:
Some actions answer 403 to a key on purpose:
  • Approving a message answers 403 unless the workspace owner turned on Let AI tools approve and send messages in Settings › API & MCP. Skipping a message always works.
  • Starting a campaign answers 403 when its approval setting lets messages go without a person checking each one.
  • Moving a campaign from HeyReach, and some settings, need a person signed in to the app. See Developers overview.
  • A plan without outreach answers “Outreach automation is not enabled for this account.”

Rate limits

There’s no general limit on requests per key today. Some actions have their own: Past a limit you get 429. Your senders’ limits always apply to messages, however a person was added.

The API reference

The API reference in this tab lists every endpoint your key can use, grouped as in the app: Add people, People, Notes and tasks, Lists, Campaigns, Campaign people, Approvals, Inbox, Do not contact, Senders, Webhooks, Integrations, Reports, Watchlists and Search. Each page shows the fields, the answers, and a request you can try.

API keys

Make, replace and turn off your key.

Add people from your tools

Every intake option, with examples.

Webhooks

Get events as they happen.

Developers overview

Permissions, limits and errors.