fal webhook redirect 3xx is never retried: what Sume does instead
fal treats a 3xx from your webhook URL as a permanent failure. Sume does not follow redirects either, but counts a 3xx as a failed attempt, not an end.

If your webhook URL answers with a redirect, fal does not follow it and treats the delivery as a permanent failure that is not retried. Sume does not follow redirects either, but its docs call a 3xx a failed attempt, so it counts against the 10 attempts rather than ending delivery at once. The practical fix is the same on both: register the final URL, with the right scheme and trailing slash, not one that redirects.
fal's rules are from the Retry policy section of its Webhooks page, read on 2026-10-02. Sume's are from Run webhooks and Webhooks.
What does fal do with a redirect or an internal address?
A 3xx response is not followed and is not retried. fal says to set webhook_url to the final destination directly and names two common pitfalls: http:// URLs that redirect to https://, and paths that redirect to add or remove a trailing slash.
Deliveries to URLs that resolve to a private, internal or loopback address, such as localhost or a public hostname whose DNS record points to 10.0.0.5, are dropped permanently before any request is sent. A hostname that fails to resolve at all is treated as a network error and retried.
What does Sume do?
A run webhook URL must be public HTTPS, at most 2048 characters. Localhost, private-network and non-HTTPS URLs are rejected at submit time with 400 invalid_request. The URL is validated again at delivery time, not only when you submit. Job webhooks follow the same rule: public HTTPS only, with localhost, private-network and non-HTTPS URLs rejected.
Redirects are not followed; the docs say a 3xx is a failed attempt and not a delivery. Because Sume retries failed attempts up to 10 times in total, a redirecting endpoint keeps being tried until the cap, then the delivery shows exhausted. The job or run itself is unaffected.
How do the rules line up?
The main difference is when a bad URL is caught.
| Case | fal | Sume |
|---|---|---|
3xx response | Permanent failure, not retried | Failed attempt; counts toward the 10 |
| Private, internal or loopback target | Dropped permanently before any request | Rejected at submit with 400 invalid_request; checked again at delivery |
| Unresolvable hostname | Network error, retried | Not stated on the pages |
http:// URL | Not stated whether accepted; redirects to https:// are a named pitfall | Rejected: public HTTPS only |
How do I check my URL before I go live?
Request the URL with curl -sI and confirm it answers 200 or 204 directly, with no Location header. Check both the scheme and the trailing slash. For Sume, the dashboard Webhooks tab has a Send test action (also POST /v1/webhooks/test-deliveries, scope account:write) that posts a dummy signed webhook.test payload to a URL you type, so you can see your endpoint answer before a real job runs.
Send test never replays a real job. To replay a real terminal event later, use Redeliver on the delivery row; it does not change the destination, so a new URL means a new job.
Sources
Related posts
More in Comparisons
- fal webhook ED25519 and JWKS vs Sume's HMAC-SHA256 check
fal signs webhooks with ED25519 keys fetched from a JWKS URL. Sume signs HMAC-SHA256 over timestamp.body with a workspace secret. The two checks, side by side.
- Fastest AI image model API: what the October 2026 claims say
Flare says half the latency of GPT Image 2, MAI-Image-2.6-Flash says 2.8x faster than GPT-Image-2-Medium. None are comparable. A timing script for Sume models.
- FFmpeg whisper filter vs a hosted transcript call for video
FFmpeg's whisper filter needs whisper.cpp and a model file you manage. Sume's video-inspect transcribe returns words and sentence segments for $0.01 a minute.
- FFmpeg xfade has 59 transitions: which does Sume Timeline take?
FFmpeg's xfade page lists 59 transition values, including custom. Sume Timeline 1.0 accepts six: fade, wipeleft, wiperight, slideup, slidedown and dissolve.
Written by Sume