Endpoints
Shorts API
POST /v1/shorts writes and renders a complete faceless short from a topic or your own script: a 15 to 90 second 1080p MP4 with AI scene images, a voiceover, word-by-word captions and music, in 8 visual styles and 6 languages.
You also get a title, a post caption with hashtags and every scene's narration and image, ready to publish.
- Typical render
- About 100 s
- 97 s for a 60 s short in our tests
- Price
- $0.25
- per short up to 60 s, $0.35 for shorts up to 90 s
- Length
- 15 to 90 s
- 4 to 24 scenes
Example#
A short takes longer than the default 60 second wait, so create it with Prefer: respond-async, then wait on the job. The loop below holds each request open for up to 60 seconds, so it only makes two or three calls. The curl version uses jq to read the JSON.
body=$(curl -sS "https://api.reelsdk.com/v1/shorts" \
-H "Authorization: Bearer $REELSDK_KEY" \
-H "Content-Type: application/json" \
-H "Prefer: respond-async" \
-d '{
"topic": "Why octopuses have three hearts",
"duration_s": 30,
"style": "cinematic"
}')
JOB_ID=$(printf '%s' "$body" | jq -r ".job.id")
# We wait on the job, up to 60 s per call, until it finishes
while :; do
state=$(printf '%s' "$body" | jq -r ".job.status")
[ "$state" = queued ] || [ "$state" = running ] || break
body=$(curl -sS "https://api.reelsdk.com/v1/jobs/$JOB_ID?wait=60" \
-H "Authorization: Bearer $REELSDK_KEY")
done
printf '%s' "$body" | jq ".error // .job.outputs"The create call answers 202 Accepted right away, with a Location header pointing at the job and Retry-After: 5. A webhook saves you the polling.
{
"job": {
"id": "job_x5wepdaqkop4tepq05xp",
"op": "shorts",
"status": "queued",
"stage": null,
"created_at": "2026-10-26T01:15:26.166Z",
"finished_at": null,
"outputs": {},
"result": null,
"duration_s": null,
"error": null,
"usage": {
"output_seconds": 0,
"audio_seconds": 0,
"tts_characters": 0,
"images": 0
},
"poll_url": "https://api.reelsdk.com/v1/jobs/job_x5wepdaqkop4tepq05xp"
}
}Parameters#
Send topic, script or both. Everything else is optional, and fields we don't recognize are ignored.
| Parameter | Description |
|---|---|
topicstring | What the short is about. We write the script. Required unless you send 1 to 500 characters |
scriptstring | Your own narration, read word for word. It sets the length of the short, and 1 to 3,000 characters, at most 90 s of narration |
duration_sinteger | Target length in seconds when we write the script from Default |
aspectstring | Output frame: 1080x1920, 1080x1080 or 1920x1080. 9:16default1:116:9 |
stylestring | The look of the scene images. It also picks the default music mood and caption preset. See Styles. cinematicdefaultphotorealanime3d-cartoonwatercolorcomicdark-documentaryoil-painting |
languagestring | Language of the script, voice and captions. endefaultesfrjazhko |
voicestring | Narrator voice. English has 40 voices (default Show all voicesHide all voicesamaltheaandromedaapolloarcasariesasteriaathenaatlasauroracallistacoracordeliadeliadracoelectraharmoniahelenaherahermeshyperionirisjanusjunojupiterlunamarsminervaneptuneodysseusopheliaorionorpheuspandoraphoebeplutosaturnthaliatheiavestazeussirionestorcarinacelestealvarodianaaquilaselenaestrellajavier |
musicstring | Background music. autodefaultnonelofichillupbeatcinematicdramaticdarkenergeticinspiring |
captionsboolean, string or object | On by default with the style's preset. Send |
webhook_urlstring | We POST the finished job to this URL. See Webhooks. Public http(s) URL |
Topic or script#
With only a topic, we write narration to fit duration_s, opening with a hook. With a script, we read your text word for word and the script sets the length. You can still send a topic next to it to steer the images.
A script must read in 90 seconds or less at the voice's pace, which is about 250 words with the default English voice. A longer one returns 400 with an estimate, such as script reads as about 143 s of narration at this voice's pace, over the 90 s limit.
Styles#
A style sets the look of the images, plus a default music mood and caption preset. Send music or captions to override either one.
| style | Look | Music | Captions |
|---|---|---|---|
| cinematic | Film still, anamorphic lens, teal and amber grade | cinematic | bold |
| photoreal | Realistic photo, natural light, documentary feel | chill | bold |
| anime | 2D anime key visual, cel shading, painted backgrounds | lofi | karaoke |
| 3d-cartoon | Stylized 3D animated film, warm and family friendly | upbeat | bold |
| watercolor | Hand-painted watercolor, pastel storybook look | chill | minimal |
| comic | Comic book ink, halftone shading, flat vivid colors | energetic | bold |
| dark-documentary | Low-key true-crime photo, cold colors, heavy grain | dark | bold |
| oil-painting | Classical oil painting, visible brushstrokes | cinematic | minimal |
With music: "auto", the script writer picks one of 8 moods for your topic and we pick a track for it from our royalty-free library. The music sits under the voice.
Languages and voices#
Shorts speak English, Spanish, French, Japanese, Chinese and Korean. The script, voiceover and captions all use the language you send, and any other language returns 400 UNSUPPORTED_LANGUAGE.
| language | Language | Voices |
|---|---|---|
| en | English | 40 voices, default luna |
| es | Spanish | 10 voices, default aquila |
| fr | French | One voice |
| ja | Japanese | One voice |
| zh | Chinese | One voice |
| ko | Korean | One voice |
Progress and timing#
Most shorts finish in about 100 seconds: we measured 97 s for a 60 second short and 103 s for a 30 second one. While the job runs, job.stage tells you what it's doing.
| stage | What happens |
|---|---|
| planning | We write the script, the scene prompts, the title and the post caption. |
| voice | The voiceover is recorded while the scene images are drawn. |
| images | The voiceover is done and the last images are still drawing. Skipped when the images finish first. |
| rendering | We cut the scenes to the voice, add music and captions, and encode the MP4. |
stage is null while the job is queued and once it finishes.
Response#
A finished short answers 200. Besides the files, result holds a title, a post_caption with hashtags to paste into TikTok, Reels or Shorts, and the narration and image URL of every scene. This one is trimmed to 2 of its 8 scenes.
{
"job": {
"id": "job_x5wepdaqkop4tepq05xp",
"op": "shorts",
"status": "succeeded",
"stage": null,
"created_at": "2026-10-26T01:15:26.166Z",
"finished_at": "2026-10-26T01:17:07.802Z",
"outputs": {
"video": "https://api.reelsdk.com/f/out/job_x5wepdaqkop4tepq05xp/video.mp4",
"transcript": "https://api.reelsdk.com/f/out/job_x5wepdaqkop4tepq05xp/transcript.json",
"srt": "https://api.reelsdk.com/f/out/job_x5wepdaqkop4tepq05xp/captions.srt",
"vtt": "https://api.reelsdk.com/f/out/job_x5wepdaqkop4tepq05xp/captions.vtt",
"poster": "https://api.reelsdk.com/f/in/job_x5wepdaqkop4tepq05xp/scene-01.jpg"
},
"result": {
"title": "The Octopus Heart Secret",
"post_caption": "Three hearts and a stopping beat? The octopus is a biological masterpiece. #octopus #oceanlife #naturefacts #marinebiology #wildlife",
"scenes": [
{
"narration": "An octopus does not rely on just one heart.",
"image": "https://api.reelsdk.com/f/in/job_x5wepdaqkop4tepq05xp/scene-01.jpg"
},
{
"narration": "They actually possess three distinct hearts beating inside.",
"image": "https://api.reelsdk.com/f/in/job_x5wepdaqkop4tepq05xp/scene-02.jpg"
}
]
},
"duration_s": 28,
"error": null,
"usage": {
"output_seconds": 28,
"audio_seconds": 27.384,
"tts_characters": 405,
"images": 8
},
"poll_url": "https://api.reelsdk.com/v1/jobs/job_x5wepdaqkop4tepq05xp"
}
}| Output | Contents |
|---|---|
| video | The short as an H.264 MP4 at 1080x1920, 1080x1080 or 1920x1080 |
| poster | The first scene's image, as a JPEG thumbnail |
| transcript | The narration with every word's start and end in seconds |
| srt | SubRip subtitles of the narration |
| vtt | WebVTT subtitles of the narration |
usage.output_seconds is the video length, usage.audio_seconds the voiceover length, usage.tts_characters the characters read aloud and usage.images the scene images. All files stay up for 7 days.
Errors and retries#
If something fails on our side, we retry the job once on our own and pick up from the last finished step, so the script, images and voice aren't made twice. When you see a 500, that retry has already happened, except for TIMEOUT. Sending the request again starts a new short from scratch.
| Code | HTTP | When it happens |
|---|---|---|
| INVALID_REQUEST | 400 | A field is invalid, the script reads longer than 90 s, or neither topic nor script was sent |
| UNSUPPORTED_LANGUAGE | 400 | language is not one of the 6 above |
| CONTENT_REJECTED | 422 | The image safety filter flagged the scenes. Try a less graphic topic or script. |
| PLAN_FAILED | 500 | Writing the script failed. Send the request again. |
| IMAGES_FAILED | 500 | No scene image could be drawn. Send the request again. |
| TTS_FAILED | 500 | The voiceover or its word timings failed. Send the request again. |
| TIMEOUT | 500 | The render hit the 10 minute limit. Send the request again. |
Other 500 codes come from the render workers and are listed in Errors.
Tips#
- Create shorts with
Prefer: respond-asyncor awebhook_url, since they take longer than the default 60 s wait. - Your topic is the brief: "why octopuses have three hearts" makes a better short than "octopus".
- Pick the style for the topic:
dark-documentarysuits true crime and mysteries,3d-cartoonandwatercolorsuit kids' stories. - Back off before you retry a
500, since we already retried it once. ForCONTENT_REJECTED, change the topic or script first. result.titleandresult.post_captionare written for posting, andoutputs.postermakes a ready thumbnail. Download what you keep within 7 days.
Last updated 26 October 2026