Reference
Rate limits
fal applies per-account limits across the queue. Numbers change; the dashboard is authoritative. This page shows how to handle the error when you hit one.
Current limits
fal has not published a fixed number for fal-ai/gpt-image-2. Your current limits are visible on the fal dashboard. If you hit a 429, check there first.
What a 429 looks like
The response is HTTP 429 with a small JSON body naming the limit you exceeded. There is no Retry-After header to rely on; back off on your side.
Backoff pattern
Start at 500ms, double on every retry, cap at 10 seconds, give up after five attempts. This handles both 429s and the rare transient 503.
TS
1async function callWithBackoff<T>(fn: () => Promise<T>, max = 5): Promise<T> {2 let attempt = 0;3 while (true) {4 try {5 return await fn();6 } catch (err) {7 const status = (err as { status?: number })?.status;8 if (status !== 429 && status !== 503) throw err;9 attempt++;10 if (attempt >= max) throw err;11 const backoffMs = Math.min(2 ** attempt * 250, 10_000);12 await new Promise((r) => setTimeout(r, backoffMs));13 }14 }15}
Staying under the limit
- Queue outbound requests at the edge; do not fan out from inside a request handler.
- Use webhooks for long jobs so you are not holding a slot open while you poll.
- Parallelise batches with a semaphore capped at your documented concurrent limit.
- If you regularly hit the ceiling, contact fal for a raise rather than adding a queue.