Skip to content

API média — images, vidéo, musique ​

Générez 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. Facturation unique, paiement à l’usage, sans abonnement ni forfait.

  • Base : https://nordrouter.com (ou https://global-api.nordrouter.com pour les réseaux à l’étranger).
  • Authentification : en-tête Authorization: Bearer sk-nr-… (ou X-API-Key: sk-nr-…).
  • Format : JSON, génération asynchrone (créer une tâche → interroger son statut → récupérer le fichier).

Endpoints ​

MéthodeDescription
POST /media/generateCréer une tâche de génération
GET /media/job/:idStatut et résultat de la tâche
POST /media/estimateObtenir le prix d’une configuration à l’avance
GET /media/modelsListe des modèles et paramètres lisible par machine
POST /media/uploadImporter un fichier média source
GET /media/file/:idFichier généré (lien fourni par result_url)

Cycle de vie d’une requête ​

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": "video/kling-2.6-i2v",
        "input": { "prompt": "mouvement de caméra fluide vers l’avant", "image": "https://…/photo.png", "duration": "5", "audio": true } }'
json
{ "id": "b1f2…", "model": "video/kling-2.6-i2v", "status": "processing", "poll": "https://nordrouter.com/media/job/b1f2…" }

2. Interroger le statut (toutes les 3 à 5 secondes)

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

3. Récupérer le fichier à l’aide de result_url. Le lien pointe vers nordrouter.com (votre marque). Les fichiers sont conservés pendant 14 jours, puis supprimés. Téléchargez-les ou transférez-les vers votre propre stockage avant cette échéance.

Importer des fichiers média source

Les champs image, image2, audio_url et video_url acceptent un lien public direct. Les modèles qui utilisent le champ attachments acceptent un tableau d’objets renvoyés par POST /media/upload : envoyez { "data": "data:audio/mpeg;base64,…", "name": "track.mp3" }, puis transmettez toute la réponse du téléversement dans input.attachments. Pour Suno, vous pouvez à la place fournir une URL publique dans input.source_url, et pour un mashup, deux URL dans input.source_urls.

Facturation ​

Les frais sont prélevés sur votre solde en dollars (le même que celui utilisé pour les modèles de texte), au coût réel de la génération, exactement selon les tarifs indiqués dans les tableaux ci-dessous.

  • Réservation → coût réel. À la création de la tâche, une estimation du coût est réservée. Une fois la génération terminée, le montant est recalculé selon le résultat réel et le trop-perçu est recrédité sur votre solde.
  • Vidéo : facturation à la seconde. Le prix augmente avec la durée et la résolution ; l’activation du son coûte plus cher. Les tableaux indiquent le tarif « à partir de » pour les paramètres par défaut ; la mention /sec correspond au tarif par seconde.
  • Aucun frais en cas d’erreur. Si la tâche se termine avec le statut failed, la totalité du montant réservé est remboursée. Vous ne payez que les générations réussies.
  • Prix exact à l’avance : POST /media/estimate renvoie { "usd": … } avant le lancement, avec les mêmes valeurs model et input.
  • Le solde est rechargé en roubles (≈ 1 $ = 89–96 ₽) ; tous les calculs sont ensuite effectués en USD.

Catalogue des modèles ​

Prix : pour la vidéo, tarif par seconde (/sec), total = tarif × durée (la résolution et le son peuvent aussi modifier le tarif) ; pour le reste, prix par génération avec les paramètres par défaut. Le coût exact de toute configuration est renvoyé par POST /media/estimate.

L’objet input peut contenir davantage de champs : la liste lisible par machine (types, options, valeurs par défaut, plages de durée en secondes) est toujours renvoyée par GET /media/models. Les champs obligatoires sont marqués d’un *. Vous pouvez envoyer directement dans input tous les champs supplémentaires du modèle (negative_prompt, seed, cfg_scale…).

Anciens noms de paramètres ​

