Vertical, square, any frame. From one landscape video.
Turn one recording into the shapes each network wants. Crop when the subject is in the middle, pad when nothing may be cut off.
Who uses it: Social tools, creator apps, marketing teams and anyone republishing long video as short clips.
01
Vertical 9:16
Crops the centre of a landscape video to 9:16 and scales it to 1080 by 1920.
- What it is for
- Reels, Shorts and TikTok fill the screen with vertical video.
- Endpoint and fields
POST /v1/transcodepreset- In ffmpeg
cropscale
curl "$VIDEXO_API_URL/v1/transcode" \
-H "Authorization: Bearer $VIDEXO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"input": "https://example.com/talk.mp4",
"preset": "social-vertical",
"filename": "talk-vertical.mp4"
}' import { Videxo } from '@videxo/sdk';
const videxo = new Videxo({ apiKey: process.env.VIDEXO_API_KEY, baseUrl: process.env.VIDEXO_API_URL });
const job = await videxo.transcode({
"input": "https://example.com/talk.mp4",
"preset": "social-vertical",
"filename": "talk-vertical.mp4"
});
const done = await videxo.jobs.wait(job.id); Install with npm i @videxo/sdk, or send the same request with curl or JavaScript. About the SDK
const response = await fetch(`${process.env.VIDEXO_API_URL}/v1/transcode`, {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.VIDEXO_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"input": "https://example.com/talk.mp4",
"preset": "social-vertical",
"filename": "talk-vertical.mp4"
}),
});
const job = await response.json(); ffmpeg \
-i https://example.com/talk.mp4 \
-map 0:v:0 \
-vf scale=1080:1920:force_original_aspect_ratio=increase,crop=1080:1920,fps=30 \
-c:v libx264 -preset veryfast -crf 23 -pix_fmt yuv420p \
-map "0:a:0?" \
-c:a aac -b:a 128k -movflags +faststart \
talk-vertical.mp4 Output. talk-vertical.mp4: a 1080 by 1920 video at 30 frames a second, cut from the middle of the frame, with the sound as AAC.
02
Square 1:1
Crops the centre of a landscape video to a square and scales it to 1080 by 1080.
- What it is for
- Square video takes the most room in a feed on both phones and desktops.
- Endpoint and fields
POST /v1/transcodepreset- In ffmpeg
cropscale
curl "$VIDEXO_API_URL/v1/transcode" \
-H "Authorization: Bearer $VIDEXO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"input": "https://example.com/talk.mp4",
"preset": "square",
"filename": "talk-square.mp4"
}' import { Videxo } from '@videxo/sdk';
const videxo = new Videxo({ apiKey: process.env.VIDEXO_API_KEY, baseUrl: process.env.VIDEXO_API_URL });
const job = await videxo.transcode({
"input": "https://example.com/talk.mp4",
"preset": "square",
"filename": "talk-square.mp4"
});
const done = await videxo.jobs.wait(job.id); Install with npm i @videxo/sdk, or send the same request with curl or JavaScript. About the SDK
const response = await fetch(`${process.env.VIDEXO_API_URL}/v1/transcode`, {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.VIDEXO_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"input": "https://example.com/talk.mp4",
"preset": "square",
"filename": "talk-square.mp4"
}),
});
const job = await response.json(); ffmpeg \
-i https://example.com/talk.mp4 \
-map 0:v:0 \
-vf scale=1080:1080:force_original_aspect_ratio=increase,crop=1080:1080,fps=30 \
-c:v libx264 -preset veryfast -crf 23 -pix_fmt yuv420p \
-map "0:a:0?" \
-c:a aac -b:a 128k -movflags +faststart \
talk-square.mp4 Output. talk-square.mp4: a 1080 by 1080 video at 30 frames a second, cut from the middle of the frame, with the sound as AAC.
03
Pad and letterbox
Fits the whole picture into a new frame and fills the rest with a colour.
- What it is for
- Nothing is cut off, so slides, screen recordings and captions stay readable in any format.
- Endpoint and fields
POST /v1/transcoderesize- In ffmpeg
scalepad
curl "$VIDEXO_API_URL/v1/transcode" \
-H "Authorization: Bearer $VIDEXO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"input": "https://example.com/talk.mp4",
"filename": "talk-letterbox.mp4",
"resize": {
"width": 1080,
"height": 1920,
"fit": "pad",
"pad_color": "black"
}
}' import { Videxo } from '@videxo/sdk';
const videxo = new Videxo({ apiKey: process.env.VIDEXO_API_KEY, baseUrl: process.env.VIDEXO_API_URL });
const job = await videxo.transcode({
"input": "https://example.com/talk.mp4",
"filename": "talk-letterbox.mp4",
"resize": {
"width": 1080,
"height": 1920,
"fit": "pad",
"pad_color": "black"
}
});
const done = await videxo.jobs.wait(job.id); Install with npm i @videxo/sdk, or send the same request with curl or JavaScript. About the SDK
const response = await fetch(`${process.env.VIDEXO_API_URL}/v1/transcode`, {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.VIDEXO_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"input": "https://example.com/talk.mp4",
"filename": "talk-letterbox.mp4",
"resize": {
"width": 1080,
"height": 1920,
"fit": "pad",
"pad_color": "black"
}
}),
});
const job = await response.json(); ffmpeg \
-i https://example.com/talk.mp4 \
-map 0:v:0 \
-vf "scale=1080:1920:force_original_aspect_ratio=decrease:force_divisible_by=2,pad=1080:1920:(ow-iw)/2:(oh-ih)/2:color=0x000000" \
-c:v libx264 -preset veryfast -crf 23 -pix_fmt yuv420p \
-map "0:a:0?" \
-c:a aac -b:a 128k -movflags +faststart \
talk-letterbox.mp4 Output. talk-letterbox.mp4: the full landscape picture centred in a 1080 by 1920 frame, black above and below.
04
Rotate and flip
Turns a video by 90 degrees, or mirrors it left to right or top to bottom.
- What it is for
- Fixes phone footage recorded sideways and selfie video that came out mirrored.
- Endpoint and fields
POST /v1/transcoderotate- In ffmpeg
transposehflipvflip
curl "$VIDEXO_API_URL/v1/transcode" \
-H "Authorization: Bearer $VIDEXO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"input": "https://example.com/talk.mp4",
"filename": "talk-rotated.mp4",
"rotate": 90
}' import { Videxo } from '@videxo/sdk';
const videxo = new Videxo({ apiKey: process.env.VIDEXO_API_KEY, baseUrl: process.env.VIDEXO_API_URL });
const job = await videxo.transcode({
"input": "https://example.com/talk.mp4",
"filename": "talk-rotated.mp4",
"rotate": 90
});
const done = await videxo.jobs.wait(job.id); Install with npm i @videxo/sdk, or send the same request with curl or JavaScript. About the SDK
const response = await fetch(`${process.env.VIDEXO_API_URL}/v1/transcode`, {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.VIDEXO_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"input": "https://example.com/talk.mp4",
"filename": "talk-rotated.mp4",
"rotate": 90
}),
});
const job = await response.json(); ffmpeg \
-i https://example.com/talk.mp4 \
-map 0:v:0 \
-vf "transpose=clock,scale='min(trunc(iw/2)*2,min(7680,min(trunc(7680*iw/ih/2)*2,trunc(sqrt(33554432*iw/ih)/2)*2)))':-2" \
-c:v libx264 -preset veryfast -crf 23 -pix_fmt yuv420p \
-map "0:a:0?" \
-c:a aac -b:a 128k -movflags +faststart \
talk-rotated.mp4 Output. talk-rotated.mp4: the video turned 90 degrees clockwise.
Limits. Set by your plan.
- A crop takes the area you choose, the centre in these examples, or the anchor you name in JSON.
- Commands may size crops and pads with expressions such as ih*9/16 and (ow-iw)/2.
- Inputs are public http or https URLs, or completed private uploads up to 100 MB and your plan’s input limit. Outputs have signed download links. A job names up to 16 input and 16 output files.
| Limit | Pay as you go | Starter | Pro | Scale |
|---|---|---|---|---|
| Longest job | 10 min | 10 min | 30 min | 60 min |
| Inputs per job | 1 GB | 1 GB | 5 GB | 10 GB |
| Outputs per job | 1 GB | 1 GB | 5 GB | 8 GB |
| Outputs expire after | 7 days | 7 days | 30 days | 30 days |
Pay as you go
- Longest job
- 10 min
- Inputs per job
- 1 GB
- Outputs per job
- 1 GB
- Outputs expire after
- 7 days
Starter
- Longest job
- 10 min
- Inputs per job
- 1 GB
- Outputs per job
- 1 GB
- Outputs expire after
- 7 days
Pro
- Longest job
- 30 min
- Inputs per job
- 5 GB
- Outputs per job
- 5 GB
- Outputs expire after
- 30 days
Scale
- Longest job
- 60 min
- Inputs per job
- 10 GB
- Outputs per job
- 8 GB
- Outputs expire after
- 30 days