LeadMove Docs
Delivery

Webhook deliveries

Posting leads to a buyer's API — URL, headers, the standard payload, custom body templates with merge codes, and what a failure looks like.

A webhook delivery method POSTs one JSON body per lead to the buyer's URL. You set the URL, optional headers, and — when the buyer has their own format — the exact body to send.

The URL must be https:// and publicly reachable. Requests always use POST, and redirects are not followed.

A webhook delivery method: the buyer's https URL, custom headers carrying their API key as JSON, and Custom body template switched on, listing every merge code available plus the codes still waiting to be mapped to a lead field.

Custom headers

Optional, entered as JSON, and merged into the request on top of Content-Type: application/json:

{
  "Authorization": "Bearer your-token"
}

The standard payload

With Custom body template off, the buyer receives this envelope. lead contains the delivery method's expected fields, already transformed:

{
  "leadId": "LD-00042",
  "internalLeadId": "…",
  "buyer": { "id": "…", "name": "Acme Leads" },
  "lead": { "email": "…", "phone": "…", "zip": "90001" },
  "timestamp": "2026-07-29T14:02:11.000Z"
}

Custom body template

Turn the switch on when the buyer documents its own contract. You then write the exact JSON to send, with {merge_code} placeholders — a buyer's sample body can usually be pasted verbatim and mapped field by field.

Quoting decides the type: "year": "{vehicle_year}" sends text, "year": {vehicle_year} sends a number. Static values (an API key, a constant) are typed directly. The editor validates the JSON as you type and flags unknown merge codes.

Available merge codes: every field in this delivery method's schema and in the pipelines wired to the buyer, plus the system codes {timestamp}, {email}, {phone}, {lead_id}, {campaign}, {buyer}, {source}, {quality_score} and {quality_grade}.

A code can carry a modifier: {sold_at|date:MM/DD/YYYY}, {phone|phone:e164}, {state|upper} (also |lower, |title). For repeated formatting, use Field transforms below the template instead — set it once and {field} sends the transformed value.

Check before going live

Preview payload builds the exact JSON this method would send, with your formats and fixed values, using clearly-marked test values — nothing leaves LeadMove. Send a real test to the endpoint actually posts it to the buyer's URL, so their system may create a record; a 2xx response means they accept your leads.

When a delivery fails

The lead's delivery history stores the error and the exact body that was posted, so you can hand the buyer something concrete:

What you seeWhat happened
HTTP 404: Not Found, HTTP 401: UnauthorizedThe buyer's endpoint answered with a non-2xx status
Timed out after 10sNo response within 10 seconds
URL must use https / URL resolves to a private or reserved addressThe URL isn't a public HTTPS address

Anything that isn't a 2xx counts as a failure and is retried — see Retries and deferrals.

Common questions

Can I use GET or PUT? No. Lead delivery is always POST with a JSON body.

The buyer returns 200 but says nothing arrived. Their endpoint accepted the request, so LeadMove considers it delivered. Open the delivery in the lead's history, copy the posted body, and check it against their spec — usually a field name or a type (quoted string where they expect a number).

How do I send the buyer's API key? Either as a custom header, or as a static value inside a custom body template. Both are stored with the delivery method.

Do my transforms apply inside a custom body template? Yes, through the Field transforms list on the same panel. The per-field transforms set in the schema apply to the standard payload.

On this page