Tokia

POST /v1/video/generations

Endpoint assíncrono para geração de vídeo a partir de texto ou imagem. Suporta 31 modelos de 8 provedores diferentes (Google, OpenAI, ByteDance, Alibaba, Runway, MiniMax, xAI, HeyGen e FLUX).

Fluxo completo

  1. Envie POST /v1/video/generations com modelo e prompt
  2. Receba um job ID e URL de polling (status 202)
  3. Faça GET /v1/video/generations/:id a cada 5–10 segundos
  4. Quando status: "completed", baixe o vídeo pela URL retornada

Request body

CampoTipoObrigatórioNotas
modelstringsimID do modelo de vídeo (ver tabela abaixo)
promptstringsimDescrição do vídeo desejado
image_urlstringnãoURL de imagem de referência (image-to-video)
durationnumbernãoDuração em segundos (default: modelo define)
resolutionstringnão720p, 1080p, 4k
aspect_ratiostringnão16:9, 9:16, 1:1

Exemplo — submeter vídeo

bash
curl -X POST https://api.usetokia.com/v1/video/generations \
  -H "Authorization: Bearer $TOKIA_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "veo-3-1-fast",
    "prompt": "um gato feliz usando uma bandana do Brasil, cena ensolarada, câmera lenta",
    "duration": 5,
    "resolution": "720p"
  }'

Response (202 Accepted)

json
{
  "id": "veo-3-1-fast--gen-abc123xyz",
  "status": "pending",
  "polling_url": "/v1/video/generations/veo-3-1-fast--gen-abc123xyz"
}

Exemplo — consultar status

bash
curl https://api.usetokia.com/v1/video/generations/veo-3-1-fast--gen-abc123xyz \
  -H "Authorization: Bearer $TOKIA_KEY"

Response — em progresso

json
{
  "id": "veo-3-1-fast--gen-abc123xyz",
  "status": "pending",
  "polling_url": "/v1/video/generations/veo-3-1-fast--gen-abc123xyz"
}

Response — concluído

json
{
  "id": "veo-3-1-fast--gen-abc123xyz",
  "status": "completed",
  "video_url": "https://storage.googleapis.com/.../0?X-Goog-Signature=...",
  "urls": ["https://storage.googleapis.com/.../0?X-Goog-Signature=..."],
  "expires_at": 1792421715,
  "cost_brl": 2.85,
  "polling_url": "/v1/video/generations/veo-3-1-fast--gen-abc123xyz"
}

Modelos disponíveis

Todos os modelos usam o markup padrão da plataforma sobre o custo do provedor; o valor cobrado em reais vem em cost_brl quando o vídeo conclui. Preço em BRL calculado com câmbio do dia.

Em destaque

ModeloProvedorCusto upstream (5s)Preço Tokia (5s, ≈R$)Resolução maxÁudio
veo-3-1-fastGoogle$0.40~R$ 8,964KSim
veo-3-1Google$1.00~R$ 22,404KSim
sora-2-proOpenAI$1.50~R$ 33,601080pSim
seedance-2-5ByteDance~$0.50~R$ 11,20720pSim
kling-v3-proKuaishou$0.56~R$ 12,54720pSim
gen-4-5Runway$0.60~R$ 13,44720pNão
hailuo-3-maxMiniMax$0.25~R$ 5,60768pNão
wan-3-primeAlibaba$0.34~R$ 7,621080pSim

Todos os modelos

