Buying leads and calls
Every lead and call that passes our publisher rules is auctioned in real time to all buyer orders on that campaign. Each order sets what you buy (states, ZIPs, age, custom conditions, hours), how much (a bid, optional per-state bids, a daily cap and budget) and how you receive it.
- The highest bid wins. You pay your own bid, and leads are exclusive.
- An order sits out an auction when it's paused, outside its hours, filtered, at its daily cap or budget, short on balance, or you already bought that phone number in the last 30 days. The Bid log in the portal shows the reason for every auction.
- If the winner rejects the lead at post time, it goes to the next-highest bidder.
Delivery options
| Option | Bid | You receive the lead |
|---|---|---|
| Portal CRM | Your fixed bid (plus state bids) | In the portal CRM, plus your webhook if set. Live transfers are sent to your transfer number. |
| Post to my system | Your fixed bid | We POST the full lead to your URL. You accept or reject in the response. |
| Ping/post | Your server bids live per lead | We ping without personal data, you return a price, and the winner gets the full lead posted. |
Ping/post protocol
1. Ping. We POST JSON to your ping URL with no personal data (no name, phone, email, address or exact DOB). Respond within the campaign's timeout (usually 1.5 seconds) or your order sits out that auction.
POST https://your-server/ping
X-Your-Auth: •••••• (the auth header you configured)
{
"auction_id": "4b1f…",
"kind": "lead",
"campaign": { "id": 2, "name": "ACA Health – Real-Time", "vertical": "Health" },
"lead": { "state": "TX", "zip": "75201", "age": 41, "household_size": 3 }
}
Respond with a bid in dollars, or decline:
{ "bid": 32.50, "bid_id": "your-ref-123" }
{ "accepted": false, "reason": "Out of footprint" }
2. Post. If you win, we POST the full lead to your post URL with your bid_id and the price.
{
"auction_id": "4b1f…", "bid_id": "your-ref-123", "lead_id": "9c2e…", "price": "32.50",
"campaign": { "id": 2, "name": "ACA Health – Real-Time", "vertical": "Health" },
"lead": { "first_name": "Ana", "last_name": "Diaz", "phone": "2145550199", "state": "TX", "zip": "75201",
"dob": "1985-04-12", "trustedform_cert_url": "https://cert.trustedform.com/…" }
}
Accept with any of {"accepted": true}, {"success": true} or {"status": "accepted"}. Anything else (including errors and timeouts after 8 seconds) is a rejection, and the lead moves to the next bidder. You're charged only for leads you accept.
Post-only
Same as step 2 above, without the ping or bid_id. Your order bids its fixed price.
Webhooks
Any order can also send each purchased lead to a webhook URL (Zapier, Make, your CRM):
{ "event": "lead_purchased", "lead_id": "9c2e…", "price": "32.50", "order_id": 14, "campaign": { … }, "lead": { … } }Buyer API
Create a key under API & integrations and send it in the X-API-Key header. Base URL is this site followed by /buyer-api/v1.
| Endpoint | Use |
|---|---|
| GET /leads?since=…&stage=…&q=… | Pull purchased leads (full data) for your CRM; page with limit/offset |
| GET /leads/{id} | One lead with its activity history |
| PATCH /leads/{id} | Update stage (new, contacted, qualified, appointment, won, lost), follow_up_at, deal_value, or add a note |
| POST /leads/{id}/return | Request a return with a reason, within the campaign's return window |
| GET /calls | Transfers you won, with duration and charge |
| GET /orders · POST /orders · PUT /orders/{id} | Manage orders |
| PATCH /orders/{id} | Change bid, status or daily_cap instantly, for automated bid management |
| GET /bids | Auction-by-auction results and reasons |
| GET /reports?group_by=day|order|state|campaign | Spend, leads, returns, won, calls and auction win rate |
| GET /billing | Balance transactions |
curl -X PATCH https://YOUR-BUYER-DOMAIN/buyer-api/v1/orders/14 \
-H "X-API-Key: emp_buy_…" -H "Content-Type: application/json" -d '{"bid": 38}'Returns & billing
Accounts are prepaid. Leads are charged when you win them and calls when they pass the billable duration. Pending live transfers hold their price against your available balance. When your available balance runs out, your orders stop bidding until funds are added.
Request a return from the lead in the CRM (or the API) within the campaign's return window. Approved returns are credited to your balance.