Skip to main content
Webhooks notify your server when payment or settlement events happen. Create and manage them from the dashboard without writing code.

View your webhooks

Go to Settings > Developers > Webhooks to see your endpoints. Each row shows the name, endpoint URL, status, and last activity. Filter by Active or Inactive to narrow the list.

Create a webhook

  1. From Settings > Developers > Webhooks, select Create webhook.
  2. Select one or more events that trigger the webhook. At least one is required. See Events for the full list.
  3. Enter a name that identifies its purpose. Required.
  4. Enter the endpoint URL where Lite sends event notifications. Required.
  5. Add a description of what the webhook is for. Optional, up to 1,000 characters.
  6. Add custom headers to send with every delivery. Optional. See Custom headers.

Events

Select any combination of the following. Event names arrive in the event field of the payload. Registration is validated against this list. An unrecognized event name is rejected with a 400 Bad Request that lists the invalid entries and the allowed values.

Custom headers

Custom headers are sent with every delivery to your endpoint. Use them to pass values your server expects, such as an authentication token or a routing key. Each header is a name and value pair. Select Add Header to add more than one.

Verify signatures

lite signs every delivery with HMAC-SHA256 so you can confirm it came from lite and was not tampered with. Verify the signature on your server before you trust the body. On its own, treat a webhook as a trigger to read the payment server-side, never as proof that money moved. lite uses a signing secret tied to your webhook. Store it server-side and never expose it in client code. Every delivery includes these headers, plus any custom headers you configured: To verify: recompute HMAC-SHA256(secret, rawBody), hex-encode it, and compare it to X-Lite-Signature with a constant-time comparison.
Hash the raw request body exactly as received. Read the raw bytes before any JSON parsing, because parsing and re-serializing can change the bytes and break the match.
Always compare with a constant-time function (crypto.timingSafeEqual, hmac.compare_digest, or the equivalent in your language). A plain == comparison can leak the signature through timing.

Event payload

Every delivery uses one envelope: { event, mode, data }. event is the event type from the list above. mode is live or sandbox. data carries the entity. Match the payment using data.orderId (your order reference) or data.id. Return 200 as soon as you receive a delivery, then process it. Deduplicate on X-Idempotency-Key, since a delivery can arrive more than once. You can also reject deliveries whose X-Timestamp is older than a few minutes to limit replay.
If your endpoint does not return 200, lite retries with exponential backoff, starting around 1 minute and up to 12 attempts, which spans roughly 3 days before delivery is abandoned.