🎵 Music Video Generator
Make your own music video in seconds - just upload your song, pick a look and download the video
About this tool
Create your own music video online, in seconds. Just upload a song, pick a style and download an MP4 with the sound baked in - no editing, no signup, no watermark. Your track becomes a beat-synced photo slideshow, classic EQ spectrum bars (optionally behind an album cover), Matrix digital rain with your lyrics, a neon tunnel or a starfield. Every cut lands on the beat. Vertical formats are ready for TikTok, Reels and YouTube Shorts, with widescreen for YouTube and X. Fine-tune colours, motion and length if you want, or keep the defaults. Everything is rendered on the server from your audio.
API
POST /api/tools/music-video-generator/run (multipart/form-data) → JSON with
outputs[].url, a zip link and a config_url.
Every run also hands you the config JSON (button above). It is the request body - POST it straight back to replay the exact generation:
curl -X POST -H 'Content-Type: application/json' \\ --data @genbox-config-music-video-generator.json \\ /api/tools/music-video-generator/run
For AI agents · API specs
Technical specs
| Category | video |
|---|---|
| Slug | music-video-generator |
| Run endpoint | POST /api/tools/music-video-generator/run |
| Content type | multipart/form-data (with file uploads) or application/json |
| Response | JSON: job, notes, outputs[].url, zip, config_url |
| Rate limit | API: 1 request / minute / IP. Live preview and image renders have their own separate limits, plus a short global cooldown between renders (storm protection). Over a limit you get HTTP 429 + a Retry-After header (local requests are unlimited) |
| Machine-readable spec | GET /api/tools/music-video-generator |
| OpenAPI 3.1 (Swagger) | this tool (JSON) · all tools |
Request body
Every parameter accepted by the run endpoint, in request-body order.
Fields are optional unless marked required. The same schema is published as
OpenAPI 3.1.
Upload files with multipart/form-data; a JSON body replays a saved config.
| Parameter | Type | Required | Default / allowed values | Description |
|---|---|---|---|---|
audio |
file | required | |
MP3 or WAV. |
visualizer |
select | no | slideshow · spectrum · spectrum_cover · matrix · tunnel · space |
The options below adapt to the style you pick. |
preset |
templates | no | |
Ready-made looks - how the photos behave, not just colours. Pick one, then tweak below if you want. Only used when {"visualizer": ["slideshow"]} matches. |
photos |
file (list) | no | |
Shown in order, one after another. Use ‹ › to change the sequence. Only used when {"visualizer": ["slideshow"]} matches. |
cover |
file | no | |
Optional. A square image (album cover, logo, single photo) sits in the upper part of the frame, on top of the EQ. Without it you get the plain spectrum bars. Only used when {"visualizer": ["spectrum_cover"]} matches. |
lyrics |
textarea | no | |
Matrix: lines drop into random streams. Slideshow: lines appear as captions over the photos. Only used when {"visualizer": ["matrix", "slideshow"]} matches. |
color_mode |
select | no | spectrum · fire · ice · solid |
Only used when {"visualizer": ["spectrum", "spectrum_cover"]} matches. |
bars |
range | no | 72 |
Only used when {"visualizer": ["spectrum", "spectrum_cover"]} matches. |
reflection |
range | no | 45 |
Only used when {"visualizer": ["spectrum", "spectrum_cover"]} matches. |
glow |
range | no | 50 |
Only used when {"visualizer": ["spectrum", "spectrum_cover"]} matches. |
color |
color | no | #22d3ee |
Only used when {"visualizer": ["spectrum", "spectrum_cover", "tunnel", "space"]} matches. |
spectrum_height |
range | no | 42 |
How much of the frame height the spectrum bars occupy, growing up from the bottom. Only used when {"visualizer": ["spectrum_cover"]} matches. |
cover_size |
range | no | 52 |
Only used when {"visualizer": ["spectrum_cover"]} matches. |
cover_y |
range | no | 32 |
Vertical centre of the cover. Small values push it towards the top of the frame. Only used when {"visualizer": ["spectrum_cover"]} matches. |
cover_zoom |
range | no | 0 |
Only used when {"visualizer": ["spectrum_cover"]} matches. |
cover_round |
range | no | 0 |
Only used when {"visualizer": ["spectrum_cover"]} matches. |
cover_shadow |
range | no | 55 |
Only used when {"visualizer": ["spectrum_cover"]} matches. |
cover_glow |
range | no | 50 |
Accent halo around the cover, pulsing with the music. Only used when {"visualizer": ["spectrum_cover"]} matches. |
cover_pulse |
range | no | 40 |
How much the cover breathes with the music. Only used when {"visualizer": ["spectrum_cover"]} matches. |
backdrop |
select | no | blur · dim · none |
What fills the frame behind the bars. 'Blurred cover' makes the whole clip feel like one cover. Only used when {"visualizer": ["spectrum_cover"]} matches. |
backdrop_blur |
range | no | 60 |
Only used when {"backdrop": ["blur"]} matches. |
backdrop_dim |
range | no | 50 |
Only used when {"backdrop": ["blur", "dim"]} matches. |
stream_count |
range | no | 120 |
More streams = denser rain, but slower render. Only used when {"visualizer": ["matrix"]} matches. |
symbol_size |
range | no | 28 |
Only used when {"visualizer": ["matrix"]} matches. |
speed_factor |
range | no | 1.0 |
Only used when {"visualizer": ["matrix"]} matches. |
head_color |
color | no | #B4FFB4 |
Only used when {"visualizer": ["matrix"]} matches. |
body_color |
color | no | #00C800 |
Only used when {"visualizer": ["matrix"]} matches. |
slide_seconds |
range | no | 3.5 |
Only used when {"visualizer": ["slideshow"]} matches. |
transition |
range | no | 0.8 |
How long the change between two photos takes. Only used when {"visualizer": ["slideshow"]} matches. |
transition_type |
select | no | fade · slide · zoom |
Only used when {"visualizer": ["slideshow"]} matches. |
beats_per_slide |
select | no | 0 · 1 · 2 · 4 · 8 |
On by default: photos change exactly on the beat (accent every 4th beat in 4/4). Set to Off for fixed seconds per photo. Only used when {"visualizer": ["slideshow"]} matches. |
fit |
select | no | cover · contain |
Use 'Show the whole photo' for an ad or a photo with a perfect ratio. Only used when {"visualizer": ["slideshow"]} matches. |
zoom |
range | no | 18 |
Only used when {"visualizer": ["slideshow"]} matches. |
pan |
range | no | 45 |
Only used when {"visualizer": ["slideshow"]} matches. |
beat_pulse |
range | no | 60 |
How much the photos breathe with the music. Only used when {"visualizer": ["slideshow"]} matches. |
effect |
select | no | none · bubbles · lightleak · wave |
Movement that works even when the photos stay still. Only used when {"visualizer": ["slideshow"]} matches. |
overlay |
range | no | 0 |
Only used when {"visualizer": ["slideshow"]} matches. |
lyric_size |
range | no | 6 |
Only used when {"visualizer": ["slideshow"]} matches. |
lyric_color |
color | no | #ffffff |
Only used when {"visualizer": ["slideshow"]} matches. |
lyric_band |
range | no | 45 |
Only used when {"visualizer": ["slideshow"]} matches. |
background_color |
color | no | #05070d |
|
resolution |
select | no | 720x1280 · 1080x1920 · 1080x1080 · 1280x720 · 1920x1080 · 854x480 · 640x360 |
Phone formats: pick HD Vertical for TikTok, Reels and Shorts. |
fps |
select | no | 24 · 30 |
|
length |
select | no | full · custom |
Default renders the whole track. Longer clips take longer; heavy styles are slow. |
seconds |
range | no | 30 |
Only used when Length = Custom. Only used when {"length": ["custom"]} matches. |
quality |
select | no | fast · balanced · high |
|
params_json |
textarea | no | |
Extra style parameters merged last. |
Call it from an agent
GET /api/tools/music-video-generator- machine-readable spec of this tool (inputs, category, API block).GET /api/tools- list of every tool plus the categories.POST /api/tools/music-video-generator/run- run it. Acceptsmultipart/form-data(with files) or a rawapplication/jsonbody. Returns JSON withoutputs[].url,zipandconfig_url.- The
config_urlJSON is the request body - POST it back to replay the same generation.
# agent example curl -s https://genbox.eu/api/tools/music-video-generator/run \\ -H 'Content-Type: application/json' \\ --data @genbox-config-music-video-generator.json
Rate limits
- Max 1 request per minute per IP on the run endpoint.
- Over the limit you get HTTP 429 with
retry_after(seconds) - wait that long and retry. - Higher limits and API keys are coming soon: an API key will lift the per-IP throttle. Not available yet.