Image edit reference URL rejected? Public HTTPS checklist for Sume
Sume rejects localhost, private-network and non-HTTPS reference URLs, and a URL it cannot download fails as input_media_unreachable. Check yours in 12 lines.

Every image-editing launch this fall assumes you can hand the model a photo. Over an API you hand it a URL, and the URL has to be one Sume's servers can 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.
Two different failures
A URL that breaks the rule is refused up front. A URL that passes the rule but cannot be downloaded fails later. In a synchronous call that second case comes back as 502 with an error envelope; the docs show the code input_media_unreachable, the message "Could not download an input media URL (image_url). Verify the URL is publicly reachable, then retry.", retryable: false and next_action: "fix_input". Retrying the same URL will not help, so fix the input.
| URL problem | When Sume reports it | What to do |
|---|---|---|
| http:// instead of https:// | Before submission | Serve the file over HTTPS |
| localhost or a private-network address | Before submission | Host it on a public address or a public bucket |
| Public HTTPS but the download fails (expired signature, login wall) | 502 input_media_unreachable, next_action fix_input | Re-issue a fresh public URL, then send a new request |
A pre-flight check you can run
Do the check yourself before you spend a request. The script asks for the headers only and confirms the status and that the content is an image.
import requests
def reference_ok(url: str) -> bool:
if not url.startswith("https://"):
return False
r = requests.head(url, allow_redirects=True, timeout=15)
ctype = r.headers.get("content-type", "")
return r.status_code == 200 and ctype.startswith("image/")
print(reference_ok("https://example.com/photo.png"))
Signed URLs need a long enough life
If your photos sit in private storage, create a signed URL with a lifetime that covers the whole job, not just the submit. A job can wait in the queue before it starts, so an expiry measured in seconds can pass before Sume downloads the file. For slow models, pass the URL and read the job at GET /v1/jobs/{id}/status (Jobs and results).
Sources
Related posts
More in Developers
- Image job progress bar: Sume has no percentage, so show job stages
ChatGPT Images 2.5 shows a progress percentage. Sume image jobs report queued, processing and completed plus events, and stream:true returns 400.
- Image quality defaults differ: OpenAI auto, Sume high, Ideogram medium
Omit quality and the tier differs: OpenAI defaults GPT Image 2.5 to auto, Sume to high, Ideogram 4.5 to medium, Image 1.0 to low. Pin it before you budget.
- image_size presets (landscape_16_9, square_hd): what Sume sends
Named image_size presets map to ratios on Ideogram, Grok, Imagen and Nano Banana, but pass through on GPT and FLUX. What auto means on each, checked in code.
- "image_size must be a named preset" 400 on Sume: how to fix it
Sending image_size as a bare number or an empty object returns a 400 invalid_request. The three accepted shapes, a tested error table, and a safe builder.
Written by Sume