fal cancel returns 202 or 400: how Sume's cancel 409 differs
fal's queue cancel answers 202 CANCELLATION_REQUESTED, 400 ALREADY_COMPLETED or 404. Sume's cancel works only before generation starts, else 409.

fal's cancel call is a PUT on the request's /cancel URL and answers 202 with CANCELLATION_REQUESTED, 400 with ALREADY_COMPLETED, or 404 with NOT_FOUND. Sume's is a POST /v1/jobs/{job_id}/cancel that succeeds only before generation work starts; after that it returns 409 job_generation_already_started and the job runs to completion. Both treat a request that is already running as not reliably stoppable, but they report it differently, so a handler ported from one needs a new branch for the other.
fal facts come from the cancel section of its Queue API page; Sume facts come from Jobs and results and the core workflow page. The fal page was read on 2026-10-02.
What does fal do when you cancel?
It depends on the request's state. A request still in IN_QUEUE is removed immediately and never processed. A request already IN_PROGRESS gets a cancellation signal sent to the runner, and fal says it may still complete if the app does not handle cancellation; whether the code stops depends on whether the app implements a cancel endpoint.
The response carries both an HTTP status and a JSON body. A 202 means the cancel was accepted, not that work stopped. With fal's SDK, handler.cancel() returns silently on 202 and raises on 400 or 404.
What does Sume do when you cancel?
A job that has not started generating is canceled and ends in the terminal canceled status. Once generation has started, Sume returns 409 job_generation_already_started with details.cancelable: false, and the job runs to completion. Cancelling a job that is already canceled is idempotent and returns the same canceled job.
The core workflow page says provider-backed generation can reserve estimated USD usage, capture the actual cost on success, and refund on failure or cancellation before capture. So the cancel that works is the one that refunds; a 409 means the work is already running and will be billed like any completed job.
Which statuses map to which?
The table lines up the documented cases. A fal 202 is a request, so poll afterwards; on Sume, read the job status after cancel to confirm canceled.
| Situation | fal | Sume |
|---|---|---|
| Not started | Request removed from the queue; 202 | Job ends canceled |
| Already running | 202 CANCELLATION_REQUESTED; may still complete | 409 job_generation_already_started, details.cancelable: false; runs to completion |
| Already finished | 400 ALREADY_COMPLETED | Not stated for completed jobs on the page; read the job status |
| Already canceled | Not stated on the page | Idempotent; returns the same canceled job |
| Unknown id | 404 NOT_FOUND | Not stated on the page |
How should a client handle both?
Treat cancel as a request, then read state. After a cancel call, fetch the job (GET /v1/jobs/{job_id}/status on Sume) and branch on the terminal flag rather than on the cancel response alone. On Sume, a 409 is not a failure to retry: stop trying to cancel and wait for the job to finish, because it will still bill. On fal, a 202 for an in-progress request should be followed by a status check for the same reason.
A client-side timeout cancels nothing on Sume. Sume's docs say the job keeps running and billing after you stop watching, so store the job id and either pick it back up from status_url or cancel before it starts.
Sources
Related posts
More in Comparisons
- 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.
- 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.
- fal webhook retries: 31 attempts, 15 s timeout, vs Sume's 10
fal retries a failed webhook with backoff up to 31 times while the stored result lasts; Sume makes up to 10 attempts with a 10 second timeout. What to build.
- 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.
Written by Sume