ID TokiaNomeProvedorPreço/s (USD)DuraçãoÁudio
heygen-video-1HeyGen VideoHeyGen$0.02–0.065–15sNão
flux-video-editFLUX Video EditBFL$0.03—Não
hailuo-3-maxHailuo 3 MaxMiniMax$0.05–0.085–15sNão
wan-3-primeWan 3.0 PrimeAlibaba$0.068–0.282–30sSim
wan-3Wan 3.0Alibaba$0.05–0.202–30sSim
avatar-ivAvatar IVHeyGen$0.05—Não
flux-video-upscaleFLUX UpscaleBFL$0.075–0.105—Não
seedance-2-miniSeedance 2.0 MiniByteDance~$0.0344–15sSim
seedance-2-5Seedance 2.5ByteDance~$0.104–30sSim
flux-3-videoFLUX.3 VideoBFL$0.17–0.535–20sSim
hailuo-3Hailuo 3MiniMax$0.135–15sSim
aleph-2Aleph 2.0Runway$0.28—Não
gen-4-5Gen-4.5 TurboRunway$0.122–10sNão
grok-imagine-video-1-5Grok Video 1.5xAI$0.08–0.251–15s—
happyhorse-1-1HappyHorse 1.1Alibaba$0.099–0.1283–15s—
happyhorse-1-0HappyHorse 1.0Alibaba$0.099–0.1693–15s—
grok-imagine-videoGrok VideoxAI$0.05–0.071–15s—
kling-v3-proKling v3.0 ProKuaishou$0.1123–15sSim
kling-v3-stdKling v3.0 StdKuaishou$0.0843–15sSim
veo-3-1-fastVeo 3.1 FastGoogle$0.08–0.304–8sSim
veo-3-1-liteVeo 3.1 LiteGoogle$0.03–0.084–8sSim
kling-video-o1Kling Video O1Kuaishou$0.1125, 10sSim
hailuo-2-3Hailuo 2.3MiniMax$0.0826, 10sNão
wan-2-7Wan 2.7Alibaba$0.102–10sSim
seedance-2-0Seedance 2.0ByteDance~$0.0674–15sSim
seedance-2-0-fastSeedance 2.0 FastByteDance~$0.0404–15sSim
wan-2-6Wan 2.6Alibaba$0.04–0.155, 10sSim
seedance-1-5-proSeedance 1.5 ProByteDance~$0.0234–12sSim
sora-2-proSora 2 ProOpenAI$0.30–0.504–20sSim
veo-3-1Veo 3.1Google$0.20–0.604–8sSim
kling-falKling Video (Fal)Fal.ai$0.065——

Erros comuns

CódigoSignificadoAção
400Campos obrigatórios faltandoInclua model e prompt
401API key inválidaVerifique sua chave em /dashboard/keys
402Saldo insuficienteAdicione saldo em /dashboard
404Job não encontradoVerifique o ID do job
422Modelo não é de vídeoUse GET /v1/models?category=video
429Rate limit atingidoAguarde o tempo indicado em retry-after
502Erro do provedor upstreamTente novamente ou use outro modelo

Exemplo Python

python
import requests
import time

TOKIA_KEY = "sk-..."
BASE = "https://api.usetokia.com"

"""Submeter"""
r = requests.post(f"{BASE}/v1/video/generations", json={
    "model": "seedance-2-0-fast",
    "prompt": "cachorro golden retriever correndo na praia ao pôr do sol",
    "duration": 5,
}, headers={"Authorization": f"Bearer {TOKIA_KEY}"})
job = r.json()
print(f"Job: {job['id']}")

"""Polling"""
while True:
    r = requests.get(f"{BASE}/v1/video/generations/{job['id']}",
                     headers={"Authorization": f"Bearer {TOKIA_KEY}"})
    status = r.json()
    if status.get("status") == "completed":
        print(f"Vídeo pronto: {status.get('video_url')}")
        break
    print(f"Status: {status.get('status')}...")
    time.sleep(10)

Exemplo Node.js

typescript
const TOKIA_KEY = "sk-...";
const BASE = "https://api.usetokia.com";

const submit = await fetch(`${BASE}/v1/video/generations`, {
  method: "POST",
  headers: {
    Authorization: `Bearer ${TOKIA_KEY}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    model: "veo-3-1-fast",
    prompt: "paisagem montanhosa com nuvens passando em time-lapse",
    duration: 5,
    resolution: "1080p",
  }),
});
const job = await submit.json();
console.log("Job:", job.id);

while (true) {
  const poll = await fetch(`${BASE}/v1/video/generations/${job.id}`, {
    headers: { Authorization: `Bearer ${TOKIA_KEY}` },
  });
  const status = await poll.json();
  if (status.status === "completed") {
    console.log("Vídeo pronto:", status.video_url);
    break;
  }
  console.log("Status:", status.status);
  await new Promise((r) => setTimeout(r, 10000));
}