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.comEl 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):
- Crea una tarea:
POST /media/generatecon el modelo y los parámetros. - Espera el resultado: consulta
GET /media/job/:idhasta questatusseadone. - Descarga el archivo: mediante
result_url(un enlace anordrouter.com).
1. Crear una tarea
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:
{ "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
curl https://nordrouter.com/media/job/beefb531-…{ "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_urly la segunda enresult_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:
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:
{ "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:
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: solohttps://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
2xxo volveremos a intentarlo. - El webhook no desactiva las consultas periódicas: puedes combinar ambos métodos o usar
GET /media/job/:idcomo 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:
{ "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:
| Tipo | Familia | Modos | ≈ precio |
|---|---|---|---|
| 🖼 Imágenes | Nano Banana / 2 / Pro (image/nano-banana*) | texto→imagen, edición, hasta 4K | desde $0.025 |
| 🖼 | Imagen 4 Fast / Ultra (image/imagen4*) | texto→imagen | desde $0.025 |
| 🖼 | GPT Image 1.5 / 2 (image/gpt-image-*) | texto→imagen, edición, hasta 4K | desde $0.025 |
| 🖼 | Flux 2 Pro / Flex (image/flux2-*) | texto→imagen, edición | desde $0.03 |
| 🖼 | Seedream v4 / 4.5 / 5 Lite (image/seedream-*) | texto→imagen, edición | desde $0.04 |
| 🖼 | Ideogram v3 / Character (image/ideogram-*) | texto, remezcla, personaje | desde $0.02 |
| 🖼 | Qwen / Wan Image / Grok / Z-Image | texto→imagen, edición | desde $0.01 |
| 🛠 Utilidades | Topaz / Recraft (image/*upscale*, image/recraft-remove-bg) | escalado hasta 8K, eliminación del fondo | desde $0.01 |
| 🎬 Vídeo | Veo 3.1 Lite / Fast / Quality (video/veo-3.1-*) | texto/foto→vídeo | desde $0.19 |
| 🎬 | Kling 2.1 → 3.0 (video/kling-*) | texto/foto→vídeo, movimiento, avatares, hasta 4K y 15 s | desde $0.16 |
| 🎬 | Wan 2.2 → 2.7 (video/wan-*) | texto/foto/vídeo→vídeo, voz→vídeo | desde $0.25 |
| 🎬 | Seedance 1.5 / 2 / Fast / Mini (video/seedance-*) | texto/foto→vídeo, hasta 4K, sonido | desde $0.06 |
| 🎬 | Hailuo 02 / 2.3 (video/hailuo-*) | texto/foto→vídeo | desde $0.08 |
| 🎬 | HappyHorse 1.0 / 1.1 (video/happyhorse-*) | texto/foto/referencia→vídeo, edición de vídeo | desde $0.70 |
| 🎬 | Grok Video / 1.5 (video/grok-*) | texto/foto→vídeo, hasta 30 s | desde $0.06 |
| 🎬 | Gemini Omni (video/gemini-omni) | vídeo con sonido, hasta 4K | desde $0.39 |
| 🗣 Avatares | Kling Avatar, OmniHuman, InfiniteTalk, Lip Sync | foto+audio→vídeo hablado | desde $0.19 |
| 🎵 Música | Suno V6 / V6 Wild / V6 Mini (music/suno-*) | texto/estilo→2 pistas, versión, continuación, voz, pistas separadas, sonidos | ~$0.08 |
| 🎙 Síntesis de voz | ElevenLabs Turbo / Multilingual (audio/elevenlabs-*) | texto→voz, aislamiento de voz | desde $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) o480p/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 incluyen1:1-hd.duration— duración del vídeo en segundos (en la mayoría,5/10; en Kling 3.0 y Wan 2.7, hasta15; en Grok, hasta30). 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/estimatelo tiene en cuenta.mode/quality/render_mode— nivel de calidad (Kling 3.0standard/pro/4k, GPT Imagemedium/high, Ideogramfast/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/jpegpara imágenes,glb/obj/fbx/stl/usdzpara 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:
{ "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}.
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"}}'| id | entrada | ≈ precio | características |
|---|---|---|---|
3d/tripo-text, 3d/tripo-image | texto, foto | desde $0.31 | los más económicos, malla de cuadriláteros, PBR |
3d/hunyuan-rapid-text, -image | texto, foto | desde $0.43 | generación rápida, 5 formatos de archivo |
3d/seed3d-image | foto | desde $0.50 | GLB, OBJ, USD, USDZ |
3d/hunyuan-pro-text, -image | texto, foto | desde $0.71 | hasta 1,5 millones de polígonos |
3d/meshy-text, -image, -multi-image | texto, foto, hasta 4 ángulos | desde $0.94 | texturas 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_usdal 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_daysen/media/models): descárgalos para conservarlos.