/v1/videos failed: 'Could not download an input media URL' fix
A /v1/videos job fails with 'Could not download an input media URL (image_url)' when Sume cannot fetch your input. Make the URL public https and resubmit.

When a frame_images or input_references URL cannot be fetched, the poll response is a failed job with this public error string: "Could not download an input media URL (image_url). Verify the URL is publicly reachable, then retry." The fix is to host the file at a public HTTPS URL and submit a new job.
What the poll returns
This is the poll body the Sume docs show for the case (shortened to the fields that matter).
{
"id": "job_01HXYZ",
"status": "failed",
"error": "Could not download an input media URL (image_url). Verify the URL is publicly reachable, then retry."
}Why the text looks like this
Sume remaps the raw worker error before it reaches you. The same remap sits behind GET /v1/jobs/{id}/status, so a failed job reads the same on both routes. You see the media type in brackets, such as image_url, but the URL that caused the failure stays private.
Fix list
Check these in order. The docs only promise the reachability rule; the other items are common causes.
- Open the URL in a private browser window. If it asks for a login, it is not public.
- Use HTTPS. The docs say reference images must be available over public HTTPS.
- Avoid short-lived signed links that expire before the worker fetches them.
- Check that the bracketed type (
image_url,video_url,audio_url) names the field you expect.
A poll that surfaces the message
Poll the job, print the error, and resubmit with a corrected URL.
import asyncio, os
import httpx
async def main():
headers = {"Authorization": f"Bearer {os.environ['SUME_API_KEY']}"}
job_id = os.environ["JOB_ID"]
async with httpx.AsyncClient(base_url="https://api.sume.com", headers=headers) as c:
st = (await c.get(f"/v1/videos/{job_id}")).json()
if st["status"] == "failed":
print("failed:", st.get("error"))
else:
print(st["status"])
asyncio.run(main())Retry rule
Do not retry the same body in a loop. The content endpoint answers 409 job_failed for a failed job, which is not retryable.
Sources
Related posts
More in Developers
- /v1/videos poll status: pending, in_progress, and the Sume job state
On /v1/videos, a Sume job reads queued as pending, processing as in_progress, canceled as cancelled. The full status mapping, and why expired never appears.
- /v1/videos provider.options returns 400: no passthrough in v1
Non-empty provider.options on /v1/videos returns 400 unsupported_parameter: every model lists allowed_passthrough_parameters as empty. seed and size fail too.
- Veo 3.1 Lite: no 4K, no extension. Checklist before Oct 22
Veo 3.1 Lite has no 4K and cannot extend clips, and all three Veo 3.1 preview ids shut down October 22, 2026. Google points to gemini-omni-1.1-flash.
- Veo 3.1 preview ids vs gemini-omni-1.1-flash vs Sume's Omni id
Three Veo 3.1 preview ids end October 22, 2026 and Google names gemini-omni-1.1-flash as the replacement. Sume spells its id gemini-omni-flash-1.1.
Written by Sume