Events API — push
One endpoint, plain JSON, one HTTP POST per event. Whenever a lead is created, a checkout is abandoned, a payment fails or a sale completes on your side, send us one POST — it becomes a callable lead in our dial queue within seconds.
Endpoint & authentication
Content-Type: application/json
We hand you a delivery URL with your partner slug ({source}), connection id
and a secret token baked into the path — unguessable and unique to you. No keys to manage,
no signing code required.
- Treat the full URL as a credential. If it ever leaks, tell us — we mint a new URL and the old one stops working immediately.
- Optional HMAC signing: if your platform can HMAC-sign request bodies (SHA-256), we'll verify signatures too — say the word during onboarding and we agree a header name and secret.
- Per-merchant connections: one shared URL, or one URL per merchant/store/brand for per-merchant attribution — your choice.
Event types
Every POST declares what it is via event_type. Send the same
lead_id across events for one person — that's how a later sale
flips the earlier lead to completed instead of creating a duplicate.
| event_type | When to send it | What we do |
|---|---|---|
new_lead |
A fresh prospect / opt-in / new contact. | Goes straight to our dial queue. |
abandoned_checkout |
Someone started a checkout and didn't finish. Include amount (cart
value) if you have it. |
Recovery dial queue. |
payment_failed |
A declined or failed payment — initial charge or subscription rebill. Include
amount so the agent knows what's on the line. |
Dial queue for a recovery call. |
sale |
A completed purchase or subscription payment. Send amount. |
Marks the lead completed & records revenue. Works standalone too, if we never saw the lead before. |
Payload
One POST per event. Extra fields are welcome — anything we don't recognize rides along and is kept on the lead; nothing is rejected for having more data.
{
"event_type": "payment_failed",
"lead_id": "your-unique-lead-id",
"first_name": "John",
"last_name": "Doe",
"phone": "+15551234567",
"email": "john@example.com",
"state": "FL",
"zip": "33101",
"store": "brand-a",
"product": "supplement-x",
"amount": 129.00,
"currency": "USD"
}
Field reference
| Field | Required? | Notes |
|---|---|---|
lead_id |
Required | Your unique lead / customer / order id. Stable per person — we de-dupe and link events on it. Subscription, transaction and order ids work as fallbacks. |
phone |
Required | E.164 (+1…) or 10-digit US. Leads without a dialable number are
skipped by design — these campaigns exist to call. |
event_type |
Recommended | new_lead / abandoned_checkout /
payment_failed / sale. Defaults to
new_lead when missing. |
first_name / last_name |
Recommended | A single full-name field works too. |
email |
Recommended | |
amount + currency |
Recommended | Major units (dollars). On sale events this is the recorded
revenue. |
address1 / city / state / zip / country |
Optional | Country defaults to US; full names ("United States") and ISO codes both work. |
store |
Optional | Which of your stores/brands the event came from. |
product |
Optional | Product label — shown to the agent on the lead. |
| anything else | Optional | Extra fields ride along and are kept. |
Responses, retries & idempotency
| Status | Meaning |
|---|---|
200 | {"received": true} — accepted, well under a second. |
400 | Missing lead_id or invalid JSON. |
401 | Wrong URL / secret. |
5xx | Transient problem on our side — retry. |
- Retries are always safe. We de-duplicate on
lead_id, so resends never create duplicates. Any retry policy works; exponential backoff is plenty. - Ordering doesn't matter. A
salearriving before itsabandoned_checkoutstill resolves to one completed lead.
Going live — the checklist
- We send you the delivery URL (id + secret) — one shared, or one per store/brand.
- You wire the push from your webhook triggers: one POST per event, JSON body as above.
- Fire one test event of each type — we confirm each landed end-to-end.
Then we're live: every event you send becomes a callable lead in our dial queue within seconds. First success criterion — one test lead lands with a working phone number.