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.

POST/v1/shorts
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.

202 Accepted
{
  "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.

ParameterDescription
topicstring

What the short is about. We write the script. Required unless you send script.

1 to 500 characters

scriptstring

Your own narration, read word for word. It sets the length of the short, and topic then only steers the images.

1 to 3,000 characters, at most 90 s of narration

duration_sinteger

Target length in seconds when we write the script from topic.

Default 4515 to 90

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. en-US and eng count as en.

endefaultesfrjazhko
voicestring

Narrator voice. English has 40 voices (default luna) and Spanish 10 (default aquila). French, Japanese, Chinese and Korean have one voice each, so this is ignored.

Show all voices
amaltheaandromedaapolloarcasariesasteriaathenaatlasauroracallistacoracordeliadeliadracoelectraharmoniahelenaherahermeshyperionirisjanusjunojupiterlunamarsminervaneptuneodysseusopheliaorionorpheuspandoraphoebeplutosaturnthaliatheiavestazeussirionestorcarinacelestealvarodianaaquilaselenaestrellajavier
musicstring

Background music. auto lets the script writer pick a mood for the topic, and none leaves the music out.

autodefaultnonelofichillupbeatcinematicdramaticdarkenergeticinspiring
captionsboolean, string or object

On by default with the style's preset. Send false to turn them off, a preset name, or a style object.

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.

styleLookMusicCaptions
cinematicFilm still, anamorphic lens, teal and amber gradecinematicbold
photorealRealistic photo, natural light, documentary feelchillbold
anime2D anime key visual, cel shading, painted backgroundslofikaraoke
3d-cartoonStylized 3D animated film, warm and family friendlyupbeatbold
watercolorHand-painted watercolor, pastel storybook lookchillminimal
comicComic book ink, halftone shading, flat vivid colorsenergeticbold
dark-documentaryLow-key true-crime photo, cold colors, heavy graindarkbold
oil-paintingClassical oil painting, visible brushstrokescinematicminimal

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.

languageLanguageVoices
enEnglish40 voices, default luna
esSpanish10 voices, default aquila
frFrenchOne voice
jaJapaneseOne voice
zhChineseOne voice
koKoreanOne 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.

stageWhat happens
planningWe write the script, the scene prompts, the title and the post caption.
voiceThe voiceover is recorded while the scene images are drawn.
imagesThe voiceover is done and the last images are still drawing. Skipped when the images finish first.
renderingWe 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.

200 OK
{
  "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"
  }
}
OutputContents
videoThe short as an H.264 MP4 at 1080x1920, 1080x1080 or 1920x1080
posterThe first scene's image, as a JPEG thumbnail
transcriptThe narration with every word's start and end in seconds
srtSubRip subtitles of the narration
vttWebVTT 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.

CodeHTTPWhen it happens
INVALID_REQUEST400A field is invalid, the script reads longer than 90 s, or neither topic nor script was sent
UNSUPPORTED_LANGUAGE400language is not one of the 6 above
CONTENT_REJECTED422The image safety filter flagged the scenes. Try a less graphic topic or script.
PLAN_FAILED500Writing the script failed. Send the request again.
IMAGES_FAILED500No scene image could be drawn. Send the request again.
TTS_FAILED500The voiceover or its word timings failed. Send the request again.
TIMEOUT500The 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-async or a webhook_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-documentary suits true crime and mysteries, 3d-cartoon and watercolor suit kids' stories.
  • Back off before you retry a 500, since we already retried it once. For CONTENT_REJECTED, change the topic or script first.
  • result.title and result.post_caption are written for posting, and outputs.poster makes a ready thumbnail. Download what you keep within 7 days.

Last updated 26 October 2026