webhook attribute. When you provide one, BetterContact posts the
results to that URL as soon as the request is done, and you never have to poll.
Request
How the call is made
The body of the enrichment webhook is identical to
GET /async/{request_id}, and the body of the Lead Finder webhook
is identical to
GET /lead_finder/async/{request_id}. There is no
separate envelope and no event type to switch on.200 as soon as you have persisted the payload, and do the actual processing afterwards. A
slow endpoint that times out counts as a failed attempt.
No signature
Webhook calls carry no signature header and no authentication. Treat the webhook URL itself as a secret: give it a long unguessable path, and do not expose it anywhere public. If you need certainty about the origin of a payload, do not trust the body directly. Read theid
it carries and call GET /async/{id} with your API key to confirm.
Per lead webhooks
On the enrichment API,push_contact_individually changes the delivery model: instead of one call
with the whole batch at the end, each lead is pushed to contact_webhook as soon as it is enriched.
This is useful for batches of 100 where you would rather start working on the first results without
waiting for the slowest lead.
Request
contact_webhook is a single flat object, not the batch envelope. It always
carries request_id, enriched, custom_fields and the enriched contact fields.
Note that custom_fields comes back as an array of { name, value, position } entries even though
you sent an object. Look your field up by name.
Per lead payload
Testing
Pointwebhook at a request bin while you build, then submit a single lead. Every attempt is logged
on our side with its HTTP status and the response body we received, so if nothing arrives, open the
request in your BetterContact account or ask support to read the
attempts back to you.