Botverse Conform

Mux a separate video file and audio file into one fresh-encoded output, reconciling frame-rate or duration mismatches — or splice video and image segments together for slates, bumpers, end cards, and joined clips.

MCP endpoint
https://botverse.cloud/mcp
Auth
X-API-Key header
Output formats
mp4, webm, mov_prores
Starting price
$0.30 / job (up to 5 min)

What "conform" means here

A conform is what a post-production pipeline calls the step where a picture track and a separately-sourced audio track get combined into one deliverable — and where any mismatch between the two (frame rate, or plain length) gets reconciled before the two are locked together. Common cases: a video exported at one frame rate needs to marry up with audio recorded or mixed separately; a translated or re-recorded audio track is longer or shorter than the picture it belongs to; footage shot at 24fps needs to play back at 25fps (or vice versa) for a different delivery spec, with the audio's pitch and pace following it.

Botverse Conform does this as a single MCP call. Point it at a video and an audio source, pick how frame-rate and duration differences should be resolved, and get back one fresh-encoded file.

Conform methods

options.methodWhat it doesDuration effectWhen to use it
muxCombines the two streams as-is — no retiming.UnchangedRates already match; you just need one file out of two.
resample_videoDuplicates/drops video frames to hit target_framerate.Unchanged (real-time)Cheap frame-rate match, small rate change, speed matters.
interpolate_videoMotion-compensated retime to target_framerate (minterpolate).Unchanged (real-time)Larger rate change where dropped/duplicated frames would look jerky.
speed_conformEvery source frame kept, played back at target_framerate. Audio time-stretched by the same ratio.Changes by source_fps / target_fpsTrue pulldown-style conform, e.g. 24fps → 25fps NTSC/PAL-speed.
target_framerate is required for every method except mux. For speed_conform, Botverse detects the source video's actual frame rate automatically — you only supply the target.

Duration policy

Independently of the frame-rate method, the two sources might just be different lengths — a dubbed audio track that runs long, or a trimmed video that's shorter than its original audio. options.duration_policy decides what happens:

ValueBehaviour
shortest (default)Output is trimmed to the shorter of the two streams. If audio runs long, its tail is cut; if video runs long, playback ends when audio ends.
match_videoOutput is exactly video-length. If audio is shorter, the remainder is silence-padded rather than cutting the picture short.

Splice: slates, bumpers, end cards, and joining clips

A second conform operation, alongside the video+audio mux above: conform_splice_from_url and conform_splice_media concatenate an ordered list of video and/or still-image segments into one continuous, fresh-encoded output. Where you put an image segment decides what it reads as — the mechanism underneath is identical either way:

Image segment positionWhat it reads asTypical use
FirstHead slate / bumperTitle card or logo before the footage starts
LastTail slate / end cardCredits or contact card after the footage ends
MiddleMid-roll insert / cutawayA caption or still dropped between two shots
No image segments at allStraight spliceJoining two or more real video clips back-to-back

Every segment is scaled to fit the output frame and letterboxed — not stretched — if its aspect ratio differs, so a portrait or square slate against widescreen footage doesn't distort. Any segment without its own audio (every still image, or an occasional silent video clip) gets a matching silent track synthesised automatically, so the output's audio never drops out mid-timeline. At least one segment must be a video — its resolution and frame rate become the output's defaults unless options.width/height/framerate override them. 2–8 segments per job.

Tools

conform_from_url

Fetch a video file and an audio file from public HTTPS URLs (or cloud share links) and mux them into one output — no upload step required. Use this when both sources are already hosted online.

Parameters
NameTypeReqDescription
video_urlstringyesPublic HTTPS URL of the video source. Its frames and resolution drive the output. Share links from Dropbox, Google Drive, OneDrive, SharePoint, Box auto-resolve.
audio_urlstringyesPublic HTTPS URL of the audio source. Replaces/supplies the video's audio track.
output_formatstringyesOne of: mp4, webm, mov_prores.
options.methodstringnomux (default) | resample_video | interpolate_video | speed_conform.
options.target_frameratenumbernoTarget video frame rate. Required for every method except mux.
options.duration_policystringnoshortest (default) | match_video.
options.width / heightnumbernoResize output. Single dimension scales proportionally.
options.bitratestringnoVideo bitrate override, e.g. '2M'.
options.audio_bitratestringnoAudio bitrate, e.g. '128k'.
options.h264_profilestringnobaseline | main | high — mp4 output only.
Response fields
FieldTypeDescription
job_idstringUnique job identifier. Poll get_job_status with this.
statusstring"pending" on success.
estimated_cost_usdnumberPre-flight cost estimate.
conform_media

