image_not_fetchable on a Sume image edit: reference URL checklist
A Sume image edit failed with image_not_fetchable or input_media_unreachable. What the docs say the error means and a checklist for the reference URL.

image_not_fetchable and input_media_unreachable mean Sume could not fetch or safely mirror the image you referenced. The fix, per the Errors and rate limits page, is to make sure the input is a public HTTPS image URL, then retry, or contact support with the request id.
Two different layers can stop a reference. Sume rejects some URLs before submission with a 400, and fails others later when it tries to fetch them. The checklist below separates them.
Rejected up front, or failed on fetch
The Image API docs say reference URLs must be public HTTPS, and that Sume rejects localhost, private-network and non-HTTPS URLs before submission. A well-formed public URL can still fail at fetch time, which is where the fetch errors come from.
| Problem | Where it fails | Typical signal |
|---|---|---|
| http:// or localhost URL | Before submission | 400 invalid_request |
| Private-network address | Before submission | 400 invalid_request |
| Entry without image_url.url | Before submission | 400 invalid_request |
| Host unreachable, or URL expired | On fetch | image_not_fetchable or input_media_unreachable |
| URL is not an image | On fetch | image_not_fetchable or input_media_unreachable |
A checklist for the URL
Work through these in order. Most failures are one of the first three.
- Open the URL in a private window with no cookies. If it asks for a login, Sume cannot fetch it either.
- Check that the response is an image with a 2xx status. A redirect to a sign-in page or an HTML error page is not an image.
- If the URL is presigned, make sure it is still valid when Sume fetches it. Generate it just before you submit, with an expiry well beyond your queue time.
- Check hotlink protection on the host. The Agent Completions docs list hotlink protection among the causes of a failed attachment fetch (
502 attachment_fetch_failed), and the same kind of host rule can block an image reference. - Check the file is a supported image type. Agent attachments, for one, accept only certain image types, so convert unusual formats to png or jpeg first.
Retry the right way
Because the failure is about the input, a blind retry rarely helps. Fix the URL first, then send the request again. A failed generation is not billed, so you can repeat the call without paying for the failed attempt.
If the job was already accepted and then failed, its error carries a category and a next action. The category validation means correct the input, and generation_rejected means examine the events and correct the unsupported input. Read the job events at GET /v1/jobs/{id}/events before you try again.
Attach the request id from the response body or headers when you contact support, and leave out API keys, signed URLs and raw media URLs, as the errors page asks.
Avoiding the problem
The most reliable fix is to stop depending on a third-party URL. Copy the source image to storage you control when the user uploads it, serve it over HTTPS without authentication for the short time the generation needs, and sign the link at submit time. A product photo that lives on your own CDN with no hotlink rule will not hit these errors.
Sources
Related posts
More in Developers
- Image API returned 202, not an image: one Python handler for both
POST /v1/images waits 30 seconds, then returns a 202 job envelope. A Python handler that reads the status code, polls the job and returns image URLs either way.
- ky retry on POST for Sume: Idempotency-Key, 40 s timeout, v2 baseUrl
ky does not retry POST by default and times out at 10 s, but Sume sync can hold 30 s. A tested ky v2 config with a stable Idempotency-Key and no 429 retries.
- Launch-week 503 provider_capacity_exceeded: safe video submit retries
New video models cause capacity spikes. Retry 429 and 503 on Sume with the same Idempotency-Key, honor retry-after, never retry 402. Python sample included.
- Let a browser poll your backend, not the Sume API: a proxy pattern
Keep SUME_API_KEY on the server: submit async, return the job id, and give the browser a read-only status route. A 27-line TypeScript route with the checks.
Written by Sume