Run any FFmpeg command in the cloud. ~120 whitelisted flags, 8-layer sandboxed execution, signed download URL. Same FFmpeg syntax you know.
You write the FFmpeg command. Rendobar downloads inputs, runs the command in an isolated container, returns a signed download URL. Same syntax you’d run locally.
Reach for the inputs map only when a file can’t go inline: a file a filter reads by name (see below), inline text you don’t want to host, an already-uploaded asset, or when you need a stable filename. Each key is a filename staged under that exact name, and the command references it by bare name.A value can be one of three shapes:
Value
Use it for
"https://..."
A remote file. Shorthand for { "url": "..." }
{ "url": "https://..." }
A remote file, explicit form
{ "content": "...text..." }
Inline text you don’t want to host (≤64 KB)
A file you already uploaded is referenced by its content URL: the url
returned by the uploads endpoint, like https://api.rendobar.com/assets/asset_abc123/content.
Pass it like any other URL.
Some files aren’t passed as -i arguments. Filters like subtitles=, lut3d=, and drawtext fontfile=, and the lists read by the concat demuxer, read a file by name from the working directory. Provide those through inputs so they’re staged before the command runs.This burns a subtitle track that lives only in the request, with no file to host:
Working directory for the command. Maps a filename to a source (URL, {url}, or {content}; an uploaded asset’s content URL is just a URL). {} when every input is an inline -i URL. See Input sources
params.command
string
yes
-
Real FFmpeg command starting with ffmpeg. Input URLs go in -i positions
params.outputFormat
string
no
inferred
Override container format. Inferred from trailing filename if omitted
Your jobs run on CPU-powered or GPU-powered machines. compute defaults to auto, so a command that uses an NVENC encoder routes to a GPU on its own. You don’t send anything.Switch one flag to move an encode to the hardware encoder. The GPU path runs h264_nvenc, hevc_nvenc, and av1_nvenc on NVIDIA L4 GPUs, several times faster than software libx264 at the same resolution.
ffmpeg -i input.mp4 -c:v libx264 -preset medium -crf 23 output.mp4
Set compute only to force a choice. gpu pins the job to a GPU; cpu pins it to CPU and rejects an NVENC command with VALIDATION_ERROR.
Priced per compute second from your credit balance, the wall-clock time FFmpeg ran, excluding file transfer. Typical cost ~$0.05/min.Plan timeouts: 5 min (Free), 15 min (Pro). See plan limits for the full table. Exceeding the timeout returns PROVIDER_TIMEOUT; no credits charged.
The filenames your command writes define the output. You get back every file it produced.Every completed job, FFmpeg or otherwise, returns the same output shape. Job output documents it in full. The short version:
output.data: the computed answer (a probe result, a transcript). null for FFmpeg jobs, which only write files.
output.file: the headline result you play or download, one file or a stream manifest. null for pure file sets.
output.files: every file the job produced, the complete list.
output.expiresAt: Unix ms when the URLs expire, present when files is non-empty.
Each file is { url, path, type, size, meta? }. The type is an open enum: video, image, audio, captions, playlist, data, or other. Tolerate values you don’t recognise.A command that writes one file sets output.file to that file, and output.files to a list of one:
A command that writes a stream (HLS or DASH) sets output.file to the manifest, typed playlist. Point a player at output.file.url directly. output.files carries the manifest plus every segment:
A command that writes an unordered set (image sequence, -f segment, a resolution ladder) has no single headline result. output.file is null. Read output.files for the list:
Consuming the result is the same every time. The answer is output.data. The thing you play or download is output.file.url. The full list is output.files. Two invariants hold: output.file is always one of output.files (or null), and output.expiresAt is present whenever output.files is non-empty.URLs expire at output.expiresAt. Re-fetch the job with GET /jobs/{id} to mint fresh ones.
A failed job carries an error object with code, message, detail, and retryable. When FFmpeg exits non-zero, error.detail holds the last ~2 KB of the real stderr. Fetch the job to see exactly why FFmpeg stopped.
{ "data": { "id": "job_abc123", "status": "failed", "error": { "code": "PROVIDER_ERROR", "message": "FFmpeg process exited with code 1", "detail": "[in#0 @ 0x55…] Error opening input: Invalid data found when processing input\nError opening input file clip.mp4.\n", "retryable": false } }}
A disallowed flag is rejected before dispatch. The request fails with the error envelope, so no job is created:
{ "error": { "code": "VALIDATION_ERROR", "message": "Flag '-protocol_whitelist' is not allowed in FFmpeg commands" } }