Skip to main content
Receive real-time notifications when payout events occur.

How Webhooks Work

Configure a webhook URL in your Merchant Dashboard under Developer API > Webhooks. Quickei sends an HTTP POST request to your URL whenever a payout is completed.

Payload Format

The webhook payload is a flat JSON object (not wrapped in a data envelope):
string
The event type. Currently always payout.completed.
string
Unique payout identifier matching the one returned from the Payout endpoint.
string
Your internal reference for this payout.
number
The amount sent (before fees).
string
The sender currency code.
number
Total fee charged.
number
Total debited from your merchant wallet (amount + fee).
number
Applied exchange rate.
number
Amount credited to the recipient.
string
The recipient’s currency code.
string
Payout status (e.g. completed).
string
ISO 8601 timestamp when the payout was processed.
string
ISO 8601 timestamp when the webhook was sent.

Headers

Each webhook request includes these headers:

Signature Verification

The X-Quickei-Signature header contains an HMAC-SHA256 hex digest of the raw request body, signed with your webhook secret (configured in the Merchant Dashboard).
Always verify the signature before processing webhook events. Reject any request with an invalid or missing signature.

Verification Examples

Retry Policy

If your endpoint does not return a 2xx status code, Quickei retries the webhook delivery: After 3 failed attempts, the webhook is marked as failed. You can view failed deliveries and trigger manual retries from the Merchant Dashboard under Developer API > Webhooks > Delivery Log.
Return a 200 status code as quickly as possible. Perform heavy processing (database writes, notifications) asynchronously after acknowledging the webhook.

Best Practices

  • Verify signatures on every webhook before processing
  • Respond quickly with a 200 and process asynchronously
  • Handle duplicates — you may receive the same event more than once during retries. Use the payout_id to deduplicate.
  • Use the status endpoint as a fallback. If you miss a webhook, poll GET /payout/{id} to get the current status.