Mux an already-uploaded video and audio file (both from get_upload_url) into one output. Use for local files, or files too large to fetch by URL.

Parameters
NameTypeReqDescription
video_object_keystringyesS3 object key from get_upload_url for the video source.
audio_object_keystringyesS3 object key from get_upload_url for the audio source.
output_formatstringyesOne of: mp4, webm, mov_prores.
optionsobjectnoSame fields as conform_from_url.options.
Response fields
FieldTypeDescription
job_idstringUnique job identifier. Use for polling and download.
statusstring"pending" on success.
conform_splice_from_url

Concatenate an ordered list of video and/or still-image segments (all public HTTPS URLs) into one continuous, fresh-encoded output — head/tail slates, bumpers, end cards, mid-roll inserts, or joining real clips back-to-back.

Parameters
NameTypeReqDescription
segmentsarrayyesOrdered list of {type: 'video', url} or {type: 'image', url, duration_seconds}. 2–8 entries; at least one type 'video'.
output_formatstringyesOne of: mp4, webm, mov_prores.
options.width / height / frameratenumbernoDefaults to the first video segment's own values.
options.bitratestringnoVideo bitrate override, e.g. '2M'.
options.audio_bitratestringnoAudio bitrate, e.g. '128k'.
options.h264_profilestringnobaseline | main | high — mp4 output only.
Response fields
FieldTypeDescription
job_idstringUnique job identifier. Poll get_job_status with this.
statusstring"pending" on success.
estimated_cost_usdnumberPre-flight cost estimate.
conform_splice_media

Same as conform_splice_from_url, using already-uploaded segments (each from get_upload_url) instead of public URLs. Use for local files, or files too large to fetch by URL.

Parameters
NameTypeReqDescription
segmentsarrayyesOrdered list of {type: 'video', object_key} or {type: 'image', object_key, duration_seconds}. 2–8 entries; at least one type 'video'.
output_formatstringyesOne of: mp4, webm, mov_prores.
optionsobjectnoSame fields as conform_splice_from_url.options.
Response fields
FieldTypeDescription
job_idstringUnique job identifier. Use for polling and download.
statusstring"pending" on success.

Example — combine a picture and a replacement audio track

The simplest conform: video and audio are already at the same frame rate and the same length, and you just need them muxed into one deliverable.

Agent calls conform_from_url
// Agent calls:
{
  "name": "conform_from_url",
  "arguments": {
    "video_url": "https://cdn.example.com/footage/scene-04-picture.mp4",
    "audio_url": "https://cdn.example.com/footage/scene-04-remix.wav",
    "output_format": "mp4"
  }
}

// Botverse returns:
{
  "job_id": "job_9a1c2f4e",
  "status": "pending",
  "estimated_cost_usd": 0.30
}

Example — reconcile a frame-rate mismatch

Picture was delivered at 30fps; the target spec needs 24fps, and dropping every fifth frame would judder too much on this footage. Use interpolate_video for a motion-compensated retime:

Agent calls conform_from_url with interpolate_video
{
  "name": "conform_from_url",
  "arguments": {
    "video_url": "https://cdn.example.com/footage/interview-30fps.mp4",
    "audio_url": "https://cdn.example.com/footage/interview-mixed.wav",
    "output_format": "mp4",
    "options": {
      "method": "interpolate_video",
      "target_framerate": 24
    }
  }
}
For a small rate change (e.g. 30→29.97) or when render speed matters more than the last bit of motion smoothness, use resample_video instead — it's near-instant, versus interpolation which can take significantly longer to encode.

Example — true pulldown-style speed conform

Footage was shot at 24fps and needs to conform to a 25fps PAL-speed delivery: every frame is kept, but the whole thing plays back about 4% faster, and the audio needs to speed up by the same ratio to stay in sync.

