Run Multiple Commands
Submit up to 10 independent FFmpeg commands that execute in parallel. Returns an array of command IDs.
Run Multiple Commands
POST /api/v1/run-multiple-ffmpeg-commandsSubmit multiple independent FFmpeg commands that execute in parallel. Each command runs in its own sandbox with its own input and output files. This is useful for batch processing -- for example, generating multiple renditions of the same source, or processing unrelated files at once.
Authentication
Requires API key via X-API-KEY header.
Request
Headers
| Header | Type | Required | Description |
|---|---|---|---|
Content-Type | string | Yes | Must be application/json |
X-API-KEY | string | Yes | Your API key with ffsk_ prefix |
Body
interface RunMultipleCommandsRequest {
commands: RunFFmpegCommandRequest[]; // Max 10 commands, executed in parallel
}Each element in the commands array follows the same shape as the Run FFmpeg Command request body:
interface RunFFmpegCommandRequest {
input_files: Record<string, string>;
output_files: Record<string, string>;
ffmpeg_command: string;
metadata?: Record<string, string | number | boolean>;
webhook_url?: string;
storage_destination_id?: string;
}| Field | Type | Required | Description |
|---|---|---|---|
commands | RunFFmpegCommandRequest[] | Yes | Array of command objects to execute in parallel. Maximum 10 commands. |
Each command can set its own storage_destination_id to send that command's outputs to an S3-compatible storage destination. This requires the Business plan.
Response
200 OK
{
command_ids: string[];
}| Field | Type | Description |
|---|---|---|
command_ids | string[] | Array of unique identifiers, one per submitted command, in the same order as the input array. |
Retrieve the outputs
Poll GET /api/v1/commands/:commandId for every returned command ID. Managed outputs provide storage_url. Commands sent to a BYOB destination also provide the persistent external_uri and external_object_key; a private bucket has storage_url: null. See Bring Your Own Bucket.
Error responses
| Status | Error | Description |
|---|---|---|
400 | INVALID_REQUEST | Missing required fields, invalid aliases, or malformed FFmpeg commands. |
401 | UNAUTHORIZED | Missing or invalid API key. |
403 | FORBIDDEN | A command requested a Business-only webhook or storage destination from an ineligible account. |
404 | NOT_FOUND | A supplied storage destination does not exist or belongs to another account. |
409 | CONFLICT | A supplied storage destination is disabled. |
422 | VALIDATION_ERROR | Validation failed, such as too many commands, an invalid command structure, or a malformed storage_destination_id. |
429 | RATE_LIMITED | Too many requests. Retry after the period indicated in the Retry-After header. |
Examples
curl -X POST https://renderio.dev/api/v1/run-multiple-ffmpeg-commands \
-H "Content-Type: application/json" \
-H "X-API-KEY: ffsk_your_api_key_here" \
-d '{
"commands": [
{
"input_files": { "in_video": "https://example.com/sample.mp4" },
"output_files": { "out_video": "720p.mp4" },
"ffmpeg_command": "ffmpeg -i {{in_video}} -vf scale=1280:720 -c:v libx264 {{out_video}}"
},
{
"input_files": { "in_video": "https://example.com/sample.mp4" },
"output_files": { "out_video": "480p.mp4" },
"ffmpeg_command": "ffmpeg -i {{in_video}} -vf scale=854:480 -c:v libx264 {{out_video}}"
},
{
"input_files": { "in_video": "https://example.com/sample.mp4" },
"output_files": { "out_thumb": "thumbnail.jpg" },
"ffmpeg_command": "ffmpeg -i {{in_video}} -ss 00:00:05 -frames:v 1 {{out_thumb}}"
}
]
}'curl -X POST https://renderio.dev/api/v1/run-multiple-ffmpeg-commands \
-H "Content-Type: application/json" \
-H "X-API-KEY: ffsk_your_api_key_here" \
-d '{
"commands": [
{
"input_files": { "in_video": "https://example.com/sample.mp4" },
"output_files": { "out_video": "720p.mp4" },
"ffmpeg_command": "ffmpeg -i <<in_video>> -vf scale=1280:720 -c:v libx264 <<out_video>>"
},
{
"input_files": { "in_video": "https://example.com/sample.mp4" },
"output_files": { "out_video": "480p.mp4" },
"ffmpeg_command": "ffmpeg -i <<in_video>> -vf scale=854:480 -c:v libx264 <<out_video>>"
},
{
"input_files": { "in_video": "https://example.com/sample.mp4" },
"output_files": { "out_thumb": "thumbnail.jpg" },
"ffmpeg_command": "ffmpeg -i <<in_video>> -ss 00:00:05 -frames:v 1 <<out_thumb>>"
}
]
}'import requests
response = requests.post(
"https://renderio.dev/api/v1/run-multiple-ffmpeg-commands",
headers={
"Content-Type": "application/json",
"X-API-KEY": "ffsk_your_api_key_here",
},
json={
"commands": [
{
"input_files": {"in_video": "https://example.com/sample.mp4"},
"output_files": {"out_video": "720p.mp4"},
"ffmpeg_command": "ffmpeg -i {{in_video}} -vf scale=1280:720 -c:v libx264 {{out_video}}",
},
{
"input_files": {"in_video": "https://example.com/sample.mp4"},
"output_files": {"out_video": "480p.mp4"},
"ffmpeg_command": "ffmpeg -i {{in_video}} -vf scale=854:480 -c:v libx264 {{out_video}}",
},
{
"input_files": {"in_video": "https://example.com/sample.mp4"},
"output_files": {"out_thumb": "thumbnail.jpg"},
"ffmpeg_command": "ffmpeg -i {{in_video}} -ss 00:00:05 -frames:v 1 {{out_thumb}}",
},
],
},
)
data = response.json()
print("Command IDs:", data["command_ids"])import requests
response = requests.post(
"https://renderio.dev/api/v1/run-multiple-ffmpeg-commands",
headers={
"Content-Type": "application/json",
"X-API-KEY": "ffsk_your_api_key_here",
},
json={
"commands": [
{
"input_files": {"in_video": "https://example.com/sample.mp4"},
"output_files": {"out_video": "720p.mp4"},
"ffmpeg_command": "ffmpeg -i <<in_video>> -vf scale=1280:720 -c:v libx264 <<out_video>>",
},
{
"input_files": {"in_video": "https://example.com/sample.mp4"},
"output_files": {"out_video": "480p.mp4"},
"ffmpeg_command": "ffmpeg -i <<in_video>> -vf scale=854:480 -c:v libx264 <<out_video>>",
},
{
"input_files": {"in_video": "https://example.com/sample.mp4"},
"output_files": {"out_thumb": "thumbnail.jpg"},
"ffmpeg_command": "ffmpeg -i <<in_video>> -ss 00:00:05 -frames:v 1 <<out_thumb>>",
},
],
},
)
data = response.json()
print("Command IDs:", data["command_ids"])interface RunCommandRequest {
input_files: Record<string, string>;
output_files: Record<string, string>;
ffmpeg_command: string;
}
interface MultipleCommandsResponse {
command_ids: string[];
}
const commands: RunCommandRequest[] = [
{
input_files: { in_video: "https://example.com/sample.mp4" },
output_files: { out_video: "720p.mp4" },
ffmpeg_command:
"ffmpeg -i {{in_video}} -vf scale=1280:720 -c:v libx264 {{out_video}}",
},
{
input_files: { in_video: "https://example.com/sample.mp4" },
output_files: { out_video: "480p.mp4" },
ffmpeg_command:
"ffmpeg -i {{in_video}} -vf scale=854:480 -c:v libx264 {{out_video}}",
},
{
input_files: { in_video: "https://example.com/sample.mp4" },
output_files: { out_thumb: "thumbnail.jpg" },
ffmpeg_command:
"ffmpeg -i {{in_video}} -ss 00:00:05 -frames:v 1 {{out_thumb}}",
},
];
const response = await fetch(
"https://renderio.dev/api/v1/run-multiple-ffmpeg-commands",
{
method: "POST",
headers: {
"Content-Type": "application/json",
"X-API-KEY": "ffsk_your_api_key_here",
},
body: JSON.stringify({ commands }),
},
);
const { command_ids } = (await response.json()) as MultipleCommandsResponse;
console.log("Command IDs:", command_ids);interface RunCommandRequest {
input_files: Record<string, string>;
output_files: Record<string, string>;
ffmpeg_command: string;
}
interface MultipleCommandsResponse {
command_ids: string[];
}
const commands: RunCommandRequest[] = [
{
input_files: { in_video: "https://example.com/sample.mp4" },
output_files: { out_video: "720p.mp4" },
ffmpeg_command:
"ffmpeg -i <<in_video>> -vf scale=1280:720 -c:v libx264 <<out_video>>",
},
{
input_files: { in_video: "https://example.com/sample.mp4" },
output_files: { out_video: "480p.mp4" },
ffmpeg_command:
"ffmpeg -i <<in_video>> -vf scale=854:480 -c:v libx264 <<out_video>>",
},
{
input_files: { in_video: "https://example.com/sample.mp4" },
output_files: { out_thumb: "thumbnail.jpg" },
ffmpeg_command:
"ffmpeg -i <<in_video>> -ss 00:00:05 -frames:v 1 <<out_thumb>>",
},
];
const response = await fetch(
"https://renderio.dev/api/v1/run-multiple-ffmpeg-commands",
{
method: "POST",
headers: {
"Content-Type": "application/json",
"X-API-KEY": "ffsk_your_api_key_here",
},
body: JSON.stringify({ commands }),
},
);
const { command_ids } = (await response.json()) as MultipleCommandsResponse;
console.log("Command IDs:", command_ids);const response = await fetch(
"https://renderio.dev/api/v1/run-multiple-ffmpeg-commands",
{
method: "POST",
headers: {
"Content-Type": "application/json",
"X-API-KEY": "ffsk_your_api_key_here",
},
body: JSON.stringify({
commands: [
{
input_files: { in_video: "https://example.com/sample.mp4" },
output_files: { out_video: "720p.mp4" },
ffmpeg_command:
"ffmpeg -i {{in_video}} -vf scale=1280:720 -c:v libx264 {{out_video}}",
},
{
input_files: { in_video: "https://example.com/sample.mp4" },
output_files: { out_video: "480p.mp4" },
ffmpeg_command:
"ffmpeg -i {{in_video}} -vf scale=854:480 -c:v libx264 {{out_video}}",
},
{
input_files: { in_video: "https://example.com/sample.mp4" },
output_files: { out_thumb: "thumbnail.jpg" },
ffmpeg_command:
"ffmpeg -i {{in_video}} -ss 00:00:05 -frames:v 1 {{out_thumb}}",
},
],
}),
},
);
const { command_ids } = await response.json();
console.log("Command IDs:", command_ids);const response = await fetch(
"https://renderio.dev/api/v1/run-multiple-ffmpeg-commands",
{
method: "POST",
headers: {
"Content-Type": "application/json",
"X-API-KEY": "ffsk_your_api_key_here",
},
body: JSON.stringify({
commands: [
{
input_files: { in_video: "https://example.com/sample.mp4" },
output_files: { out_video: "720p.mp4" },
ffmpeg_command:
"ffmpeg -i <<in_video>> -vf scale=1280:720 -c:v libx264 <<out_video>>",
},
{
input_files: { in_video: "https://example.com/sample.mp4" },
output_files: { out_video: "480p.mp4" },
ffmpeg_command:
"ffmpeg -i <<in_video>> -vf scale=854:480 -c:v libx264 <<out_video>>",
},
{
input_files: { in_video: "https://example.com/sample.mp4" },
output_files: { out_thumb: "thumbnail.jpg" },
ffmpeg_command:
"ffmpeg -i <<in_video>> -ss 00:00:05 -frames:v 1 <<out_thumb>>",
},
],
}),
},
);
const { command_ids } = await response.json();
console.log("Command IDs:", command_ids);<?php
$ch = curl_init("https://renderio.dev/api/v1/run-multiple-ffmpeg-commands");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"Content-Type: application/json",
"X-API-KEY: ffsk_your_api_key_here",
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode([
"commands" => [
[
"input_files" => ["in_video" => "https://example.com/sample.mp4"],
"output_files" => ["out_video" => "720p.mp4"],
"ffmpeg_command" => "ffmpeg -i {{in_video}} -vf scale=1280:720 -c:v libx264 {{out_video}}",
],
[
"input_files" => ["in_video" => "https://example.com/sample.mp4"],
"output_files" => ["out_video" => "480p.mp4"],
"ffmpeg_command" => "ffmpeg -i {{in_video}} -vf scale=854:480 -c:v libx264 {{out_video}}",
],
[
"input_files" => ["in_video" => "https://example.com/sample.mp4"],
"output_files" => ["out_thumb" => "thumbnail.jpg"],
"ffmpeg_command" => "ffmpeg -i {{in_video}} -ss 00:00:05 -frames:v 1 {{out_thumb}}",
],
],
]));
$response = curl_exec($ch);
curl_close($ch);
$data = json_decode($response, true);
echo "Command IDs: " . implode(", ", $data["command_ids"]) . "\n";<?php
$ch = curl_init("https://renderio.dev/api/v1/run-multiple-ffmpeg-commands");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"Content-Type: application/json",
"X-API-KEY: ffsk_your_api_key_here",
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode([
"commands" => [
[
"input_files" => ["in_video" => "https://example.com/sample.mp4"],
"output_files" => ["out_video" => "720p.mp4"],
"ffmpeg_command" => "ffmpeg -i <<in_video>> -vf scale=1280:720 -c:v libx264 <<out_video>>",
],
[
"input_files" => ["in_video" => "https://example.com/sample.mp4"],
"output_files" => ["out_video" => "480p.mp4"],
"ffmpeg_command" => "ffmpeg -i <<in_video>> -vf scale=854:480 -c:v libx264 <<out_video>>",
],
[
"input_files" => ["in_video" => "https://example.com/sample.mp4"],
"output_files" => ["out_thumb" => "thumbnail.jpg"],
"ffmpeg_command" => "ffmpeg -i <<in_video>> -ss 00:00:05 -frames:v 1 <<out_thumb>>",
],
],
]));
$response = curl_exec($ch);
curl_close($ch);
$data = json_decode($response, true);
echo "Command IDs: " . implode(", ", $data["command_ids"]) . "\n";Run Chained Commands
Submit up to 20 FFmpeg commands on the Business plan. They execute sequentially, and outputs from earlier steps are available as inputs to later steps.
Get Command API Reference
Retrieve a RenderIO command by ID to check status, processing times, output file metadata, errors, and the original request.