Le 19 octobre 2026, les paramètres ont adopté des noms et des valeurs uniformes : snake_case, valeurs en minuscules (par exemple, version: "v6-wild", resolution: "720p", audio: true). Les noms et valeurs de l’ancienne version de la documentation sont toujours acceptés : les intégrations écrites auparavant n’ont pas besoin d’être modifiées ; la tâche, le résultat et le prix restent les mêmes. Dans GET /media/models, MCP et cette documentation, seuls les nouveaux noms sont utilisés. Si la requête contient à la fois l’ancien et le nouveau nom d’un même paramètre, le nouveau nom prévaut.

🖼 Images ​

modelModeParamètres inputFichierPrix
image/nano-bananatexte→imageprompt *, aspect_ratio=1:1|16:9|9:16|3:4|4:3|3:2|2:3|21:9|auto, safety_filter=boolPNG$0.025
image/nano-banana-2texte→imageprompt *, aspect_ratio=auto|1:1|16:9|9:16|3:4|4:3|21:9, resolution=1k|2k|4k, image=url, safety_filter=boolPNG$0.050
image/nano-banana-2-litetexte→imageprompt *, aspect_ratio=auto|1:1|16:9|9:16|3:4|4:3, image=url, safety_filter=boolPNG$0.025
image/nano-banana-protexte→imageprompt *, aspect_ratio=1:1|16:9|9:16|3:4|4:3|21:9|auto, resolution=1k|2k|4k, image=url, safety_filter=boolPNG$0.11
image/imagen4-fasttexte→imageprompt *, aspect_ratio=1:1|16:9|9:16|3:4|4:3, safety_filter=boolPNG$0.025
image/imagen4texte→imageprompt *, aspect_ratio=1:1|16:9|9:16|3:4|4:3, safety_filter=boolPNG$0.050
image/imagen4-ultratexte→imageprompt *, aspect_ratio=1:1|16:9|9:16|3:4|4:3, safety_filter=boolPNG$0.075
image/gpt-image-1.5texte→imageprompt *, aspect_ratio=1:1|2:3|3:2, quality=medium|high, safety_filter=boolPNG$0.025
image/gpt-image-1.5-editretouche d’imageprompt *, image=url *, aspect_ratio=3:2|1:1|2:3, quality=medium|high, safety_filter=boolPNG$0.025
image/gpt-image-2texte→imageprompt *, aspect_ratio=1:1|3:2|2:3|16:9|9:16|4:3|3:4, resolution=1k|2k|4kPNG$0.006
image/gpt-image-2-editretouche d’imageprompt *, image=url *, aspect_ratio=auto|1:1|3:2|2:3|16:9|9:16, resolution=1k|2k|4k, safety_filter=boolPNG$0.037
image/flux2-protexte→imageprompt *, aspect_ratio=1:1|4:3|3:4|16:9|9:16|3:2|2:3, resolution=1k|2k, safety_filter=boolPNG$0.031
image/flux2-pro-editretouche d’imageprompt *, image=url *, aspect_ratio=1:1|4:3|3:4|16:9|9:16|3:2|2:3|auto, resolution=1k|2k, safety_filter=boolPNG$0.031
image/flux2-flextexte→imageprompt *, aspect_ratio=1:1|4:3|3:4|16:9|9:16|3:2|2:3, resolution=1k|2k, safety_filter=boolPNG$0.087
image/flux2-flex-editretouche d’imageprompt *, image=url *, aspect_ratio=1:1|4:3|3:4|16:9|9:16|3:2|2:3|auto, resolution=1k|2k, safety_filter=boolPNG$0.087
image/seedream-editretouche d’imageprompt *, image=url *, aspect_ratio=1:1-hd|1:1|3:4|9:16|4:3|16:9, resolution=1k|2k|4k, safety_filter=boolPNG$0.037
image/seedream-4.5-editretouche d’imageprompt *, image=url *, aspect_ratio=1:1|4:3|3:4|16:9|9:16|2:3|3:2, quality=basic|high, safety_filter=boolPNG$0.044
image/seedream-5-lite-editretouche d’imageprompt *, image=url *, aspect_ratio=1:1|4:3|3:4|16:9|9:16|2:3|3:2, quality=basic|high, safety_filter=boolPNG$0.037
image/seedream-5.0-pro-editretouche d’imageprompt *, image=url *, aspect_ratio=1:1|4:3|3:4|16:9|9:16|2:3|3:2|21:9, quality=basic|high, safety_filter=boolPNG$0.044
image/ideogram-v3texte→imageprompt *, render_mode=fast|balanced|quality, aspect_ratio=1:1-hd|1:1|3:4|9:16|4:3|16:9, style=auto|general|realistic|design, safety_filter=boolPNG$0.044
image/ideogram-editretouche d’imageprompt *, image=url *, render_mode=fast|balanced|quality, aspect_ratio=1:1-hd|1:1|3:4|9:16|4:3|16:9, safety_filter=boolPNG$0.044
image/ideogram-characterretouche d’imageprompt *, image=url *, render_mode=fast|balanced|quality, style=auto|realistic|fiction, safety_filter=boolPNG$0.11
image/qwentexte→imageprompt *, aspect_ratio=1:1-hd|1:1|3:4|9:16|4:3|16:9, safety_filter=boolPNG$0.031
image/qwen-editretouche d’imageprompt *, image=url *, aspect_ratio=1:1-hd|1:1|3:4|9:16|4:3|16:9, safety_filter=boolPNG$0.037
image/qwen-i2iretouche d’imageprompt *, image=url *, safety_filter=boolPNG$0.031
image/qwen2-editretouche d’imageprompt *, image=url *, aspect_ratio=16:9|1:1|3:4|4:3|9:16|3:2|2:3, safety_filter=boolPNG$0.037
image/groktexte→imageprompt *, aspect_ratio=1:1|2:3|3:2|16:9|9:16, pro=bool, safety_filter=boolPNG$0.025
image/grok-editretouche d’imageprompt *, image=url *, safety_filter=boolPNG$0.025
image/z-imagetexte→imageprompt *, aspect_ratio=1:1|16:9|9:16|3:4|4:3, safety_filter=boolPNG$0.006
image/wan-2.7texte→imageprompt *, aspect_ratio=1:1|16:9|9:16|4:3|3:4|21:9, resolution=1k|2k|4k, image=url, safety_filter=boolPNG$0.031
image/wan-2.7-protexte→imageprompt *, aspect_ratio=1:1|16:9|9:16|4:3|3:4|21:9, resolution=1k|2k|4k, image=url, safety_filter=boolPNG$0.075
image/seedream-5.0-protexte→imageprompt *JPG$0.013
image/gemini-3.1-flashtexte→imageprompt *, aspect_ratio=1:1|16:9|9:16|4:3|3:4, resolution=1k|2k|4kPNG$0.013
image/gemini-3-protexte→imageprompt *, aspect_ratio=1:1|16:9|9:16|4:3|3:4, resolution=1k|2k|4kPNG$0.031

