Webhooks let your application react to events as they happen — a payment succeeds, a refund is created, an order is placed, a fulfillment ships. Instead of polling the API, you register a URL and we send you an HTTP POST with the event data.Documentation Index
Fetch the complete documentation index at: https://docs.fluveo.com/llms.txt
Use this file to discover all available pages before exploring further.
Setting up a webhook endpoint
Create an endpoint by specifying a URL and the event types you want to receive:Verifying signatures
Every webhook delivery includes aFluveo-Signature header (Stripe-style namespaced) and an X-Signature header (legacy alias) — both carry the same value. Always verify the signature before processing the event to ensure it came from us and hasn’t been tampered with.
We additionally send a Webhook-Id header containing the event id so you can deduplicate without parsing the body, and a User-Agent: Fluveo-Webhooks/1.0 header so deliveries are easy to identify in your logs.
The signature header format is:
Reject any delivery whose
t timestamp is more than 5 minutes in the past — that’s the standard replay protection guardrail.Retry schedule
If your endpoint returns a non-2xx response or times out, we retry the delivery with increasing delays:| Attempt | Delay | Cumulative Time |
|---|---|---|
| 1 | Immediate | 0 |
| 2 | 1 minute | 1 minute |
| 3 | 5 minutes | 6 minutes |
| 4 | 30 minutes | 36 minutes |
| 5 | 2 hours | ~2.5 hours |
| 6 | 8 hours | ~10.5 hours |
| 7 | 24 hours | ~1.5 days |
| 8 | 72 hours | ~4.5 days |
Endpoint requirements
- Must accept POST requests with
Content-Type: application/json - Must return a 2xx status code within 30 seconds
- Must verify the
Fluveo-Signature(or legacyX-Signature) header before processing
Best practices
Respond quickly. Return a
200 response immediately, then process the event asynchronously. If your handler takes longer than 30 seconds, the delivery will be marked as failed and retried.- Verify signatures on every request to prevent spoofing
- Deduplicate by event ID — the same event may be delivered more than once during retries
- Process asynchronously — use a message queue to handle events outside the request cycle
- Subscribe selectively — only subscribe to event types you need to reduce load
- Handle test events — in test mode, events include
"livemode": false