API do Seedance 2.0: texto para vídeo e imagem para vídeo em Python
Um script cria a tarefa, acompanha o status e salva o MP4. Veja os campos, os limites e dois clipes de 5 segundos feitos em 30 de outubro de 2026.
Nesta página
- Resposta rápida
- O que você precisa antes da primeira chamada?
- Quais campos uma requisição do Seedance 2.0 aceita?
- O script em Python
- Como enviar um primeiro quadro para imagem para vídeo?
- Dois clipes que fizemos
- O que os arquivos mediram
- Quais erros e limites você vai encontrar?
- Seedance 2.0, Fast, Mini ou 2.5?
- FAQ
- Existe uma API oficial do Seedance 2.0?
- Posso mandar uma URL de imagem em vez de base64?
- Como desligo o som?
- Por que minha requisição deu timeout?
- Quanto tempo os links de vídeo duram?
- Fontes verificadas
Seedance 2.0 roda na API de mídia da OmniaKey com o ID de modelo dreamina-seedance-2-0-260128. Você envia uma tarefa por POST para https://api.omniakey.com/v1/media/tasks, consulta o ID da tarefa e depois baixa o MP4. Nossos dois clipes de 5 segundos em 720p, um a partir de texto e outro a partir de uma imagem parada, levaram 159 e 139 segundos em 30 de outubro de 2026.
Resposta rápida
- ID de modelo
dreamina-seedance-2-0-260128, com três operações:text_to_video,image_to_videoereference_to_video(a documentação da API de vídeo da OmniaKey, verificada em 30 de outubro de 2026). - Criar, consultar, baixar: a chamada de criação responde 202 com um ID, depois você faz
GET /v1/media/tasks/{id}a cada poucos segundos até o status sersucceeded(a visão geral da API de mídia da OmniaKey, verificada em 30 de outubro de 2026). - A duração vai de 4 a 15 segundos inteiros, e o ID completo 2.0 renderiza em 480P, 720P e 1080P.
- O corpo da requisição fica abaixo de 1 MiB, base64 embutido incluído.
- Nossas duas renderizações de 5 segundos em 720p terminaram em 159 segundos (texto para vídeo) e 139 segundos (primeiro quadro).
O que você precisa antes da primeira chamada?
Uma chave de API da OmniaKey, Python 3 e o ID exato do modelo. O script importa apenas a biblioteca padrão, então roda sem ambiente virtual e sem instalar pacote.
Exporte a chave em OMNIAKEY_API_KEY antes da primeira chamada. O script lê a chave uma vez e a envia como token Bearer em cada requisição, então ela fica fora do arquivo e fora do seu histórico do Git.
Crie com POST https://api.omniakey.com/v1/media/tasks e consulte com GET https://api.omniakey.com/v1/media/tasks/{id}. Essas duas chamadas mais POST /v1/media/tasks/{id}/cancel são toda a API de mídia (visão geral da API de mídia, verificada em 30 de outubro de 2026).
Escreva os IDs de modelo por inteiro. A OmniaKey não serve os apelidos curtos seedance-2 e seedance-2-5, eles respondem 503 no_available_channel (documentação da API de vídeo, verificada em 30 de outubro de 2026).
Tarefas de vídeo são cobradas adiantado por segundo de saída gerada, e o valor volta automaticamente quando a tarefa termina em failed ou canceled (visão geral da API de mídia, verificada em 30 de outubro de 2026). Para saber quanto custa cada segundo agora, veja as tarifas atuais na página do modelo Seedance 2.0.
Quais campos uma requisição do Seedance 2.0 aceita?
Quatro campos de primeiro nível carregam a tarefa, e um objeto parameters carrega as configurações de saída. Só duration não tem um padrão razoável, então envie sempre.
model: o ID completo do modelo (apelidos curtos falham)type:video(o tipo de mídia)operation:text_to_video,image_to_video,reference_to_video(nome puro, sem prefixo)input.prompt: uma string (cena, ação e câmera, até 12.000 caracteres)input.media[]:{"type": "first_frame", "url": …}(um primeiro quadro, oureference_image)
Dentro de parameters:
duration: 4 a 15, segundos inteiros (define o preço)resolution:480P,720P,1080P(Fast e Mini param em 720P)ratio:16:9,9:16,1:1,4:3,3:4,21:9,adaptive(adaptivesegue o quadro)generate_audio:truepor padrão, oufalse(falsegera um MP4 sem som)n:1(precisa ser 1)
As duas listas seguem a documentação da API de vídeo e a visão geral da API de mídia da OmniaKey (verificadas em 30 de outubro de 2026), e o limite de prompt vem da página do modelo.
Envie o nome puro da operação; a OmniaKey adiciona o prefixo do tipo de mídia (documentação da API de vídeo, verificada em 30 de outubro de 2026). Parâmetros que ela não reconhece seguem para o provedor como chegaram (visão geral da API de mídia, verificada em 30 de outubro de 2026).
Uma armadilha pega quem começa pela documentação do provedor: a API de criação de tarefa da BytePlus coloca campos dentro de content[] e no primeiro nível, então código de um tutorial da BytePlus não roda sem mudanças contra /v1/media/tasks (API de criação de tarefa da BytePlus, verificada em 30 de outubro de 2026).
O script em Python
Um arquivo faz as duas operações, e a única diferença é o corpo que ele monta. Salve como seedance_video.py e rode 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",
))
Seis pontos desse arquivo importam antes de você mudar qualquer coisa.
- Cada requisição de criação leva um
Idempotency-Keyaleatório; repetir essa chave com o mesmo corpo devolve a tarefa original com HTTP 200 e nunca cobra duas vezes (visão geral da API de mídia, verificada em 30 de outubro de 2026). - O laço espera 5 segundos entre as consultas e para depois de 180 tentativas, ou seja, 15 minutos.
- Um timeout significa que a tarefa ainda está renderizando. Consulte o mesmo ID mais tarde e nunca reenvie, ou você paga por um segundo clipe.
assets[0].urlé um link assinado que dura cerca de uma hora, por isso o script baixa assim que a tarefa dá certo (visão geral da API de mídia, verificada em 30 de outubro de 2026).progress.percentpode ficar em 0 enquanto a tarefa roda, então o laço acompanha sóstatus(documentação da API de vídeo, verificada em 30 de outubro de 2026).- A função de imagem recusa arquivo acima de 700.000 bytes, porque o base64 acrescenta um terço e o corpo precisa ficar abaixo de 1 MiB.
O formato da requisição é o mesmo do Kling 3.0 na mesma API, então trocar de modelo muda o ID e os parâmetros, não o código em volta.
Como enviar um primeiro quadro para imagem para vídeo?
Coloque a imagem em input.media[] com "type": "first_frame", embutida como URI data:image/jpeg;base64,..., do jeito que o clipe do gato usou.
input.media[] aceita uma URL HTTPS pública ou uma data URI embutida, e o corpo inteiro é limitado a 1 MiB (documentação da API de vídeo, verificada em 30 de outubro de 2026). No teste interno da OmniaKey, um link HTTPS comum para o primeiro quadro voltou como provider_submit_rejected, por isso o exemplo envia uma data URI (documentação da API de vídeo, verificada em 30 de outubro de 2026).
O base64 acrescenta um terço, então comece com um JPEG de cerca de 1024 pixels de largura: nosso primeiro quadro tinha 134.356 bytes, e um PNG de 4 MB seria recusado.
Mantenha parameters.ratio em adaptive aqui: ele segue o formato da imagem enviada, e foi assim que uma imagem parada de 1024×571 virou um clipe de 1280×720. Para reference_to_video, o mesmo array recebe "type": "reference_image" (documentação da API de vídeo, verificada em 30 de outubro de 2026).
Dois clipes que fizemos
As duas tarefas saíram em 30 de outubro de 2026 com o arquivo acima, sem alterações. A primeira é texto para vídeo, tarefa task_uF2QUtbeAAUW11lXEaLxNw1ZnBUoqvNk, criada às 01:39:43 UTC e concluída às 01:42:22 UTC. O prompt pedia o som do líquido sendo servido, então o áudio ficou ligado.
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.

