Skip to content

Generación multimedia (vídeo, imágenes, música) ​

NordRouter permite generar imágenes, vídeo y música con la misma clave sk-nr-… y el mismo saldo que los modelos de texto. Se paga por generación, sin tokens ni paquetes.

Solicitudes solo desde el backend, no desde el navegador

No se puede acceder a /media/* directamente desde el navegador: la solicitud no superará la comprobación CORS y fallará con Failed to fetch.

Es una restricción intencionada. El endpoint requiere tu clave en el encabezado Authorization, y todo lo que llega al navegador es visible para cualquiera que abra las herramientas de desarrollo: la clave quedará expuesta y otras personas podrán gastar tu saldo. Ningún encabezado de fetch evita esto.

El esquema correcto:

navegador → tu servidor (la clave se guarda aquí) → nordrouter.com

El archivo generado se entrega mediante un enlace normal que puedes insertar directamente en <img src> o <video src> en la página, sin configurar nada más.

Cómo funciona ​

La generación es asíncrona (el vídeo y la música tardan desde unos segundos hasta un par de minutos):

  1. Crea una tarea: POST /media/generate con el modelo y los parámetros.
  2. Espera el resultado: consulta GET /media/job/:id hasta que status sea done.
  3. Descarga el archivo: mediante result_url (un enlace a nordrouter.com).

1. Crear una tarea ​

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": "una acogedora cabaña en un bosque invernal, acuarela", "resolution": "2k" }
  }'

Respuesta:

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

Los errores siempre tienen el mismo formato: { "error": "понятный текст", "code": "missing_param" }. Usa code para gestionar los distintos casos en tu código (invalid_input, missing_param, unknown_model, insufficient_balance, rate_limited, no_auth…); error está destinado a las personas.

2. Esperar el 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 (o failed). El archivo generado está disponible en result_url.

🎵 Suno genera dos pistas por tarea: la primera está en result_url y la segunda en result_url_2 (con el mismo formato de enlace). El precio es por la tarea completa e incluye ambas pistas.

Webhooks (en lugar de consultas periódicas) ​

Si prefieres no hacer consultas periódicas, incluye el campo callback_url en POST /media/generate y te enviaremos el resultado mediante una solicitud POST cuando termine la tarea:

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": "ваш-секрет"
  }'

Cuando la tarea pase a done/failed, se enviará a callback_url un POST con el mismo cuerpo que devuelve GET /media/job/:id, más el 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 o media.failed.

Verificación de la firma. Si has definido callback_secret, el encabezado X-NR-Signature contendrá sha256=<hmac>: el HMAC-SHA256 del cuerpo de la solicitud, calculado con tu secreto. Compruébalo para confirmar que la solicitud procede de nosotros:

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 y fiabilidad:

  • callback_url: solo https:// y una dirección pública (las IP internas o privadas se rechazan con un error 400).
  • Hasta 4 intentos de entrega con intervalos crecientes; responde con 2xx o volveremos a intentarlo.
  • El webhook no desactiva las consultas periódicas: puedes combinar ambos métodos o usar GET /media/job/:id como alternativa de respaldo.

Más información

Consulta el ciclo de vida de las tareas, ejemplos de verificación de firmas y la fiabilidad de entrega en Tareas y webhooks.

3. Lista de modelos y precios ​

GET /media/models devuelve los modelos disponibles, sus parámetros y una estimación del coste:

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 }

Referencia completa

Encontrarás todos los modelos con sus parámetros input y precios en Multimedia: todos los modelos y facturación.

Modelos ​

Hay 95 modelos disponibles; la lista completa y actualizada con parámetros y precios siempre está en GET /media/models. Familias principales:

TipoFamiliaModos≈ precio
🖼 ImágenesNano Banana / 2 / Pro (image/nano-banana*)texto→imagen, edición, hasta 4Kdesde $0.025
🖼Imagen 4 Fast / Ultra (image/imagen4*)texto→imagendesde $0.025
🖼GPT Image 1.5 / 2 (image/gpt-image-*)texto→imagen, edición, hasta 4Kdesde $0.025
🖼Flux 2 Pro / Flex (image/flux2-*)texto→imagen, edicióndesde $0.03
🖼Seedream v4 / 4.5 / 5 Lite (image/seedream-*)texto→imagen, edicióndesde $0.04
🖼Ideogram v3 / Character (image/ideogram-*)texto, remezcla, personajedesde $0.02
🖼Qwen / Wan Image / Grok / Z-Imagetexto→imagen, edicióndesde $0.01
🛠 UtilidadesTopaz / Recraft (image/*upscale*, image/recraft-remove-bg)escalado hasta 8K, eliminación del fondodesde $0.01
🎬 VídeoVeo 3.1 Lite / Fast / Quality (video/veo-3.1-*)texto/foto→vídeodesde $0.19
🎬Kling 2.1 → 3.0 (video/kling-*)texto/foto→vídeo, movimiento, avatares, hasta 4K y 15 sdesde $0.16
🎬Wan 2.2 → 2.7 (video/wan-*)texto/foto/vídeo→vídeo, voz→vídeodesde $0.25
🎬Seedance 1.5 / 2 / Fast / Mini (video/seedance-*)texto/foto→vídeo, hasta 4K, sonidodesde $0.06
🎬Hailuo 02 / 2.3 (video/hailuo-*)texto/foto→vídeodesde $0.08
🎬HappyHorse 1.0 / 1.1 (video/happyhorse-*)texto/foto/referencia→vídeo, edición de vídeodesde $0.70
🎬Grok Video / 1.5 (video/grok-*)texto/foto→vídeo, hasta 30 sdesde $0.06
🎬Gemini Omni (video/gemini-omni)vídeo con sonido, hasta 4Kdesde $0.39
🗣 AvataresKling Avatar, OmniHuman, InfiniteTalk, Lip Syncfoto+audio→vídeo habladodesde $0.19
🎵 MúsicaSuno V6 / V6 Wild / V6 Mini (music/suno-*)texto/estilo→2 pistas, versión, continuación, voz, pistas separadas, sonidos~$0.08
🎙 Síntesis de vozElevenLabs Turbo / Multilingual (audio/elevenlabs-*)texto→voz, aislamiento de vozdesde $0.04 / 1000 caracteres

Parámetros ​

Los parámetros dependen del modelo; la lista exacta está en /media/models (campo fields: nombre, tipo, opciones, valor predeterminado). Los nombres siguen un formato uniforme (snake_case), y los valores van en minúsculas. Parámetros comunes:

  • prompt — descripción (para todos los modelos generativos).
  • resolution — 1k/2k/4k (imágenes) o 480p/720p/768p/1080p/4k (vídeo). El precio depende de la resolución.
  • aspect_ratio — 1:1, 16:9, 9:16, etc.; los modelos con selección de tamaño incluyen 1:1-hd.
  • duration — duración del vídeo en segundos (en la mayoría, 5/10; en Kling 3.0 y Wan 2.7, hasta 15; en Grok, hasta 30). El vídeo se factura por segundo.
  • audio — pista de audio en el vídeo (true/false). Con sonido cuesta más; la estimación de /media/estimate lo tiene en cuenta.
  • mode / quality / render_mode — nivel de calidad (Kling 3.0 standard/pro/4k, GPT Image medium/high, Ideogram fast/balanced/quality).
  • safety_filter — filtro de contenido para mayores de 18 años (activado de forma predeterminada).
  • enhance_prompt — el modelo amplía el prompt con más detalles (Qwen, Flux 3).
  • file_format — formato de archivo (png/jpeg para imágenes, glb/obj/fbx/stl/usdz para 3D).
  • image — imagen de entrada (edición, foto→vídeo; envía un enlace directo o súbela mediante /media/upload).
  • video_url / audio_url — vídeo/audio de entrada (edición de vídeo, sincronización labial, avatares).

Música: title, style, instrumental, version (v6, v6-wild, v6-mini), advanced (ajuste preciso: título, estilo y duración duration propios), exclude_styles, vocal (female/male), continue_from (desde qué segundo continuar); para sonidos: loop, bpm, tonality; separación en pistas: mode (vocals, stems, track) y track (qué pista extraer). Controles de ajuste fino del estilo: style_weight, weirdness, audio_weight (0…1).

Síntesis de voz: text, voice (nombre corto de la voz de options, por ejemplo, james, bella, Zephyr), speed; en los modelos Gemini: style, pace, accent, voice_description, scene, temperature. Diálogo de dos voces:

json
{ "model": "audio/gemini-3.1-flash-tts",
  "input": {
    "voices": [ { "voice": "Kore", "style": "newscaster" }, { "voice": "Puck", "pace": "fast" } ],
    "dialogue": [ { "speaker": 1, "text": "¡Hola! Hoy nos acompaña…" }, { "speaker": 2, "text": "Gracias por invitarme." } ]
  } }

POST /media/estimate muestra el precio exacto de una configuración concreta antes de ejecutarla, con los mismos model + input.

Los nombres anteriores de los parámetros también funcionan

El 19 de octubre de 2026 se unificaron los nombres y valores de los parámetros (snake_case, valores en minúsculas). Si tu integración envía nombres y valores de la versión anterior de la documentación, no necesitas cambiar nada: el servidor también los acepta, y el resultado y el precio son los mismos. En /media/models y en esta documentación solo aparecen los nuevos.

🧊 Modelos 3D ​

Generación 3D a partir de texto o de una fotografía. El resultado es un archivo GLB (y también OBJ, FBX, STL, USDZ, USD o 3MF, según el modelo) junto con una imagen de vista previa: la tarea devuelve varios archivos, cada uno con su propia extensión.

La llamada es igual que para el resto de contenido multimedia: POST /media/generate y consulta periódica de 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":"taza de cerámica, esmalte mate"}}'
identrada≈ preciocaracterísticas
3d/tripo-text, 3d/tripo-imagetexto, fotodesde $0.31los más económicos, malla de cuadriláteros, PBR
3d/hunyuan-rapid-text, -imagetexto, fotodesde $0.43generación rápida, 5 formatos de archivo
3d/seed3d-imagefotodesde $0.50GLB, OBJ, USD, USDZ
3d/hunyuan-pro-text, -imagetexto, fotodesde $0.71hasta 1,5 millones de polígonos
3d/meshy-text, -image, -multi-imagetexto, foto, hasta 4 ángulosdesde $0.94texturas de hasta 8K, pose del personaje

Foto como textura. Los modelos 3d/meshy-* aceptan una imagen independiente (texture_photo) o una descripción del material en palabras (texture_text): la textura se define independientemente de la geometría. 3d/meshy-multi-image utiliza hasta cuatro ángulos de un mismo objeto para obtener una geometría más precisa.

El precio solo se conoce después de la generación

La generación 3D se factura según los recursos realmente utilizados, por lo que el importe exacto se conoce después de que se haya generado el modelo. Reservamos el coste máximo posible y, cuando el cálculo está listo, cobramos el coste real y devolvemos la diferencia. El importe final siempre aparece en el campo cost_usd.

En el estudio, estos modelos llevan una etiqueta y la generación solo comienza después de tu consentimiento.

Requiere tiempo. La generación 3D tarda entre medio minuto y varios minutos, más que una imagen o un vídeo corto. No es necesario mantener la tarea abierta: el estado se conserva y hay webhooks disponibles.

Coste y almacenamiento ​

  • Se descuenta de tu saldo en USD según el coste real de la generación: el importe exacto aparece en cost_usd al finalizar.
  • Las generaciones fallidas no se facturan: el importe reservado se devuelve automáticamente.
  • Los archivos se almacenan en nuestros servidores durante un tiempo limitado (consulta retention_days en /media/models): descárgalos para conservarlos.