Back to blog
PostBy MaikoJune 24, 20264 min read

How to Generate Brainrot Videos with an API

A hands-on tutorial for the Brainrot Shorts REST API: create a key, POST a project, start a render, and poll for a finished 9:16 MP4 — with copy-paste curl, JavaScript, and Python.

brainrot apiai video apivideo automationfaceless channelrest api

If you've been searching for a brainrot API — a way to generate short-form videos from code instead of clicking through an editor — this is the walkthrough. The Brainrot Shorts API exposes the same engine that powers the app over plain REST: AI voiceover, gameplay backgrounds, and word-by-word captions, all from a single POST.

By the end you'll have a script that turns a few lines of text into a finished, watermark-free vertical MP4, ready for TikTok, Reels, or YouTube Shorts.

Step 1 — Create an API key

Open the API dashboard and create a new REST key. The full key is shown once and is prefixed with brs_ — copy it somewhere safe. You'll send it in the X-API-Key header on every request.

Store it as an environment variable so it never lands in your code:

export BRS_API_KEY="brs_your_api_key"

Sanity-check that the key works by calling the /me endpoint:

curl https://www.brainrotshorts.com/api/v1/me \
  -H "X-API-Key: $BRS_API_KEY"

You should get back your account context:

{ "data": { "userId": "usr_123", "plan": "creator" }, "requestId": "req_5f3c0e9d" }

Every response uses the same envelope: a data object on success, an error object on failure, and always a requestId you can quote in support requests.

Step 2 — Create a project

The fastest workflow is AI Voice Over: you supply scenes of text and a background video, and the API narrates them with captions. Send a POST to /voiceover/projects.

Notice the Idempotency-Key header — if your request times out and you retry with the same key and body, the API replays the original response instead of creating a duplicate project. Always set one on writes.

curl https://www.brainrotshorts.com/api/v1/voiceover/projects \
  -H "X-API-Key: $BRS_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: clip-001" \
  -d '{
    "title": "Daily AI news",
    "voiceId": "peter_griffin",
    "backgroundVideoUrl": "https://cdn.example.com/gameplay.mp4",
    "scenes": [
      { "text": "Everyone thinks AI replaces video editors." },
      { "text": "The real edge is shipping ten variants before lunch." }
    ]
  }'

The response hands back a project ID:

{ "data": { "project": { "id": "proj_a1b2c3", "kind": "ai-voice-over-video", "status": "draft" } }, "requestId": "req_5f3c0e9d" }

Here's the same call in JavaScript and Python:

const res = await fetch(
  "https://www.brainrotshorts.com/api/v1/voiceover/projects",
  {
    method: "POST",
    headers: {
      "X-API-Key": process.env.BRS_API_KEY,
      "Content-Type": "application/json",
      "Idempotency-Key": "clip-001",
    },
    body: JSON.stringify({
      title: "Daily AI news",
      voiceId: "peter_griffin",
      backgroundVideoUrl: "https://cdn.example.com/gameplay.mp4",
      scenes: [
        { text: "Everyone thinks AI replaces video editors." },
        { text: "The real edge is shipping ten variants before lunch." },
      ],
    }),
  },
);
const { data } = await res.json();
const projectId = data.project.id;
import os, requests

res = requests.post(
    "https://www.brainrotshorts.com/api/v1/voiceover/projects",
    headers={"X-API-Key": os.environ["BRS_API_KEY"], "Idempotency-Key": "clip-001"},
    json={
        "title": "Daily AI news",
        "voiceId": "peter_griffin",
        "backgroundVideoUrl": "https://cdn.example.com/gameplay.mp4",
        "scenes": [
            {"text": "Everyone thinks AI replaces video editors."},
            {"text": "The real edge is shipping ten variants before lunch."},
        ],
    },
)
project_id = res.json()["data"]["project"]["id"]

Step 3 — Start the render

A project is just a draft until you render it. Approve and kick off a render by posting to /projects/{projectId}/render:

curl https://www.brainrotshorts.com/api/v1/projects/proj_a1b2c3/render \
  -H "X-API-Key: $BRS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "approved": true }'
{ "data": { "render": { "id": "rnd_99", "status": "rendering", "progress": 0.0 } }, "requestId": "req_5f3c0e9d" }

Step 4 — Poll until it's done

The v1 API is polling-based, so check the render status until it reports done, then read the outputUrl:

curl https://www.brainrotshorts.com/api/v1/projects/proj_a1b2c3/render \
  -H "X-API-Key: $BRS_API_KEY"
{ "data": { "render": { "id": "rnd_99", "status": "done", "progress": 1, "outputUrl": "https://.../proj_a1b2c3.mp4" } }, "requestId": "req_5f3c0e9d" }

That's the entire loop: key → project → render → poll → MP4. The same four steps work for Reddit story videos (/reddit/videos/from-url even does create-and-render in one call) and AI brainrot dialogue videos.

Where to go next

  • Wire this into a faceless-channel pipeline: read ideas from a sheet, loop the four steps, and post the output URLs on a schedule.
  • Generate scripts via the API first (/voiceover/scripts/generate) if you want the model to write the scenes for you.
  • Read the complete API documentation for every endpoint, the full error catalog, and idempotency details.

When you're ready, grab a key from the API dashboard and ship your first automated brainrot short today.

Ready to ship faster?

Turn what you learn here into clips, captions, and exports.

Brainrot Shorts is built for creators who want the posting volume of a media team without hiring one.