Skip to content

Geração de mídia (vídeo, imagens, música) ​

O NordRouter pode gerar imagens, vídeos e músicas usando a mesma chave sk-nr-… e o mesmo saldo das modelos de texto. Você paga pelo uso, sem tokens nem pacotes.

Solicitações somente pelo backend, não pelo navegador

Não é possível acessar /media/* diretamente pelo navegador: a solicitação não passará pela verificação de CORS e terminará com Failed to fetch.

Isso é intencional. O endpoint exige sua chave no cabeçalho Authorization, e tudo o que chega ao navegador fica visível para qualquer pessoa que abrir as ferramentas do desenvolvedor: sua chave será exposta e outras pessoas poderão gastar seu saldo. Nenhum cabeçalho em fetch protege contra isso.

A arquitetura correta:

navegador → seu servidor (a chave fica aqui) → nordrouter.com

O arquivo gerado é disponibilizado por um link comum, que você pode usar diretamente em <img src> ou <video src> na página, sem precisar configurar nada.

Como funciona ​

A geração é assíncrona (vídeos e músicas levam de alguns segundos a alguns minutos):

  1. Crie uma tarefa — POST /media/generate com o modelo e os parâmetros.
  2. Aguarde o resultado — consulte GET /media/job/:id até que status seja done.
  3. Obtenha o arquivo — usando result_url (um link para nordrouter.com).

1. Criar uma tarefa ​

bash
curl https://nordrouter.com/media/generate \
  -H "Authorization: Bearer sk-nr-YOUR-KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "image/nano-banana-2",
    "input": { "prompt": "уютная хижина в зимнем лесу, акварель", "resolution": "2k" }
  }'

Resposta:

json
{ "id": "beefb531-…", "model": "image/nano-banana-2", "status": "processing",
  "poll": "https://nordrouter.com/media/job/beefb531-…" }

Os erros sempre têm o mesmo formato: { "error": "texto explicativo", "code": "missing_param" }. Use code para ramificações no código (invalid_input, missing_param, unknown_model, insufficient_balance, rate_limited, no_auth…), e error para exibição ao usuário.

2. Aguardar o resultado ​

bash
curl https://nordrouter.com/media/job/beefb531-…
json
{ "id": "beefb531-…", "status": "done",
  "result_url": "https://nordrouter.com/media/file/beefb531-…",
  "cost_usd": 0.052, "error": null }

status: processing → done (ou failed). O arquivo fica disponível em result_url.

🎵 Suno gera duas faixas por tarefa: a primeira fica em result_url, e a segunda, em result_url_2 (no mesmo formato de link). O preço é por tarefa e já inclui as duas faixas.

Webhooks (em vez de polling) ​

Se não quiser consultar o status, informe o campo callback_url em POST /media/generate e enviaremos o resultado automaticamente por uma solicitação POST quando a tarefa for concluída:

bash
curl https://nordrouter.com/media/generate \
  -H "Authorization: Bearer sk-nr-YOUR-KEY" -H "Content-Type: application/json" \
  -d '{
    "model": "image/nano-banana-2",
    "input": { "prompt": "…" },
    "callback_url": "https://your-server.com/webhooks/nordrouter",
    "callback_secret": "ваш-секрет"
  }'

Quando a tarefa passar para done/failed, será enviada para callback_url uma solicitação POST com o mesmo corpo retornado por GET /media/job/:id, além do campo event:

json
{ "event": "media.completed", "id": "beefb531-…", "status": "done",
  "result_url": "https://nordrouter.com/media/file/beefb531-…", "cost_usd": 0.052, "error": null }

event: media.completed ou media.failed.

Verificação da assinatura. Se você definir callback_secret, o cabeçalho X-NR-Signature conterá sha256=<hmac> — HMAC-SHA256 do corpo da solicitação, usando seu segredo. Confira a assinatura para confirmar que a solicitação veio de nós:

python
import hmac, hashlib
expected = "sha256=" + hmac.new(secret.encode(), raw_body, hashlib.sha256).hexdigest()
assert hmac.compare_digest(expected, request.headers["X-NR-Signature"])

Requisitos e confiabilidade:

  • callback_url deve usar https:// e ser um endereço público (IP interno/privado será rejeitado com erro 400).
  • Até 4 tentativas de entrega, com intervalos crescentes; responda com 2xx, caso contrário, tentaremos novamente.
  • O webhook não substitui o polling: você pode combiná-los ou usar GET /media/job/:id como alternativa.

Saiba mais

O ciclo de vida da tarefa, a verificação da assinatura com exemplos e a confiabilidade da entrega estão na página Tarefas e webhooks.

3. Lista de modelos e preços ​

GET /media/models retorna os modelos disponíveis, seus parâmetros e o custo estimado:

json
{ "models": [
    { "id": "image/nano-banana-2", "type": "image",
      "fields": [ {"name":"prompt","type":"textarea"}, {"name":"resolution","type":"select","options":["1k","2k","4k"]},
                  {"name":"safety_filter","type":"bool","default":true} ],
      "est_usd": 0.052 }
  ], "retention_days": 14 }

Referência completa

Todos os modelos, com os parâmetros input e os preços, estão na página Mídia: todos os modelos e cobrança.

Modelos ​

Estão disponíveis 95 modelos — a lista completa e atualizada, com parâmetros e preços, está sempre em GET /media/models. Principais famílias:

TipoFamíliaModos≈ preço
🖼 ImagensNano Banana / 2 / Pro (image/nano-banana*)texto→imagem, edição, até 4Ka partir de $0.025
🖼Imagen 4 Fast / Ultra (image/imagen4*)texto→imagema partir de $0.025
🖼GPT Image 1.5 / 2 (image/gpt-image-*)texto→imagem, edição, até 4Ka partir de $0.025
🖼Flux 2 Pro / Flex (image/flux2-*)texto→imagem, ediçãoa partir de $0.03
🖼Seedream v4 / 4.5 / 5 Lite (image/seedream-*)texto→imagem, ediçãoa partir de $0.04
🖼Ideogram v3 / Character (image/ideogram-*)texto, remix, personagema partir de $0.02
🖼Qwen / Wan Image / Grok / Z-Imagetexto→imagem, ediçãoa partir de $0.01
🛠 UtilitáriosTopaz / Recraft (image/*upscale*, image/recraft-remove-bg)aumento de resolução até 8K, remoção de fundoa partir de $0.01
🎬 VídeoVeo 3.1 Lite / Fast / Quality (video/veo-3.1-*)texto/foto→vídeoa partir de $0.19
🎬Kling 2.1 → 3.0 (video/kling-*)texto/foto→vídeo, movimento, avatares, até 4K e 15sa partir de $0.16
🎬Wan 2.2 → 2.7 (video/wan-*)texto/foto/vídeo→vídeo, fala→vídeoa partir de $0.25
🎬Seedance 1.5 / 2 / Fast / Mini (video/seedance-*)texto/foto→vídeo, até 4K, áudioa partir de $0.06
🎬Hailuo 02 / 2.3 (video/hailuo-*)texto/foto→vídeoa partir de $0.08
🎬HappyHorse 1.0 / 1.1 (video/happyhorse-*)texto/foto/referência→vídeo, edição de vídeoa partir de $0.70
🎬Grok Video / 1.5 (video/grok-*)texto/foto→vídeo, até 30sa partir de $0.06
🎬Gemini Omni (video/gemini-omni)vídeo com áudio, até 4Ka partir de $0.39
🗣 AvataresKling Avatar, OmniHuman, InfiniteTalk, Lip Syncfoto+áudio→vídeo com falaa partir de $0.19
🎵 MúsicaSuno V6 / V6 Wild / V6 Mini (music/suno-*)texto/estilo→2 faixas, cover, continuação, vocais, faixas, sons~$0.08
🎙 Síntese de vozElevenLabs Turbo / Multilingual (audio/elevenlabs-*)texto→fala, isolamento de voza partir de $0.04 / 1000 caracteres

Parâmetros ​

Os parâmetros dependem do modelo — a lista exata está em /media/models (campo fields: nome, tipo, opções, valor padrão). Os nomes seguem um padrão único (snake_case), e os valores usam letras minúsculas. Parâmetros comuns:

  • prompt — descrição (para todos os modelos generativos).
  • resolution — 1k/2k/4k (imagens) ou 480p/720p/768p/1080p/4k (vídeo). O preço depende da resolução.
  • aspect_ratio — 1:1, 16:9, 9:16 etc.; modelos com seleção de tamanho oferecem 1:1-hd.
  • duration — duração do vídeo em segundos (na maioria, 5/10; no Kling 3.0 e Wan 2.7, até 15; no Grok, até 30). O vídeo é cobrado por segundo.
  • audio — faixa de áudio no vídeo (true/false). Com áudio, o preço é maior — a estimativa em /media/estimate considera isso.
  • mode / quality / render_mode — nível de qualidade (Kling 3.0 standard/pro/4k, GPT Image medium/high, Ideogram fast/balanced/quality).
  • safety_filter — filtro de conteúdo 18+ (ativado por padrão).
  • enhance_prompt — o próprio modelo acrescenta detalhes ao prompt (Qwen, Flux 3).
  • file_format — formato do arquivo (png/jpeg para imagens, glb/obj/fbx/stl/usdz para 3D).
  • image — imagem de entrada (edição, foto→vídeo; envie um link direto ou faça upload via /media/upload).
  • video_url / audio_url — vídeo/áudio de entrada (edição de vídeo, sincronização labial, avatares).

Música: title, style, instrumental, version (v6, v6-wild, v6-mini), advanced (ajuste preciso: título, estilo e duração duration personalizados), exclude_styles, vocal (female/male), continue_from (a partir de qual segundo continuar); para sons — loop, bpm, tonality; separação em faixas — mode (vocals, stems, track) e track (qual faixa extrair). Ajustes finos de estilo: style_weight, weirdness, audio_weight (0…1).

Síntese de voz: text, voice (nome curto da voz em options, por exemplo, james, bella, Zephyr), speed; nos modelos Gemini — style, pace, accent, voice_description, scene, temperature. Diálogo com duas vozes:

json
{ "model": "audio/gemini-3.1-flash-tts",
  "input": {
    "voices": [ { "voice": "Kore", "style": "newscaster" }, { "voice": "Puck", "pace": "fast" } ],
    "dialogue": [ { "speaker": 1, "text": "Olá! Hoje recebemos…" }, { "speaker": 2, "text": "Obrigado pelo convite." } ]
  } }

O preço exato de uma configuração específica antes da execução é informado por POST /media/estimate com os mesmos model + input.

Os nomes antigos dos parâmetros também funcionam

Em 19 de outubro de 2026, os parâmetros passaram a ter nomes e valores padronizados (snake_case, valores em minúsculas). Se a sua integração envia nomes e valores da versão anterior da documentação, não é necessário alterar nada: o servidor também os aceita, e o resultado e o preço são os mesmos. Em /media/models e nesta documentação, aparecem apenas os novos.

🧊 Modelos 3D ​

Geração 3D a partir de texto ou foto. A saída inclui GLB (além de OBJ, FBX, STL, USDZ, USD e 3MF em modelos diferentes) e uma imagem de pré-visualização: a tarefa retorna vários arquivos, cada um com sua própria extensão.

A chamada é igual à das outras mídias: POST /media/generate e consulta de status com GET /media/job/{id}.

bash
curl -X POST https://nordrouter.com/media/generate   -H "Authorization: Bearer $NR_KEY" -H "Content-Type: application/json"   -d '{"model":"3d/tripo-text","input":{"prompt":"caneca de cerâmica com esmalte fosco"}}'
identrada≈ preçocaracterísticas
3d/tripo-text, 3d/tripo-imagetexto, fotoa partir de $0.31mais barato de todos, malha quad, PBR
3d/hunyuan-rapid-text, -imagetexto, fotoa partir de $0.43rápido, 5 formatos de arquivo
3d/seed3d-imagefotoa partir de $0.50GLB, OBJ, USD, USDZ
3d/hunyuan-pro-text, -imagetexto, fotoa partir de $0.71até 1,5 milhão de polígonos
3d/meshy-text, -image, -multi-imagetexto, foto, até 4 ângulosa partir de $0.94texturas de até 8K, pose de personagem

Foto como textura. Os modelos 3d/meshy-* aceitam uma imagem separada (texture_photo) ou uma descrição textual do material (texture_text): a textura é definida independentemente da geometria. O 3d/meshy-multi-image recebe até quatro ângulos do mesmo objeto, o que resulta em uma geometria mais precisa.

O preço só é conhecido após a geração

A geração 3D é cobrada de acordo com os recursos efetivamente utilizados, então o valor exato só é conhecido depois que o modelo é processado. Reservamos o custo máximo possível e, quando o processamento termina, cobramos o valor real e devolvemos a diferença. O valor final fica sempre visível no campo cost_usd.

No Studio, esses modelos são identificados por um selo, e a geração só começa após sua confirmação.

O processamento demora. A geração 3D leva de meio minuto a vários minutos, mais tempo do que uma imagem ou um vídeo curto. Não é necessário manter a tarefa aberta: o status é salvo e há webhooks.

Custo e armazenamento ​

  • O valor é descontado do seu saldo em USD com base no custo real da geração; o valor exato aparece em cost_usd após a conclusão.
  • Gerações malsucedidas não são cobradas; o valor reservado é devolvido automaticamente.
  • Os arquivos ficam armazenados nos nossos servidores por tempo limitado (consulte retention_days em /media/models); faça o download para mantê-los.