🎬 Vidéo ​

modelModeParamètres inputFichierPrix
video/veo-3.1-fasttexte→vidéoprompt *, aspect_ratio=16:9|9:16, image=urlMP4$0.38
video/veo-3.1-qualitytexte→vidéoprompt *, aspect_ratio=16:9|9:16, image=urlMP4$1.56
video/veo-3.1-litetexte→vidéoprompt *, aspect_ratio=16:9|9:16, image=urlMP4$0.19
video/gemini-omnitexte→vidéoprompt *, duration=4|6|8|10 *, aspect_ratio=16:9|9:16, resolution=720p|1080p|4k, image=url, safety_filter=boolMP4$0.66
video/gemini-omni-flashtexte→vidéoprompt *, attachments=upload[]MP4$0.13
video/kling-3.0texte→vidéoprompt *, duration=3–15s, aspect_ratio=16:9|9:16|1:1, mode=standard|pro|4k, audio=bool, image=url, image2=url, safety_filter=boolMP4$0.11/sec
video/kling-t2vtexte→vidéoprompt *, duration=3–15s, aspect_ratio=16:9|9:16|1:1, resolution=720p|1080p, safety_filter=boolMP4$0.11/sec
video/kling-turbo-i2vphoto→vidéoprompt *, image=url *, duration=3–15s, resolution=720p|1080p, safety_filter=boolMP4$0.11/sec
video/kling-2.6-t2vtexte→vidéoprompt *, duration=5|10, aspect_ratio=16:9|9:16|1:1, audio=bool, safety_filter=boolMP4$0.34
video/kling-2.6-i2vphoto→vidéoprompt *, image=url *, duration=5|10, audio=bool, safety_filter=boolMP4$0.34
video/kling-2.5-t2vtexte→vidéoprompt *, duration=5|10, aspect_ratio=16:9|9:16|1:1, safety_filter=boolMP4$0.26
video/kling-2.5-i2vphoto→vidéoprompt *, image=url *, image2=url, duration=5|10, safety_filter=boolMP4$0.26
video/kling-i2vphoto→vidéoprompt *, image=url *, image2=url, duration=5|10, safety_filter=boolMP4$0.31
video/kling-2.1-standardphoto→vidéoprompt *, image=url *, duration=5|10, safety_filter=boolMP4$0.16
video/kling-2.1-master-t2vtexte→vidéoprompt *, duration=5|10, aspect_ratio=16:9|9:16|1:1, safety_filter=boolMP4$1.00
video/kling-2.1-master-i2vphoto→vidéoprompt *, image=url *, duration=5|10, safety_filter=boolMP4$1.00
video/kling-motionvidéo→vidéoimage=url *, video_url *, prompt, mode=standard|proMP4$1.25
video/kling-avataravatar (photo+audio)image=url *, audio_url *, prompt *MP4$0.75
video/kling-avatar-proavatar (photo+audio)image=url *, audio_url *, prompt *MP4$1.50
video/wan-2.7-t2vtexte→vidéoprompt *, duration=2–15s, aspect_ratio=16:9|9:16|1:1|4:3|3:4, resolution=720p|1080p, audio_url, safety_filter=boolMP4$0.15/sec
video/wan-2.7-i2vphoto→vidéoprompt *, image=url *, image2=url, duration=2–15s, resolution=720p|1080p, audio_url, safety_filter=boolMP4$0.15/sec
video/wan-2.7-r2vphoto→vidéoprompt *, image=url *, duration=2–10s, aspect_ratio=16:9|9:16|1:1, resolution=720p|1080p, safety_filter=boolMP4$0.15/sec
video/wan-2.7-editvidéo→vidéoprompt *, video_url *, resolution=720p|1080p, audio_source=auto|originalMP4$1.50
video/wan-t2vtexte→vidéoprompt *, duration=5|10|15, resolution=720p|1080p, safety_filter=boolMP4$0.44
video/wan-i2vphoto→vidéoprompt *, image=url *, duration=5|10|15, resolution=720p|1080p, safety_filter=boolMP4$0.44
video/wan-v2vvidéo→vidéoprompt *, video_url *, duration=5|10, resolution=720p|1080pMP4$0.44
video/wan-2.5-t2vtexte→vidéoprompt *, duration=5|10 *, aspect_ratio=16:9|9:16|1:1, resolution=720p|1080p, safety_filter=boolMP4$0.38
video/wan-2.5-i2vphoto→vidéoprompt *, image=url *, duration=5|10 *, resolution=720p|1080p, safety_filter=boolMP4$0.38
video/wan-2.2-t2vtexte→vidéoprompt *, aspect_ratio=16:9|9:16, resolution=480p|720p, safety_filter=boolMP4$0.50
video/wan-2.2-i2vphoto→vidéoprompt *, image=url *, resolution=480p|720p, safety_filter=boolMP4$0.50
video/wan-s2vavatar (photo+audio)prompt *, image=url *, audio_url *, resolution=480p|580p|720pMP4$0.38
video/wan-animate-movevidéo→vidéoimage=url *, video_url *, resolution=480p|580p|720pMP4$0.38
video/wan-animate-replacevidéo→vidéoimage=url *, video_url *, resolution=480p|580p|720pMP4$0.38
video/seedance-2texte→vidéoprompt *, duration=4–15s, aspect_ratio=16:9|9:16|1:1|4:3|21:9, resolution=480p|720p|1080p|4k, audio=bool, image=url, image2=url, safety_filter=boolMP4$0.26/sec
video/seedance-2-fasttexte→vidéoprompt *, duration=4–15s, aspect_ratio=16:9|9:16|1:1, resolution=480p|720p, audio=bool, image=url, image2=url, safety_filter=boolMP4$0.21/sec
video/seedance-2-minitexte→vidéoprompt *, duration=4–15s, aspect_ratio=16:9|9:16|1:1, resolution=480p|720p, audio=bool, image=url, image2=url, safety_filter=boolMP4$0.13/sec
video/seedance-1.5-protexte→vidéoprompt *, duration=4–12s, aspect_ratio=16:9|9:16|1:1|4:3, resolution=480p|720p|1080p, audio=bool, image=url, safety_filter=boolMP4$0.025/sec
video/hailuo-02-t2vtexte→vidéoprompt *, duration=6|10, safety_filter=boolMP4$0.19
video/hailuo-02-t2v-protexte→vidéoprompt *, safety_filter=boolMP4$0.36
video/hailuo-02-i2vphoto→vidéoprompt *, image=url *, image2=url, duration=6|10, resolution=768p|512p, safety_filter=boolMP4$0.19
video/hailuo-02-i2v-prophoto→vidéoprompt *, image=url *, image2=url, safety_filter=boolMP4$0.36
video/hailuo-2.3-i2vphoto→vidéoprompt *, image=url *, duration=6|10, resolution=768p|1080p, safety_filter=boolMP4$0.19
video/hailuo-2.3-i2v-prophoto→vidéoprompt *, image=url *, duration=6|10, resolution=768p|1080p, safety_filter=boolMP4$0.28
video/happyhorse-1.1-t2vtexte→vidéoprompt *, duration=3–15s, aspect_ratio=16:9|9:16|1:1|4:3|3:4, resolution=720p|1080p, safety_filter=boolMP4$0.18/sec
video/happyhorse-1.1-i2vphoto→vidéoprompt, image=url *, duration=3–15s, resolution=720p|1080p, safety_filter=boolMP4$0.18/sec
video/happyhorse-1.1-r2vphoto→vidéoprompt *, image=url *, duration=3–15s, aspect_ratio=16:9|9:16|1:1, resolution=720p|1080p, safety_filter=boolMP4$0.18/sec
video/happyhorse-t2vtexte→vidéoprompt *, duration=3–15s, aspect_ratio=16:9|9:16|1:1|4:3|3:4, resolution=720p|1080p, safety_filter=boolMP4$0.30/sec
video/happyhorse-i2vphoto→vidéoprompt, image=url *, duration=3–15s, resolution=720p|1080p, safety_filter=boolMP4$0.30/sec
video/happyhorse-editvidéo→vidéoprompt *, video_url *, resolution=720p|1080p, audio_source=auto|originalMP4$1.50
video/grok-t2vtexte→vidéoprompt *, duration=6–30s, aspect_ratio=16:9|9:16|1:1|3:2|2:3, resolution=480p|720p, mode=normal|fun|spicy, safety_filter=boolMP4$0.019/sec
video/grok-i2vphoto→vidéoprompt *, image=url *, duration=6–30s, resolution=480p|720p, mode=normal|fun|spicy, safety_filter=boolMP4$0.019/sec
video/grok-1.5texte→vidéoprompt *, duration=1–15s, aspect_ratio=auto|16:9|9:16|1:1, resolution=480p|720p, image=url, safety_filter=boolMP4$0.019/sec
video/omnihumanavatar (photo+audio)image=url *, audio_url *, prompt, resolution=720p|1080pMP4$1.69
video/infinitalkavatar (photo+audio)prompt *, image=url *, audio_url *, resolution=480p|720pMP4$0.19
video/lipsyncvidéo→vidéovideo_url *, audio_url *, mode=lite|basicMP4$0.50
video/topaz-upscalemise à l’échellevideo_url *, scale=2|4MP4$0.50

