Overview
Webhooks are HTTP POST requests sent to your server when specific events occur. Each webhook event includes:- Event ID: Unique identifier for idempotency
- Event Type: The type of event (e.g.,
customer.created,invoice.paid) - Timestamp: When the event occurred
- Organization ID: The organization that triggered the event
- Data: The event payload with relevant information
Event Catalog
Browse every available event type — with descriptions and sample payloads — in the Event Catalog in your console under Developer → Webhooks. Events are grouped by domain:- Customer Events:
customer.created,customer.updated,customer.verified,customer.status_changed,customer.deleted, and more - Transfer Events:
transfer.created,transfer.processing,transfer.updated,transfer.completed,transfer.failed,transfer.cancelled,transfer.refund_initiated,transfer.refund_completed,transfer.reversed - Invoice Events:
invoice.created,invoice.sent,invoice.paid,invoice.cancelled,invoice.overdue - Verification Events:
verification.session.created,verification.session.submitted,verification.session.completed,verification.session.failed,verification.link.sent,verification.session.expired - FX Events:
fx_trade.created,fx_trade.completed,fx_quote.expired, and more - Agent Events:
agent.created,agent.updated,agent.limit_reached,agent.revoked—transfer.*payloads also carryagentIdwhen an agent key made the transfer
transfer.updated with data.status set to IN_REVIEW while Infinite reviews or resolves the transfer. transfer.failed is only sent when the transfer fails before funds are received.
Setting Up Webhooks
1. Create a Webhook Endpoint
Use the Create Webhook Endpoint API to register your webhook URL:2. Configure Event Filtering
You can specify which event types to receive using thefilterTypes array. Omit it (or pass an empty array) to receive all event types, including new ones as they launch. To receive only specific events:
3. Manage Endpoints
- List endpoints:
GET /v1/webhooks/endpoints - Update endpoint:
PUT /v1/webhooks/endpoints/{endpointId}(supports enabling/disabling withdisabled) - Delete endpoint:
DELETE /v1/webhooks/endpoints/{endpointId} - Get signing secret:
GET /v1/webhooks/endpoints/{endpointId}/secret - Rotate signing secret:
POST /v1/webhooks/endpoints/{endpointId}/secret/rotate— the previous secret stays valid for 24 hours so you can roll over without dropping deliveries
Webhook Payload Structure
All webhook events follow this structure:Example: Customer Created Event
Example: Invoice Paid Event
Verifying Webhooks
Every delivery is signed following the Standard Webhooks specification and includeswebhook-id, webhook-timestamp, and webhook-signature headers. Verify these signatures to ensure the webhook is legitimate.
Retrieve your endpoint’s signing secret (whsec_...) with the Get Signing Secret API or from the console under Developer → Webhooks → Signing secret.
Using a Verification Library
The easiest way to verify webhooks is with a Standard Webhooks library: Node.js:Manual Verification
To verify manually, compute the signed content as{webhook-id}.{webhook-timestamp}.{raw request body}, HMAC-SHA256 it with the base64-decoded portion of your signing secret (the part after whsec_), and base64-encode the result. Compare it against the v1, entries in the webhook-signature header using a constant-time comparison, and reject deliveries whose timestamp is more than a few minutes old to prevent replay attacks.
Delivery History & Replay
Inspect and replay deliveries programmatically:- List messages:
GET /v1/webhooks/messages— newest first, with cursor pagination. Filter byendpointId(adds per-endpoint deliverystatus),eventTypes,tag(resource IDs such as a transfer or customer ID), and time range. - Get a message:
GET /v1/webhooks/messages/{messageId}— includes the payload and every delivery attempt with HTTP status and response body. The message ID matches thewebhook-idheader on the delivery. - Resend a message:
POST /v1/webhooks/messages/{messageId}/resend— redelivers the original payload to every enabled endpoint subscribed to the event type, or a single endpoint viaendpointId. - Replay failed deliveries:
POST /v1/webhooks/endpoints/{endpointId}/recover— redelivers everything that failed since a timestamp. Useful after an outage on your receiver.
Best Practices
Idempotency
All webhook events include anid field, and replays redeliver the original event unchanged. Use the ID to implement idempotency in your webhook handler:
Retry Logic
Infinite automatically retries failed webhook deliveries with exponential backoff. Your endpoint should:- Return
200 OKimmediately after receiving the webhook - Process the event asynchronously
- Handle errors gracefully
Security
- Always verify webhook signatures
- Use HTTPS for your webhook endpoints
- Store signing secrets securely (environment variables, secrets manager)
- Monitor your delivery history for suspicious activity
Error Handling
If your endpoint returns a non-2xx status code, the delivery is retried. If you want to acknowledge receipt but process later:Testing Webhooks
Send an example payload of any event type to an endpoint from the console: Developer → Webhooks → Endpoints → Send test event. The delivery shows up in the Deliveries feed like any other event, including the response your server returned.Need Help?
- Browse the Event Catalog in your console for all available events and sample payloads
- Review the API Reference for endpoint details