Skip to main content
Webhooks push real-time updates to your server when objects in Zapyd change state. Use them instead of polling. They are the recommended way to drive your integration logic.

Quick setup

Register your URL

Call POST /org/api/v1/organizations/api-webhooks with webhook_url. It must be public HTTPS. One URL receives every event type.

Verify every event

Check X-TIMESTAMP and X-SIGNATURE before you read the body. See Signature validation.

Acknowledge fast

Return 2xx within a few seconds, and do the work asynchronously. Zapyd treats any other response as a failed delivery.

Deduplicate

The same event can arrive more than once. Store id + event, and skip events you’ve already processed.

Event envelope

Every event has the same shape:
Webhooks tell you that something changed. For the full object, fetch it by id.

Signature validation

Every request includes two headers:
  • X-TIMESTAMP — Unix timestamp when the webhook was generated
  • X-SIGNATURE — HMAC-SHA256 of the request, Base64 encoded
Validate both on every incoming request. Reject anything with a stale timestamp or a signature mismatch. Webhooks are signed exactly like API requests, using your API key and secret: Base64(HMAC-SHA256(secret, apiKey + "|" + X-TIMESTAMP + "|" + canonicalBody)). See Authentication for the canonical body rules.
Usage:
Always validate the signature before processing any webhook payload. Never trust the payload without verification.

Event catalog

Customer events

Fired when a customer’s KYC status changes. Metadata:
  • failure_reason — present on FAILED. Values: DOCUMENT_VERIFICATION_FAILED, TAX_VERIFICATION_FAILED, ADDITIONAL_INFO_VERIFICATION_FAILED, KYC_FAILED

Bank events

Fired when a bank account or UPI ID verification resolves. Metadata:
  • failure_reason — present on FAILED. Values: ACCOUNT_TYPE_NRE, PENNY_DROP_FAILED, NAME_MISMATCH, BANK_RISK_CHECK_FAILED

Payin events

Fired when a payin order changes state. Metadata:
  • transaction_reference_id — present on SUCCESS. The bank reference (UTR for INR) of the customer’s payment
  • transaction_hash — present on SUCCESS. The on-chain transaction that delivered the crypto
  • failure_reason — present on FAILED. Values: INCORRECT_UTR, PAYMENT_NOT_RECEIVED, and others. See Failure Reason Reference
  • refund_reason — present on REFUND_INITIATED and REFUNDED. Values: INCORRECT_AMOUNT, PAYMENT_FROM_NON_WHITELISTED_ACCOUNT, THIRD_PARTY_PAYMENT

Payout events

Fired when a payout order changes state. Metadata:
  • client_reference_id — present on every payout event. Your reference from Create Payout, or null
  • utr — present on SUCCESS. The bank’s transfer reference (the UTR in India), usable for reconciliation
  • failure_reason — present on FAILED. Always the generic Payout failed; the detailed reason is not exposed
  • refund_reason — present on REFUNDED
  • reason — present on IN_REVIEW. Either Request for information (with an rfi_link the customer must complete) or Under compliance review
PROCESSING is not sent as a webhook. Poll Fetch Payout if you need it.

EDD events

Fired when Enhanced Due Diligence verification resolves.