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 04, 1 = as-is. A bed under speech usually wants 0.150.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 (04, 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 operations value 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.