Skip to content

Media API — Images, Video, Music ​

Generate images, video, and music using the same sk-nr-… key and balance as text models. One account, pay as you go, no subscriptions or packages.

  • Base URL: https://nordrouter.com (or https://global-api.nordrouter.com for networks outside Russia).
  • Authentication: Authorization: Bearer sk-nr-… header (or X-API-Key: sk-nr-…).
  • Format: JSON, asynchronous generation (create a job → poll → retrieve the file).

Endpoints ​

MethodPurpose
POST /media/generateCreate a generation job
GET /media/job/:idGet job status and result
POST /media/estimateGet the price for a configuration in advance
GET /media/modelsGet a machine-readable list of models and parameters
POST /media/uploadUpload a source media file
GET /media/file/:idRetrieve the generated file (link from result_url)

Request Lifecycle ​

1. Create a job

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": "smooth camera push-in", "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. Poll for status (every 3–5 seconds)

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. Retrieve the file — via result_url. The link is on nordrouter.com (your brand); files are stored for 14 days, then deleted — download them or copy them to your own storage in advance.

Uploading source media files

The image, image2, audio_url, and video_url fields accept a direct public URL. Models with an attachments field accept an array of objects returned by POST /media/upload: send { "data": "data:audio/mpeg;base64,…", "name": "track.mp3" }, then pass the entire upload response in input.attachments. For Suno, you can instead pass a public URL in input.source_url, or two URLs in input.source_urls for mashup.

Billing ​

Charges are deducted from your USD balance (the same balance used for text models) — after generation completes, for exactly the amount listed in the tables below.

  • Reserve → actual charge. The estimated cost is reserved when a job is created; after completion, the amount is recalculated based on the actual result, and any excess is returned to your balance.
  • Video — per second. The price increases with duration and resolution; enabling audio costs more. The tables list starting prices for default settings; /sec indicates a per-second rate.
  • No charge for failures. If a job ends with status failed, the reserve is returned in full — you only pay for successful generations.
  • Exact price in advance — POST /media/estimate with the same model + input returns { "usd": … } before generation starts.
  • Top up your balance in rubles (≈ $1 = 89–96 ₽); all subsequent calculations are in USD.

Model catalog ​

Pricing: for video — rate per second (/sec), total = rate × duration (resolution/audio may also affect the rate); for everything else — per generation with default settings. POST /media/estimate returns the exact cost of any configuration.

There may be more fields in input — GET /media/models always returns a machine-readable list (types, options, defaults, duration ranges in seconds). Required fields are marked with *. Any additional model fields (negative_prompt, seed, cfg_scale…) can be sent directly in input.

Legacy parameter names ​

On October 19, 2026, parameters were standardized: snake_case names and lowercase values (for example, version: "v6-wild", resolution: "720p", audio: true). Names and values from the previous documentation are still accepted — existing integrations need no changes: the task, result, and price remain the same. GET /media/models, MCP, and this documentation use only the new names and values. If a request contains both the legacy and new name for the same parameter, the new name takes precedence.

🖼 Images ​

