> ## Documentation Index
> Fetch the complete documentation index at: https://docs.apiyi.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Seedance сообщает об ошибке invalid image format, но ссылка открывается в браузере

> Ссылка на изображение для Seedance успешно открывается в браузере, однако отправка задачи возвращает 400 invalid image format. Ссылка предназначена для разового скачивания в браузере, а не для получения сервером: она отклоняет запросы Range, ограничивает количество скачиваний или слишком быстро истекает. На этой странице объясняется, как проверить ссылку и что выбрать: публичный URL, ID ассета или Base64.

## Краткий ответ

То, что получил провайдер, было не изображением, а ответом с ошибкой от вашего сервера. Ссылка, которая открывается в браузере, доказывает лишь то, что работает **скачивание в одном браузере**. Это не доказывает, что **серверы провайдера могут его получить**.

Типичная ошибка возвращается с кодом 400 в момент отправки, и задача не создается:

```text theme={null}
The parameter `content[1]` specified in the request is not valid:
invalid image format (detected format); received: "".
```

`received: ""` означает, что провайдер не смог обнаружить формат изображения в том, что он скачал.

**Самое простое решение**: разместите изображение в обычном бакете объектного хранилища или CDN и передайте прямой публичный URL, например `https://cdn.example.com/xxx.png`.

## Реальный пример

Ссылка на изображение первого кадра у одного из клиентов выглядела следующим образом:

```text theme={null}
https://<customer-domain>/api/v1/resource-download-grants/<file-id>/content?access_token=<signed token with an expiry>
```

В браузере изображение отображалось нормально, однако при отправке задачи Seedance возвращалась описанная выше ошибка 400. Мы протестировали ссылку:

| Тест                                                              | Результат                                          |
| ----------------------------------------------------------------- | -------------------------------------------------- |
| Обычный GET-запрос (как в браузере)                               | 200, возвращает PNG-изображение                    |
| GET-запрос с заголовком `Range`, запрашивающий первую часть файла | **416**, возвращает ошибку JSON вместо изображения |
| Примерно после 10 скачиваний подряд                               | **429**, исчерпан лимит на скачивание              |
| То же изображение, переданное в виде Base64                       | **Успешно**, видео сгенерировано                   |

Последняя строка показывает, что с изображением и параметрами запроса всё было в порядке. Проблема заключалась исключительно в ссылке.

## Почему существуют такие ссылки

Это не адрес изображения. Это **эндпоинт приложения**: приватные файлы пользователей хранятся на бэкенде, и всякий раз, когда файл требуется, приложение выдает временное разрешение на скачивание, содержащее срок действия, подпись и ограничение по количеству скачиваний. Это распространенный способ защиты приватных файлов. Утекшая ссылка быстро перестает работать и становится недействительной после нескольких использований, а каждое скачивание можно отследить через аудит.

Такая логика предполагает, что **один пользователь скачивает файл один раз в браузере**. Она дает сбой, когда файл вместо этого запрашивает сервер:

* **Отсутствие поддержки Range**: многие сервисы получают медиафайлы, сначала запрашивая начальные байты с заголовком `Range` для определения формата или скачивая данные частями. Подобные эндпоинты возвращают только файл целиком и отвечают ошибкой на запрос Range
* **Лимит на скачивание**: когда провайдер загружает медиафайл, он может выполнять проверку, скачивать файл и повторять попытки при сбое, поэтому скачивание не обязательно происходит всего один раз. Как только лимит исчерпан, в ответ возвращается JSON с ошибкой
* **Короткий срок действия**: после истечения срока действия ссылки в ответе также возвращается не изображение

Публичный URL в объектном хранилище или CDN (R2, S3, OSS, TOS и т. д.) лишен подобных ограничений. Он ведет напрямую к статическому файлу, поддерживает Range, не имеет ограничений по скачиванию и не требует дополнительных заголовков или cookie.

## Выбор способа передачи изображения

| Метод                                  | Когда использовать                                                                                         | Примечания                                                                                                                                                                                                                                                      |
| -------------------------------------- | ---------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Публичный URL** (рекомендуется)      | Изображения используются один раз                                                                          | Крошечный размер тела запроса. Серверы провайдера загружают файл напрямую, обладая большей емкостью и пропускной способностью. Ссылка должна пройти проверки ниже                                                                                               |
| **Asset ID** `asset://...`             | Одно и то же изображение используется неоднократно, или на нем присутствует реалистичное человеческое лицо | Загрузите его один раз, а затем каждый раз передавайте только короткую строку. См. [Рабочий процесс Asset-First](/ru/api-capabilities/seedance2/asset-first-workflow)                                                                                           |
| **Base64** `data:image/png;base64,...` | Запасной вариант, когда подходящий публичный URL недоступен                                                | Кодирование увеличивает размер примерно на треть, и все данные передаются с вашего устройства, что заметно замедляет отправку. В одном из тестов PNG размером 2,3 МБ превратился в тело запроса размером 3,1 МБ, а вызов create-task выполнялся около 60 секунд |

Если ваши файлы находятся за эндпоинтом такого типа (с выдачей разрешения на скачивание), перед отправкой сформируйте другую ссылку:

* Если файл уже находится в объектном хранилище (OSS, S3, R2 и т. д.), сгенерируйте **presigned URL** в сервисе хранилища и установите срок его действия не менее 1 часа. Presigned URL истекают только по времени, не имеют лимита на скачивание и поддерживают Range
* В противном случае скопируйте изображение в публичный бакет объектного хранилища или CDN и передайте новый URL в Seedance

## Проверка ссылки перед отправкой

Выполните эти две команды на любой машине с доступом в интернет. Замените `<URL>` на вашу ссылку на изображение и оставьте её в одинарных кавычках, чтобы командная оболочка не интерпретировала `&`:

```bash theme={null}
# 1. Plain download: expect 200 and an image Content-Type such as image/png or image/jpeg
curl -s -o /dev/null -w 'code=%{http_code} type=%{content_type} size=%{size_download}\n' '<URL>'

# 2. Range download: expect 206 (or 200 with the full image), never a 4xx
curl -s -o /dev/null -w 'code=%{http_code} type=%{content_type}\n' -H 'Range: bytes=0-1023' '<URL>'
```

Также убедитесь, что:

* Обе команды возвращают изображение, а не JSON или HTML
* Повторные скачивания продолжают работать без ограничения на количество загрузок
* Не требуются cookie, сессия авторизации или дополнительные заголовки
* Ссылка остается действительной как минимум до завершения отправки, в идеале — в течение 1 часа или более
* Ссылка доступна из публичного интернета, а не находится внутри интранета или за списком разрешенных IP

<Warning>
  Проверка ссылки с ограничением на скачивание также расходует доступные загрузки. Выполняйте проверку с отдельно созданной ссылкой, чтобы не исчерпать ту, которую вы планируете отправить.
</Warning>

## Связанная документация

<CardGroup cols={2}>
  <Card title="API генерации видео" icon="video" href="/ru/api-capabilities/seedance2/video-generation">
    Три способа передачи изображений и все параметры запроса
  </Card>

  <Card title="Рабочий процесс Asset-First" icon="gauge" href="/ru/api-capabilities/seedance2/asset-first-workflow">
    Сравнение трех методов на этапе отправки и загрузка ассетов
  </Card>
</CardGroup>
