Serverless ffmpeg. No binary to package.
Run ffmpeg from a Lambda, a Vercel function or any backend without a layer to package or a timeout to fight: one HTTPS request, billed by the minute of output.
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
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://videxo.io/samples/talk.mp4",
"preset": "web-720p",
"filename": "talk-720p.mp4",
"metadata": {
"order": "1234"
}
}),
});
const job = await response.json(); ffmpeg \
-i https://videxo.io/samples/talk.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 Side by side
Where ffmpeg can run. And what it costs you.
| Topic | Videxo | AWS Lambda | Vercel Functions | Cloudflare Workers | Your own server or Docker |
|---|---|---|---|---|---|
| The ffmpeg binary | Installed: ffmpeg 6.1.1. | You package a static build as a layer (250 MB unzipped with your code) or a container image. | You bundle a static build in the function: 250 MB unzipped, up to 5 GB in the large functions beta. | Cannot run it: Workers run JavaScript and WebAssembly, not native programs. | You install and patch it, or build and update the image. |
| Longest run | 10 min to 60 min a job, by plan. | 15 minutes an invocation. | 300 s on Hobby; 800 s on Pro and Enterprise, 1,800 s in beta. | 5 minutes of CPU time at most; 30 s by default. | No limit. |
| Memory and CPU | Nothing to set: inputs of 1 GB to 10 GB a job, by plan. | 128 MB to 10,240 MB; CPU grows with memory, one vCPU at 1,769 MB. | 2 GB and 1 vCPU; up to 4 GB and 2 vCPUs on Pro. | 128 MB an isolate. | What you buy. |
| Files in and out | Input URLs in; outputs stored with SHA-256 and expiry; a signed webhook. | Your code moves files to and from S3 and /tmp. | Request and response bodies up to 4.5 MB; your code moves files through storage. | Your code, within the memory limit. | Your code and your disks. |
| Billing | 12 credits a minute of 1080p output, less at lower quality, plus 10 credits a GB in and out. | Requests plus duration times memory, by the millisecond. | Active CPU time, provisioned memory time and invocations, at the region’s rates. | Requests plus CPU time. | Every hour the machine is on, busy or idle. |
| One 61 s job | 45 credits: 30 for 5 minutes of 720p output, 15 for 1.5 GB in and out. | $0.0102 of compute at 10,240 MB ($0.0000166667 a GB-second, x86, us-east-1), plus requests, S3 and data transfer, and the layer and file handling you write. | Active CPU and memory time at the region’s rates (in iad1 $0.128 an hour of CPU and $0.0106 a GB-hour), if the job fits the duration and memory limits. | Cannot run it. | Your share of the machine’s hours, and the time you spend keeping it running. |
Videxo
- The ffmpeg binary
- Installed: ffmpeg 6.1.1.
- Longest run
- 10 min to 60 min a job, by plan.
- Memory and CPU
- Nothing to set: inputs of 1 GB to 10 GB a job, by plan.
- Files in and out
- Input URLs in; outputs stored with SHA-256 and expiry; a signed webhook.
- Billing
- 12 credits a minute of 1080p output, less at lower quality, plus 10 credits a GB in and out.
- One 61 s job
- 45 credits: 30 for 5 minutes of 720p output, 15 for 1.5 GB in and out.
AWS Lambda
- The ffmpeg binary
- You package a static build as a layer (250 MB unzipped with your code) or a container image.
- Longest run
- 15 minutes an invocation.
- Memory and CPU
- 128 MB to 10,240 MB; CPU grows with memory, one vCPU at 1,769 MB.
- Files in and out
- Your code moves files to and from S3 and /tmp.
- Billing
- Requests plus duration times memory, by the millisecond.
- One 61 s job
- $0.0102 of compute at 10,240 MB ($0.0000166667 a GB-second, x86, us-east-1), plus requests, S3 and data transfer, and the layer and file handling you write.
Vercel Functions
- The ffmpeg binary
- You bundle a static build in the function: 250 MB unzipped, up to 5 GB in the large functions beta.
- Longest run
- 300 s on Hobby; 800 s on Pro and Enterprise, 1,800 s in beta.
- Memory and CPU
- 2 GB and 1 vCPU; up to 4 GB and 2 vCPUs on Pro.
- Files in and out
- Request and response bodies up to 4.5 MB; your code moves files through storage.
- Billing
- Active CPU time, provisioned memory time and invocations, at the region’s rates.
- One 61 s job
- Active CPU and memory time at the region’s rates (in iad1 $0.128 an hour of CPU and $0.0106 a GB-hour), if the job fits the duration and memory limits.
Cloudflare Workers
- The ffmpeg binary
- Cannot run it: Workers run JavaScript and WebAssembly, not native programs.
- Longest run
- 5 minutes of CPU time at most; 30 s by default.
- Memory and CPU
- 128 MB an isolate.
- Files in and out
- Your code, within the memory limit.
- Billing
- Requests plus CPU time.
- One 61 s job
- Cannot run it.
Your own server or Docker
- The ffmpeg binary
- You install and patch it, or build and update the image.
- Longest run
- No limit.
- Memory and CPU
- What you buy.
- Files in and out
- Your code and your disks.
- Billing
- Every hour the machine is on, busy or idle.
- One 61 s job
- Your share of the machine’s hours, and the time you spend keeping it running.
Limits and prices as documented on 2026-11-05 (Workers on 2026-11-04): Lambda quotas Lambda pricing Vercel Functions limits Vercel Functions pricing Workers limits
The request
Your function, one request. No binary, no scratch disk.
Send the input URL and a preset from any function, a Lambda, a Worker or your own server. The job returns the ffmpeg command it runs, and a signed webhook arrives when the files are ready.
TypeScript SDKcurl "$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
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://videxo.io/samples/talk.mp4",
"preset": "web-720p",
"filename": "talk-720p.mp4",
"metadata": {
"order": "1234"
}
}),
});
const job = await response.json(); ffmpeg \
-i https://videxo.io/samples/talk.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 Billing
Pay for the minutes you get. Not for a machine that waits.
A job costs its minutes of output by quality, and the gigabytes it fetched and stored. Waiting in the queue costs nothing, and each second of output includes 3 seconds of ffmpeg.
Pricing and the cost calculatorThe example job from the docs: a 720p transcode
30 + 15 = 45 credits
- Minutes of output
- 5 min × 6 = 30 credits
- Gigabytes in and out
- 1.5 GB × 10 = 15 credits
Starter is $19 a month with 25,000 credits included.
Honestly
When to keep your own. It is sometimes the right call.
- Files are a few megabytes and jobs take seconds: a Lambda layer or a Vercel function is enough, and costs less.
- The media must not leave your own cloud account.
- Your commands need ffmpeg options or filters beyond the supported list.
Questions, answered.
Can ffmpeg run on AWS Lambda?
Yes, from a static build in a layer or a container image. A run stops at 15 minutes, memory is at most 10,240 MB, and your code moves the files to and from S3 and /tmp.
Can ffmpeg run in Cloudflare Workers?
Not as a native program: Workers run JavaScript and WebAssembly. A WebAssembly build of ffmpeg has to fit, with the video it works on, in 128 MB. With Videxo a Worker sends one HTTPS request instead.
Can ffmpeg run on Vercel?
As a static build bundled into a function: 250 MB unzipped at most (5 GB in the large functions beta), 300 s a run on Hobby and 800 s on Pro, 2 GB of memory or 4 GB on Pro, and request and response bodies up to 4.5 MB, so files go through storage. From a Vercel function you can also send one request to this API and let the job run here.
What about ffmpeg in Docker?
A Docker image with ffmpeg runs anywhere you run containers, without a time limit, but you build and update the image, size and pay for the machines whether they are busy or idle, and run the queue and storage around it.
Is Videxo serverless?
For you, yes: there is nothing to deploy or keep running, and you pay for the seconds ffmpeg runs and the gigabytes it reads and writes. Your personal organization gets 500 free credits once, with no card.
How long does a job take to start?
Startup includes waiting for a free slot of your plan and reading the inputs. Every job records its created_at and started_at, so you can see how long it waited.