Video Processing Engine
Transcode video with an API call
Xora abstracts FFmpeg infrastructure into a robust serverless API. Submit transcoding jobs, apply compression profiles, trigger webhooks, and deliver directly to your own storage.
Submit Input
Point Xora at any source video URL (S3, Cloudflare R2, GCP Buckets, or HTTP links). No files to upload manually.
Configure & Process
Apply preset recipes or supply custom FFmpeg filters. Our backend slices and transcodes the video concurrently.
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.
Transcoding Presets
Create reusable output templates via the dashboard. Trigger complex compression parameters, codec selections, and resolution matrices with a single preset ID.
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.
Distributed Parallel Pipelines
Xora automatically splits long source video files into smaller segments, processes them in parallel across serverless functions, and stitches them back instantly.
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.
curl -X POST https://api.xora.sh/v1/jobs \
-H "Authorization: Bearer rmux_live_k8a9f..." \
-H "Content-Type: application/json" \
-d '{
"mode": "recipe",
"input": { "url": "s3://bucket/raw.mov" },
"output": { "format": "mp4" },
"recipe": { "name": "web-ready" }
}' 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: 'recipe',
input: { url: 's3://bucket/raw.mov' },
output: { format: 'mp4' },
recipe: { name: 'web-ready' }
})
});
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": "recipe",
"input": { "url": "s3://bucket/raw.mov" },
"output": { "format": "mp4" },
"recipe": { "name": "web-ready" }
}
)
job = response.json() package main
import (
"bytes"
"net/http"
)
func main() {
jsonPayload := []byte(`{"mode":"recipe","input":{"url":"s3://bucket/raw.mov"},"output":{"format":"mp4"}}`)
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": "recipe",
"input": { "url": "s3://bucket/raw.mov" },
"output": { "format": "mp4" }
}))
.send()
.await?;
Ok(())
} Comprehensive support
Supported codecs and formats
Covering standard container wraps, audio streams, and web image outputs.
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.