Xora

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.

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 preset recipes or supply custom FFmpeg filters. Our backend slices and transcodes the video concurrently.

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.

Chunk 1
Chunk 2
Chunk 3

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.

request.sh
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.

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.