🎵 Musique ​

modelModeParamètres inputFichierPrix
music/suno-v5musiquetitle *, style *, version=v6|v6-wild|v6-mini, instrumental=bool, promptMP3$0.075
music/suno-covermusiqueprompt *, attachments=upload[] *, version=v6|v6-wild|v6-mini, instrumental=bool, advanced=bool, title, style, duration=10–360sMP3$0.075
music/suno-extend-uploadmusiqueprompt *, attachments=upload[] *, version=v6|v6-wild|v6-mini, continue_from=1–120, instrumental=boolMP3$0.075
music/suno-add-vocalsmusiqueprompt *, attachments=upload[] *, version=v6|v6-wild|v6-mini, style, title, exclude_styles, vocal=female|maleMP3$0.075
music/suno-add-instrumentalmusiqueprompt *, attachments=upload[] *, version=v6|v6-wild|v6-mini, title, exclude_stylesMP3$0.075
music/suno-mashupmusiqueprompt *, attachments=upload[] *, version=v6|v6-wild|v6-mini, instrumental=bool, advanced=bool, title, style, duration=10–360sMP3$0.075
music/suno-soundsmusiqueprompt *, version=v6|v6-wild|v6-mini, loop=bool, bpm=auto|60|80|100|120|140|160, tonality=auto|C|Dm|Em|F|G|Am|D#mMP3$0.016

