API Seedance 2.0: текст в видео и изображение в видео на Python
Один скрипт создаёт задачу, опрашивает статус и сохраняет MP4. Дальше — поля, лимиты и два 5-секундных клипа, сделанных 30 октября 2026 года.
На этой странице
- Короткий ответ
- Что нужно перед первым вызовом?
- Какие поля принимает запрос к Seedance 2.0?
- Скрипт на Python
- Как отправить первый кадр для изображения в видео?
- Два клипа, которые мы сделали
- Что показали файлы
- Какие ошибки и лимиты вас ждут?
- Seedance 2.0, Fast, Mini или 2.5?
- FAQ
- Есть ли официальный API Seedance 2.0?
- Можно отправить ссылку на картинку вместо base64?
- Как отключить звук?
- Почему запрос завершился таймаутом?
- Сколько живут ссылки на видео?
- Проверенные источники
Seedance 2.0 работает в медиа-API OmniaKey под идентификатором модели dreamina-seedance-2-0-260128. Вы отправляете задачу POST-запросом на https://api.omniakey.com/v1/media/tasks, опрашиваете идентификатор задачи, а затем скачиваете MP4. Наши два 5-секундных клипа в 720p, один из текста и второй из статичной картинки, заняли 159 и 139 секунд 30 октября 2026 года.
Короткий ответ
- Идентификатор модели
dreamina-seedance-2-0-260128и три операции:text_to_video,image_to_videoиreference_to_video(документация видео-API OmniaKey, проверена 30 октября 2026 года). - Создать, опросить, скачать: вызов создания отвечает 202 и возвращает id, затем вы вызываете
GET /v1/media/tasks/{id}каждые несколько секунд, пока статус не станетsucceeded(обзор медиа-API OmniaKey, проверен 30 октября 2026 года). - Длительность — от 4 до 15 целых секунд, а полный id 2.0 рендерит 480P, 720P и 1080P.
- Всё тело запроса остаётся меньше 1 MiB, включая base64 внутри.
- Наши два 5-секундных рендера в 720p завершились за 159 секунд (текст в видео) и 139 секунд (первый кадр).
Что нужно перед первым вызовом?
Ключ API OmniaKey, Python 3 и точный идентификатор модели. Скрипт импортирует только стандартную библиотеку, поэтому работает без виртуального окружения и без установки пакетов.
Экспортируйте ключ в переменную OMNIAKEY_API_KEY перед первым вызовом. Скрипт читает её один раз и отправляет как Bearer-токен в каждом запросе, поэтому ключ остаётся вне файла и вне истории Git.
Создание — POST https://api.omniakey.com/v1/media/tasks, опрос — GET https://api.omniakey.com/v1/media/tasks/{id}. Эти два вызова плюс POST /v1/media/tasks/{id}/cancel и составляют весь медиа-API (обзор медиа-API, проверен 30 октября 2026 года).
Пишите идентификаторы моделей полностью. OmniaKey не обслуживает короткие псевдонимы seedance-2 и seedance-2-5, они отвечают 503 no_available_channel (документация видео-API, проверена 30 октября 2026 года).
Видеозадачи списываются заранее за секунду сгенерированного результата, и списание возвращается автоматически, когда задача завершается со статусом failed или canceled (обзор медиа-API, проверен 30 октября 2026 года). Сколько стоит секунда сейчас, видно на странице модели Seedance 2.0.
Какие поля принимает запрос к Seedance 2.0?
Четыре поля верхнего уровня описывают задачу, объект parameters — настройки результата. Разумного значения по умолчанию нет только у duration, поэтому отправляйте его всегда.
model: полный идентификатор модели (короткие псевдонимы не работают)type:video(тип медиа)operation:text_to_video,image_to_video,reference_to_video(имя без префикса)input.prompt: одна строка (сцена, действие и камера, до 12 000 символов)input.media[]:{"type": "first_frame", "url": …}(первый кадр илиreference_image)
Внутри parameters:
duration: от 4 до 15, целые секунды (определяет цену)resolution:480P,720P,1080P(Fast и Mini заканчиваются на 720P)ratio:16:9,9:16,1:1,4:3,3:4,21:9,adaptive(adaptiveследует за кадром)generate_audio:trueпо умолчанию, либоfalse(falseдаёт MP4 без звука)n:1(должно быть 1)
Оба списка следуют документации видео-API и обзору медиа-API OmniaKey (проверены 30 октября 2026 года), лимит промпта взят со страницы модели.
Отправляйте чистое имя операции: префикс типа медиа OmniaKey добавляет сам (документация видео-API, проверена 30 октября 2026 года). Неизвестные параметры уходят провайдеру как есть (обзор медиа-API, проверен 30 октября 2026 года).
Одна ловушка ждёт тех, кто начинает с документации провайдера: API создания задачи BytePlus кладёт поля внутрь content[] и на верхний уровень, поэтому код из туториала BytePlus не заработает без изменений против /v1/media/tasks (API создания задачи BytePlus, проверен 30 октября 2026 года).
Скрипт на Python
Один файл выполняет обе операции, разница только в теле, которое он собирает. Сохраните его как seedance_video.py и запустите python3 seedance_video.py.
import base64
import json
import os
import time
import urllib.error
import urllib.request
import uuid
API = "https://api.omniakey.com/v1/media/tasks"
KEY = os.environ["OMNIAKEY_API_KEY"]
MODEL = "dreamina-seedance-2-0-260128"
def request(method, url, body=None, extra_headers=None):
headers = {"Authorization": f"Bearer {KEY}", "User-Agent": "omniakey-example/1"}
data = None
if body is not None:
headers["Content-Type"] = "application/json"
data = json.dumps(body).encode()
headers.update(extra_headers or {})
req = urllib.request.Request(url, data=data, headers=headers, method=method)
with urllib.request.urlopen(req, timeout=120) as resp:
return json.load(resp)
def poll(url, attempts=5):
for attempt in range(attempts):
try:
return request("GET", url)
except urllib.error.HTTPError as err:
if err.code < 500 or attempt == attempts - 1:
raise
except urllib.error.URLError:
if attempt == attempts - 1:
raise
time.sleep(5 * (attempt + 1))
def run_task(body, out_path):
task = request("POST", API, body, {"Idempotency-Key": str(uuid.uuid4())})["id"]
print("task", task, flush=True)
for _ in range(180): # 5-second polls, up to 15 minutes
time.sleep(5)
state = poll(f"{API}/{task}")
if state["status"] not in ("queued", "processing"):
break
else:
raise TimeoutError(f"{task} is still {state['status']}: poll it again later, do not resubmit")
if state["status"] != "succeeded":
raise RuntimeError(state.get("error") or state["status"])
asset_url = state["assets"][0]["url"] # signed link: short-lived, so download now
req = urllib.request.Request(asset_url, headers={"User-Agent": "omniakey-example/1"})
with urllib.request.urlopen(req, timeout=300) as resp, open(out_path, "wb") as f:
f.write(resp.read())
return task
def text_to_video(prompt, out_path, duration=5, resolution="720P", ratio="16:9"):
body = {
"model": MODEL,
"type": "video",
"operation": "text_to_video",
"input": {"prompt": prompt},
"parameters": {"duration": duration, "resolution": resolution, "ratio": ratio},
}
return run_task(body, out_path)
def image_to_video(prompt, image_path, out_path, duration=5, resolution="720P", audio=False):
with open(image_path, "rb") as f:
raw = f.read()
if len(raw) > 700_000: # base64 adds a third, and the whole body must stay under 1 MiB
raise ValueError("first frame too large: save it as a JPEG about 1024 px wide")
frame = "data:image/jpeg;base64," + base64.b64encode(raw).decode()
body = {
"model": MODEL,
"type": "video",
"operation": "image_to_video",
"input": {"prompt": prompt, "media": [{"type": "first_frame", "url": frame}]},
"parameters": {"duration": duration, "resolution": resolution, "ratio": "adaptive",
"generate_audio": audio},
}
return run_task(body, out_path)
if __name__ == "__main__":
print("done", text_to_video(
"Close-up of a tall glass on a wooden bar counter. Sparkling water is poured over ice; bubbles "
"rise and the ice cubes clink and shift. Warm evening light from the left. The camera slowly "
"pushes in. Sound of pouring, fizzing and clinking ice. No people, no text.",
"sparkling-glass.mp4",
))
print("done", image_to_video(
"The cat slowly wakes, stretches its front paws and yawns, then looks toward the window. "
"Raindrops keep running down the glass. The camera stays still.",
"cat.jpg",
"cat-wakes.mp4",
))
Шесть мест в этом файле важны, прежде чем что-то менять.
- Каждый запрос создания несёт случайный
Idempotency-Key; повтор с тем же ключом и тем же телом возвращает исходную задачу с HTTP 200 и никогда не списывает деньги дважды (обзор медиа-API, проверен 30 октября 2026 года). - Цикл ждёт 5 секунд между опросами и останавливается после 180 попыток, то есть через 15 минут.
- Таймаут означает, что задача ещё рендерится. Опросите тот же идентификатор позже и никогда не отправляйте задачу снова, иначе вы платите за второй клип.
assets[0].url— подписанная ссылка примерно на час, поэтому скрипт скачивает файл сразу после успеха (обзор медиа-API, проверен 30 октября 2026 года).progress.percentможет стоять на 0, пока задача выполняется, поэтому цикл следит только заstatus(документация видео-API, проверена 30 октября 2026 года).- Функция для картинки отклоняет файл больше 700 000 байт: base64 добавляет треть, а тело должно остаться меньше 1 MiB.
Форма запроса совпадает с Kling 3.0 на том же API: смена модели меняет идентификатор и параметры, а не код вокруг.
Как отправить первый кадр для изображения в видео?
Поместите картинку в input.media[] с "type": "first_frame" — внутри запроса, как URI data:image/jpeg;base64,..., как в нашем клипе с котом.
input.media[] принимает публичный HTTPS-URL или data URI внутри запроса, а всё тело ограничено 1 MiB (документация видео-API, проверена 30 октября 2026 года). В собственном тесте OmniaKey обычная HTTPS-ссылка на первый кадр вернулась с provider_submit_rejected, поэтому пример отправляет data URI (документация видео-API, проверена 30 октября 2026 года).
Base64 добавляет треть, поэтому начинайте с JPEG шириной около 1024 пикселей: наш первый кадр весил 134 356 байт, а PNG на 4 МБ уже не прошёл бы.
Оставьте parameters.ratio в значении adaptive: оно повторяет форму отправленной картинки, именно так статичный кадр 1024×571 стал клипом 1280×720. Для reference_to_video тот же массив принимает "type": "reference_image" (документация видео-API, проверена 30 октября 2026 года).
Два клипа, которые мы сделали
Обе задачи ушли 30 октября 2026 года с файлом выше, без изменений. Первая — текст в видео, задача task_uF2QUtbeAAUW11lXEaLxNw1ZnBUoqvNk, создана в 01:39:43 UTC, завершена успешно в 01:42:22 UTC. Промпт просил звук наливаемой воды, поэтому звук остался включён.
Close-up of a tall glass on a wooden bar counter. Sparkling water is poured over ice; bubbles rise and the ice cubes clink and shift. Warm evening light from the left. The camera slowly pushes in. Sound of pouring, fizzing and clinking ice. No people, no text.

