Burned-In Subtitles API

Captions baked into the frames — not a sidecar track

ZapCap renders styled captions permanently into the video itself and hands back a finished MP4. On TikTok, Reels, Shorts, and paid social, subtitle tracks get stripped or stay off by default. Burned-in captions always show — and they show in your style, not the platform default.

Open captions in the frames · h264 MP4 · webhook-native · usage-based credits
Open captions vs everything else

Why "burned-in" and not a subtitle file

A subtitle track is optional — the player decides whether to show it. Burned-in captions are part of the picture, so they survive re-uploads, downloads, and silent autoplay.

OPTION 01

Soft subtitle file
SRT / VTT sidecar
  • Player decides if it shows
  • Stripped on most social re-uploads
  • No styling control
  • Off by default in feeds

OPTION 02

DIY ffmpeg burn-in
Self-hosted render workers
  • You build font + layout logic
  • You run the GPU/queue infra
  • You handle line-breaking
  • No preset styling

OPTION 03 · YOU ARE HERE

ZapCap · burned-in rendering
Finished MP4, styled captions baked in
  • Captions permanent in the frames
  • Styled presets or full overrides
  • h264 MP4 ready for any platform
  • Webhook-native, no render infra

OPTION 04

Video automation
Creatomate · Shotstack · JSON2Video
  • Full video generation
  • Build the whole timeline
  • Captions are one of many layers
  • Heavier integration to add captions
API workflow

From upload to burned-in MP4

Upload a clip, create a render task with a templateId, and collect the finished MP4 from the task status — or get a webhook. ZapCap handles transcription, styling, and the burn-in render.

  1. 1

    Upload your video

    POST the file to /videos. We stream it to storage and hand you back a videoId.

    POSTPOST /videos
  2. 2

    Create the captioning task

    One POST starts transcription, styling and rendering with your chosen template. Add a notification webhook to skip polling.

    POSTPOST /videos/:id/task
  3. 3

    Receive the webhook

    We POST status updates to your endpoint as the render moves through transcribing → rendering → completed.

    HOOKPOST → your URL
  4. 4

    Download the finished render

    Burned-in subtitles, served from a global CDN. No watermark. MP4 ready for any social platform.

    GETGET renderUrl
Step 1 / 4·~2s
1import { readFileSync } from "node:fs";
2
3const form = new FormData();
4form.append(
5 "file",
6 new Blob([readFileSync("clip.mp4")]),
7 "clip.mp4",
8);
9
10const { id: videoId } = await fetch(
11 "https://api.zapcap.ai/videos",
12 {
13 method: "POST",
14 headers: { "x-api-key": process.env.ZAPCAP_KEY! },
15 body: form,
16 },
17).then(r => r.json());

POST /videos·Upload your video

Live render

One source clip, four burned-in looks

Each MP4 below is the same source rendered against a different templateId. Captions are baked into the pixels — nothing relies on a subtitle track being honored downstream.

Beast preset
Hormozi preset
Tracy preset
Devin preset

Source is a 9:16 vertical clip. Because captions render into the frames, the output plays correctly on any platform, in any player, with sound off.

Styling as an API primitive

Brand the burn-in

Down to the keyword.

Send a templateId for a complete look, or override individual renderOptions so the baked-in captions match your brand. Because the styling is committed to the frames, get it right before the render — every control is a request field.

  • Templates — Beast, Hormozi, Tracy, Devin, plus 25 more (29 presets) — each preset is a finished burned-in look.
  • Keyword emphasis — flag punchwords; ZapCap colors / scales / boxes them so the hook lands in-frame.
  • Font & shadow — fontUppercase, fontShadow none / s / m / l for legibility over busy footage.
  • Layout — words per cue, vertical position with safe-zone math so captions clear platform UI.
  • Aspect ratios — render 9:16, 1:1, 16:9 burned-in outputs from one source.
Try a style
Render options
{
  "templateId": "46d20d67-255c-4c6a-b971-31fddcfea7f0",
  "renderOptions": {
    "subsOptions": {
      "emphasizeKeywords": true,
      "animation": true,
      "displayWords": 3
    },
    "styleOptions": {
      "fontUppercase": true,
      "fontShadow": "l"
    }
  }
}
Two transcript paths

Auto-transcribe — or burn in your approved cues

Auto-transcribe