🎙 Audio ​

modelModeParamètres inputFichierPrix
audio/gemini-3.1-flash-ttssynthèse vocaletext *, voice=Achernar|Achird|Algenib|Algieba|Alnilam|Aoede|Autonoe|Callirrhoe|Charon|Despina|Enceladus|Erinome|Fenrir|Gacrux|Iapetus|Kore|Laomedeia|Leda|Orus|Puck|Pulcherrima|Rasalgethi|Sadachbia|Sadaltager|Schedar|Sulafat|Umbriel|Vindemiatrix|Zephyr|Zubenelgenubi, style=vocal-smile|newscaster|whisper|empathetic|promo-hype|deadpan, pace=natural|fast|slow|staccato, accent=neutral|american|american-valley|american-south|british|british-brixton|transatlantic|australian, voice_description, scene, temperature=0–2WAV$0.006
audio/gemini-2.5-pro-ttssynthèse vocaletext *, voice=Achernar|Achird|Algenib|Algieba|Alnilam|Aoede|Autonoe|Callirrhoe|Charon|Despina|Enceladus|Erinome|Fenrir|Gacrux|Iapetus|Kore|Laomedeia|Leda|Orus|Puck|Pulcherrima|Rasalgethi|Sadachbia|Sadaltager|Schedar|Sulafat|Umbriel|Vindemiatrix|Zephyr|Zubenelgenubi, style=vocal-smile|newscaster|whisper|empathetic|promo-hype|deadpan, pace=natural|fast|slow|staccato, accent=neutral|american|american-valley|american-south|british|british-brixton|transatlantic|australian, voice_description, scene, temperature=0–2WAV$0.006
audio/elevenlabs-ttssynthèse vocaletext *, voice=james|addison|adeline|allison|ana-rita|anika|arabella|aria|bella|benjamin|bradford|brian|britney|brittney|brock|burt|callum|cassidy|ed|edward|emma|eve|felix|finn|hank|hope-poetic|hope-bubbly|horatius|jamahal|jean|jeff|jessica-eloquent|jessica-chatty|john-doe|john-morgan|johnny-dynamite|johnny-kid|kuon|laura|leon|liam|lucy|lutz|mark-casual|mark-natural|marshal|monika|nathan|nathaniel|phil|rachel|rex-thunder|sam|spuds|sven|taksh|theodore|tiffany|tom|viking-bjorn|viraj-smooth|viraj-rich|wyatt|xavier, voice_id, speed=0.8|1.0|1.2MP3$0.037
audio/elevenlabs-multilingualsynthèse vocaletext *, voice=james|addison|adeline|allison|ana-rita|anika|arabella|aria|bella|benjamin|bradford|brian|britney|brittney|brock|burt|callum|cassidy|ed|edward|emma|eve|felix|finn|hank|hope-poetic|hope-bubbly|horatius|jamahal|jean|jeff|jessica-eloquent|jessica-chatty|john-doe|john-morgan|johnny-dynamite|johnny-kid|kuon|laura|leon|liam|lucy|lutz|mark-casual|mark-natural|marshal|monika|nathan|nathaniel|phil|rachel|rex-thunder|sam|spuds|sven|taksh|theodore|tiffany|tom|viking-bjorn|viraj-smooth|viraj-rich|wyatt|xavier, voice_id, speed=0.8|1.0|1.2MP3$0.075