Agent calls conform_from_url with speed_conform
{
  "name": "conform_from_url",
  "arguments": {
    "video_url": "https://cdn.example.com/footage/master-24fps.mov",
    "audio_url": "https://cdn.example.com/footage/master-mix-24fps.wav",
    "output_format": "mov_prores",
    "options": {
      "method": "speed_conform",
      "target_framerate": 25
    }
  }
}

// Botverse detects the source is 24fps and retimes both streams by 24/25 —
// output runs about 4% shorter in wall-clock time, same frame count, audio
// pitch/pace shifted to match.

Example — audio track runs long, keep the video's length

A dubbed or remixed audio track that's a few seconds longer than the picture. Use duration_policy: "match_video" so the video is never cut short and the extra audio is what gets truncated:

Agent calls conform_from_url with duration_policy
{
  "name": "conform_from_url",
  "arguments": {
    "video_url": "https://cdn.example.com/footage/promo-picture.mp4",
    "audio_url": "https://cdn.example.com/footage/promo-audio-fr.wav",
    "output_format": "mp4",
    "options": {
      "duration_policy": "match_video"
    }
  }
}

Poll for completion, then download

Agent polls get_job_status, then get_download_url
let status;
do {
  await new Promise(r => setTimeout(r, 5000));
  status = await callTool("get_job_status", { job_id: "job_9a1c2f4e" });
} while (!["complete", "failed"].includes(status.status));

if (status.status === "complete") {
  const { download_url } = await callTool("get_download_url", { job_id: "job_9a1c2f4e" });
}

From the command line

Same pipeline, no agent required:

botverse CLI
botverse conform video.mp4 audio.wav --to mp4 \
  --method speed_conform --target-framerate 25

Example — a title card in front of the footage (head slate / bumper)

Put the image segment first. It holds for duration_seconds, then the video plays — with silent audio synthesised under the still so the track never drops out at the cut:

Agent calls conform_splice_from_url
{
  "name": "conform_splice_from_url",
  "arguments": {
    "segments": [
      { "type": "image", "url": "https://cdn.example.com/title-card.png", "duration_seconds": 3 },
      { "type": "video", "url": "https://cdn.example.com/episode-04.mp4" }
    ],
    "output_format": "mp4"
  }
}

// Botverse returns:
{
  "job_id": "job_7f2b9a1c",
  "status": "pending",
  "segments": 2,
  "estimated_cost_usd": 0.30
}

Example — an end card after the footage (tail slate)

Same shape, image segment last instead of first:

Agent calls conform_splice_from_url
{
  "name": "conform_splice_from_url",
  "arguments": {
    "segments": [
      { "type": "video", "url": "https://cdn.example.com/episode-04.mp4" },
      { "type": "image", "url": "https://cdn.example.com/contact-card.png", "duration_seconds": 5 }
    ],
    "output_format": "mp4"
  }
}

Example — joining two real clips (no image involved)

All-video segments splice the clips back-to-back — the same tool covers this with no image at all:

Agent calls conform_splice_media
{
  "name": "conform_splice_media",
  "arguments": {
    "segments": [
      { "type": "video", "object_key": "inputs/…/part-a.mp4" },
      { "type": "video", "object_key": "inputs/…/part-b.mp4" }
    ],
    "output_format": "mp4"
  }
}
A mid-roll insert or cutaway is the same call with the image segment placed between two video segments instead of at either end — order in the segments array is playback order.

Which workflow to use

SituationRecommended tool
Both files are on public URLs (CDN, Dropbox, Google Drive, S3 public link)conform_from_url — one call, no upload step
Files are on the user's machine, or too large for a URL fetchget_upload_url (×2) → conform_media
Rates already match, just need one file out of twoconform_from_url / conform_media with default options.method: mux
Chaining from a prior workflow step's outputreference $.steps.<id>.output_key as video_url or audio_url — see Workflows
Adding a title card, end card, or mid-roll still to a videoconform_splice_from_url / conform_splice_media with an image segment
Joining two or more real video clips into oneconform_splice_from_url / conform_splice_media, all segments type video
Conform composes with the rest of Botverse in a single submitted workflow — e.g. transcode a raw video down first, transcribe a separate audio source, then conform the two together, all as one BWDL definition with depends_on wiring the steps together.