Veo 3.1 image_url rejected on Sume: text-only error and what to use
Sume's Veo rows refuse image, frame, reference and video inputs as 'text-to-video only here'. The refused fields, other messages, and rows that take an image.

If a Veo 3.1 request on Sume fails with Veo 3.1 is text-to-video only here and does not take image_url., the row is working as designed: Sume's three Veo rows accept a prompt and nothing else visual. Send the still to a row that supports image-to-video, such as Gemini Omni Flash 1.1, Kling Video v3 Pro or Seedance 2.5.
Google's own page says Veo 3.1 supports video extension, frame-specific generation and image direction (Gemini API video docs, read 2026-10-10). That is Google's model; Sume's route exposes a narrower slice.
The refused fields
The validation runs on the Video Router fields before a balance reservation. Each of these makes the request fail with the same sentence, naming the field:
image_url,first_frame_url,image_urlsend_image_url,last_frame_urlvideo_url(edit)reference_image_urls,reference_video_urls,reference_audio_urlsbitrate_mode
The other Veo messages
Other limits have their own messages, so a failing request tells you exactly which rule it broke.
| You sent | Message |
|---|---|
| No prompt | Veo 3.1 requires a prompt. |
| Duration 5 | Veo 3.1 duration must be 4, 6, or 8 seconds. |
| Resolution 1080p | Veo 3.1 runs at 720p here. |
| Ratio 1:1 | Veo 3.1 aspect_ratio must be 16:9 or 9:16. |
| Non-boolean generate_audio | generate_audio must be true or false. |
| Non-empty model_params | Veo 3.1 does not accept model_params. |
Rows that take your still
The catalog flags tell you which rows can start from an image. image_to_video is false on every Veo row; it is true on the rows below (Video Generation docs).
- Gemini Omni Flash 1.1: image plus optional end image, 3 to 10 seconds, 360p to 4K, 16:9 or 9:16, audio always on.
- Kling Video v3 Pro: start and end frames, 4 to 15 seconds, 1080p only, audio toggle.
- Seedance 2.5: first and last frame plus references, 4 to 30 seconds, 480p to 1080p.
- Wan 3.0: 2 to 30 seconds with references; Grok Imagine Video 1.5: still only, 4 to 15 seconds.
A pattern for fallbacks
If your pipeline picks Veo for text prompts and something else for stills, branch on the presence of an image before you choose the id, not after the 400. Because the error is a validation failure, it costs nothing, but it still wastes a round trip and, in a batch, a queue slot of your own client.
Also remember that the Veo rows list only where the Google Cloud route is configured. Read GET /v1/videos/models in your environment and read capabilities or supported_frame_images on the row instead of assuming.
Sources
Related posts
More in Developers
- Veo 3.1 request on Sume: 720p, 4, 6 or 8 seconds, in Python
A working POST /v1/videos call for veo-3.1-lite with 6 seconds, 9:16 and no audio, the rates for the three Veo rows, and what Sume rejects.
- Vercel skipMiddlewareRequestBody and a Sume webhook route
Vercel's Oct 8 skipMiddlewareRequestBody stops sending request bodies to Routing Middleware. What it means for a Sume webhook route that signs the raw body.
- Verify a canceled Sume job was refunded: read the usage ledger by job
After you cancel a queued job, check GET /v1/usage with job_id and read the row status: reserved, captured or refunded. A Python script prints the answer.
- A video model row missing from Sume's list: why, and how to check
Veo and Genjutsu list in the Sume catalog only where their provider route is configured. How listing works, plus a Python check that fails on a missing id.
Written by Sume