Génération de médias (vidéo, images, musique)
NordRouter peut générer des images, des vidéos et de la musique avec la même clé sk-nr-… et le même solde que pour les modèles de texte. Vous payez à l’usage, sans jetons ni forfaits.
Requêtes uniquement depuis le serveur, pas depuis le navigateur
Il est impossible d’appeler directement /media/* depuis le navigateur : la requête échouera à la vérification CORS et se terminera par Failed to fetch.
C’est intentionnel. L’endpoint nécessite votre clé dans l’en-tête Authorization, et tout ce qui est transmis au navigateur est visible par quiconque ouvre les outils de développement. Votre clé serait alors exposée et des tiers pourraient dépenser votre solde. Aucun en-tête fetch ne protège contre cela.
La bonne architecture :
navigateur → votre serveur (la clé reste ici) → nordrouter.comLe fichier généré est ensuite accessible par un lien classique, que vous pouvez insérer directement dans <img src> ou <video src> sur votre page. Aucune configuration supplémentaire n’est nécessaire.
Fonctionnement
La génération est asynchrone (la vidéo et la musique prennent de quelques secondes à quelques minutes) :
- Créez une tâche avec
POST /media/generate, en indiquant le modèle et les paramètres. - Attendez le résultat en interrogeant
GET /media/job/:idjusqu’à ce questatuspasse àdone. - Récupérez le fichier via
result_url(un lien versnordrouter.com).
1. Créer une tâche
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" }
}'Réponse :
{ "id": "beefb531-…", "model": "image/nano-banana-2", "status": "processing",
"poll": "https://nordrouter.com/media/job/beefb531-…" }Les erreurs ont toujours le même format : { "error": "понятный текст", "code": "missing_param" }. Le champ code permet de gérer les cas dans votre code (invalid_input, missing_param, unknown_model, insufficient_balance, rate_limited, no_auth…), tandis que error est destiné à l’utilisateur.
2. Attendre le résultat
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 (ou failed). Le fichier généré est accessible via result_url.
🎵 Suno génère deux morceaux par tâche : le premier se trouve dans
result_url, le second dansresult_url_2(même format de lien). Le prix s’applique à la tâche entière ; les deux morceaux sont inclus.
Webhooks (au lieu du polling)
Vous ne souhaitez pas interroger l’API ? Transmettez le champ callback_url dans POST /media/generate et nous vous enverrons le résultat par une requête POST dès que la tâche sera terminée :
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": "ваш-секрет"
}'Lorsque la tâche passe à l’état done ou failed, une requête POST contenant le même corps que la réponse de GET /media/job/:id, ainsi que le champ event, est envoyée à callback_url :
{ "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.
Vérification de la signature. Si vous avez défini callback_secret, l’en-tête X-NR-Signature contient sha256=<hmac> : un HMAC-SHA256 du corps de la requête, calculé avec votre secret. Vérifiez-le pour vous assurer que la requête vient bien de nous :
import hmac, hashlib
expected = "sha256=" + hmac.new(secret.encode(), raw_body, hashlib.sha256).hexdigest()
assert hmac.compare_digest(expected, request.headers["X-NR-Signature"])Exigences et fiabilité :
callback_urldoit utiliserhttps://et être une adresse publique (les adresses IP internes ou privées sont rejetées avec une erreur 400).- Jusqu’à 4 tentatives d’envoi sont effectuées, avec un délai croissant. Répondez avec un code
2xx, sinon nous réessaierons. - Le webhook ne remplace pas le polling : vous pouvez combiner les deux ou utiliser
GET /media/job/:idcomme solution de secours.
En savoir plus
Pour connaître le cycle de vie des tâches, vérifier les signatures avec des exemples et en savoir plus sur la fiabilité de livraison, consultez la page Tâches et webhooks.
3. Liste des modèles et tarifs
GET /media/models renvoie les modèles disponibles, leurs paramètres et une estimation du coût :
{ "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 }Référence complète
Retrouvez tous les modèles, leurs paramètres input et leurs tarifs sur la page Médias : tous les modèles et la facturation.
Modèles
95 modèles sont disponibles. La liste complète et à jour, avec les paramètres et les prix, est toujours accessible via GET /media/models. Principales familles :
| Type | Famille | Modes | Prix approx. |
|---|---|---|---|
| 🖼 Images | Nano Banana / 2 / Pro (image/nano-banana*) | texte→image, retouche, jusqu’à 4K | à partir de $0.025 |
| 🖼 | Imagen 4 Fast / Ultra (image/imagen4*) | texte→image | à partir de $0.025 |
| 🖼 | GPT Image 1.5 / 2 (image/gpt-image-*) | texte→image, retouche, jusqu’à 4K | à partir de $0.025 |
| 🖼 | Flux 2 Pro / Flex (image/flux2-*) | texte→image, retouche | à partir de $0.03 |
| 🖼 | Seedream v4 / 4.5 / 5 Lite (image/seedream-*) | texte→image, retouche | à partir de $0.04 |
| 🖼 | Ideogram v3 / Character (image/ideogram-*) | texte, remix, personnage | à partir de $0.02 |
| 🖼 | Qwen / Wan Image / Grok / Z-Image | texte→image, retouche | à partir de $0.01 |
| 🛠 Utilitaires | Topaz / Recraft (image/*upscale*, image/recraft-remove-bg) | agrandissement jusqu’à 8K, suppression de l’arrière-plan | à partir de $0.01 |
| 🎬 Vidéo | Veo 3.1 Lite / Fast / Quality (video/veo-3.1-*) | texte/photo→vidéo | à partir de $0.19 |
| 🎬 | Kling 2.1 → 3.0 (video/kling-*) | texte/photo→vidéo, motion, avatars, jusqu’à 4K et 15 s | à partir de $0.16 |
| 🎬 | Wan 2.2 → 2.7 (video/wan-*) | texte/photo/vidéo→vidéo, speech-to-video | à partir de $0.25 |
| 🎬 | Seedance 1.5 / 2 / Fast / Mini (video/seedance-*) | texte/photo→vidéo, jusqu’à 4K, audio | à partir de $0.06 |
| 🎬 | Hailuo 02 / 2.3 (video/hailuo-*) | texte/photo→vidéo | à partir de $0.08 |
| 🎬 | HappyHorse 1.0 / 1.1 (video/happyhorse-*) | texte/photo/référence→vidéo, retouche vidéo | à partir de $0.70 |
| 🎬 | Grok Video / 1.5 (video/grok-*) | texte/photo→vidéo, jusqu’à 30 s | à partir de $0.06 |
| 🎬 | Gemini Omni (video/gemini-omni) | vidéo avec audio, jusqu’à 4K | à partir de $0.39 |
| 🗣 Avatars | Kling Avatar, OmniHuman, InfiniteTalk, Lip Sync | photo+audio→vidéo parlante | à partir de $0.19 |
| 🎵 Musique | Suno V6 / V6 Wild / V6 Mini (music/suno-*) | texte/style→2 pistes, reprise, continuation, voix, pistes séparées, sons | ~$0.08 |
| 🎙 Voix | ElevenLabs Turbo / Multilingual (audio/elevenlabs-*) | texte→parole, isolation de la voix | à partir de $0.04 / 1000 caractères |
Paramètres
Les paramètres dépendent du modèle. La liste exacte se trouve dans /media/models (champ fields : nom, type, options, valeur par défaut). Les noms suivent une convention uniforme (snake_case) et les valeurs sont en minuscules. Paramètres communs :
prompt— description (pour tous les modèles génératifs).resolution—1k/2k/4k(images) ou480p/720p/768p/1080p/4k(vidéos). Le prix dépend de la résolution.aspect_ratio—1:1,16:9,9:16, etc. ; les modèles qui proposent le choix de taille acceptent aussi1:1-hd.duration— durée de la vidéo en secondes (la plupart des modèles proposent5/10, Kling 3.0 et Wan 2.7 jusqu’à15, Grok jusqu’à30). La vidéo est facturée à la seconde.audio— piste audio dans la vidéo (true/false). L’audio entraîne un coût supplémentaire ; l’estimation dans/media/estimateen tient compte.mode/quality/render_mode— niveau de qualité (Kling 3.0standard/pro/4k, GPT Imagemedium/high, Ideogramfast/balanced/quality).safety_filter— filtre 18+ (activé par défaut).enhance_prompt— le modèle étoffe le prompt automatiquement (Qwen, Flux 3).file_format— format du fichier (png/jpegpour les images,glb/obj/fbx/stl/usdzpour la 3D).image— image d’entrée (retouche, photo→vidéo ; indiquez un lien direct ou téléversez l’image via/media/upload).video_url/audio_url— vidéo/audio d’entrée (video-edit, lip sync, avatars).
Musique : title, style, instrumental, version (v6, v6-wild, v6-mini), advanced (réglage précis : titre, style et durée duration personnalisés), exclude_styles, vocal (female/male), continue_from (seconde à partir de laquelle poursuivre), et pour les sons : loop, bpm, tonality ; séparation en pistes : mode (vocals, stems, track) et track (piste à extraire). Réglages fins du style : style_weight, weirdness, audio_weight (0…1).
Voix : text, voice (nom court de la voix parmi les options, par exemple james, bella, Zephyr), speed ; pour les modèles Gemini : style, pace, accent, voice_description, scene, temperature. Dialogue entre deux voix :
{ "model": "audio/gemini-3.1-flash-tts",
"input": {
"voices": [ { "voice": "Kore", "style": "newscaster" }, { "voice": "Puck", "pace": "fast" } ],
"dialogue": [ { "speaker": 1, "text": "Привет! Сегодня у нас в гостях…" }, { "speaker": 2, "text": "Спасибо, что позвали." } ]
} }Pour connaître le prix exact d’une configuration avant de la lancer, utilisez POST /media/estimate avec les mêmes valeurs model et input.
Les anciens noms de paramètres fonctionnent aussi
Le 19 octobre 2026, les paramètres ont adopté des noms et des valeurs uniformes (snake_case, valeurs en minuscules). Si votre intégration transmet les noms et les valeurs de l’ancienne version de la documentation, vous n’avez rien à changer : le serveur les accepte également, avec le même résultat et le même prix. /media/models et cette documentation présentent uniquement les nouveaux noms et valeurs.
🧊 Modèles 3D
Génération 3D à partir de texte ou d’une photo. En sortie : GLB (ainsi que OBJ, FBX, STL, USDZ, USD, 3MF selon les modèles) et une image d’aperçu : la tâche renvoie plusieurs fichiers, chacun avec sa propre extension.
L’appel est identique à celui des autres médias : POST /media/generate et interrogation 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":"tasse en céramique, émail mat"}}'| id | source | ≈ prix | caractéristiques |
|---|---|---|---|
3d/tripo-text, 3d/tripo-image | texte, photo | à partir de $0.31 | les moins chers, maillage en quadrilatères, PBR |
3d/hunyuan-rapid-text, -image | texte, photo | à partir de $0.43 | rapide, 5 formats de fichier |
3d/seed3d-image | photo | à partir de $0.50 | GLB, OBJ, USD, USDZ |
3d/hunyuan-pro-text, -image | texte, photo | à partir de $0.71 | jusqu’à 1,5 million de polygones |
3d/meshy-text, -image, -multi-image | texte, photo, jusqu’à 4 angles de vue | à partir de $0.94 | textures jusqu’à 8K, pose du personnage |
Une photo comme texture. Les modèles 3d/meshy-* acceptent une image distincte (texture_photo) ou une description textuelle du matériau (texture_text) — la texture est définie indépendamment de la géométrie. 3d/meshy-multi-image accepte jusqu’à quatre angles de vue d’un même objet pour obtenir une géométrie plus précise.
Le prix n’est connu qu’après la génération
La 3D est facturée selon les ressources réellement utilisées ; le montant exact n’est donc connu qu’après le calcul du modèle. Nous réservons le montant maximal possible, puis, une fois le calcul terminé, nous débitons le coût réel et remboursons la différence. Le montant final est toujours indiqué dans le champ cost_usd.
Dans le studio, ces modèles sont signalés par un badge, et la génération ne démarre qu’après votre accord.
Cela prend du temps. Le calcul 3D prend de trente secondes à plusieurs minutes — plus longtemps qu’une image ou une courte vidéo. Vous n’avez pas besoin de garder la tâche ouverte : son statut est conservé et des webhooks sont disponibles.
Coût et stockage
- Votre solde en USD est débité du coût réel de la génération — le montant exact est indiqué dans
cost_usdune fois la génération terminée. - Les générations échouées ne sont pas facturées — le montant réservé est automatiquement restitué.
- Les fichiers sont conservés sur nos serveurs pendant une durée limitée (voir
retention_daysdans/media/models) — téléchargez-les pour les conserver.