Source · fal.ai · Verified November 1, 2026
fal.ai
Short answer: fal.ai queue webhooks report the final result of image, video and other asynchronous model requests as OK or ERROR.
Hooks verifies fal.ai deliveries with ed25519 over <request-id> / <user-id> / <timestamp> / <sha256 hex of raw body>; hex signature, public keys from https://rest.fal.ai/.well-known/jwks.json and normalizes them into the unified event format.
Set up the webhook in fal.ai
- Submit the queue request with
webhook_urlset to this Hooks receive URL; fal calls it only for the final OK or ERROR result. - fal signs with Ed25519 keys published at
https://rest.fal.ai/.well-known/jwks.json; Hooks caches keys for at most one hour and never trusts a URL supplied with the request. - Set the Hooks source secret to your fal user id (the value fal sends in
X-Fal-Webhook-User-Id) so deliveries are bound to your account. - fal does not follow redirects (3xx is a permanent failure) and retries with backoff; result storage expires, so treat every delivery idempotently.
Signature verification
| Header | X-Fal-Webhook-Signature |
|---|---|
| Algorithm | Ed25519 over <request-id> / <user-id> / <timestamp> / <sha256 hex of raw body>; hex signature, public keys from https://rest.fal.ai/.well-known/jwks.json |
| Replay window | 5 minutes |
| Delivery id | Body `request_id` |
Events Hooks normalizes
| event.type | subject | What it means |
|---|---|---|
request.completed | event | fal.ai queue webhooks report the final result of image, video and other asynchronous model requests as OK or ERROR. |
Normalized payload
Every adapter produces this shape before filters or templates run. The raw payload and sanitized headers stay attached for audit, but filters and templates read the normalized fields.
Normalized event
{
"id": "evt_demo",
"source": "fal",
"type": "request.completed",
"action": "completed",
"deliveryId": "delivery_demo",
"subject": {
"title": "fal.ai event"
},
"raw": {
"request_id": "req_8f3c2a1d6e4b9f0a",
"gateway_request_id": "gw_2b7d9e4c1a3f8b60",
"status": "OK",
"payload": {
"images": [
{
"url": "https://fal.media/files/example.png",
"content_type": "image/png",
"file_name": "example.png",
"file_size": 184320,
"width": 1024,
"height": 1024
}
],
"seed": 42
}
}
}Filter and template examples
Filter
type equals "request.completed"Template
"fal.ai event: {{event.subject.title}}"Retries and the delivery log
408, 425, 429, and 5xx responses retry with backoff and honor Retry-After; other 4xx responses fail permanently with a named code. Every attempt keeps the rendered request and the target response, so a failure points at one field or one status instead of a guess.

Common errors
| Symptom | Fix |
|---|---|
SIGNATURE_INVALID | Use the signing secret fal.ai shows when the webhook is created, and send X-Fal-Webhook-Signature for the exact raw body. |
Nothing arrives | Confirm the webhook points at the endpoint's /in/<endpoint-id> URL and that the endpoint is active. |
Pair with a target
Reference
- Receiving eventshttps://fal.ai/docs/documentation/model-apis/inference/webhooks
- Verify signatureshttps://hooks.events/docs/signatures.md
- Payload templateshttps://hooks.events/docs/templates.md
Other sources
X-Hook-Secret handshake.Auth0Auth0 custom log streams POST tenant log events (login, signup, logout, token exchange, user changes) to a webhook.AWS SNSAWS SNS delivers JSON notifications and subscription confirmations to HTTP(S) endpoints, signed with an RSA certificate published under an sns.<region>.amazonaws.com URL.Azure DevOpsAzure DevOps service hooks send git pushes, pull requests, work items, builds and releases to a public webhook endpoint.BitbucketBitbucket Cloud repository webhooks cover pushes, pull request changes, and issue events.BrowserbaseBrowserbase Functions webhooks report invocation and build lifecycle states (pending, running, completed, failed).Cal.comCal.com booking webhooks wrap the booking in a triggerEvent envelope and sign each delivery with an HMAC-SHA256 of the raw body.Browse all sourcesSetup steps, signatures, events, and payload samples for every provider.