Purple Squirrel Media · Break Free

The fastest AI video API.

One API over every video model. We race them on every prompt and hand you the first clip that finishes. Bring your own key — we orchestrate, cache, and store.

https://gen.purplesquirrel.media/v1
How it's fast

We don't run the GPUs. We run the race.

Video gen is slow, expensive, and split across a dozen APIs. Three layers we control turn that into one fast endpoint.

01

Model racing

Your prompt fans out to every configured model at once — fal and Replicate, fast and cinematic. The first render to finish is the one you get; the rest are dropped. Every model has a slow render sometimes; racing means you never wait on it.

first-clip-wins
02

One API · your keys

Bring your own fal / Replicate key. One OpenAI-style endpoint replaces a dozen SDKs — swap or add a model without touching your code. You pay the render on your own account; we bill only the fast layer on top.

BYOK · unified
03

Cached & stored

Seeded renders are cached — ask twice, pay once, get it instantly. Every finished clip is copied to our storage with a permanent URL, so provider links never expire under you.

seed cache · permanent URLs
Drop-in

Create. Poll. Done.

Async by design — renders take seconds to minutes. Create a job, poll until the first model finishes, get a permanent URL.

psm-video-fast
Raced across LTX + Wan fast. First usable clip, quickest.
$0.02 / generation
psm-video-max
Cinematic — Kling turbo + Wan A14B — raced for quality.
$0.03 / generation
That's the orchestration fee only — the render bills to your provider key. Pay the fee with x402 or a prepaid key.
generate.ts
// 1 · create — bring your own fal key
const job = await fetch("https://gen.purplesquirrel.media/v1/video/generations", {
  method: "POST",
  headers: {
    "content-type": "application/json",
    "X-Fal-Key": process.env.FAL_KEY,
    "Authorization": "Bearer psm_...",
  },
  body: JSON.stringify({ model: "psm-video-fast", prompt: "a squirrel surfing a neon wave" }),
}).then(r => r.json());

// 2 · poll until the first model finishes
let v;
do { await sleep(2000);
  v = await fetch(job.poll, { headers: { "X-Fal-Key": process.env.FAL_KEY } }).then(r => r.json());
} while (v.status === "processing");

console.log(v.video_url); // stored on our R2 — permanent

Response tells you which model won (provider) and the permanent video_url.

Stop babysitting one render queue.

Get an API key