LeadCentre Webhook Reference
Every LeadCentre account has a webhook that accepts leads from any system able to send an HTTP POST. This is the technical reference: what to send, how it's read, the limits and what comes back. It's inbound only, as there's no public REST API.
Available: Works directly from LeadCentre today.
What This Does
A post to your webhook URL creates a lead. You decide the field names, and an Admin on the account matches them to LeadCentre fields once, per key. There's no schema to follow beyond the formats below.
It doesn't read, update or delete leads, and it doesn't send anything back out. There are no outbound webhooks and no signed requests.
URL and keys
https://hooks.leadcentre.com/in/YOUR-ACCOUNT-ID?key=YOUR-KEY
- Each account has a key called Default and can add more under Settings > Connections. Each key has its own secret, field matching and test state.
- Send the secret as ?key= in the URL, or in an x-api-key header. If both are present, the URL wins. Use the header where you can, because URLs end up in logs.
- A secret is shown once, when it's created or replaced. LeadCentre keeps only a hash, so it can't be recovered.
- Replace this URL issues a new secret, and the old one stops at once. Field matching is kept. Revoke removes a key, and it isn't offered for Default.
- Only POST is accepted. Each client account on an agency platform has its own URL and keys.
Accepted bodies
- A JSON object: one lead.
- A JSON array of objects: one lead per object, up to 25 per post. Anything past 25 is ignored without an error, and non-object items are skipped, so check the length of results.
- A form post (URL-encoded): one lead.
The format is worked out from the body, so a wrong Content-Type header won't stop a JSON or URL-encoded post. multipart/form-data isn't read. It's refused with a 415 and isn't logged, so it won't show on the matching screen. Files aren't accepted in any format.
Limits
- 64 KB per post.
- 120 a minute per key. Each lead in an array counts separately, so five arrays of 25 reach the limit.
- 200 fields per lead and six levels of nesting. Anything further is dropped.
How fields are named
Nested JSON is flattened into dotted names, with array items numbered from 0:
{"contact": {"phone": "07700900123"}, "answers": [{"text": "Roof"}]}
contact.phone 07700900123
answers.0.text Roof
Values are trimmed and turned into text. Null and empty values are skipped, so they won't appear on the matching screen until a post has a value for them. Send a test with everything filled in.
Numbered names mean position. If your source sends answers as a list, answers.0.text means whatever comes first. If the order changes, values land in the wrong fields with no error, as the Google Ads guide explains. Prefer named fields where you control the payload.
Test mode
A post is test data if the URL includes test=1, or while the key is listening. Listen for test data lasts 15 minutes, or until Stop listening. Test data is logged, shows on the matching screen and never becomes a lead. That includes a real lead sent while the key is listening, as it isn't kept back for later. The response shows the result test, so your system can tell.
Held posts
A post sent before a key has any matching is held, and shows the result awaiting_mapping. Pressing Save field matching turns held posts into leads, with their original received time. A post that was matched but had no name, phone or email (the result no_contact) is retried the same way, so matching a renamed field recovers it. Each save handles up to 200, oldest first, so save again for a longer backlog. Received posts are deleted after 30 days, so anything still held by then is lost.
Duplicates
Match your own ID to Unique ID. A repeat returns the result duplicate and doesn't create a second lead. Unique IDs apply across your whole account, including other keys, so prefix them if two sources could use the same number. Without a Unique ID, every post makes a new lead.
Responses
A successful post returns one result per lead, in order:
{"ok": true, "results": ["lead", "duplicate"]}
| Status | Meaning |
|---|---|
| 200 | Received. Each result is lead, duplicate, no_contact, test or awaiting_mapping. Check them, because no_contact also returns 200. |
| 400 | Send JSON or a form post. The body was empty, broken JSON, plain text or an array with no objects. |
| 401 | Invalid webhook URL or key. It's missing, wrong, replaced or revoked, the account ID is malformed or the account is suspended. |
| 404 | Not found. The path isn't /in/YOUR-ACCOUNT-ID. |
| 413 | Body too large. Over 64 KB. |
| 415 | Multipart form data is not supported. Send JSON or a URL-encoded form (application/x-www-form-urlencoded). |
| 429 | Too many requests. Over the limit for this key, so wait and try again. |
| 500 | A lead couldn't be saved, and ok is false. Earlier items in the array may have been saved, so retry only with Unique ID matched. |
What happens to mapped values
- First name and last name combine into the full name when no full name is matched.
- Emails are lowercased and postcodes uppercased.
- A future or unreadable Date received is ignored, and the lead takes the time it arrived. Send ISO dates such as 2026-11-04T10:30:00Z, because a UK date such as 04/11/2026 can be read as 11 April.
- Lead source defaults to the key's name, so name keys after the source.
- If two fields are matched to the same LeadCentre field, the first with a value wins.
- A lead needs at least a name, phone or email.
Useful For
- Developers connecting a custom booking system, quote calculator or internal tool
- Lead suppliers who need to deliver leads into a client's LeadCentre account
- Call tracking services that can post call details to a webhook
- Technical marketers checking whether a tool's payload will work before committing to it
How Leads Flow Into LeadCentre
Step 1
Your system sends a POST
JSON or URL-encoded, to the key's URL, with the secret in the query or a header.
Step 2
LeadCentre checks and reads it
It checks the key, rate limit and size, then flattens the body into named fields.
Step 3
The key's matching is applied
Each field fills its matched LeadCentre field. A Unique ID stops repeats.
Step 4
The lead is created
A push notification goes out, and any Instant Reply you've set up is sent. Your system gets the result.
How to Set It Up
- 1
Create a key
You need the Admin role. Go to Settings > Connections. Under "Add another key", enter a name and press "Create". Press "Copy" straight away, as the URL is only shown once. The Default key has no URL to copy until you open it with "Test and match fields" and press "Get a URL to copy". On an agency-managed account, the agency can switch Connections off for a client's own people.
- 2
Listen, or use test=1
Open the key and press "Listen for test data", or add &test=1 to the URL for as long as you're testing. Test mode with test=1 is useful if live data is already flowing, as it affects only your own requests, while listening treats every post to that key as test data.
- 3
Send a complete sample
Post a payload with every field filled in, as null and empty values aren't shown. For example: curl -X POST "YOUR-URL&test=1" -H "Content-Type: application/json" -d '{"name":"Test Lead","email":"[email protected]","phone":"07700900123","id":"test-1"}'. The response should be {"ok":true,"results":["test"]}.
- 4
Match the fields
The fields appear under "2. Match the fields" with their latest values, and Smart Match suggests what it can. Choose a LeadCentre field for each, type a name to create a custom field, or leave it on Do not use, which also stops it being flagged again. Press "Save field matching".
- 5
Go live
Press "Stop listening", or remove test=1 from your URL. Send a real post and check the result is lead. Later, if your system starts sending new names, the key's card shows a notice about new fields to match.
Supported Fields
You choose the names. Smart Match recognises the common ones below, and others can be matched by hand. Custom fields can hold anything else.
| Field sent | Usually matched to |
|---|---|
| name, full_name | Full name |
| first_name, last_name | First name, Last name |
| phone, mobile, landline | Phone (mobile or landline), Mobile, Landline |
| company | Company |
| house_number, street, district | House number, Street, District |
| town or city, county, country, postcode | Town / city, County / State / Region, Country, Postcode |
| service | Enquiry type |
| best_time_to_call, preferred_contact | Best time to call, Preferred contact |
| message | Enquiry / Message |
| estimated_value | Estimated value |
| lead_source | Lead source |
| received_at | Date received |
| id | Unique ID (stops duplicates) |
Common Problems
My test data isn't showing
Check the response first. A 401 means a wrong or replaced key, a 400 means an unreadable body, and a 415 means you sent multipart. On a 200, make sure you have that key's page open, as each key has its own. Only the 25 most recent posts feed the matching screen, and empty values are skipped.
A lead is held and shows "Waiting for field matching"
That's the result awaiting_mapping. The key had no matching when it arrived. Press "Save field matching", and held posts become leads with their original received time. Do it within 30 days, as received posts are deleted after that.
I get a 200 but there's no lead
Read results. no_contact means none of your matched fields held a name, phone or email. test means the key was listening or the URL has test=1. duplicate means the Unique ID has been used before on this account.
I sent an array and some leads are missing
Only the first 25 objects in a post are read, with no error for the rest, so split larger batches into several posts. Each lead counts toward the limit of 120 a minute, so space them out.
I lost the webhook URL
A secret is shown once, and only a hash is stored. Open the key and press "Replace this URL", or "Get a URL to copy" if it has never been used. Update your system. Field matching is kept.
I need to rotate the key without losing leads
"Replace this URL" stops the old secret at once, so posts in the gap get a 401. For a clean switch, create a second key, match its fields, point your system at it, check it's working, then revoke the old key. Queue and retry on 401 from your side if you can't do that.
Questions About This Connection
Is there a REST API for reading or updating leads?
No. The webhook is inbound only. It creates leads and can't read, update or delete them. There are no outbound webhooks either.
Can I call it from a browser?
No. It sends no cross-origin headers, and any key in browser code is public. Post from a server instead.
Can I update a lead by sending the same Unique ID again?
No. A repeat is skipped and returns duplicate. The first version stays as it is.
Does LeadCentre verify a signature from the sender?
No. The secret in the URL or x-api-key header is the only check. Signature headers from other platforms are ignored, and you can match or ignore anything in the body. Treat the URL like a password.
Get Your Leads Flowing.
Set up your LeadCentre account, connect this source and see your next enquiry arrive on your phone.