🎁 Novo Cadastre-se grátis, 10 chamadas por nossa conta. Até US$ 1, sem cartão.

Geração de vídeo

POST /v1/videos · GET /v1/videos/{id} · DELETE /v1/videos/{id}

Gere vídeos curtos a partir de um prompt de texto, opcionalmente guiados por quadros de referência (primeiro/último). É uma API de jobs assíncronos no formato padrão create + poll: POST /v1/videos cria uma tarefa que responde em ~2 segundos, você faz polling até terminar, e o header Prefer: wait transforma gerações rápidas em uma única chamada síncrona. Modelos Seedance, uma única chave de API, a mesma cobrança dos demais endpoints.

A API de vídeo está em preview limitado (testes por convite). Os modelos aparecem no catálogo e nos preços, mas criar tarefas exige que seu workspace esteja na lista de permissões — entre em contato para habilitá-lo.

Endpoints e ciclo de vida da tarefa

Um recurso de tarefa, quatro operações. Uma tarefa passa de queuedin_progress → um estado terminal: completed, failed ou cancelled. A resposta de criação traz links status_url / cancel_url prontos — você nunca monta URLs à mão.

EndpointDescrição
POST /v1/videosCria uma tarefa de geração. Responde em ~2 s com o objeto da tarefa (status queued) e os links de polling.
GET /v1/videos/{id}Faz polling da tarefa. Em completed você recebe data[0].url, usage.completion_tokens e os parâmetros realmente aplicados; em failed um erro estruturado com o código e a mensagem do provedor.
DELETE /v1/videos/{id}Cancela a tarefa. Apenas tarefas queued podem ser canceladas; tarefas canceladas nunca são cobradas.
GET /v1/videos/modelsLista os modelos de vídeo disponíveis para sua chave, com as restrições de resolução/duração e os preços de cada modelo.

Açúcar síncrono — Prefer: wait

Adicione um header Prefer: wait ou Prefer: wait=N (N limitado a 1..60 segundos) à chamada de criação e o gateway mantém a requisição aberta. Se a tarefa terminar dentro da janela, você recebe o objeto terminal direto — com URL do vídeo e usage, sem polling. Se não terminar a tempo, a chamada degrada graciosamente: você recebe o objeto de status atual (sem erro, a tarefa continua rodando) e segue com o polling normal.

Corpo da requisição

ParâmetroTipoDescrição
model*stringO modelo de vídeo a usar (ex.: seedance-1-5-pro-251215). Liste todos os modelos disponíveis via GET /v1/videos/models.
prompt*stringDescrição em texto do vídeo desejado.
imagestring | string[]Entrada image-to-video: uma imagem = primeiro quadro, duas imagens = primeiro + último quadro. Cada entrada é um data URI ou uma URL https.
resolutionstringResolução de saída: 480p, 720p, 1080p ou 4k. O conjunto suportado varia por modelo — veja a tabela de modelos.
ratiostringProporção: 16:9, 4:3, 1:1, 3:4, 9:16, 21:9 ou adaptive.
durationintegerDuração do clipe em segundos (faixa por modelo dentro de 2..15). Alguns modelos também aceitam -1 para o modelo escolher.
seedintegerSeed opcional para saída reproduzível (onde houver suporte).
watermarkbooleanSe a marca d'água do provedor deve ser renderizada.
generate_audiobooleanGerar trilha de áudio (padrão true). Em modelos com tarifa dupla isso muda o preço — veja a tabela de modelos.

Modelos disponíveis

A disponibilidade de modelos depende do seu deployment. Obtenha a lista ao vivo e sensível a conformidade — com as restrições de resolução/duração e os preços de cada modelo — via GET /v1/videos/models. A formação atual:

ModeloResoluçõesDuraçãoPreçoNotas
dreamina-seedance-2-0-260128 480p · 720p · 1080p · 4k 4–15 s 480p/720p $7.0 · 1080p $7.7 · 4k $4.0 Carro-chefe 2.0; até 4K
dreamina-seedance-2-0-fast-260128 480p · 720p 4–15 s $5.6 Variante 2.0 mais rápida
dreamina-seedance-2-0-mini-260615 480p · 720p 4–15 s $3.5 Menor variante 2.0
seedance-1-5-pro-251215 480p · 720p · 1080p 4–12 s $2.4 audio · $1.2 muted Tarifa depende de generate_audio
seedance-1-0-pro-fast-251015 480p · 720p · 1080p 2–12 s $1.0 O mais barato

Preço: USD por 1M de video tokens. seedance-1-5-pro-251215 cobra $2.4 com a trilha de áudio ligada (generate_audio: true, o padrão) e $1.2 sem ela; os demais modelos cobram uma tarifa única por faixa de resolução.

Video tokens e preços

Vídeo é cobrado por video tokens, derivados da saída real: tokens ≈ largura × altura × 24 fps × segundos / 1024. As tarifas são por 1M de video tokens e seguem os parâmetros realmente aplicados (ecoados na tarefa completed) — assim, ratio: "adaptive" e duration: -1 são cobrados pelo que o modelo realmente produziu.

Âncoras intuitivas no seedance-1-5-pro-251215 com áudio: um clipe 480p / 16:9 / 4 s ≈ 40,6K video tokens ≈ $0.10; um de 720p / 5 s ≈ 108,9K tokens ≈ $0.26.

Cobrança

