Media processing for developers and agents.

Simple commands. Structured output. Local or cloud.

Get started API reference
Input
ittybit video \
  -i https://example.com/video.mp4 \
  --width 1280 \
  --format mp4 \
  --cloud
const task = {
  input: "https://example.com/video.mp4",
  kind: "video",
  options: {
    width: 1280,
    format: "mp4",
  },
};

const res = await fetch("https://api.ittybit.com/tasks", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.ITTYBIT_API_KEY}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify(task),
});
const data = await res.json();
import requests

task = {
    "input": "https://example.com/video.mp4",
    "kind": "video",
    "options": {
        "width": 1280,
        "format": "mp4",
    },
}

res = requests.post(
    "https://api.ittybit.com/tasks",
    headers={"Authorization": f"Bearer {api_key}"},
    json=task,
)
data = res.json()
TASK='{
  "input": "https://example.com/video.mp4",
  "kind": "video",
  "options": {
    "width": 1280,
    "format": "mp4"
  }
}'

curl -X POST https://api.ittybit.com/tasks \
  -H "Authorization: Bearer $ITTYBIT_API_KEY" \
  -H "Content-Type: application/json" \
  -d "$TASK"
Output
{
  "id": "task_abc123",
  "object": "task",
  "kind": "video",
  "status": "succeeded",
  "input": "https://example.com/video.mp4",
  "output": "https://store.ittybit.net/org_123/output.mp4",
  "steps": [
    { "kind": "probe", "status": "succeeded" },
    { "kind": "ingest", "status": "succeeded" },
    { "kind": "video", "status": "succeeded" },
    { "kind": "upload", "status": "succeeded" }
  ]
}

5 hours to 8 minutes.

We split video at keyframe boundaries and encode chunks in parallel. Locally, that uses your CPU cores. On our cloud, it uses a fleet of workers.

FFmpeg (8-core) MediaConvert Ittybit
44min 4K → AV1 5h 16m 7m 56s
22min 4K → H264 14m 25s 48s

Same output. Fraction of the time. If a chunk fails, it retries that chunk — not the whole file.

Four task kinds. Simple options. Structured data.

No filter graphs. No YAML configs. No parsing stderr.

Video
Transcode, resize, trim
Audio
Extract, convert, trim
Image
Resize, convert, extract frames
Adaptive
HLS adaptive bitrate streams
ittybit video \
  -i input.mp4 \
  --width 1280 \
  --quality medium

ittybit audio \
  -i podcast.wav \
  --format mp3

ittybit image \
  -i video.mp4 \
  --start 5 \
  --format webp

ittybit adaptive \
  -i input.mp4 \
  -o stream.m3u8

Every task returns typed JSON — status, URL, dimensions, duration, file size.

brew install ittybit/tap/ittybit
ittybit video \
  -i input.mp4 \
  --width 1280
Get started Read the docs