4. Recipes
The route never changes — only the three form fields do. Each recipe below is
the same POST https://mp.dvocorp.com/api/v1/jobs/upload with a different
service_slug / operation_key / params.
| Goal | service_slug |
operation_key |
params |
|---|---|---|---|
| Compress a photo to 70% JPEG | photoconvert |
compress |
{"quality": 70, "format": "jpeg"} |
| Photo to WebP | photoconvert |
convert |
{"format": "webp", "quality": 85} |
| Square crop | photoconvert |
crop |
{"crop_aspect": "1:1"} |
| Round avatar, transparent | photoconvert |
circle |
{"diameter": 512} |
| Strip EXIF + GPS | photoconvert |
strip_meta |
{"strip_metadata": true, "strip_gps": true} |
| Instagram portrait size | photoconvert |
social |
{"width": 1080, "height": 1350, "resize_mode": "fill"} |
| Shrink a video | clipconvert |
compress |
{"level": "medium"} |
| Exactly 1280×720, letterboxed | clipconvert |
resize |
{"width": 1280, "height": 720, "mode": "pad"} |
| First 30 seconds | clipconvert |
trim |
{"start": 0, "duration": 30} |
| Video → GIF | clipconvert |
gif |
{"start": 0, "duration": 5, "fps": 15, "width": 480} |
| Rip the audio | clipconvert |
extract_audio |
{"format": "mp3"} |
| Burn auto-captions | clipconvert |
subtitles |
{"style": "karaoke", "position": "top"} |
| Speech → SRT file | clipconvert |
transcribe |
{"format": "srt"} |
| Telegram video note | clipconvert |
circle |
{"format": "note", "diameter": 512, "duration": 60} |
| Landscape → TikTok canvas | clipconvert |
blur_bg |
{"width": 1080, "height": 1920, "bg_mode": "blur"} |
Written out in full, one of them:
curl -s https://mp.dvocorp.com/api/v1/jobs/upload \
-H 'X-Api-Key: ca_live_...' \
-F 'file=@/path/to/clip.mp4' \
-F 'service_slug=clipconvert' \
-F 'operation_key=resize' \
-F 'params={"width": 1280, "height": 720, "mode": "pad"}'
The sections below document every parameter of the operations that have more than a couple.
Subtitles & transcription
subtitles puts captions on the video. Text comes from your own file
(subtitles_url or inline subtitles_text), or — if you give neither — from
automatic speech recognition of the audio track.
| Param | Values | Default |
|---|---|---|
mode |
burn (baked in) / embed (soft track, mp4/mov/mkv only) |
burn |
language |
en, uk, ru, … |
auto-detect |
task |
transcribe / translate (→ English captions) |
transcribe |
style |
boxed / clean / yellow / karaoke (word-by-word) |
boxed |
position |
bottom / middle / top |
bottom |
font_size |
2–12 (% of frame height) | 5 |
subtitles_url / subtitles_text |
your own SRT / VTT / ASS | — |
subtitles_text must contain timestamps — plain text is rejected.
{
"service_slug": "clipconvert",
"operation_key": "subtitles",
"params": { "file_url": "https://.../clip.mp4", "style": "karaoke", "position": "top" }
}
transcribe returns a subtitle/text file instead of a video —
format: srt (default), vtt, ass, txt, json.
{
"service_slug": "clipconvert",
"operation_key": "transcribe",
"params": { "file_url": "https://.../interview.mp4", "format": "srt", "task": "translate" }
}
Auto-edit & voice cleanup
auto_edit is an ASR-driven rough cut: drops dead air, tightens pauses
longer than max_pause (default 0.6s) down to keep_pause (0.3s) of natural
ambience, cuts standalone filler sounds («эээ», "um" — extend with
filler_words), and with remove_retakes: true drops a sentence that is
immediately re-spoken almost verbatim, keeping the last take.
enhance_voice cleans phone audio in the same encode pass: noise reduction,
de-esser, gentle compression, loudness normalization to −16 LUFS.
Add audio (voiceover / music)
add_audio lays one or more audio tracks over the video — a voiceover, a
music bed, sound effects — mixing them with the video's own soundtrack. Up to
8 tracks in one pass. The result always keeps the video's duration: a
3-minute music bed under a 10-second clip is cut at 10 seconds, and a track
shorter than the video simply stops (or repeats, with loop).
Per track:
| Field | Meaning |
|---|---|
audio_url |
The track to mix in (fetched server-side, same SSRF rules as a watermark logo) |
volume |
0–4, 1 = as-is. A bed under speech usually wants 0.15–0.3 |
offset_sec |
Where it starts on the video timeline |
start_sec |
Skip this far into the track before using it |
loop |
Repeat until the video ends — for beds shorter than the clip |
fade_in_sec / fade_out_sec |
Fades; the fade-out is anchored to the end of the video |
Plus original_volume (0–4, default 1) for the video's own audio —
0 replaces the soundtrack entirely. On a silent video the original leg is
simply skipped.
{
"service_slug": "clipconvert",
"operation_key": "add_audio",
"params": {
"file_url": "https://.../talk.mp4",
"operations": "[{\"type\":\"add_audio\",\"original_volume\":0.25,\"tracks\":[{\"audio_url\":\"https://.../voice.mp3\",\"volume\":1},{\"audio_url\":\"https://.../music.mp3\",\"volume\":0.2,\"loop\":true,\"fade_out_sec\":2}]}]"
}
}
It composes with the rest of the pipeline in one pass (resize, compress,
subtitles, watermark…). The one exception is speed — both rewrite the
audio graph, so combining them is rejected with a clear error; run them as two
jobs instead.
Both run inside the pipeline, so they compose with everything else in one job:
{
"service_slug": "clipconvert",
"operation_key": "auto_edit",
"params": {
"file_url": "https://.../talk.mp4",
"operations": "[{\"type\":\"auto_edit\"},{\"type\":\"enhance_voice\"},{\"type\":\"subtitles\",\"style\":\"karaoke\"}]"
}
}
The finished job's result carries
auto_edit: { removed_sec, kept_sec, cuts } so you can show "cut 47 seconds of
pauses" to your user.
Note the
operationsvalue is a JSON string, not a nested object.
Circle video & Telegram video note
format decides what you get:
format |
Result |
|---|---|
note |
Square, cover-cropped, filled h264/aac clip, ≤60 s. This is the real Telegram video note format — Telegram renders it round only when a bot sends it as a video note. Use diameter: 512. |
mp4 |
Round video baked onto a solid bg_color (square file, colored corners). For sites and overlays — not Telegram notes. |
webm |
Round with real transparency. |
gif |
Animated, round on bg_color, silent. |
Other params: diameter 64–1080, zoom 1–3, offset_x / offset_y −1..1,
bg_color, start, duration, mute, fps, crf, loop.
{
"service_slug": "clipconvert",
"operation_key": "circle",
"params": { "file_url": "https://.../clip.mp4", "format": "note", "diameter": 512, "duration": 60, "mute": false }
}
Fit to canvas (blur_bg)
Landscape source → vertical TikTok / Reels / Shorts canvas:
{
"service_slug": "clipconvert",
"operation_key": "blur_bg",
"params": { "file_url": "https://.../wide.mp4", "width": 1080, "height": 1920, "bg_mode": "blur", "scale": 0.9, "pos_y": 0.5 }
}
bg_mode: blur / dark_blur / color / mirror / stretch.
scale and pos_y are 0–1 fractions of the canvas. Also: bg_color, blur,
dim, padding, radius.