Video Editing

Apply edits to video files: trim, crop, overlay, speed changes, text, audio mixing, and more.


POST/api/v1/video/edit

Request Body

ParameterTypeRequiredDescription
operationstringYesThe editing operation to perform (see operations below)
paramsobjectNoOperation-specific parameters
mediaIdsstring[]NoMedia IDs to operate on (number depends on operation)
audioMediaIdstringNoAudio media ID (used by editAudio and audioTrim)
promptTextstringNoText content for textOverlay operation
captionSegmentsarrayNoCaption segments for textOverlay caption mode

Response

{
  "editorJobId": "ej_..."
}

Operations

trim

Trim a video to a specific time range. Requires 1 mediaId.

ParameterTypeRequiredDescription
trimStartMsnumberYesStart time in milliseconds (min 0)
trimEndMsnumberYesEnd time in milliseconds (min 100). trimEndMs - trimStartMs must be >= 100

Example

{
  "operation": "trim",
  "mediaIds": ["media_abc"],
  "params": {
    "trimStartMs": 0,
    "trimEndMs": 5000
  }
}

crop

Crop a video with position, padding, and aspect ratio controls. Requires 1 mediaId.

ParameterTypeRequiredDescription
positionstringNoCrop anchor: top-left, top-center, top-right, center-left, center, center-right, bottom-left, bottom-center, bottom-right
paddingTopnumberNoTop padding (0-50)
paddingRightnumberNoRight padding (0-50)
paddingBottomnumberNoBottom padding (0-50)
paddingLeftnumberNoLeft padding (0-50)
cropAxisstringNoAxis to crop: "width" | "height"
cropPercentnumberNoCrop percentage (10-100)
aspectRatiostringNo16:9, 9:16, 1:1, 4:5, 21:9, custom (default 16:9)
customWidthintegerNoCustom width (required when aspectRatio is custom)
customHeightintegerNoCustom height (required when aspectRatio is custom)

Example

{
  "operation": "crop",
  "mediaIds": ["media_abc"],
  "params": {
    "position": "center",
    "aspectRatio": "9:16",
    "cropAxis": "width",
    "cropPercent": 80
  }
}

volume

Adjust video volume or mute. Requires 1 mediaId.

ParameterTypeRequiredDescription
volumenumberNoVolume level (0-100, default 100)
mutedbooleanNoMute the video (default false)

Example

{
  "operation": "volume",
  "mediaIds": ["media_abc"],
  "params": { "volume": 50 }
}

speed

Change video playback speed. Requires 1 mediaId.

ParameterTypeRequiredDescription
speednumberNoPlayback speed multiplier (0.33-3, default 1)
preservePitchbooleanNoKeep original audio pitch (default true)

Example

{
  "operation": "speed",
  "mediaIds": ["media_abc"],
  "params": { "speed": 2, "preservePitch": true }
}

textOverlay

Add text or captions on top of a video. Requires 1 mediaId and either promptText or captionSegments at the request body level.