Cobrado apenas em caso de sucesso: o débito acontece uma única vez, quando a tarefa atinge completed pela primeira vez, conforme o usage de video tokens retornado. Tarefas com falha (incluindo rejeições da moderação de conteúdo) e canceladas nunca são cobradas — o erro do provedor é repassado na íntegra.

!

O data[0].url retornado é uma URL pré-assinada do provedor que expira em ~24 horas — baixe logo e re-hospede o arquivo no seu próprio armazenamento se precisar dele a longo prazo.

Exemplo — curl, em um passo (Prefer: wait)

curl https://synthorai.io/v1/videos \
  -H "Authorization: Bearer $SYNTHORAI_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Prefer: wait=60" \
  -d '{
    "model": "seedance-1-0-pro-fast-251015",
    "prompt": "A corgi puppy chasing a butterfly across a meadow, cinematic",
    "resolution": "480p",
    "ratio": "16:9",
    "duration": 4
  }'

# Finished inside the wait window → the terminal object comes straight back:
{
  "id": "vid_6091d8d1af805818b1470488",
  "object": "video",
  "model": "seedance-1-0-pro-fast-251015",
  "status": "completed",
  "data": [{ "url": "https://…tos….mp4?…" }],
  "usage": { "completion_tokens": 40594, "total_tokens": 40594 },
  "resolution": "480p", "ratio": "16:9", "duration": 4, "fps": 24,
  "seed": 34142
}
# Not done in time → the current status object is returned instead (no error,
# the task keeps running) — continue polling status_url as usual.

Exemplo — curl, create + poll

# 1) Create — returns in ~2 s with a queued task object
curl https://synthorai.io/v1/videos \
  -H "Authorization: Bearer $SYNTHORAI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "seedance-1-5-pro-251215",
    "prompt": "A corgi puppy chasing a butterfly across a meadow, cinematic",
    "resolution": "720p",
    "duration": 5,
    "generate_audio": true
  }'

{
  "id": "vid_6091d8d1af805818b1470488",
  "object": "video",
  "model": "seedance-1-5-pro-251215",
  "status": "queued",
  "created_at": 1784619862,
  "status_url": "https://synthorai.io/v1/videos/vid_6091d8d1af805818b1470488",
  "cancel_url": "https://synthorai.io/v1/videos/vid_6091d8d1af805818b1470488"
}

# 2) Poll until status is terminal (completed | failed | cancelled)
curl https://synthorai.io/v1/videos/vid_6091d8d1af805818b1470488 \
  -H "Authorization: Bearer $SYNTHORAI_API_KEY"

{
  "id": "vid_6091d8d1af805818b1470488",
  "object": "video",
  "model": "seedance-1-5-pro-251215",
  "status": "completed",
  "data": [{ "url": "https://…tos….mp4?…" }],
  "usage": { "completion_tokens": 108900, "total_tokens": 108900 },
  "resolution": "720p", "ratio": "16:9", "duration": 5, "fps": 24,
  "seed": 34142, "generate_audio": true
}

# 3) Download the video — the URL is pre-signed (no auth header) and expires
#    in ~24 h: fetch promptly and re-host if you need it long-term.
curl -o out.mp4 "https://…tos….mp4?…"

Exemplo — Python (requests)

import time
import requests

BASE = "https://synthorai.io/v1"
HEADERS = {"Authorization": "Bearer YOUR_API_KEY"}

task = requests.post(f"{BASE}/videos", headers=HEADERS, json={
    "model": "seedance-1-5-pro-251215",
    "prompt": "A corgi puppy chasing a butterfly across a meadow, cinematic",
    "resolution": "720p",
    "duration": 5,
}).json()

while task["status"] not in ("completed", "failed", "cancelled"):
    time.sleep(5)
    task = requests.get(task["status_url"], headers=HEADERS).json()

if task["status"] == "completed":
    url = task["data"][0]["url"]  # pre-signed, valid ~24 h — re-host promptly
    with open("out.mp4", "wb") as f:
        f.write(requests.get(url).content)
else:
    print(task["error"])  # provider code + message, passed through verbatim

Exemplo — Node (fetch)

import fs from "node:fs";

const BASE = "https://synthorai.io/v1";
const HEADERS = { Authorization: `Bearer ${process.env.SYNTHORAI_API_KEY}` };

let task = await (await fetch(`${BASE}/videos`, {
  method: "POST",
  headers: { ...HEADERS, "Content-Type": "application/json" },
  body: JSON.stringify({
    model: "seedance-1-5-pro-251215",
    prompt: "A corgi puppy chasing a butterfly across a meadow, cinematic",
    resolution: "720p",
    duration: 5,
  }),
})).json();

while (!["completed", "failed", "cancelled"].includes(task.status)) {
  await new Promise((r) => setTimeout(r, 5000));
  task = await (await fetch(task.status_url, { headers: HEADERS })).json();
}

if (task.status === "completed") {
  const url = task.data[0].url; // pre-signed, valid ~24 h — re-host promptly
  fs.writeFileSync("out.mp4", Buffer.from(await (await fetch(url)).arrayBuffer()));
} else {
  console.error(task.error); // provider code + message, passed through verbatim
}

Idempotência

Passe um header X-Idempotency-Key na chamada de criação para tornar retries seguros: uma requisição repetida com a mesma chave retorna 409 em vez de criar (e cobrar) uma segunda tarefa. Geração de vídeo é lenta e propensa a retries — isso evita cobranças duplas.