Skip to content

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.com

Le 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) :

  1. Créez une tâche avec POST /media/generate, en indiquant le modèle et les paramètres.
  2. Attendez le résultat en interrogeant GET /media/job/:id jusqu’à ce que status passe à done.
  3. Récupérez le fichier via result_url (un lien vers nordrouter.com).

1. Créer une tâche ​

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" }
  }'

Réponse :

json
{ "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 ​

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). 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 dans result_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 :

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

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 :

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.

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 :

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"])

Exigences et fiabilité :

  • callback_url doit utiliser https:// 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/:id comme 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 :

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 }

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 :

TypeFamilleModesPrix approx.
🖼 ImagesNano 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-Imagetexte→image, retoucheà partir de $0.01
🛠 UtilitairesTopaz / Recraft (image/*upscale*, image/recraft-remove-bg)agrandissement jusqu’à 8K, suppression de l’arrière-planà partir de $0.01
🎬 VidéoVeo 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
🗣 AvatarsKling Avatar, OmniHuman, InfiniteTalk, Lip Syncphoto+audio→vidéo parlanteà partir de $0.19
🎵 MusiqueSuno V6 / V6 Wild / V6 Mini (music/suno-*)texte/style→2 pistes, reprise, continuation, voix, pistes séparées, sons~$0.08
🎙 VoixElevenLabs 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) ou 480p/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 aussi 1:1-hd.
  • duration — durée de la vidéo en secondes (la plupart des modèles proposent 5/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/estimate en tient compte.
  • mode / quality / render_mode — niveau de qualité (Kling 3.0 standard/pro/4k, GPT Image medium/high, Ideogram fast/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/jpeg pour les images, glb/obj/fbx/stl/usdz pour 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 :

json
{ "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}.

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":"tasse en céramique, émail mat"}}'
idsource≈ prixcaractéristiques
3d/tripo-text, 3d/tripo-imagetexte, photoà partir de $0.31les moins chers, maillage en quadrilatères, PBR
3d/hunyuan-rapid-text, -imagetexte, photoà partir de $0.43rapide, 5 formats de fichier
3d/seed3d-imagephotoà partir de $0.50GLB, OBJ, USD, USDZ
3d/hunyuan-pro-text, -imagetexte, photoà partir de $0.71jusqu’à 1,5 million de polygones
3d/meshy-text, -image, -multi-imagetexte, photo, jusqu’à 4 angles de vueà partir de $0.94textures 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_usd une 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_days dans /media/models) — téléchargez-les pour les conserver.