Video to Video (Sound)
Generate a combined soundtrack — music and sound effects mixed together — for a video, muxed with the original picture and delivered as a new video file. Returns 202 Accepted with a task_id; poll GET /v1/tasks/:task_id until the task reaches a terminal status.
1 call free, no credit card required.
/v1/video-to-video-soundmultipart/form-datahttps://api.sonilo.com/v1/video-to-video-soundSend API requests to https://api.sonilo.com. The platform.sonilo.com/docs pages are documentation only and are not API endpoints.
curl -X POST https://api.sonilo.com/v1/video-to-video-sound \
-H "Authorization: Bearer sk_your_api_key" \
-F "video_url=https://example.com/clip.mp4" \
-F "music_prompt=uplifting orchestral score" \
-F "sfx_prompt=match the on-screen action"
# => {"task_id": "9f5f2f7e-...", "status": "processing"}
curl https://api.sonilo.com/v1/tasks/9f5f2f7e-... \
-H "Authorization: Bearer sk_your_api_key"
# poll until "status" is "succeeded" or "failed"curl -X POST https://api.sonilo.com/v1/video-to-video-sound \
-H "Authorization: Bearer sk_your_api_key" \
-F "video_url=https://example.com/clip.mp4" \
-F "preserve_speech=true" \
-F "ducking=false" \
-F 'segments=[{"start": 0, "end": 4, "prompt": "footsteps on gravel"}, {"start": 4, "end": 10, "prompt": "car door slam then engine starts"}]'{
"task_id": "9f5f2f7e-…",
"status": "processing"
}Authorization
Authenticate via Bearer token. Generate keys at the API Keys page and pass them in the Authorization header on every request. Keep keys server-side, for example in SONILO_API_KEY.
Authorization: Bearer sk_your_api_keyStore the key server-side, commonly as SONILO_API_KEY. A 401 means the key is missing, invalid, or revoked. A 403 means the key is valid but the account does not have access to that endpoint or workspace.
Body Parameters
videofilevideo or video_url, not both. Accepted formats: mp4, mov, webm, m4v, gif (animated). Max file size: default 300MB. Max duration: 180 sec.video_urlstringvideo or video_url, not both. Must be a public http:// or https:// URL; private/internal addresses are rejected.music_promptstringsfx_prompt. For best results, omit this and let the model infer a soundtrack from the on-screen action and visuals.sfx_promptstringmusic_prompt. For best results, omit this and let the model infer sound effects from the on-screen action, or use segments for finer control.segmentsstringstart and end (seconds; the first segment's start must be 0, each segment's end must be greater than its start, and segments must be contiguous — each end equal to the next segment's start) and prompt (1-200 characters) describing the sound effect for that segment. The last segment's end must not exceed the video duration, which is capped at 180 sec.preserve_speechbooleanfalse. When true, the original speech (dialogue, narration, or voice-over) is preserved while composing the music — the model isolates the speech from the source audio and composes the new music around it. Applies to the music side of the mix only. No additional charge.duckingbooleantrue. Ducks the generated music under the video's original speech, before the music is combined with the sound effects, so dialogue stays intelligible. Pass ducking=false to opt out. Ignored when preserve_speech is used. Free of charge.Response
task_idstringstatusstringcurl -X POST https://api.sonilo.com/v1/video-to-video-sound \
-H "Authorization: Bearer sk_your_api_key" \
-F "video_url=https://example.com/clip.mp4" \
-F "music_prompt=uplifting orchestral score" \
-F "sfx_prompt=match the on-screen action"
# => {"task_id": "9f5f2f7e-...", "status": "processing"}
curl https://api.sonilo.com/v1/tasks/9f5f2f7e-... \
-H "Authorization: Bearer sk_your_api_key"
# poll until "status" is "succeeded" or "failed"curl -X POST https://api.sonilo.com/v1/video-to-video-sound \
-H "Authorization: Bearer sk_your_api_key" \
-F "video_url=https://example.com/clip.mp4" \
-F "preserve_speech=true" \
-F "ducking=false" \
-F 'segments=[{"start": 0, "end": 4, "prompt": "footsteps on gravel"}, {"start": 4, "end": 10, "prompt": "car door slam then engine starts"}]'{
"task_id": "9f5f2f7e-…",
"status": "processing"
}