Sume 503: provider_capacity_exceeded vs provider_not_configured
Sume 503s differ: provider_capacity_exceeded: retry later, same key; provider_not_configured is no hard retries, job_ledger_not_configured is an outage

A 503 from the Sume API does not have one meaning. provider_capacity_exceeded means Sume's provider dispatch queue is full, so retry later with the same idempotency key. provider_not_configured means provider execution is unavailable in this runtime, so do not retry aggressively and check catalog and runtime status. job_ledger_not_configured means job persistence is unavailable, so treat it as service unavailable.
The status code is the same, the right client behavior is not. This post lays out the three and how they differ from the 429 errors you may already handle.
What does each 503 code mean?
The Errors and rate limits page groups these under provider and worker backpressure. They are returned before provider work is accepted, which matters for billing: a request rejected at this stage did not start a generation.
| Code | Meaning | Client behavior |
|---|---|---|
| provider_capacity_exceeded | Sume's provider dispatch queue is full | Retry later with the same idempotency key |
| provider_not_configured | Provider execution is unavailable in this runtime | Do not retry aggressively; check catalog and runtime status |
| job_ledger_not_configured | Job persistence is unavailable | Treat as service unavailable |
| image_not_fetchable, input_media_unreachable | Sume could not fetch or mirror media safely | Check input is a public HTTPS image URL, then retry or contact support with the request id |
How is a 503 different from 429 queue_full?
queue_full is a 429 and it is about your workspace: accepted generation capacity is used up, and it clears when one of your own queued or processing jobs finishes or is canceled. A 503 provider_capacity_exceeded is about Sume's dispatch side, so cancelling your own jobs is not the lever.
Rate limiting is a third thing again. rate_limited is a 429 for request volume, and the docs say to back off and use retry-after when present. If you want a deeper comparison of the 429 and 503 families, 429 vs 503: rate limit or overload covers the general idea.
Why must the retry reuse the same Idempotency-Key?
The docs say not to retry unsafe submit requests without an Idempotency-Key. A 503 can leave you unsure whether a job was created, and a retry without a key risks a second paid job. With the same key on a retry of the same operation and payload, the request returns the original job instead of billing again.
The same key must not be reused for a different operation or payload: that returns 409 idempotency_conflict. Reuse keys only for exact retries.
curl -X POST https://api.sume.com/v1/image-1.0/generate \
-H "Authorization: Bearer $SUME_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: hero-shot-2026-10-02-001" \
-d '{"prompt":"Product hero shot of a matte black bottle on marble","mode":"async"}'Will a failed 503 submit cost me anything?
These errors are returned before provider work is accepted, and the docs describe the reservation being released or refunded for failed admission where applicable. Check GET /v1/balance after a burst of 503s if the numbers look off, and rely on the idempotency key to prevent a duplicate job when you retry.
What retry schedule is reasonable?
The docs do not publish a number of retries or a delay for 503 errors, so any schedule is your choice and should stay conservative. A sensible shape, consistent with the guidance above: for provider_capacity_exceeded, back off with growing delays and jitter and cap the number of attempts; for provider_not_configured, stop after a small number of attempts and look at the catalog rather than looping; for job_ledger_not_configured, treat it like an outage and alert instead of hammering.
Keep a polling fallback for anything already submitted. A 503 on a new submit says nothing about jobs that are already running, and those keep their own status through status_url.
If a 503 persists, send the request id from the error body to Sume support. It is safe to share. Leave out API keys, signed URLs and raw media URLs.
Sources
Related posts
More in Developers
- Sume API errors: a 13-line function that says retry or fix
Map a failed Sume response to out-of-credit, wait, back off, fix the key, retry with the same key, or fix the request, using the documented error envelope.
- sume/auto for an image series: why to pin a model id instead
sume/auto never tells you which model ran, and job.model stays sume/auto. For a series that must match, send one catalog id such as google/nano-banana-2.
- SUME_API_BASE_URL has /v1, the SDK baseUrl does not: which is right?
The Sume CLI base URL is https://api.sume.com/v1 and it sends x-api-key by default; the SDK baseUrl is https://api.sume.com with no /v1. Both env sets compared.
- SUME_CONFIG_DIR in GitHub Actions: keep Sume CLI config off the runner
Set SUME_API_KEY from a GitHub secret and SUME_CONFIG_DIR to a temp folder so the Sume CLI keeps its config off ~/.sume-com/config.json on a shared runner.
Written by Sume