Webhooks
The event payload
Each delivery is an HTTP POST with a JSON body and a few headers your server reads.
Headers
| Property | Type | Description |
|---|---|---|
| X-Webhook-Id | string | The event's stable id (also payload.id). Use it to dedupe. |
| X-Webhook-Event | string | The event type. |
| X-Signature | string | The HMAC signature. Always verify it before trusting the body. |
Body
invoice.completed
{"id": "01JZ8Q7M3K9V2X4B6C8D0E2F4G","event": "invoice.completed","occurred_at": "2026-07-07T14:32:10+00:00","invoice": {"id": "01JZ8Q5F2H7T9K1M3N5P7R9S1U","status": "completed","amount": { "amount": "49.99", "currency": "USD", "scale": 2 },"reference": "ORDER-10231","metadata": { "order_id": "10231" },"created_at": "2026-07-07T14:00:00+00:00","expires_at": "2026-07-07T15:00:00+00:00"}}
invoice.id matches the invoice you created; reference and metadata are echoed so you can reconcile without a follow-up request.
Money follows the shared shape: amount, currency (the code string), and scale, the same as the invoice API.