На кадрах стакан со льдом на деревянной барной стойке, позади размыты бутылки и тёплый свет. Стакан растёт от первого кадра к последнему, тот самый наезд камеры из промпта, и в конце он полный, с пузырьками у дна.
Вторая — изображение в видео, задача task_u85W0jn1sQLkrszJlxqXF1hxJYhsndxK, создана в 01:42:33 UTC, завершена успешно в 01:44:52 UTC. Первый кадр — снимок рыжего кота, спящего на стопке старых книг у окна с дождём (1024×571 пикселей), отправленный как data URI с "type": "first_frame".
The cat slowly wakes, stretches its front paws and yawns, then looks toward the window. Raindrops keep running down the glass. The camera stays still.

Кот поднимает голову, открывает глаза, вытягивает обе передние лапы за край книг, широко зевает и поворачивает голову к окну, в том порядке, который задал промпт. Дождь продолжает стекать по стеклу, а кадр остаётся неподвижным, как и просили.

Эти два прогона покрывают текст в видео и первый кадр в 720P на 5 секунд. 1080P, Fast, Mini, 2.5, reference_to_video, HTTPS-ссылку для первого кадра и другие длительности мы не проверяли.
Что показали файлы
Оба файла — MP4 H.264 в 1280×720 при 24 fps: 121 кадр, 5.04 секунды.
| Клип | Стакан | Кот |
|---|---|---|
| Операция | текст в видео | изображение в видео |
| Время до готовности | 159 с | 139 с |
| Размер файла | 2 070 248 байт | 1 352 027 байт |
| Видео | 1280×720, 24 fps, 121 кадр | 1280×720, 24 fps, 121 кадр |
| Аудио | дорожка AAC | нет |
Дорожка клипа со стаканом несёт звук наливаемой воды, шипение и звон льда, без голосов и без музыки. У клипа с котом дорожки нет вовсе, потому что запрос отправлял generate_audio: false.
Обе записи задачи сообщали usage.completion_tokens: 108900 — это 121 × 1280 × 720 ÷ 1024, формула токенов, которой BytePlus оценивает списание за видео (страница тарифов BytePlus, проверена 30 октября 2026 года).
Документация OmniaKey говорит, что 6-секундный клип в 720p обычно готов примерно за минуту (документация видео-API, проверена 30 октября 2026 года). Наши заняли 159 и 139 секунд, а три 5-секундных клипа в 720p из нашего сравнения 26 октября — 144.8, 319.0 и 184.7 секунды. Планируйте от 2 до 5 минут и опрашивайте статус, а не держите запрос открытым.
Какие ошибки и лимиты вас ждут?
Проверьте три настройки: идентификатор модели, длительность от 4 до 15 и звук, который может отклонить фильтр провайдера.
| Статус / Код | Что изменить |
|---|---|
400 invalid_request | тело или input.prompt |
400 model_price_error | длительность до 4–15 с |
403 model_not_allowed | доступ ключа к модели |
409 idempotency_key_reused | новый ключ на каждое тело |
503 no_available_channel | полный id, чистое имя операции |
| сбой задачи, ошибка провайдера | прочитать error и повторить |
Эти коды взяты из обзора медиа-API и документации видео-API (проверены 30 октября 2026 года). Задача, которая завершается со статусом failed, возвращает предоплату, поэтому отклонённый рендер стоит только времени.
Следите за настройкой звука. Seedance по умолчанию рендерит дорожку, и с включённым звуком провайдер отклонил запрос на 4 секунды в 480P с OutputAudioSensitiveContentDetected.PolicyViolation; отправляйте parameters.generate_audio: false, если сцене не нужен звук (документация видео-API, проверена 30 октября 2026 года).
BytePlus пишет, что серия 2.0 не принимает референсные изображения и видео с настоящими человеческими лицами (страница Seedance 2.0 у BytePlus, проверена 30 октября 2026 года). У Seedance 2.0 также нет seed и camera_fixed, хотя оба поля есть в API создания задачи у провайдера (API создания задачи BytePlus, проверен 30 октября 2026 года).
Пятнадцать секунд — потолок этого семейства, и duration: -1 ничего сверх него не даёт; съёмка на 20 или 30 секунд — это Seedance 2.5 (страница модели Seedance 2.0, проверена 30 октября 2026 года).
OmniaKey не публикует фиксированные лимиты частоты; считайте HTTP 429 повторяемым и делайте экспоненциальную задержку (страница ошибок API OmniaKey, проверена 30 октября 2026 года).
Seedance 2.0, Fast, Mini или 2.5?
Четыре уровня принимают одно и то же тело запроса: переход стоит одного идентификатора модели и, на Fast и Mini, более низкого потолка разрешения.
- Seedance 2.0,
dreamina-seedance-2-0-260128: 480P, 720P и 1080P, от 4 до 15 секунд. Прайс-лист BytePlus за 5-секундный клип — $0.76 в 720p и $0.35 в 480p (страница тарифов BytePlus, проверена 30 октября 2026 года). - Seedance 2.0 Fast,
dreamina-seedance-2-0-fast-260128: 480P и 720P, от 4 до 15 секунд. Прайс-лист BytePlus за 5-секундный клип — $0.60 в 720p и $0.28 в 480p. - Seedance 2.0 Mini,
dreamina-seedance-2-0-mini-260615: 480P и 720P, от 4 до 15 секунд. Прайс-лист BytePlus за 5-секундный клип — $0.38 в 720p и $0.18 в 480p. - Seedance 2.5,
dreamina-seedance-2-5-260628: единственный id семейства, который принимает съёмку на 20 или 30 секунд, и самый медленный, около четырёх минут на 4-секундный клип в 480P (документация видео-API, проверена 30 октября 2026 года). Наш обзор Seedance 2.5 описывает картинку.
Страницы моделей OmniaKey указывают для 4-секундного клипа в 480P около минуты на 2.0, две минуты на Fast и 100 секунд на Mini (проверены 30 октября 2026 года).
Берите полный id 2.0, когда нужен мастер в 1080P: Fast и Mini заканчиваются на 720P (документация видео-API, проверена 30 октября 2026 года). Для этих id OmniaKey задаёт свои тарифы, актуальные значения — на странице модели Seedance 2.0.
FAQ
Есть ли официальный API Seedance 2.0?
Да. Его продаёт BytePlus ModelArk, и для активации там нужен баланс выше USD 30, Savings Plan или пакет ресурсов Seedance (страница Seedance 2.0 у BytePlus, проверена 30 октября 2026 года). Скрипт выше вызывает тот же идентификатор модели через медиа-API OmniaKey.
Можно отправить ссылку на картинку вместо base64?
Документация OmniaKey называет публичный HTTPS-URL рядом с data URI внутри запроса (документация видео-API, проверена 30 октября 2026 года). Наши прогоны шли с data URI, потому что HTTPS-ссылка на первый кадр вернулась с provider_submit_rejected в тесте самой OmniaKey; попробуйте ссылку сначала на тестовом клипе.
Как отключить звук?
Отправьте parameters.generate_audio: false, и MP4 придёт вообще без звуковой дорожки, как клип с котом. В этой модели звук включён по умолчанию.
Почему запрос завершился таймаутом?
Клип обычно ещё рендерится: 5-секундные задачи в 720p в наших прогонах занимали от 139 до 319 секунд. Опросите тот же идентификатор задачи, никогда не отправляйте её снова и поднимите 15-минутный лимит цикла для 15-секундных клипов.
Сколько живут ссылки на видео?
Подписанная ссылка в assets[0].url живёт около часа, а сама запись задачи хранится 24 часа после создания (обзор медиа-API, проверен 30 октября 2026 года). Скачивайте при первом успехе или опросите задачу снова, чтобы получить свежую ссылку.
Проверенные источники
- BytePlus ModelArk: руководство по Seedance 2.0, проверено 30 октября 2026 года
- BytePlus ModelArk: API создания задачи генерации видео, проверено 30 октября 2026 года
- BytePlus ModelArk: тарифы моделей и формула токенов, проверено 30 октября 2026 года
Документация самой OmniaKey, проверена 30 октября 2026 года: видео-API, обзор медиа-API и ошибки API.
Модели в этой статье
Похожие статьи
Обзор Seedance 2.5
Главное обновление — 30-секундный сторителлинг и производственный контроль, а не неподтвержденные заголовки о 4K.
HappyHorse 1.1 vs Seedance 2.0: тест на одинаковых промптах и цена
Три одинаковых промпта в один день: Seedance 2.0 сделал клипы лучше, а HappyHorse 1.1 — вдвое быстрее.
Kling 3.0 API: генерация видео по тексту, код запроса и реальные клипы
Задача text-to-video — это один POST с моделью kling-3.0. Ниже код запроса, поля, которые он принимает, и два 5-секундных клипа, сделанные 29 октября 2026 года, с измерениями.
Недавние статьи
- Codex: генерация изображений через свой провайдер и imagegen
- Свои модели в Factory Droid: как подключить Claude и GPT со своим API-ключом
- Gemini 4 Carbon: дата выхода, цена и доступ по API
- GPT Image 2.5 API: генерация и редактирование изображений на Python
- Обзор MiniMax M3.1 Flash: бенчмарки, скорость и сравнение с M3