modelModeinput parametersFilePrice
image/nano-bananatext→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-2text→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-litetext→imageprompt *, aspect_ratio=auto|1:1|16:9|9:16|3:4|4:3, image=url, safety_filter=boolPNG$0.025
image/nano-banana-protext→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-fasttext→imageprompt *, aspect_ratio=1:1|16:9|9:16|3:4|4:3, safety_filter=boolPNG$0.025
image/imagen4text→imageprompt *, aspect_ratio=1:1|16:9|9:16|3:4|4:3, safety_filter=boolPNG$0.050
image/imagen4-ultratext→imageprompt *, aspect_ratio=1:1|16:9|9:16|3:4|4:3, safety_filter=boolPNG$0.075
image/gpt-image-1.5text→imageprompt *, aspect_ratio=1:1|2:3|3:2, quality=medium|high, safety_filter=boolPNG$0.025
image/gpt-image-1.5-editimage editingprompt *, image=url *, aspect_ratio=3:2|1:1|2:3, quality=medium|high, safety_filter=boolPNG$0.025
image/gpt-image-2text→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-editimage editingprompt *, 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-protext→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-editimage editingprompt *, 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-flextext→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-editimage editingprompt *, 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-editimage editingprompt *, 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-editimage editingprompt *, 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-editimage editingprompt *, 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-editimage editingprompt *, 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-v3text→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-editimage editingprompt *, 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-characterimage editingprompt *, image=url *, render_mode=fast|balanced|quality, style=auto|realistic|fiction, safety_filter=boolPNG$0.11
image/qwentext→imageprompt *, aspect_ratio=1:1-hd|1:1|3:4|9:16|4:3|16:9, safety_filter=boolPNG$0.031
image/qwen-editimage editingprompt *, image=url *, aspect_ratio=1:1-hd|1:1|3:4|9:16|4:3|16:9, safety_filter=boolPNG$0.037
image/qwen-i2iimage editingprompt *, image=url *, safety_filter=boolPNG$0.031
image/qwen2-editimage editingprompt *, image=url *, aspect_ratio=16:9|1:1|3:4|4:3|9:16|3:2|2:3, safety_filter=boolPNG$0.037
image/groktext→imageprompt *, aspect_ratio=1:1|2:3|3:2|16:9|9:16, pro=bool, safety_filter=boolPNG$0.025
image/grok-editimage editingprompt *, image=url *, safety_filter=boolPNG$0.025
image/z-imagetext→imageprompt *, aspect_ratio=1:1|16:9|9:16|3:4|4:3, safety_filter=boolPNG$0.006
image/wan-2.7text→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-protext→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-protext→imageprompt *JPG$0.013
image/gemini-3.1-flashtext→imageprompt *, aspect_ratio=1:1|16:9|9:16|4:3|3:4, resolution=1k|2k|4kPNG$0.013
image/gemini-3-protext→imageprompt *, aspect_ratio=1:1|16:9|9:16|4:3|3:4, resolution=1k|2k|4kPNG$0.031

🎬 Video ​