ZapCap transcribes, splits, and times captions for you. Review the cues on the task status, edit them, then trigger the burn-in render against the approved transcript.

  • Inspect the transcript on the task status, edit via PUT /videos/:id/task/:taskId/transcript
  • Fix any wording before it is committed to the frames
  • Re-render the same transcript into multiple branded styles

Bring your own transcript

Already have approved copy? Send your own cues and ZapCap burns them in verbatim — no retranscription, no surprise wording in the final pixels.

  • Supported via the SRT-to-burned-in workflow
  • Lock in approved product names, claims, and disclaimers
  • Burn the same script into N looks for A/B ad variants
Output

Burned-in is the default — alpha and green-screen when you need them

Default

Burned-in MP4

Styled captions permanently rendered into the source frames. Survives re-uploads, downloads, and silent autoplay — the right choice for TikTok, Reels, Shorts, and ad creative.

.mp4 · h264
Editor-friendly

Transparent overlay

Need to composite captions over your own edit instead? Request an alpha-channel overlay and drop it onto a timeline — no chroma key.

.mov ProRes 4444 · .webm VP9 alpha
Compatibility

Green-screen layer

For tools that don't support alpha. Caption layer on a #04F404 canvas you key out in OBS, a switcher, or your NLE.

.mp4 · #04F404 backdrop

Burned-in (open) captions are the right call for social and ad distribution. For accessibility, where viewers must toggle captions on and off, pair the MP4 with an exported SRT/VTT.

Multilingual burn-in

Burn captions in the viewer’s language

Set a target language on the task and ZapCap transcribes, translates, and burns captions in that language. CJK and Thai use language-aware line-breaking, so wrapped lines look right baked into the frames.

  • Source in one language, burned-in captions in another
  • A brand-term dictionary keeps product names accurate before they are committed to the frames
  • Language-aware layout for Chinese, Japanese, Thai
Watch this part
这一段
ดูตรงนี้
Simple API credits

Per-minute, usage-based credits

Pay for the minutes you render. Burned-in MP4 is the base rate; higher resolutions and alpha outputs use different multipliers — see pricing for the full table.

  • Top up credits to keep renders flowing in production
  • Volume credits available at scale
  • No per-seat fee — pay for renders, not users
$0.10 / min

Indicative starting rate. Final pricing depends on render mode and output format. API access requires a Pro plan plus credits.

Customer · Anonymized

A performance-marketing team standardized burned-in caption styling across every ad variant by routing renders through the ZapCap API

Instead of hand-editing captions per cut, the team submits one transcript and renders branded, burned-in MP4s for each hook test. Captions land identically on every platform because they live in the frames.

in-frame
Captions survive every re-upload
1 source
Rendered into multiple hook variants
webhook
No polling, no manual exports
on-brand
Same style across all platforms
Developer quickstart

Render burned-in subtitles from a task request

The default render task returns a finished h264 MP4 with captions baked into the frames. Add a webhook notification when you want delivery pushed into your pipeline.

  • POST /videos uploads the source clip and returns videoId
  • POST /videos/{videoId}/task with templateId starts the burn-in render
  • The completed task returns downloadUrl for the captioned MP4
VIDEO_ID=$(curl -s -X POST "https://api.zapcap.ai/videos" \
  -H "x-api-key: $ZAPCAP_KEY" \
  -F "file=@clip.mp4" | jq -r .id)

TASK_ID=$(curl -s -X POST "https://api.zapcap.ai/videos/$VIDEO_ID/task" \
  -H "x-api-key: $ZAPCAP_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "templateId": "46d20d67-255c-4c6a-b971-31fddcfea7f0",
    "autoApprove": true,
    "language": "en",
    "renderOptions": {
      "subsOptions": { "animation": true, "displayWords": 3 }
    }
  }' | jq -r .taskId)

curl -H "x-api-key: $ZAPCAP_KEY" \
  "https://api.zapcap.ai/videos/$VIDEO_ID/task/$TASK_ID"

About the Burned-In Subtitles API

Burned-in (or "open") subtitles are captions rendered permanently into the video frames, so they are part of the picture itself rather than a separate, toggleable subtitle track. Because they are baked into the pixels, they always display — even when a player ignores or strips subtitle files, and even with sound off.

Start rendering burned-in captions through the API

Create a key on a Pro plan and buy credits in the dashboard.