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

  1. Submit the queue request with webhook_url set to this Hooks receive URL; fal calls it only for the final OK or ERROR result.
  2. 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.
  3. 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.
  4. fal does not follow redirects (3xx is a permanent failure) and retries with backoff; result storage expires, so treat every delivery idempotently.

Signature verification

HeaderX-Fal-Webhook-Signature
AlgorithmEd25519 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 window5 minutes
Delivery idBody `request_id`

Events Hooks normalizes

event.typesubjectWhat it means
request.completedeventfal.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.

Hooks delivery detail: attempt timeline, request payload, and the destination response for one delivery
Delivery detail: the attempt timeline, the rendered request the target received, and its response — the same record an event keeps for every destination.

Common errors

SymptomFix
SIGNATURE_INVALIDUse the signing secret fal.ai shows when the webhook is created, and send X-Fal-Webhook-Signature for the exact raw body.
Nothing arrivesConfirm the webhook points at the endpoint's /in/<endpoint-id> URL and that the endpoint is active.

Pair with a target

Reference

Other sources