Lead response: webhook, cURL, field mapping, CSV and the activity log

Connect a lead source, post leads to its webhook URL, map your own field names, import a CSV, and read the activity log when something does not arrive.

Updated 5 October 2026

A new lead is someone who just asked to hear from you: a form on your site, an ad, a CRM entry. Lead response gives you a webhook URL per source; every lead posted to it gets a call from your AI caller inside the calling window, usually within seconds.

Connect a source

  1. Open Lead response and choose Connect a source.
  2. Give it a Source name (for example “Website demo form”) and pick the Caller who should ring these leads.
  3. Choose How leads arrive: “Webhook (form, ad platform or CRM)” or “CSV upload”.
  4. Set Call from / Call until (defaults 09:00–18:00) and the Timezone (default Asia/Kolkata). This window is combined with the caller's own calling policy: the later start and the earlier end win.
  5. Write the Consent purpose (“Respond to requested product demo”) and the Consent evidence rule (how people from this source agreed to a call). Leads are accepted only for that stated purpose.
  6. Click Create source. The secret is shown once; copy it before you leave the page. Rotate secret issues a new one and stops the old one immediately.

Post a lead to the webhook

The URL is https://<your-app>/api/leads/ingest/<sourceId>. Send a JSON body with Content-Type: application/json and the secret in an Authorization: Bearer <secret> header (X-Lead-Secret: <secret> also works). phone is the only required field.

cURL
curl -X POST https://<your-app>/api/leads/ingest/<sourceId> \
  -H 'Authorization: Bearer <secret>' \
  -H 'Content-Type: application/json' \
  -d '{"phone":"9876543210","name":"Asha Rao","budget":"50L"}'
  • Recognised automatically: name (also full_name, fullName, lead_name, first_name), phone (also phone_number, mobile, mobile_number), email, language (a code such as en-IN or te-IN), note (the reason for the call, up to 500 characters) and source.
  • Phone numbers: a 10-digit Indian mobile, with or without 0 or 91 in front, becomes +91…. Any other country works with a leading +. Landlines and anything else are rejected with invalid_lead_phone.
  • Every other top-level field becomes a lead variable your caller can use, up to 20 of them, 200 characters each. Budget (INR) becomes {{budget_inr}}.
  • Limits: the body must be under 8 KB; 60 posts per minute per IP and 120 per minute per source. Over the limit you get 429 with a Retry-After header.

A successful post answers 201 with status: "queued" and the scheduled call id. A lead we deliberately did not call answers 200 with status: "suppressed" and a reason: do_not_contact, duplicate_lead, outside_calling_hours, archived, consent_revoked or policy_unavailable. Bad requests answer 400, a wrong secret 401, a paused source 409, the wrong content type 415.

Field mapping

Only needed when your form or CRM uses its own field names. Under Field mapping, type your field name (for example “Contact No”) and choose what it maps to: Name, Phone, Email, Language or Note. Up to 20 rows, one target per field, and if you map anything you must map Phone. Save mapping applies it to webhook posts and CSV headers alike. The Example request body block updates to show your names.

Import a CSV

Under Import a CSV, upload up to 200 rows (512 KB). Download a template gives you the columns name,phone,email,language,note; extra columns become variables. Tick “I confirm the people in this file agreed to be called…” and click Import and call. The result tells you how many were queued, how many were skipped and why (do-not-call list, called recently, outside calling hours), and which rows need fixing.

Webhook activity

The bottom of each source card lists the last posts and CSV rows it received, newest first, kept for 30 days. Each line shows the outcome, a plain-words reason, the last four digits of the phone and the field names you sent (never the values).

  • Accepted: a call was queued.
  • Deduplicated: the same submission was posted again.
  • Suppressed: a valid lead we did not call, with the reason (on the do-not-call list, called recently, outside calling hours, no calling policy).
  • Rejected: a request we could not use: not application/json, body over 8 KB, phone number looks wrong, missing or malformed fields, source is paused, too many submissions.

If a lead never shows up here, the request never reached us: check the URL, the secret and that your tool really sent a POST. See Connecting Google Sheets, Zapier and Make for ready-made recipes.

Common questions

How fast is the call placed?
The call is scheduled for now plus the caller's Call delay (0 seconds by default) when the lead arrives inside the calling window, and goes out as soon as a line is free. Outside the window it waits according to the Leads outside calling hours setting.
Can I send a test lead without a form?
Yes. Use the Copy cURL button on the source card, or the Test source button, which creates a real queued lead and may place a paid call.
What stops the same person being called twice?
The Duplicate lead window in the calling policy (10 minutes by default) skips the same number for the same caller, and the Idempotency-Key header de-duplicates repeated posts for 24 hours.

More in Leads and call lists

Ready to put it to work?

Create an AI caller, try it in your browser, and let it ring your first lead today.

50 free creditsNo card neededLive in minutes