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

OptionBidYou receive the lead
Portal CRMYour 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 systemYour fixed bidWe POST the full lead to your URL. You accept or reject in the response.
Ping/postYour server bids live per leadWe 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.

EndpointUse
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}/returnRequest a return with a reason, within the campaign's return window
GET /callsTransfers 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 /bidsAuction-by-auction results and reasons
GET /reports?group_by=day|order|state|campaignSpend, leads, returns, won, calls and auction win rate
GET /billingBalance 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.