ffmpeg in the cloud. Without a server to keep.
Run ffmpeg in the cloud with one HTTPS request, a JSON job or your own command, and get the files and a signed webhook back, with no AWS setup, Docker image or queue to keep.
curl "$VIDEXO_API_URL/v1/transcode" \
-H "Authorization: Bearer $VIDEXO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"input": "https://videxo.io/samples/talk.mp4",
"preset": "web-720p",
"filename": "talk-720p.mp4",
"metadata": {
"order": "1234"
}
}' 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://videxo.io/samples/talk.mp4",
"preset": "web-720p",
"filename": "talk-720p.mp4",
"metadata": {
"order": "1234"
}
});
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
curl "$VIDEXO_API_URL/v1/jobs" \
-H "Authorization: Bearer $VIDEXO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"input_files": {
"in_video": "https://videxo.io/samples/talk.mp4"
},
"output_files": {
"out_main": "talk-720p.mp4"
},
"command": "-i {{in_video}} -vf scale=-2:720 -c:v libx264 -crf 23 -c:a copy {{out_main}}",
"metadata": {
"order": "1234"
}
}' What you stop running
Your command stays. The servers go.
| Part | On your own servers | With Videxo |
|---|---|---|
| ffmpeg itself | Install it, pick codecs, patch it. | ffmpeg 6.1.1 with H.264, H.265, VP9, AV1, Opus and 48 filters, ready for every job. |
| The commands | Look up filters and flags for every format and size. | Describe each output in JSON with a preset or a few options, or send the commands you already have. |
| Machines | Size them for the largest file you will get. | Jobs of up to 60 min and 10 GB of inputs, by plan; nothing to size. |
| A queue | Run one, with workers that pick jobs up. | Jobs wait for a free slot; your plan sets how many run at once. |
| Storage | Buckets, names, cleanup. | Outputs have signed download links, size, SHA-256 and an expiry set by your plan. |
| Telling your app | Callbacks, retries, signatures. | A signed webhook, retried for about a day. |
ffmpeg itself
- On your own servers
- Install it, pick codecs, patch it.
- With Videxo
- ffmpeg 6.1.1 with H.264, H.265, VP9, AV1, Opus and 48 filters, ready for every job.
The commands
- On your own servers
- Look up filters and flags for every format and size.
- With Videxo
- Describe each output in JSON with a preset or a few options, or send the commands you already have.
Machines
- On your own servers
- Size them for the largest file you will get.
- With Videxo
- Jobs of up to 60 min and 10 GB of inputs, by plan; nothing to size.
A queue
- On your own servers
- Run one, with workers that pick jobs up.
- With Videxo
- Jobs wait for a free slot; your plan sets how many run at once.
Storage
- On your own servers
- Buckets, names, cleanup.
- With Videxo
- Outputs have signed download links, size, SHA-256 and an expiry set by your plan.
Telling your app
- On your own servers
- Callbacks, retries, signatures.
- With Videxo
- A signed webhook, retried for about a day.
Compatible
Bring your ffmpeg work. Commands, formats, codecs.
- 01
Your commands
The arguments you run today, with each file named by an alias. The supported options, filter graphs and expressions stay as written.
- 02
Your formats
Outputs as .mp4 .mov .m4a .mkv .webm .ts .mp3 .aac .wav .flac .ogg .opus .gif .png .jpg .jpeg; the extension picks the muxer.
- 03
Your codecs
libx264, libx265, libvpx, libvpx-vp9, libaom-av1, mpeg4, mjpeg, png, gif, ffv1, aac, libmp3lame, libopus, libvorbis, flac, pcm_s16le, pcm_s24le, pcm_f32le, alac, and copy to keep a stream as it is.
- 04
Your files
Inputs from public http or https URLs or private uploads up to 100 MB; outputs named as you name them.
ffmpeg \
-i talk.mp4 \
-vf scale=-2:720 \
-c:v libx264 -crf 23 \
-c:a copy \
talk-720p.mp4 curl "$VIDEXO_API_URL/v1/jobs" \
-H "Authorization: Bearer $VIDEXO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"input_files": {
"in_video": "https://videxo.io/samples/talk.mp4"
},
"output_files": {
"out_main": "talk-720p.mp4"
},
"command": "-i {{in_video}} -vf scale=-2:720 -c:v libx264 -crf 23 -c:a copy {{out_main}}",
"metadata": {
"order": "1234"
}
}' curl "$VIDEXO_API_URL/v1/transcode" \
-H "Authorization: Bearer $VIDEXO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"input": "https://videxo.io/samples/talk.mp4",
"preset": "web-720p",
"filename": "talk-720p.mp4",
"metadata": {
"order": "1234"
}
}' 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://videxo.io/samples/talk.mp4",
"preset": "web-720p",
"filename": "talk-720p.mp4",
"metadata": {
"order": "1234"
}
});
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
Your command with its files named by alias, or the same job described in JSON. Both return the ffmpeg command they run.
Scale and storage
Jobs at once, by plan. Expiry set by plan.
Send as many jobs as you like; each starts when one of your plan’s slots is free. Each output gets an expires_at from your plan’s retention, and its SHA-256.
- Signed download links for outputs
- Direct uploads up to 100 MB and the plan input limit
- Expiry set by your plan
- Deleting stored files through the API
| Plan | Jobs at once | Longest job | Inputs per job | Expires after |
|---|---|---|---|---|
| Pay as you go | 3 | 10 min | 1 GB | 7 days |
| Starter | 3 | 10 min | 1 GB | 7 days |
| Pro | 10 | 30 min | 5 GB | 30 days |
| Scale | 30 | 60 min | 10 GB | 30 days |
Questions, answered.
Which ffmpeg version runs my jobs?
ffmpeg 6.1.1, with 48 filters and the codecs libx264, libx265, libvpx, libvpx-vp9, libaom-av1, mpeg4, mjpeg, png, gif, ffv1, aac, libmp3lame, libopus, libvorbis, flac, pcm_s16le, pcm_s24le, pcm_f32le, alac. The supported commands page lists every option, format and filter.
How is this different from running ffmpeg on AWS or in Docker myself?
On AWS or in a Docker image of your own you build and patch the ffmpeg binary, size the machines, run a queue, move files to and from storage and send your own notifications. Here a job is one HTTPS request: the files come back with a SHA-256 and an expiry, and a signed webhook says when they are ready. You pay for the seconds ffmpeg runs and the gigabytes it reads and writes.
Do I have to write ffmpeg commands?
No. Describe each output in JSON with a preset or a few options, from curl or any HTTP client; the job returns the ffmpeg command it runs. Commands you already have work as they are.
When do outputs expire?
Each output gets an expires_at from your plan’s retention: 7 days on Pay as you go, 7 days on Starter, 30 days on Pro, 30 days on Scale. DELETE /v1/jobs/{id}/files removes a job’s stored outputs and sets deleted_at; they stay listed with that time.
Files are unavailable after expires_at, so download what you want to keep before then. Download links expire in at most one hour; read the job again for a fresh one.
What if a job runs longer than my plan allows?
The job ends failed with time_limit. The longest job is 10 min on Pay as you go, 10 min on Starter, 30 min on Pro, 60 min on Scale.