Smaller files. Formats every player reads.
Send a video by URL and get back the codec, size and quality you choose. One job can write several versions of the same upload.
Who uses it: Apps that store what users upload, course and media platforms, and anyone paying for bandwidth.
01
Compress and transcode
Re-encodes a video to H.264, H.265, VP9 or AV1 at the quality you set with CRF and a preset.
- What it is for
- Smaller files cost less to store and start playing sooner on slow connections.
- Endpoint and fields
POST /v1/transcodevideoaudio- In ffmpeg
-c:v libx264-crf-preset-movflags +faststart
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-small.mp4",
"video": {
"codec": "h264",
"crf": 28,
"encoder_preset": "veryfast"
},
"audio": {
"codec": "aac",
"bitrate": "128k"
}
}' 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-small.mp4",
"video": {
"codec": "h264",
"crf": 28,
"encoder_preset": "veryfast"
},
"audio": {
"codec": "aac",
"bitrate": "128k"
}
});
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-small.mp4",
"video": {
"codec": "h264",
"crf": 28,
"encoder_preset": "veryfast"
},
"audio": {
"codec": "aac",
"bitrate": "128k"
}
}),
});
const job = await response.json(); ffmpeg \
-i https://example.com/talk.mp4 \
-map 0:v:0 \
-vf "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 28 -pix_fmt yuv420p \
-map "0:a:0?" \
-c:a aac -b:a 128k -movflags +faststart \
talk-small.mp4 Output. talk-small.mp4: H.264 video at CRF 28 with AAC audio at 128 kbit/s, its index at the front so it plays before the whole file has arrived.
02
WebM for browsers
Encodes VP9 video with Opus audio into a WebM file.
- What it is for
- VP9 keeps quality at lower bitrates than H.264, and every current browser plays it.
- Endpoint and fields
POST /v1/transcodevideoaudio- In ffmpeg
-c:v libvpx-vp9-c:a libopus
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.webm",
"video": {
"codec": "vp9",
"crf": 32,
"max_bitrate": "2M"
},
"audio": {
"codec": "opus",
"bitrate": "96k"
}
}' 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.webm",
"video": {
"codec": "vp9",
"crf": 32,
"max_bitrate": "2M"
},
"audio": {
"codec": "opus",
"bitrate": "96k"
}
});
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.webm",
"video": {
"codec": "vp9",
"crf": 32,
"max_bitrate": "2M"
},
"audio": {
"codec": "opus",
"bitrate": "96k"
}
}),
});
const job = await response.json(); ffmpeg \
-i https://example.com/talk.mp4 \
-map 0:v:0 \
-vf "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 libvpx-vp9 -crf 32 -b:v 2M -pix_fmt yuv420p \
-map "0:a:0?" \
-c:a libopus -b:a 96k \
talk.webm Output. talk.webm: VP9 video at CRF 32 capped at 2 Mbit/s, with Opus audio at 96 kbit/s.
03
Renditions: several sizes in one job
Writes an MP4 for each size you name with a preset, keeping the shape, from one read of the input.
- What it is for
- Serve 1080p to big screens and 720p to phones from one upload and one request.
- Endpoint and fields
POST /v1/jobsoutputs- In ffmpeg
splitscale-map
curl "$VIDEXO_API_URL/v1/jobs" \
-H "Authorization: Bearer $VIDEXO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"inputs": {
"talk": "https://example.com/talk.mp4"
},
"outputs": [
{
"name": "hd",
"preset": "web-1080p",
"filename": "talk-1080p.mp4"
},
{
"name": "sd",
"preset": "web-720p",
"filename": "talk-720p.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.jobs.create({
"inputs": {
"talk": "https://example.com/talk.mp4"
},
"outputs": [
{
"name": "hd",
"preset": "web-1080p",
"filename": "talk-1080p.mp4"
},
{
"name": "sd",
"preset": "web-720p",
"filename": "talk-720p.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/jobs`, {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.VIDEXO_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"inputs": {
"talk": "https://example.com/talk.mp4"
},
"outputs": [
{
"name": "hd",
"preset": "web-1080p",
"filename": "talk-1080p.mp4"
},
{
"name": "sd",
"preset": "web-720p",
"filename": "talk-720p.mp4"
}
]
}),
});
const job = await response.json(); ffmpeg \
-i https://example.com/talk.mp4 \
-map 0:v:0 \
-vf "scale='min(iw,1920)':'min(ih,1080)':force_original_aspect_ratio=decrease:force_divisible_by=2" \
-c:v libx264 -preset veryfast -crf 22 -pix_fmt yuv420p \
-map "0:a:0?" \
-c:a aac -b:a 160k -movflags +faststart \
talk-1080p.mp4 \
-map 0:v:0 \
-vf "scale='min(iw,1280)':'min(ih,720)':force_original_aspect_ratio=decrease:force_divisible_by=2" \
-c:v libx264 -preset veryfast -crf 23 -pix_fmt yuv420p \
-map "0:a:0?" \
-c:a aac -b:a 128k -movflags +faststart \
talk-720p.mp4 Output. talk-1080p.mp4 and talk-720p.mp4: H.264 MP4s within 1920 by 1080 and 1280 by 720, never enlarged, from one read of the input.
04
Change the frame rate
Converts a video to a fixed frame rate, dropping or repeating frames as needed.
- What it is for
- Phones record at variable rates; editors, players and TV formats expect a constant one.
- Endpoint and fields
POST /v1/transcodefpsaudio- In ffmpeg
fps
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-30fps.mp4",
"fps": 30,
"audio": {
"codec": "copy"
}
}' 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-30fps.mp4",
"fps": 30,
"audio": {
"codec": "copy"
}
});
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-30fps.mp4",
"fps": 30,
"audio": {
"codec": "copy"
}
}),
});
const job = await response.json(); ffmpeg \
-i https://example.com/talk.mp4 \
-map 0:v:0 \
-vf "scale='min(trunc(iw/2)*2,min(7680,min(trunc(7680*iw/ih/2)*2,trunc(sqrt(33554432*iw/ih)/2)*2)))':-2,fps=30" \
-c:v libx264 -preset veryfast -crf 23 -pix_fmt yuv420p \
-map "0:a:0?" \
-c:a copy -movflags +faststart \
talk-30fps.mp4 Output. talk-30fps.mp4: the video at a constant 30 frames a second, the audio copied as it was.
Limits. Set by your plan.
- Video codecs: H.264 (libx264), H.265 (libx265), VP8 and VP9 (libvpx, libvpx-vp9), AV1 (libaom-av1), MPEG-4, FFV1. VP9 and AV1 take several times longer to encode than H.264; check the time against your plan’s longest job.
- Containers: MP4, MOV, MKV, WebM and MPEG-TS, one file per output. Adaptive streaming (HLS) Soon.
- 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
Soon. Planned, not available yet.
Adaptive streaming (HLS) and a player Soon
Playback that adapts to the connection, with an embeddable player.
AI upscale Soon
Raise a video to 1080p, 1440p or 4K with AI that restores detail, with optional smoother motion.