Webhook Receiver Documentation
Receive webhook events reliably with retries, replay, and delivery metadata — without changing your business logic.
Overview
Your application receives webhook events from our platform exactly as it would from Stripe, Razorpay, GitHub, or any provider — with added reliability.
- Original payload (unchanged)
- Automatic retries with backoff
- Replay of failed events
- Delivery metadata headers
- HMAC signature verification
Request Format
All webhook requests are delivered as HTTP POST requests with a JSON body.
POST /your-webhook-endpoint
Content-Type: application/json
Payload
The request body contains the original event payload sent by the provider. We do not wrap or modify the payload.
{
"id": "evt_123",
"type": "payment_intent.succeeded",
"data": {
"object": {
"id": "pi_456",
"amount": 2000,
"currency": "usd"
}
}
}
Request Headers
Each webhook delivery includes metadata headers for observability and security.
X-Webhook-Source: stripe
X-Webhook-Event-Id: 9bafc1b2-acde
X-Webhook-Delivery-Id: 1021
X-Webhook-Attempt: 2
X-Webhook-Signature: <hmac-sha256>
| Header | Description |
|---|---|
| X-Webhook-Source | Provider name (stripe, razorpay, github, custom) |
| X-Webhook-Event-Id | Unique event identifier |
| X-Webhook-Attempt | Delivery attempt number |
| X-Webhook-Signature | HMAC SHA256 signature |
Signature Verification
Each request is signed using HMAC SHA256. You should verify the signature before processing the payload.
hash_hmac(
'sha256',
raw_request_body,
signing_secret
)
Retries & Replay
Failed deliveries are retried automatically. You can replay events manually from the dashboard at any time.
- Same payload
- Same event ID
- New delivery attempt
- Incremented attempt count
Your webhook handler should be idempotent.
Best Practices
- Always verify the signature
- Return HTTP 200 on success
- Use event ID for idempotency
- Queue long-running jobs
- Log delivery metadata
Your webhook endpoint receives the original event payload, delivered reliably with retry, replay, and delivery metadata — without changing your business logic.