Skip to main content
Use this when a tool you already use finds people you want in B2B Signals: a form, a CRM, a spreadsheet, Zapier, Make, n8n or your own code. Each request adds one person, or up to 100, with the reason you picked them. Data moves one way: from your tool to B2B Signals. To get events back out, use Webhooks.

Before you start

  • An API key for your workspace. “API keys come with a paid plan (Software or Custom).” Only the owner or an admin can make one. See API keys.
  • Your address. Open Sources, then Integrations, and press Connect on the API row. Open Developer details and copy the Address.
Send people with the API drawer showing the address, the masked key and a sample body

The API drawer with Developer details open. Your own address appears where this picture shows $B2B_API_BASE, and your key is masked.

In the examples, $B2B_API_BASE is the address without /intake/people at the end, and $B2B_API_KEY is your key. See API keys for where to find the base URL.

Set it up in Zapier, Make or n8n

1

Add a web request step

In your tool, add a step that sends an HTTP request. Set the method to POST and the URL to your address.
2

Add two headers

X-API-Key with your key, and Content-Type with application/json.
3

Build the body

Map your tool’s fields to ours. See Fields you can send.
4

Test first

Add ?test=true to the URL and run the step once. The answer says what a real send would do, and nobody is added.
5

Go live

Remove ?test=true. From now on every run adds or updates a person.
Clay uses the same address with ?source=clay, which keeps its rows as tests until you turn Clay on. Other tools call the address without source, so their rows are saved at once. See Clay.

Fields you can send

Every request needs a person: a linkedin_url, or a name with a company_name or company_domain. A row with only a company is refused.

Add one person

A new person answers 201:
Send the same person again and action is updated. We match on the LinkedIn profile, so the same person is never added twice. A person on Do not contact is saved, but never contacted. Adding a person sends nothing to anyone.

Add a person without a LinkedIn URL

Send a full name with a company name or domain. We look up their LinkedIn profile.
These lookups have limits: A row with a LinkedIn URL never uses a lookup.

Test a row

Add ?test=true, or put "test": true in the body. Nothing is saved, and a test never runs a lookup by name.
A test that would be refused still answers 200, with would: "reject".

Add people and start them in a campaign

Add workflow_id to start the person in a campaign. To find the id, list your campaigns:
Each campaign has an id and a name. Then:
Starting someone in a campaign doesn’t send a message right away. The campaign’s schedule, sender limits and approvals still decide when anything goes. If the person can’t start, they are still saved. enrolled is false and enroll_status says why: force never overrides Do not contact, a missing name, or a recent send to another tool.

Add up to 100 people at once

The answer is 200, with one result per person, in the order you sent them, and a summary:
  • The top-level workflow_id applies to everyone who doesn’t name their own. A person’s own workflow_id wins.
  • The top-level force applies to everyone. A person’s own force: true also counts.
  • One bad row doesn’t fail the others. Check each result’s action, reason_code and error.
  • People are handled one after another, so a full request of 100 can take a while.

Errors

An error in one person’s row is answered like this:

Check that it works

GET /intake/status tells you when your key was last used and the last test row received:
In the app, the API row under Sources › Integrations shows Connected once people arrive, with how many came this week and when the last one did.

API quickstart

List people, add them to campaigns and read results.

Clay

Send rows from a Clay table.

API keys

Make and replace your key.

Webhooks

Get events back out.