ParameterTypeRequiredDescription
modestringNo"text" | "caption" (default text)
durationModestringNo"full" | "duration"
startTimestringNoStart time in MM:SS format (required if durationMode is duration)
endTimestringNoEnd time in MM:SS format (required if durationMode is duration)
positionstringNotop-left, top-center, top-right, center-left, center, center-right, bottom-left, bottom-center, bottom-right
paddingnumberNoPadding around text (0-50)
sizePercentnumberNoText container size (10-100)
fontFamilystringNoInter, Montserrat, Bebas Neue, Oswald, Bungee Inline, League Spartan, Roboto, Poppins, Raleway, Anton, Darker Grotesque, TikTok Sans, TikTok Sans Condensed, TikTok Sans SemiCondensed, TikTok Sans SemiExpanded, TikTok Sans Expanded, TikTok Sans ExtraExpanded, Nohemi, Comic Cat, Gavency
fontSizeScalenumberNoFont size multiplier (0.3-3)
textColorstringNoHex color for the text (e.g. #FFFFFF)
strokeColorstringNoHex color for the text stroke
highlightColorstringNoHex color for the text highlight
strokeWidthnumberNoStroke width (0-20)
showShadowbooleanNoShow drop shadow behind text

Example

{
  "operation": "textOverlay",
  "mediaIds": ["media_abc"],
  "promptText": "Hello World!",
  "params": {
    "mode": "text",
    "durationMode": "full",
    "position": "bottom-center",
    "fontFamily": "Montserrat",
    "textColor": "#FFFFFF",
    "strokeColor": "#000000",
    "strokeWidth": 2
  }
}

editAudio

Mix an audio track into a video. Requires 1 mediaId and an optional audioMediaId.

ParameterTypeRequiredDescription
videoVolumenumberNoVolume of the original video audio (0-100)
audioVolumenumberNoVolume of the added audio track (0-100)
audioStartMsnumberNoStart offset of the audio track in milliseconds (min 0)
audioEndMsnumberNoEnd offset of the audio track in milliseconds (min 0, optional)
audioOffsetMsnumberNoOffset where the audio starts in the video timeline (min 0)

Example

{
  "operation": "editAudio",
  "mediaIds": ["media_video"],
  "audioMediaId": "media_audio",
  "params": {
    "videoVolume": 30,
    "audioVolume": 80,
    "audioStartMs": 0,
    "audioOffsetMs": 2000
  }
}

extractAudio

Extract the audio track from a video. Requires 1 mediaId. No additional params. Returns an audio file.

Example

{
  "operation": "extractAudio",
  "mediaIds": ["media_abc"]
}

reverseVideo

Reverse the playback of a video. Requires 1 mediaId. No additional params.

Example

{
  "operation": "reverseVideo",
  "mediaIds": ["media_abc"]
}

extractFrame

Extract a single frame from a video as a JPEG image. Requires 1 mediaId.

ParameterTypeRequiredDescription
timestampMsintegerNoAbsolute timestamp in milliseconds. Takes precedence over timestampPercent
timestampPercentnumberNoRelative position as a percentage (0-100)

Example

{
  "operation": "extractFrame",
  "mediaIds": ["media_abc"],
  "params": { "timestampMs": 3500 }
}

imageToVideo

Convert a static image into a video. Requires 1 mediaId (image).

ParameterTypeRequiredDescription
durationMsnumberNoDuration in milliseconds (500-60000, default 5000)

Example

{
  "operation": "imageToVideo",
  "mediaIds": ["media_img"],
  "params": { "durationMs": 3000 }
}

overlay

Place one video or image on top of another. Requires 2 mediaIds (base + overlay).

ParameterTypeRequiredDescription
positionstringNotop-left, top-center, top-right, center-left, center, center-right, bottom-left, bottom-center, bottom-right
paddingnumberNoPadding around overlay (0-50)
resizeAxisstringNoAxis to constrain: "width" | "height"
resizePercentnumberNoOverlay size as percentage of base (10-100)
baseVideoVolumenumberNoVolume of the base video (0-100, default 0)
overlayVideoVolumenumberNoVolume of the overlay video (0-100, default 100)
overlayStartMsnumberNoWhen the overlay appears in the base timeline (ms)
overlayDurationMsnumberNoHow long the overlay is visible (ms)

Example

{
  "operation": "overlay",
  "mediaIds": ["media_base", "media_overlay"],
  "params": {
    "position": "bottom-right",
    "resizeAxis": "width",
    "resizePercent": 30,
    "padding": 10
  }
}

splitScreen

Combine two videos side by side in a split-screen layout. Requires 2 mediaIds.

ParameterTypeRequiredDescription
targetAspectRatiostringNo"16:9" | "9:16" (default 16:9)

Example

{
  "operation": "splitScreen",
  "mediaIds": ["media_top", "media_bottom"],
  "params": { "targetAspectRatio": "9:16" }
}

merge

Concatenate 2 to 5 videos sequentially. Requires 2-5 mediaIds. No additional params.

Example

{
  "operation": "merge",
  "mediaIds": ["media_a", "media_b", "media_c"]
}

splitScenes

Detect and split a video into individual scenes. Requires 1 mediaId.

ParameterTypeRequiredDescription
thresholdnumberNoScene detection sensitivity (0.01-0.9, default 0.5)
minClipDurationnumberNoMinimum clip duration in seconds (0.1-5, default 0.5)
modestringNo"split" (output all clips) | "omit" (remove detected scenes). Default split
outputSelectionstring | integerNo"first", "last", or an integer index to pick a single clip (default 1)

Example

{
  "operation": "splitScenes",
  "mediaIds": ["media_abc"],
  "params": {
    "threshold": 0.3,
    "minClipDuration": 1,
    "mode": "split",
    "outputSelection": "first"
  }
}

motionDesign

Generate a motion graphics video from a text prompt using an AI model. Accepts 0-2 mediaIds as visual context.

ParameterTypeRequiredDescription
promptstringYesDescription of the motion design to generate
modelstringNogemini-2.5-pro, claude-opus-4, claude-sonnet-4.5 (default claude-sonnet-4.5)
canvasstringNo"landscape" | "portrait" | "square" (default landscape)
durationMsnumberNoDuration in milliseconds (1000-60000, default 5000)
includeMediaContextbooleanNoInclude attached media as visual context (default false)

Example

{
  "operation": "motionDesign",
  "mediaIds": [],
  "params": {
    "prompt": "Animated logo reveal with particles",
    "model": "claude-sonnet-4.5",
    "canvas": "landscape",
    "durationMs": 5000
  }
}