Lead sends webhooks to notify you about events that happen within your program. We use HTTPS to send events as a JSON payload. You can then use these events to trigger new actions in your system.
Webhook Authentication
To verify a webhook came from Lead, every webhook contains a signature in the header:Lead-Signature. The format of the Lead-Signature header is t={0},v0={1}.
tis the timestamp in millisecondsv0is a HMAC signature with SHA-256. It uses the webhook endpoint’s signing secret as the key, and the event payload (the request body) in string bytes as the message.- The
hmacportion of the signature header is base64 encoded.
t and webhook request body concatenated with ., i.e. base64(HMAC256(t + . + webhook request body)), and ensure it matches v0, the signature sent in the Lead-Signature header.
Ensure to concatenate the webhook request body as bytes (directly as it is received) without any additional processing.
t, the timestamp the webhook was sent to the current timestamp on your server and decide if it’s within your tolerance to prevent a replay attack.
Webhook IP Addresses
Lead will always send webhooks from the following IP addresses:- Production:
3.216.219.186 - Sandbox:
34.234.237.195
Replayed & Missed Events
Lead will consider an event successfully delivered once we receive a 2XX HTTP response from your webhook endpoint. If an event delivery receives a non-2XX response, we will retry delivery every three hours until we receive a success response from your endpoint, or we’ve made 24 attempts. To ensure you haven’t missed any events, use the List all events API to retrieve previous events up to 90 days.Pairing Webhooks With Reconciliation
Webhooks are the recommended way to receive real-time lifecycle updates, but they should not be your only signal. A polling-only integration is fragile, and a webhook-only integration can miss events. Pair webhooks with a periodic reconciliation pass for the following reasons:- Not every status sends a webhook. Some states are marked
Webhook Sent: Noin the event tables below (for example,wire.created,ach.processing,ach.pending_return,account_number.activated). You will only observe those states by retrieving the underlying resource (such asGET /v1/wires/{wire_id}orGET /v1/ach/{ach_id}) or by listing events. - Delivery is retried but not guaranteed forever. Failed deliveries retry every three hours up to 24 attempts. After that, the event is not retried.
- Events may be delivered more than once. Use the event
idas an idempotency key when processing. - Events expire after 90 days. Reconcile before that window closes.
- Process webhooks in real time as the primary trigger for downstream logic.
- Run a periodic reconciliation job (for example, hourly or daily) that calls List all events and/or the relevant resource endpoint to catch anything missed.
- Use the resource endpoint (
GET /v1/wires/{wire_id},GET /v1/ach/{ach_id},GET /v1/instant_payments/{id}, etc.) when you need the authoritative current status of a single transfer.
Webhook Format
Sample ofLead-Signature header with the hmac value under v0 :
Event Types
ACH Events
ACH Events
Internal Transfer Events
Internal Transfer Events
Instant Payment Events
Instant Payment Events
Incoming
Outgoing
Wire Events
Wire Events
Incoming
Outgoing
Account Number Events
Account Number Events
Lending Events
Lending Events
Funding Events
Funding Events