modelModeinput parametersFilePrice
video/veo-3.1-fasttext→videoprompt *, aspect_ratio=16:9|9:16, image=urlMP4$0.38
video/veo-3.1-qualitytext→videoprompt *, aspect_ratio=16:9|9:16, image=urlMP4$1.56
video/veo-3.1-litetext→videoprompt *, aspect_ratio=16:9|9:16, image=urlMP4$0.19
video/gemini-omnitext→videoprompt *, 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-flashtext→videoprompt *, attachments=upload[]MP4$0.13
video/kling-3.0text→videoprompt *, 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-t2vtext→videoprompt *, duration=3–15s, aspect_ratio=16:9|9:16|1:1, resolution=720p|1080p, safety_filter=boolMP4$0.11/sec
video/kling-turbo-i2vphoto→videoprompt *, image=url *, duration=3–15s, resolution=720p|1080p, safety_filter=boolMP4$0.11/sec
video/kling-2.6-t2vtext→videoprompt *, duration=5|10, aspect_ratio=16:9|9:16|1:1, audio=bool, safety_filter=boolMP4$0.34
video/kling-2.6-i2vphoto→videoprompt *, image=url *, duration=5|10, audio=bool, safety_filter=boolMP4$0.34
video/kling-2.5-t2vtext→videoprompt *, duration=5|10, aspect_ratio=16:9|9:16|1:1, safety_filter=boolMP4$0.26
video/kling-2.5-i2vphoto→videoprompt *, image=url *, image2=url, duration=5|10, safety_filter=boolMP4$0.26
video/kling-i2vphoto→videoprompt *, image=url *, image2=url, duration=5|10, safety_filter=boolMP4$0.31
video/kling-2.1-standardphoto→videoprompt *, image=url *, duration=5|10, safety_filter=boolMP4$0.16
video/kling-2.1-master-t2vtext→videoprompt *, duration=5|10, aspect_ratio=16:9|9:16|1:1, safety_filter=boolMP4$1.00
video/kling-2.1-master-i2vphoto→videoprompt *, image=url *, duration=5|10, safety_filter=boolMP4$1.00
video/kling-motionvideo→videoimage=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-t2vtext→videoprompt *, 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→videoprompt *, image=url *, image2=url, duration=2–15s, resolution=720p|1080p, audio_url, safety_filter=boolMP4$0.15/sec
video/wan-2.7-r2vphoto→videoprompt *, 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-editvideo→videoprompt *, video_url *, resolution=720p|1080p, audio_source=auto|originalMP4$1.50
video/wan-t2vtext→videoprompt *, duration=5|10|15, resolution=720p|1080p, safety_filter=boolMP4$0.44
video/wan-i2vphoto→videoprompt *, image=url *, duration=5|10|15, resolution=720p|1080p, safety_filter=boolMP4$0.44
video/wan-v2vvideo→videoprompt *, video_url *, duration=5|10, resolution=720p|1080pMP4$0.44
video/wan-2.5-t2vtext→videoprompt *, duration=5|10 *, aspect_ratio=16:9|9:16|1:1, resolution=720p|1080p, safety_filter=boolMP4$0.38
video/wan-2.5-i2vphoto→videoprompt *, image=url *, duration=5|10 *, resolution=720p|1080p, safety_filter=boolMP4$0.38
video/wan-2.2-t2vtext→videoprompt *, aspect_ratio=16:9|9:16, resolution=480p|720p, safety_filter=boolMP4$0.50
video/wan-2.2-i2vphoto→videoprompt *, 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-movevideo→videoimage=url *, video_url *, resolution=480p|580p|720pMP4$0.38
video/wan-animate-replacevideo→videoimage=url *, video_url *, resolution=480p|580p|720pMP4$0.38
video/seedance-2text→videoprompt *, 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-fasttext→videoprompt *, 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-minitext→videoprompt *, 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-protext→videoprompt *, 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-t2vtext→videoprompt *, duration=6|10, safety_filter=boolMP4$0.19
video/hailuo-02-t2v-protext→videoprompt *, safety_filter=boolMP4$0.36
video/hailuo-02-i2vphoto→videoprompt *, image=url *, image2=url, duration=6|10, resolution=768p|512p, safety_filter=boolMP4$0.19
video/hailuo-02-i2v-prophoto→videoprompt *, image=url *, image2=url, safety_filter=boolMP4$0.36
video/hailuo-2.3-i2vphoto→videoprompt *, image=url *, duration=6|10, resolution=768p|1080p, safety_filter=boolMP4$0.19
video/hailuo-2.3-i2v-prophoto→videoprompt *, image=url *, duration=6|10, resolution=768p|1080p, safety_filter=boolMP4$0.28
video/happyhorse-1.1-t2vtext→videoprompt *, 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→videoprompt, image=url *, duration=3–15s, resolution=720p|1080p, safety_filter=boolMP4$0.18/sec
video/happyhorse-1.1-r2vphoto→videoprompt *, image=url *, duration=3–15s, aspect_ratio=16:9|9:16|1:1, resolution=720p|1080p, safety_filter=boolMP4$0.18/sec
video/happyhorse-t2vtext→videoprompt *, 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→videoprompt, image=url *, duration=3–15s, resolution=720p|1080p, safety_filter=boolMP4$0.30/sec
video/happyhorse-editvideo→videoprompt *, video_url *, resolution=720p|1080p, audio_source=auto|originalMP4$1.50
video/grok-t2vtext→videoprompt *, 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→videoprompt *, image=url *, duration=6–30s, resolution=480p|720p, mode=normal|fun|spicy, safety_filter=boolMP4$0.019/sec
video/grok-1.5text→videoprompt *, 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/lipsyncvideo→videovideo_url *, audio_url *, mode=lite|basicMP4$0.50
video/topaz-upscaleupscalingvideo_url *, scale=2|4MP4$0.50

🎵 Music ​