🧊 Modèles 3D ​

Le résultat est au format GLB (certaines modèles proposent également OBJ, FBX, STL, USDZ, USD ou 3MF), avec une image d’aperçu : la tâche renvoie plusieurs fichiers, chacun avec sa propre extension. La liste des fichiers se trouve dans le champ results ; chaque fichier possède un champ ext.

Le prix n’est connu qu’après la génération

La 3D est facturée selon les ressources réellement utilisées. Nous retenons le plafond indiqué dans le tableau puis, une fois le coût réel connu, nous prélevons ce montant et remboursons la différence. Le montant final est toujours indiqué dans cost_usd.

modelModeParamètres inputFichierPrix
3d/tripo-texttexte→3Dprompt *, negative_prompt, texture_detail=standard|high, geometry_detail=standard|high, pbr=bool, quad_mesh=boolGLB/FBX$0.31–0.79
3d/tripo-imagephoto→3Dimage=url *, texture_detail=standard|high, geometry_detail=standard|high, pbr=bool, quad_mesh=boolGLB/FBX$0.31–0.79
3d/hunyuan-rapid-texttexte→3Dprompt *, file_format=glb|obj|fbx|stl|usdz, pbr=bool, extra_mesh=boolGLB et autres$0.43–0.71
3d/hunyuan-rapid-imagephoto→3Dimage=url *, file_format=glb|obj|fbx|stl|usdz, pbr=bool, extra_mesh=boolGLB et autres$0.43–0.71
3d/hunyuan-pro-texttexte→3Dprompt *, output=textured|mesh, polygons=auto|40000|100000|300000|800000|1500000, pbr=boolGLB$0.71–1.00
3d/hunyuan-pro-imagephoto→3Dimage=url *, output=textured|mesh, polygons=auto|40000|100000|300000|800000|1500000, pbr=boolGLB$0.71–1.00
3d/seed3d-imagephoto→3Dimage=url *, mesh_detail=low|medium|high, file_format=glb|obj|usd|usdzGLB/OBJ/USD$0.50
3d/meshy-texttexte→3Dprompt *, texture_size=2k|4k|8k, pose=none|a-pose|t-pose, ultra=bool, pbr=bool, texture_text, texture_photo=urlGLB$0.94–1.26
3d/meshy-imagephoto→3Dimage=url *, texture_size=2k|4k|8k, ultra=bool, texture=bool, pbr=bool, texture_text, texture_photo=urlGLB$0.94–1.26
3d/meshy-multi-imagevues→3Dimages=[url] * (1–4), texture_size=2k|4k|8k, ultra=bool, texture=bool, pbr=bool, texture_textGLB$0.94–1.26

