API Documentation
Everything you need to generate short-form videos over HTTP. Authenticate with a scoped key, POST a project, and poll a render.
Overview
The Brainrot Shorts REST API lets you generate short-form vertical videos programmatically — AI brainrot dialogue videos, Reddit story videos, and AI voice-over videos. It's the same engine as the app, exposed over HTTP.
All requests are made to https://www.brainrotshorts.com/api/v1. REST API access is available on the Creator and Pro plans. New to the API? Start with the Brainrot API overview.
Auth
Authentication
Create a REST API key in the API dashboard. The full key (prefixed brs_) is shown once — store it securely. Send it in the X-API-Key header on every request. REST keys are separate from MCP / agent keys and are scoped specifically to this API.
curl https://www.brainrotshorts.com/api/v1/me \
-H "X-API-Key: brs_your_api_key"Get started
Quickstart
Create a voice-over project, then approve, render, and poll for the finished MP4.
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." }
]
}'# 1. Approve + start the 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 }'
# 2. Poll until status is "done", then read outputUrl
curl https://www.brainrotshorts.com/api/v1/projects/proj_a1b2c3/render \
-H "X-API-Key: $BRS_API_KEY"Conventions
Response format
Every response is JSON. Successful responses wrap the payload in data; errors use an error object. Both always include a requestId.
{
"data": { /* endpoint payload */ },
"requestId": "req_5f3c0e9d"
}{
"error": {
"code": "VALIDATION_ERROR",
"message": "Request body failed validation.",
"details": [
{ "path": "scenes", "code": "too_small", "message": "Array must contain at least 1 element(s)" }
]
},
"requestId": "req_5f3c0e9d"
}Response headers
X-Request-IdUnique ID for the request (also in the body as requestId). Quote it in support requests.
X-RateLimit-LimitTotal requests allowed in the current 24h window for this key.
X-RateLimit-RemainingRequests remaining in the current window.
X-RateLimit-ResetISO-8601 timestamp when the window resets.
X-RateLimit-WindowWindow length in seconds (86400).
X-API-TierPlan tier resolved for the key (Creator or Pro).
X-Idempotent-ReplayPresent and true when a response was replayed from an Idempotency-Key.
Retry-AfterOn a 429, seconds to wait before retrying.
Failures
Errors
Errors return the appropriate HTTP status and a stable error.code you can switch on.
MISSING_API_KEY401No X-API-Key header was sent.
INVALID_API_KEY401Key is unknown, disabled, expired, or not scoped for REST access.
FORBIDDEN403Your plan does not include REST API access (Creator/Pro only).
INSUFFICIENT_CREDITS402Not enough credits for a render, script, or audio action.
VALIDATION_ERROR400Body is not valid JSON or failed schema validation. See details[].
UNSUPPORTED_VIDEO_TYPE400The project's kind is not valid for this endpoint.
NOT_FOUND404Project, scene, render, or route does not exist for this account.
RATE_LIMITED429Daily request quota for the key is exhausted. See Retry-After.
IDEMPOTENCY_CONFLICT409Idempotency-Key was reused with a different request body.
INTERNAL_ERROR500Unexpected server error. Safe to retry with an Idempotency-Key.
Quotas
Rate limits
Requests are metered per key on a rolling 24-hour UTC window:
50 / day
Creator
200 / day
Pro
Read X-RateLimit-Remaining to track usage; a 429 response includes a Retry-After header. Status polls count toward the quota, so poll conservatively. Renders, script generation, and narration audio also consume your account's credits.
Safe retries
Idempotency
Any mutating POST accepts an optional Idempotency-Key header. Retrying with the same key and body within 24 hours replays the original response (flagged with X-Idempotent-Replay) instead of creating a duplicate. Reusing a key with a different body returns IDEMPOTENCY_CONFLICT.
curl https://www.brainrotshorts.com/api/v1/voiceover/projects \
-H "X-API-Key: $BRS_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: my-unique-key-001" \
-d '{ "title": "Daily AI news", "scenes": [ { "text": "..." } ] }'Model
Core concepts
- Project — a video and its config. Each has a
kind(brainrot, reddit-story, or ai-voice-over-video) and a status. - Scene / block — the ordered units inside a project that carry the script text and per-scene settings.
- Render — a job that produces the final MP4. Start it, then poll until
status: "done"and readoutputUrl. - Audio job — narration generation runs async; poll
GET /audio/jobs/{jobId}.
Endpoints
Account & catalog
Read your account context and the catalogs of voices, backgrounds, and caption styles you can reference by ID.
/api/v1/meGet the authenticated account.
{
"data": { "userId": "usr_123", "plan": "creator" },
"requestId": "req_5f3c0e9d"
}https://www.brainrotshorts.com/api/v1/me
/api/v1/catalog/charactersList the characters and voices available to your plan.
https://www.brainrotshorts.com/api/v1/catalog/characters
/api/v1/catalog/backgroundsList gameplay/background videos you can attach by ID.
https://www.brainrotshorts.com/api/v1/catalog/backgrounds
/api/v1/catalog/caption-stylesList the built-in caption style presets.
https://www.brainrotshorts.com/api/v1/catalog/caption-styles
Endpoints
Projects & renders
Shared lifecycle endpoints. Only brainrot, reddit-story, and ai-voice-over-video projects are visible over the REST API.
/api/v1/projectsList your API-visible projects with their latest render.
{
"data": { "projects": [ { "id": "proj_a1b2c3", "kind": "ai-voice-over-video", "status": "draft", "latestRender": null } ] },
"requestId": "req_5f3c0e9d"
}https://www.brainrotshorts.com/api/v1/projects
/api/v1/projects/{projectId}Get a single project by ID.
Path parameters
projectIdstringrequiredThe project ID.
/api/v1/projects/{projectId}Delete a project.
Path parameters
projectIdstringrequiredThe project ID.
/api/v1/projects/{projectId}/renderApprove and start a render.
Renders consume credits. Send an Idempotency-Key so retries don't start duplicate renders.
Path parameters
projectIdstringrequiredThe project ID.
Body parameters
approvedbooleanMust be true to start the render. Defaults to false.
curl https://www.brainrotshorts.com/api/v1/projects/proj_a1b2c3/render \
-H "X-API-Key: $BRS_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: render-001" \
-d '{ "approved": true }'{
"data": { "render": { "id": "rnd_99", "status": "rendering", "progress": 0.0 } },
"requestId": "req_5f3c0e9d"
}/api/v1/projects/{projectId}/renderGet the latest render status for a project (poll this).
Path parameters
projectIdstringrequiredThe project ID.
{
"data": { "render": { "id": "rnd_99", "status": "done", "progress": 1, "outputUrl": "https://.../proj_a1b2c3.mp4" } },
"requestId": "req_5f3c0e9d"
}/api/v1/renders/{renderId}Get a specific render by its ID.
Path parameters
renderIdstringrequiredThe render ID.
/api/v1/projects/{projectId}/outputGet the latest finished output URL for a project.
Path parameters
projectIdstringrequiredThe project ID.
/api/v1/audio/jobs/{jobId}Get the status of a narration audio generation job.
Path parameters
jobIdstringrequiredThe audio job ID returned by a scene audio call.
Endpoints
AI Brainrot
Gameplay-background dialogue videos with AI voiceover and word-by-word captions.
/api/v1/brainrot/projectsCreate a brainrot project.
Provide simple settings to start a draft, or pass a full promptJson scene config to create a ready-to-render project.
Body parameters
titlestringProject title (max 120 chars).
backgroundVideoIdstringID from GET /catalog/backgrounds.
characterIdstringID from GET /catalog/characters.
captionStyleobjectCaption styling object. List valid presets via GET /catalog/caption-styles.
captionGroupingobjectControls how words are grouped into caption chunks.
promptJsonobjectFull project config (backgroundColor, scenes[]). When present, creates a complete project.
curl https://www.brainrotshorts.com/api/v1/brainrot/projects \
-H "X-API-Key: $BRS_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "title": "Did you know?", "characterId": "peter_griffin" }'/api/v1/brainrot/projects/{projectId}Update a brainrot project.
Path parameters
projectIdstringrequiredThe project ID.
Body parameters
titlestringNew title (max 120 chars).
captionStyleobjectCaption styling object. List valid presets via GET /catalog/caption-styles.
captionGroupingobjectControls how words are grouped into caption chunks.
backgroundColorstringBackground color for the project.
watermarkEnabledbooleanToggle the watermark.
promptJsonobjectReplace the full scene config.
/api/v1/brainrot/projects/{projectId}/scenes/{sceneId}Update a single scene.
Path parameters
projectIdstringrequiredThe project ID.
sceneIdstringrequiredThe scene ID.
Body parameters
characterIdstringCharacter for the scene.
backgroundVideoIdstringBackground by catalog ID.
backgroundVideoUrlstringBackground by direct URL.
characterEntranceEnabledbooleanToggle the character entrance animation.
characterEntrancePresetstringEntrance animation preset.
characterEntranceSoundEnabledbooleanToggle the entrance sound.
characterPositionobjectCharacter position.
characterScalenumberCharacter scale (> 0).
captionPositionYnumberVertical caption position, 0–1.
voiceEnabledbooleanToggle voiceover for the scene.
/api/v1/brainrot/scripts/ideasGenerate script ideas for a niche.
Body parameters
nichestringrequiredThe niche to ideate around (max 200 chars).
https://www.brainrotshorts.com/api/v1/brainrot/scripts/ideas
/api/v1/brainrot/projects/{projectId}/scripts/generateGenerate a full script for a project.
Path parameters
projectIdstringrequiredThe project ID.
Body parameters
nichestringrequiredNiche (max 200 chars).
ideastringrequiredThe specific idea to script (max 500 chars).
charactersarray1–4 characters to cast in the dialogue.
/api/v1/brainrot/projects/{projectId}/scripts/applyApply a script to a project as scenes.
Path parameters
projectIdstringrequiredThe project ID.
Body parameters
titlestringOptional title (max 120 chars).
scriptarrayrequired1–40 script lines to turn into scenes.
/api/v1/brainrot/projects/{projectId}/scenes/{sceneId}/audioGenerate narration audio for a scene.
Consumes credits. Returns an audio job — poll GET /audio/jobs/{jobId}.
Path parameters
projectIdstringrequiredThe project ID.
sceneIdstringrequiredThe scene ID.
Endpoints
Reddit Videos
Narrated Reddit story videos from a Reddit URL, a raw prompt, or an explicit script/blocks payload.
/api/v1/reddit/posts/fetchFetch a Reddit post for use in a story video.
Body parameters
urlstringrequiredA valid Reddit post URL.
https://www.brainrotshorts.com/api/v1/reddit/posts/fetch
/api/v1/reddit/scripts/generateGenerate a Reddit story script from a description.
Body parameters
descriptionstringrequiredWhat the story is about (max 2000 chars).
stylestringOptional style hint (max 100 chars).
durationSecondsnumberTarget length 10–120. Defaults to 90.
https://www.brainrotshorts.com/api/v1/reddit/scripts/generate
/api/v1/reddit/posts/repurposeRepurpose an existing Reddit post into a script.
Body parameters
originalPostobjectrequired{ subreddit, username, title, selftext, upvotes, comments }.
mode"repurpose" | "longer"requiredRepurpose verbatim-ish or expand into a longer story.
durationSecondsnumberTarget length 10–120. Defaults to 60.
https://www.brainrotshorts.com/api/v1/reddit/posts/repurpose
/api/v1/reddit/projectsCreate a Reddit story project.
Provide exactly one of script or blocks, plus optional settings.
Body parameters
titlestringProject title (max 120 chars).
voiceIdstring | nullNarrator voice.
backgroundVideoUrlstring | nullBackground by URL.
backgroundVideoIdstringBackground by catalog ID.
captionStyleobjectCaption styling object. List valid presets via GET /catalog/caption-styles.
captionGroupingobjectControls how words are grouped into caption chunks.
backgroundMusicobject | nullBackground music config.
playbackRatenumberSpeed 1–2.
watermarkEnabledbooleanToggle watermark.
captionPositionYnumberCaption position, 0–1.
scriptobjectA generated Reddit script object (mutually exclusive with blocks).
blocksarrayExplicit story blocks (mutually exclusive with script).
https://www.brainrotshorts.com/api/v1/reddit/projects
/api/v1/reddit/projects/{projectId}Update a Reddit story project.
Path parameters
projectIdstringrequiredThe project ID.
Body parameters
(settings)objectAny of the create settings above.
script | blocksobject | arrayOptionally replace the script or blocks (not both).
/api/v1/reddit/videos/from-promptCreate a Reddit video from a text prompt in one call.
Body parameters
descriptionstringrequiredWhat the story is about (max 2000 chars).
stylestringOptional style hint.
durationSecondsnumberTarget length 10–120. Defaults to 90.
(settings)objectAny Reddit project settings (voiceId, background, captions...).
approvedbooleanStart a render immediately. Defaults to false.
https://www.brainrotshorts.com/api/v1/reddit/videos/from-prompt
/api/v1/reddit/videos/from-urlCreate a Reddit video from a Reddit URL in one call.
Body parameters
urlstringrequiredA valid Reddit post URL.
originalPostobjectOptional pre-fetched post payload.
mode"repurpose" | "longer"Defaults to repurpose.
durationSecondsnumberTarget length 10–120. Defaults to 60.
(settings)objectAny Reddit project settings.
approvedbooleanStart a render immediately. Defaults to false.
curl https://www.brainrotshorts.com/api/v1/reddit/videos/from-url \
-H "X-API-Key: $BRS_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: reddit-001" \
-d '{ "url": "https://www.reddit.com/r/AmItheAsshole/comments/abc123/", "approved": true }'/api/v1/reddit/projects/{projectId}/blocks/{blockId}/audioGenerate narration audio for a Reddit block.
Path parameters
projectIdstringrequiredThe project ID.
blockIdstringrequiredThe block ID.
Endpoints
AI Voice Over
Scenes of text narrated over any background video, with tunable captions and playback.
/api/v1/voiceover/scripts/generateGenerate a voice-over script from a description.
Body parameters
descriptionstringrequiredWhat the video is about (max 2000 chars).
stylestringOptional style hint (max 100 chars).
durationSecondsnumberTarget length 10–120. Defaults to 60.
https://www.brainrotshorts.com/api/v1/voiceover/scripts/generate
/api/v1/voiceover/projectsCreate an AI voice-over project.
Body parameters
titlestringProject title (max 120 chars).
voiceIdstring | nullNarrator voice ID.
backgroundVideoUrlstring | nullBackground video URL.
captionStyleobjectCaption styling object. List valid presets via GET /catalog/caption-styles.
captionGroupingobjectControls how words are grouped into caption chunks.
captionPositionYnumberCaption position, 0–1.
backgroundMusicobjectBackground music config.
playbackRatenumberSpeed 1–2.
watermarkEnabledbooleanToggle watermark.
scenesarrayrequired≥1 scene: { text (required), id?, narrationAudioUrl?, generatedCaptions?, durationInSeconds? }.
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." }
]
}'{
"data": { "project": { "id": "proj_a1b2c3", "kind": "ai-voice-over-video", "status": "draft" } },
"requestId": "req_5f3c0e9d"
}/api/v1/voiceover/projects/{projectId}Update an AI voice-over project.
Path parameters
projectIdstringrequiredThe project ID.
Body parameters
(any create field)objectAny field from create. scenes, if sent, must contain ≥1 scene.
/api/v1/voiceover/projects/{projectId}/scenes/{sceneId}/audioGenerate narration audio for a voice-over scene.
Path parameters
projectIdstringrequiredThe project ID.
sceneIdstringrequiredThe scene ID.
Recipes
Workflows
AI Voice Over → MP4
- POST
/voiceover/projectswith your scenes → get a projectId. - POST
/projects/{projectId}/renderwith{ approved: true }. - Poll GET
/projects/{projectId}/renderuntil done, then read outputUrl.
Reddit URL → MP4 (one call)
- POST
/reddit/videos/from-urlwith the URL and{ approved: true }. - Poll the render and read outputUrl.
AI Brainrot from a niche
- POST
/brainrot/projects→ projectId. - POST
/brainrot/projects/{projectId}/scripts/generate, then.../scripts/apply. - Render and poll as above.