modelModeinput parametersFilePrice
music/suno-v5musictitle *, style *, version=v6|v6-wild|v6-mini, instrumental=bool, promptMP3$0.075
music/suno-covermusicprompt *, attachments=upload[] *, version=v6|v6-wild|v6-mini, instrumental=bool, advanced=bool, title, style, duration=10–360sMP3$0.075
music/suno-extend-uploadmusicprompt *, attachments=upload[] *, version=v6|v6-wild|v6-mini, continue_from=1–120, instrumental=boolMP3$0.075
music/suno-add-vocalsmusicprompt *, attachments=upload[] *, version=v6|v6-wild|v6-mini, style, title, exclude_styles, vocal=female|maleMP3$0.075
music/suno-add-instrumentalmusicprompt *, attachments=upload[] *, version=v6|v6-wild|v6-mini, title, exclude_stylesMP3$0.075
music/suno-mashupmusicprompt *, attachments=upload[] *, version=v6|v6-wild|v6-mini, instrumental=bool, advanced=bool, title, style, duration=10–360sMP3$0.075
music/suno-soundsmusicprompt *, 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 ​

modelModeinput parametersFilePrice
audio/gemini-3.1-flash-ttstext-to-speechtext *, 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-ttstext-to-speechtext *, 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-ttstext-to-speechtext *, 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-multilingualtext-to-speechtext *, 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

🧊 3D models ​

The output is GLB (some models also offer OBJ, FBX, STL, USDZ, USD, 3MF) plus a preview image: the task returns multiple files, each with its own extension. The file list is in results; each file has an ext field.

The price is known only after generation

3D is billed based on the resources actually used. We reserve the upper limit from the table, then charge the actual cost once it is known and refund the difference. The final amount is always in cost_usd.

modelModeinput parametersFilePrice
3d/tripo-texttext→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-texttext→3Dprompt *, file_format=glb|obj|fbx|stl|usdz, pbr=bool, extra_mesh=boolGLB and others$0.43–0.71
3d/hunyuan-rapid-imagephoto→3Dimage=url *, file_format=glb|obj|fbx|stl|usdz, pbr=bool, extra_mesh=boolGLB and others$0.43–0.71
3d/hunyuan-pro-texttext→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-texttext→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-imagemultiple views→3Dimages=[url] * (1–4), texture_size=2k|4k|8k, ultra=bool, texture=bool, pbr=bool, texture_textGLB$0.94–1.26

Photo as texture. For 3d/meshy-*, the texture is specified separately from the geometry: with an image in texture_photo or words in texture_text.

Takes time. 3D generation takes from half a minute to several minutes — longer than an image or a short clip. You do not need to keep the connection open: the status is saved, and webhooks are available.

🛠 Utilities ​

modelModeinput parametersFilePrice
image/topaz-upscaleupscalingimage=url *, scale=2|4|8PNG$0.063
image/recraft-remove-bgeditingimage=url *PNG$0.006
image/recraft-upscaleupscalingimage=url *PNG$0.006

Examples by Mode ​

Text to image

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

Image editing

json
{ "model": "image/seedream-edit", "input": { "prompt": "remove the background, add neon", "image": "https://…/photo.png" } }

Photo→video (first/last frame, duration, audio)

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

Music

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

Text to speech

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

Two-voice dialogue — instead of the text field, put lines in dialogue and voices in voices (voice 1 is the first in the list):

json
{ "model": "audio/gemini-3.1-flash-tts", "input": {
    "voices": [ { "voice": "Kore", "style": "newscaster" }, { "voice": "Puck", "pace": "fast" } ],
    "dialogue": [ { "speaker": 1, "text": "Good evening!" }, { "speaker": 2, "text": "Glad to hear it." } ] } }

Avatar (talking video from a photo + audio)

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

Statuses and Errors ​

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

StatusMeaning
processingIn progress — continue polling
doneComplete — file in result_url, charge in cost_usd
failedFailed — reason in error, funds refunded

Response codes for POST /media/generate: 400 — unknown model or missing required field; 401 — missing/invalid key; 402 — insufficient balance; 403 — model unavailable for the account.

The error body always has the same format — { "error": "текст для человека", "code": "машинный код" }. Codes: unknown_model, missing_param (+ param field), invalid_input, invalid_attachment, prompt_too_long, input_too_long, no_auth, no_key, insufficient_balance, unpaid_shortfall, rate_limited, generation_failed, unavailable.

Estimate Cost in Advance ​

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 }

The parameters in the tables were verified against the service catalog on October 19, 2026; for the complete, up-to-date list of models, parameters, and prices, see GET /media/models.