Xora

Cloud FFmpeg API

Run FFmpeg commands via API

Xora lets you run any FFmpeg command in the cloud. Replace local command-line dependencies with a simple HTTP request, apply pre-configured recipes, and write outputs directly to your own storage.

POST /v1/jobs
Select preset
Send this mock payload to the engine
Job status: Idle 0%
> Click "Simulate API Call" to start processing...
1

Submit Input

Point Xora at any source video URL (S3, Cloudflare R2, GCP Buckets, or HTTP links). No files to upload manually.

2

Configure & Process

Apply pre-configured recipes or supply custom FFmpeg parameters. Xora runs your commands in a high-performance cloud environment.

3

Receive Hook

Get instantly notified via webhook when finished. Outputs are saved to your own cloud storage bucket.

Platform Capabilities

Developer-first video infrastructure

A single scalable API that completely replaces complex FFmpeg script servers, task queues, and storage integrations.

BYOB Bucket Storage

Directly route transcoded outputs to your S3, Google Cloud Storage, or Cloudflare R2 bucket. Xora handles signed URL access, credential isolation, and secure handshakes automatically.

web-ready-1080p
h264 aac 1080p faststart

Transcoding Presets

Create reusable output templates via the dashboard. Trigger complex compression parameters, codec selections, and resolution matrices with a single preset ID.

-vf "scale=1280:-1" -crf 23
720p HD 1080p HQ 30 FPS (Mute) Rotate 90°

Custom FFmpeg Flags

Full parameter override. Pass raw encoding arguments directly inside the API payload to target custom filters, codecs, frame-rates, and complex media pipelines.

Job 71a
Job 92b
Job 34c

Concurrently Scalable Pipelines

Process dozens of media files simultaneously. Xora scales machine provisioning and queue priorities automatically, ensuring your applications never wait for a processing slot.

Simple Integration

Fits directly into your codebase

Build video pipelines using native client requests. Select your language of choice, grab the snippet, and issue request triggers from your application backend.

request.sh
curl -X POST https://api.xora.sh/v1/jobs \
  -H "Authorization: Bearer rmux_live_k8a9f..." \
  -H "Content-Type: application/json" \
  -d '{
    "mode": "ffmpeg",
    "input_files": { "in_1": "s3://bucket/raw.mov" },
    "output_files": { "out_1": "output.mp4" },
    "ffmpeg": {
      "args": ["-i", "{{in_1}}", "-vf", "scale=1280:720", "-c:v", "libx264", "-crf", "23", "{{out_1}}"]
    }
  }'
const response = await fetch('https://api.xora.sh/v1/jobs', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer rmux_live_k8a9f...',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    mode: 'ffmpeg',
    input_files: { in_1: 's3://bucket/raw.mov' },
    output_files: { out_1: 'output.mp4' },
    ffmpeg: {
      args: ['-i', '{{in_1}}', '-vf', 'scale=1280:720', '-c:v', 'libx264', '-crf', 23, '{{out_1}}']
    }
  })
});
const data = await response.json();
import requests

response = requests.post(
    "https://api.xora.sh/v1/jobs",
    headers={
        "Authorization": "Bearer rmux_live_k8a9f...",
        "Content-Type": "application/json"
    },
    json={
        "mode": "ffmpeg",
        "input_files": { "in_1": "s3://bucket/raw.mov" },
        "output_files": { "out_1": "output.mp4" },
        "ffmpeg": {
            "args": ["-i", "{{in_1}}", "-vf", "scale=1280:720", "-c:v", "libx264", "-crf", "23", "{{out_1}}"]
        }
    }
)
job = response.json()
package main

import (
	"bytes"
	"net/http"
)

func main() {
	jsonPayload := []byte(`{"mode":"ffmpeg","input_files":{"in_1":"s3://bucket/raw.mov"},"output_files":{"out_1":"output.mp4"},"ffmpeg":{"args":["-i","{{in_1}}","-vf","scale=1280:720","-c:v","libx264","-crf","23","{{out_1}}"]}}`)
	req, _ := http.NewRequest("POST", "https://api.xora.sh/v1/jobs", bytes.NewBuffer(jsonPayload))
	req.Header.Set("Authorization", "Bearer rmux_live_k8a9f...")
	req.Header.Set("Content-Type", "application/json")
	
	client := &http.Client{}
	resp, _ := client.Do(req)
	defer resp.Body.Close()
}
use reqwest::header::{HeaderMap, HeaderValue, AUTHORIZATION, CONTENT_TYPE};
use serde_json::json;

#[tokio::main]
async fn main() -> Result<(), reqwest::Error> {
    let mut headers = HeaderMap::new();
    headers.insert(AUTHORIZATION, HeaderValue::from_static("Bearer rmux_live_k8a9f..."));
    headers.insert(CONTENT_TYPE, HeaderValue::from_static("application/json"));

    let client = reqwest::Client::new();
    let res = client.post("https://api.xora.sh/v1/jobs")
        .headers(headers)
        .json(&json!({
            "mode": "ffmpeg",
            "input_files": { "in_1": "s3://bucket/raw.mov" },
            "output_files": { "out_1": "output.mp4" },
            "ffmpeg": {
                "args": ["-i", "{{in_1}}", "-vf", "scale=1280:720", "-c:v", "libx264", "-crf", "23", "{{out_1}}"]
            }
        }))
        .send()
        .await?;
    Ok(())
}

Comprehensive support

Supported codecs and formats

Covering standard container wraps, audio streams, and web image outputs.

MP4 WebM MKV MOV GIF JPG PNG MP4 WebM MKV MOV GIF JPG PNG
H.264 VP8 VP9 MP3 AAC WAV H.264 VP8 VP9 MP3 AAC WAV

Ready to offload your video processing infrastructure?

Get started with free trial minutes. Set up API credentials in seconds and begin delivering optimised assets directly to your buckets.