🎬 Reel Director API NEW

Turn any source video into a 60-second narrative reel with HOOK → WHAT IT DOES → HOW TO USE → CALL TO ACTION arc. Cuts land on full-stop boundaries (whisper-large-v3). Window picks come from Qwen2.5-VL-7B reading both frames and transcript. Render is sentence-bounded ffmpeg with voice EQ + sidechain-ducked BGM. 30 credits per reel ≈ $0.03 — 2× cheaper than OpusClip ($0.10) and 1.7× cheaper than Vizard ($0.05).

What you give us: a YouTube URL OR an mp4 upload (≤100 MB).
What you get back: a 60-second mp4 at the aspect ratio you chose (16:9 / 9:16 / 1:1).

Quick Start

Submit (with URL)

curl -X POST https://api.pixelapi.dev/v1/video/auto-reel \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -F "source_url=https://youtu.be/abcdef12345" \
  -F "aspect=16:9" \
  -F "bgm=calm" \
  -F "include_logo=true"
# Response:
# {
#   "generation_id": "74c886c9-1247-44f4-aaa0-4de49ba6b32b",
#   "status": "queued",
#   "credits_used": 30,
#   "estimated_seconds": 150,
#   "poll_url": "https://api.pixelapi.dev/v1/video/auto-reel/74c886c9-..."
# }

Submit (with file upload)

curl -X POST https://api.pixelapi.dev/v1/video/auto-reel \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -F "source=@my_long_talk.mp4" \
  -F "aspect=9:16" \
  -F "bgm=calm"

Poll for completion

curl https://api.pixelapi.dev/v1/video/auto-reel/$GEN_ID \
  -H "Authorization: Bearer YOUR_API_KEY"
# Once "status": "done", an output_url field appears.

Download the reel

curl -o my_reel.mp4 \
  https://api.pixelapi.dev/v1/video/auto-reel/$GEN_ID/download \
  -H "Authorization: Bearer YOUR_API_KEY"

Python

import requests, time

key = "YOUR_API_KEY"
hdrs = {"Authorization": f"Bearer {key}"}

# 1. Submit
r = requests.post("https://api.pixelapi.dev/v1/video/auto-reel",
                  headers=hdrs,
                  data={"source_url": "https://youtu.be/abcdef12345",
                        "aspect": "16:9", "bgm": "calm",
                        "include_logo": "true"})
gen_id = r.json()["generation_id"]

# 2. Poll
while True:
    s = requests.get(f"https://api.pixelapi.dev/v1/video/auto-reel/{gen_id}",
                     headers=hdrs).json()
    if s["status"] == "done":
        break
    if s["status"] == "error":
        raise RuntimeError(s["error"])
    time.sleep(8)

# 3. Download
mp4 = requests.get(s["output_url"], headers=hdrs)
open("reel.mp4", "wb").write(mp4.content)
print(f"saved {len(mp4.content)} bytes; picks={s['picks']}")

Node.js

import fs from "node:fs";

const KEY = process.env.PIXELAPI_KEY;
const headers = { Authorization: `Bearer ${KEY}` };

// Submit
const fd = new FormData();
fd.append("source_url", "https://youtu.be/abcdef12345");
fd.append("aspect", "16:9");
fd.append("bgm", "calm");
const r = await fetch("https://api.pixelapi.dev/v1/video/auto-reel",
                     { method: "POST", headers, body: fd }).then(r => r.json());

// Poll
let s; do {
  await new Promise(r => setTimeout(r, 8000));
  s = await fetch(`https://api.pixelapi.dev/v1/video/auto-reel/${r.generation_id}`,
                  { headers }).then(r => r.json());
} while (s.status !== "done" && s.status !== "error");

// Download
const mp4 = await fetch(s.output_url, { headers });
fs.writeFileSync("reel.mp4", Buffer.from(await mp4.arrayBuffer()));

Parameters

FieldTypeRequiredDescription
source_urlstringOne ofYouTube URL or direct mp4 URL.
sourcefileOne ofmp4 upload, ≤ 100 MB.
aspectstringno16:9 (default), 9:16, 1:1.
bgmstringnocalm (default), epic, none.
languagestringnoWhisper language hint (e.g. en, hi). Auto-detects when blank.
include_logoboolnoAppend PixelAPI logo bumper at end (default true).

Response shape

When done

{
  "generation_id": "74c886c9-1247-44f4-aaa0-4de49ba6b32b",
  "status": "done",
  "output_url": "https://api.pixelapi.dev/v1/video/auto-reel/74c886c9-.../download",
  "duration_seconds": 56.13,
  "picks": [
    { "start_cue": 1,  "end_cue": 3,  "start_s": 0.0,    "end_s": 12.80, "dur_s": 12.80, "role": "HOOK" },
    { "start_cue": 8,  "end_cue": 11, "start_s": 42.46,  "end_s": 57.58, "dur_s": 15.12, "role": "WHAT_IT_DOES" },
    { "start_cue": 12, "end_cue": 17, "start_s": 57.58,  "end_s": 72.64, "dur_s": 15.06, "role": "HOW_TO_USE" },
    { "start_cue": 26, "end_cue": 32, "start_s": 108.96, "end_s": 123.26,"dur_s": 14.30, "role": "CALL_TO_ACTION" }
  ],
  "timings": { "transcribe_s": 54.3, "vlm_pick_s": 1.5, "render_s": 41.1, "total_s": 144.8 }
}

Pricing

ProviderCheapest paid tierCost per reel (~2-min source)Story-arc cuts?Sentence-bounded?
OpusClip Starter$15/mo for 150 credits~$0.10No (engagement clips)No
Munch Candy Bar$23/mo for 100 min~$0.46NoApprox
Vizard Creator$20/mo for 800 min~$0.05NoNo
Pictory Standard$25/mo for 200 min~$0.25NoNo
Klap Starter$29/moNoNo
Submagic Starter$16/moNoYes (captions only)
PixelAPI Reel DirectorPay-as-you-go$0.03Yes (HOOK→WHAT→HOW→CTA)Yes (whisper-large-v3)

FAQ

What languages are supported?

99 languages via whisper-large-v3 transcription, including English, Hindi, Marathi, Tamil, Bengali, Spanish, Mandarin, Arabic, French, German, Japanese, Korean, Portuguese. Pass language=hi to force a hint, or leave blank to auto-detect.

How long can my source be?

Up to 30 minutes / 100 MB. We pick 4 windows in the [8s, 16s] range, total ≈ 45–65s.

Can I get the picks without rendering?

Not yet — but the response includes the picks so you can replay or remix them yourself. We're considering a preview_only param for future.

What's in the BGM library?

calm is the current default — a cinematic, sidechain-friendly score. epic is more dramatic. none ships voice-only audio.

Will my source video be stored?

Uploads are deleted after 24h. Output reels are retained 30 days for redownload. See privacy policy.