GPT-6 Sol e Claude Opus 5.5 disponíveisGPT-6 Sol pela metade do preço do 5.6 Sol

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.

Kiki, OmniaKey COO11 min de leitura
Nesta página

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_video e reference_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 ser succeeded (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, ou reference_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 (adaptive segue o quadro)
  • generate_audio: true por padrão, ou false (false gera 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.

python
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-Key aleató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.percent pode 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.

prompt
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.
Oito quadros de um copo alto de água com gás sobre um balcão de madeira, do copo sendo servido até o copo cheio com bolhas perto do fundo.
Oito quadros do clipe do copo em ordem cronológica, de 0.0 a 5.0 segundos. Seedance 2.0 pela API da OmniaKey, texto para vídeo, 5 segundos, 720P, feito em 30 de outubro de 2026.

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".

prompt
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.
Oito quadros de um gato ruivo dormindo sobre uma pilha de livros perto de uma janela com chuva, acordando, esticando as patas e bocejando.
Oito quadros do clipe do gato em ordem cronológica, de 0.0 a 5.0 segundos. Seedance 2.0 pela API da OmniaKey, imagem para vídeo, 5 segundos, 720P, feito em 30 de outubro de 2026.

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.

À esquerda a imagem parada do gato ruivo enviada como primeiro quadro, à direita o último quadro do clipe, com as patas esticadas sobre os livros e a cabeça virada para a janela.
Esquerda: a imagem parada enviada como primeiro quadro. Direita: o último quadro do clipe do gato. Seedance 2.0 pela API da OmniaKey, imagem para vídeo, 5 segundos, 720P, feito em 30 de outubro de 2026.

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.

ClipeCopoGato
Operaçãotexto para vídeoimagem para vídeo
Tempo até terminar159 s139 s
Tamanho do arquivo2.070.248 bytes1.352.027 bytes
Vídeo1280×720, 24 fps, 121 quadros1280×720, 24 fps, 121 quadros
Áudiofaixa AACnenhuma

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ódigoO que mudar
400 invalid_requestcorpo ou input.prompt
400 model_price_errorduração para 4–15 s
403 model_not_allowedacesso do modelo para a chave
409 idempotency_key_reusedchave nova por corpo
503 no_available_channelID completo, operação pura
tarefa com falha, erro do provedorler 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.

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

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

Seedance 2.0vídeo com IAAPI de vídeoimagem para vídeoPython

Artigos relacionados

Artigos recentes