Photo comme texture. Pour 3d/meshy-*, la texture est définie séparément de la géométrie : avec une image dans texture_photo ou du texte dans texture_text.

Durée. La génération 3D prend de trente secondes à plusieurs minutes, soit plus longtemps qu’une image ou qu’un court clip. Il n’est pas nécessaire de maintenir la connexion : le statut est conservé et des webhooks sont disponibles.

🛠 Outils ​

modelModeParamètres inputFichierPrix
image/topaz-upscalemise à l’échelleimage=url *, scale=2|4|8PNG$0.063
image/recraft-remove-bgretoucheimage=url *PNG$0.006
image/recraft-upscalemise à l’échelleimage=url *PNG$0.006

Exemples par mode ​

Image à partir de texte

json
{ "model": "image/flux2-pro", "input": { "prompt": "neon fox in snow", "aspect_ratio": "16:9", "resolution": "2k" } }

Retouche d’image

json
{ "model": "image/seedream-edit", "input": { "prompt": "supprimer l’arrière-plan, ajouter du néon", "image": "https://…/photo.png" } }

Photo→vidéo (première/dernière image, durée, son)

json
{ "model": "video/wan-2.7-i2v", "input": {
    "prompt": "travelling avant fluide", "image": "https://…/first.png",
    "image2": "https://…/last.png", "duration": 8, "resolution": "1080p" } }

