1
Create an API key
Settings → API & webhooks → API keys. Give it the smallest role that works —
member for most recipes. Copy it now; it is shown once.2
Store it as a connection
In Zapier use a Webhooks by Zapier action with a header; in Make an HTTP module; in n8n a Header Auth credential; in Clay an HTTP API column. Never paste the key into a step your whole team can read.
3
Add an idempotency key to every write
All four tools retry on timeouts. Send
Idempotency-Key with a value from your own data — a row id plus the step name works well — and a retry can never act twice.1. New interested reply → Slack or your CRM
The one everyone builds first.- Trigger: a webhook subscribed to
message.classified. - Filter:
data.intentisinterested. - Lookup:
GET /v1/leads/{data.lead_id}for the name, company and LinkedIn URL. - Action: post to Slack, or create the contact or deal in your CRM.
x-signature before trusting the payload — every tool can do an HMAC-SHA256 check — and use x-delivery-id to drop duplicates.
2. New row in a sheet → create the lead → enrol
- Trigger: new row in Google Sheets, Airtable or a Clay table.
- Step 1:
POST /v1/leadswith the LinkedIn URL or email. Existing people are updated, not duplicated, and fields you leave out are never blanked. - Step 2:
POST /v1/enrollments/previewwith the sequence and the new lead’s id. - Step 3: if
eligible_idsis not empty,POST /v1/enrollmentswith"confirm": true.
3. Found an email elsewhere → fill it on the lead
- Trigger: your enrichment tool finds a work email (Clay’s waterfall, for example).
- Action:
PATCH /v1/leads/{id}withemail_work.
unchanged_fields so your flow can tell the difference.
4. Meeting booked → CRM deal
- Trigger: a webhook subscribed to
meeting.booked. - Payload:
lead_id,sender_id,provider,starts_at,booking_id. - Action: create the deal, and optionally
GET /v1/leads/{id}/timelinefor the whole conversation history to attach to it.
Tool notes
Longer step-by-step versions of each recipe, with the exact JSON bodies, ship with the API reference.