Os quadros mostram um copo com gelo sobre um balcão de madeira, com garrafas e luzes quentes desfocadas atrás. O copo cresce do primeiro ao último quadro, o movimento de aproximação que o prompt pediu, e termina cheio com bolhas perto do fundo.
A segunda é imagem para vídeo, tarefa task_u85W0jn1sQLkrszJlxqXF1hxJYhsndxK, criada às 01:42:33 UTC e concluída às 01:44:52 UTC. O primeiro quadro é uma foto de um gato ruivo dormindo sobre uma pilha de livros velhos perto de uma janela com chuva (1024×571 pixels), enviada como data URI com "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.

O gato levanta a cabeça, abre os olhos, estica as duas patas da frente além da borda dos livros, boceja largo e vira a cabeça para a janela, na ordem que o prompt deu. A chuva continua escorrendo pelo vidro e o enquadramento fica parado, como pedido.

Essas duas execuções cobrem texto para vídeo e um primeiro quadro em 720P por 5 segundos. Não testamos 1080P, Fast, Mini, 2.5, reference_to_video, link HTTPS de primeiro quadro nem outras durações.
O que os arquivos mediram
Os dois downloads são MP4 H.264 em 1280×720 a 24 fps: 121 quadros, 5.04 segundos.
| Clipe | Copo | Gato |
|---|---|---|
| Operação | texto para vídeo | imagem para vídeo |
| Tempo até terminar | 159 s | 139 s |
| Tamanho do arquivo | 2.070.248 bytes | 1.352.027 bytes |
| Vídeo | 1280×720, 24 fps, 121 quadros | 1280×720, 24 fps, 121 quadros |
| Áudio | faixa AAC | nenhuma |
A faixa do clipe do copo traz o som sendo servido, o borbulhar e o gelo tilintando, sem vozes e sem música. O clipe do gato não tem faixa nenhuma, porque a requisição mandou generate_audio: false.
Os dois registros de tarefa informaram usage.completion_tokens: 108900, que é 121 × 1280 × 720 ÷ 1024, a fórmula de tokens que a BytePlus usa para estimar a cobrança de vídeo (página de preços da BytePlus, verificada em 30 de outubro de 2026).
A documentação da OmniaKey diz que um clipe de 6 segundos em 720p costuma terminar em cerca de um minuto (documentação da API de vídeo, verificada em 30 de outubro de 2026). Os nossos levaram 159 e 139 segundos, e três clipes de 5 segundos em 720p da nossa comparação de 26 de outubro levaram 144.8, 319.0 e 184.7 segundos. Planeje de 2 a 5 minutos e consulte o status em vez de manter uma requisição aberta.
Quais erros e limites você vai encontrar?
Confira três ajustes primeiro: o ID do modelo, uma duração de 4 a 15 e o áudio, que o filtro do provedor pode recusar.
| Status / Código | O que mudar |
|---|---|
400 invalid_request | corpo ou input.prompt |
400 model_price_error | duração para 4–15 s |
403 model_not_allowed | acesso do modelo para a chave |
409 idempotency_key_reused | chave nova por corpo |
503 no_available_channel | ID completo, operação pura |
| tarefa com falha, erro do provedor | ler error, depois tentar de novo |
Esses códigos vêm da visão geral da API de mídia e da documentação da API de vídeo (verificadas em 30 de outubro de 2026). Uma tarefa que termina em failed devolve a cobrança adiantada, então uma renderização recusada custa só tempo.
Fique de olho no ajuste de áudio. O Seedance renderiza uma faixa por padrão, e deixá-la ligada fez o provedor recusar uma requisição de 4 segundos em 480P com OutputAudioSensitiveContentDetected.PolicyViolation, então envie parameters.generate_audio: false a menos que a cena precise de som (documentação da API de vídeo, verificada em 30 de outubro de 2026).
A BytePlus diz que a série 2.0 não aceita imagens ou vídeos de referência com rostos humanos reais (página do Seedance 2.0 da BytePlus, verificada em 30 de outubro de 2026). O Seedance 2.0 também não tem seed nem camera_fixed, embora os dois sejam campos da API de criação de tarefa do provedor (API de criação de tarefa da BytePlus, verificada em 30 de outubro de 2026).
Quinze segundos é o teto desta família, e duration: -1 não compra nada além disso; uma gravação de 20 ou 30 segundos fica no Seedance 2.5 (página do modelo Seedance 2.0, verificada em 30 de outubro de 2026).
A OmniaKey não publica limites de taxa fixos; trate um HTTP 429 como repetível com backoff exponencial (página de erros de API da OmniaKey, verificada em 30 de outubro de 2026).
Seedance 2.0, Fast, Mini ou 2.5?
Quatro níveis aceitam o mesmo corpo de requisição, então trocar custa um ID de modelo e, no Fast e no Mini, um teto de resolução menor.
- Seedance 2.0,
dreamina-seedance-2-0-260128: 480P, 720P e 1080P, 4 a 15 segundos. O preço de tabela da BytePlus para um clipe de 5 segundos é $0.76 em 720p e $0.35 em 480p (página de preços da BytePlus, verificada em 30 de outubro de 2026). - Seedance 2.0 Fast,
dreamina-seedance-2-0-fast-260128: 480P e 720P, 4 a 15 segundos. O preço de tabela da BytePlus para um clipe de 5 segundos é $0.60 em 720p e $0.28 em 480p. - Seedance 2.0 Mini,
dreamina-seedance-2-0-mini-260615: 480P e 720P, 4 a 15 segundos. O preço de tabela da BytePlus para um clipe de 5 segundos é $0.38 em 720p e $0.18 em 480p. - Seedance 2.5,
dreamina-seedance-2-5-260628: o único ID da família que aceita gravação de 20 ou 30 segundos, e o mais lento, cerca de quatro minutos para um clipe de 4 segundos em 480P (documentação da API de vídeo, verificada em 30 de outubro de 2026). Nossa análise do Seedance 2.5 cobre o lado da imagem.
As páginas de modelo da OmniaKey informam um clipe de 4 segundos em 480P em cerca de um minuto no 2.0, dois minutos no Fast e 100 segundos no Mini (verificadas em 30 de outubro de 2026).
Pegue o ID completo 2.0 quando precisar de um master em 1080P, porque Fast e Mini param em 720P (documentação da API de vídeo, verificada em 30 de outubro de 2026). A OmniaKey define as próprias tarifas para esses IDs, então veja os valores atuais na página do modelo Seedance 2.0.
FAQ
Existe uma API oficial do Seedance 2.0?
Sim. A BytePlus ModelArk vende, e ativar lá exige saldo acima de USD 30, um Savings Plan ou um pacote de recursos Seedance (página do Seedance 2.0 da BytePlus, verificada em 30 de outubro de 2026). O script acima chama o mesmo ID de modelo pela API de mídia da OmniaKey.
Posso mandar uma URL de imagem em vez de base64?
A documentação da OmniaKey lista uma URL HTTPS pública ao lado da data URI embutida (documentação da API de vídeo, verificada em 30 de outubro de 2026). Nossas execuções foram embutidas porque um link HTTPS de primeiro quadro voltou como provider_submit_rejected no teste interno da OmniaKey, então teste uma URL em um clipe de teste primeiro.
Como desligo o som?
Envie parameters.generate_audio: false, e o MP4 chega sem faixa de áudio nenhuma, como o clipe do gato. Neste modelo o áudio vem ligado por padrão.
Por que minha requisição deu timeout?
O clipe normalmente ainda está renderizando, já que tarefas de 5 segundos em 720p levaram de 139 a 319 segundos nas nossas execuções. Consulte o mesmo ID de tarefa de novo, nunca reenvie, e aumente o limite de 15 minutos do laço para clipes de 15 segundos.
Quanto tempo os links de vídeo duram?
O link assinado em assets[0].url dura cerca de uma hora, e o registro da tarefa fica guardado por 24 horas depois da criação (visão geral da API de mídia, verificada em 30 de outubro de 2026). Baixe no primeiro sucesso ou consulte a tarefa de novo para pegar um link novo.
Fontes verificadas
- BytePlus ModelArk: guia do Seedance 2.0, verificada em 30 de outubro de 2026
- BytePlus ModelArk: API de criação de tarefa de geração de vídeo, verificada em 30 de outubro de 2026
- BytePlus ModelArk: preços dos modelos e fórmula de tokens, verificada em 30 de outubro de 2026
A documentação da própria OmniaKey, verificada em 30 de outubro de 2026: API de vídeo, visão geral da API de mídia e erros de API.
Modelos deste artigo
Artigos relacionados
Análise do Seedance 2.5
A atualização significativa é a narrativa e o controle de produção de segundos 30, não as manchetes 4K não verificadas que circulam em torno dele.
HappyHorse 1.1 vs Seedance 2.0: teste com o mesmo prompt e preço
Os mesmos três prompts no mesmo dia: Seedance 2.0 fez os melhores clipes, HappyHorse 1.1 os fez duas vezes mais rápido.
Kling 3.0 API: código da requisição de texto para vídeo e clipes reais
Uma tarefa de texto para vídeo é um POST com o modelo kling-3.0. Aqui estão o código da requisição, os campos que ela recebe e dois clipes de 5 segundos que fizemos em 29 de outubro de 2026, com as medidas.
Artigos recentes
- Codex: gerar imagem com imagegen e um provedor personalizado
- Modelos personalizados no Factory Droid: use Claude e GPT com sua própria chave de API
- Gemini 4 Carbon: data de lançamento, preço e acesso à API
- GPT Image 2.5 API: gerar e editar imagens em Python
- Review do MiniMax M3.1 Flash: benchmarks, velocidade e comparação com o M3
