Skip to main content

Short Answer

What the provider received was not an image but an error response from your server. A link that opens in a browser only proves that one browser download works. It does not prove that the provider’s servers can fetch it. The typical error comes back as a 400 at submission time, and no task is created:
received: "" means the provider could not detect any image format in what it downloaded. The simplest fix: host the image on a regular object storage bucket or CDN and pass a plain public URL, such as https://cdn.example.com/xxx.png.

A Real Case

A customer’s first-frame image link looked like this:
The image displayed fine in a browser, but submitting the Seedance task returned the 400 above. We tested the link: The last row shows that the image and the request parameters were fine. Only the link was the problem. This is not an image address. It is an application endpoint: private user files live on the backend, and whenever one is needed, the app issues a temporary download grant carrying an expiry, a signature, and a download cap. This is a common way to protect private files. A leaked link stops working soon and after a few uses, and every download can be audited. The design assumes one person downloading once in a browser. It breaks when a server fetches the file instead:
  • No Range support: many services fetch media by first requesting the opening bytes with a Range header to detect the format, or by downloading in chunks. Endpoints like this only return the whole file and answer a Range request with an error
  • Download cap: when the provider fetches media, it may probe, download, and retry on failure, so it will not necessarily download just once. Once the cap is used up, the response is an error JSON
  • Short expiry: once the link expires, the response is not an image either
A public URL on object storage or a CDN (R2, S3, OSS, TOS, and so on) has none of these limits. It points straight at a static file, supports Range, has no download cap, and needs no extra headers or cookies.

Choosing How to Pass the Image

If your files sit behind this kind of download-grant endpoint, produce a different link before submitting:
  • If the file is already in object storage (OSS, S3, R2, and so on), generate a presigned URL from the storage service and set its expiry to at least 1 hour. Presigned URLs expire by time only, have no download cap, and support Range
  • Otherwise, copy the image to a public object storage bucket or CDN and pass the new URL to Seedance
Run these two commands on any machine with internet access. Replace <URL> with your image link and keep it in single quotes so the shell does not interpret &:
Also confirm that:
  • Both commands return an image, not JSON or HTML
  • Repeated downloads keep working, with no download cap
  • No cookie, login session, or extra header is required
  • The link stays valid at least until submission completes, ideally for 1 hour or more
  • The link is reachable from the public internet, not behind an intranet or an IP allowlist
Checking a download-capped link uses up downloads too. Test with a separately issued link so you do not exhaust the one you plan to submit.

Video Generation API

The three ways to pass images and every request parameter

Asset-First Workflow

Submission-time comparison of the three methods and how to upload assets