Musique

json
{ "model": "music/suno-v5", "input": { "title": "Northern Lights", "style": "epic orchestral", "instrumental": true, "version": "v6" } }

Synthèse vocale

json
{ "model": "audio/gemini-3.1-flash-tts", "input": {
    "text": "Bonjour, le monde", "voice": "Zephyr", "style": "empathetic",
    "pace": "natural", "accent": "neutral" } }

Dialogue à deux voix — à la place du champ text, les répliques sont dans dialogue, les voix dans voices (la voix 1 est la première de la liste) :

json
{ "model": "audio/gemini-3.1-flash-tts", "input": {
    "voices": [ { "voice": "Kore", "style": "newscaster" }, { "voice": "Puck", "pace": "fast" } ],
    "dialogue": [ { "speaker": 1, "text": "Bonsoir !" }, { "speaker": 2, "text": "Ravi de vous entendre." } ] } }

Avatar (vidéo parlante à partir d’une photo + audio)

json
{ "model": "video/omnihuman", "input": { "image": "https://…/face.png", "audio_url": "https://…/voice.mp3" } }

Statuts et erreurs ​

GET /media/job/:id → champ status :

StatutSignification
processingEn cours — continuez à interroger le statut
doneTerminé — fichier dans result_url, montant débité dans cost_usd
failedÉchec — motif dans error, montant remboursé

Codes de réponse de POST /media/generate : 400 — modèle inconnu ou champ obligatoire manquant ; 401 — clé absente ou invalide ; 402 — solde insuffisant ; 403 — modèle indisponible pour ce compte.

Le corps de l’erreur a toujours la même forme — { "error": "текст для человека", "code": "машинный код" }. Codes : unknown_model, missing_param (+ champ param), invalid_input, invalid_attachment, prompt_too_long, input_too_long, no_auth, no_key, insufficient_balance, unpaid_shortfall, rate_limited, generation_failed, unavailable.

Estimer le coût à l’avance ​

bash
curl https://nordrouter.com/media/estimate \
  -H "Authorization: Bearer sk-nr-YOUR-KEY" -H "Content-Type: application/json" \
  -d '{ "model": "video/kling-3.0", "input": { "duration": 10, "mode": "pro", "audio": true } }'
json
{ "model": "video/kling-3.0", "usd": 1.6875 }

Paramètres des tableaux vérifiés dans le catalogue du service le 19.10.2026 ; liste complète et à jour des modèles, paramètres et tarifs — GET /media/models.