> ## Documentation Index
> Fetch the complete documentation index at: https://rendobar-docs-compose-gallery.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Burn captions into a video

> Burn subtitles into a video from an SRT, VTT, or ASS file, or auto-transcribe in any language, with full styling control.

<script
  type="application/ld+json"
  dangerouslySetInnerHTML={{
__html: JSON.stringify({
  "@context": "https://schema.org",
  "@type": "TechArticle",
  "@id": "https://rendobar.com/docs/jobs/captions/burn/#article",
  "headline": "Burn captions into a video",
  "description": "Burn subtitles into a video from an SRT, VTT, or ASS file, or auto-transcribe in any language, with full styling control.",
  "datePublished": "2026-06-22",
  "dateModified": "2026-06-22",
  "author": { "@type": "Organization", "@id": "https://rendobar.com/#organization" },
  "publisher": { "@type": "Organization", "@id": "https://rendobar.com/#organization" },
  "isPartOf": { "@id": "https://rendobar.com/#website" }
})
}}
/>

The `caption.burn` job burns subtitles permanently into a video. Provide an SRT, VTT, or ASS file as the `subtitles` input, or omit it to auto-transcribe the audio. Style the text with web-hex colors, an outline, a background box, and a position.

<Info>
  **Accepts:** video · **Type:** `caption.burn`
</Info>

## Request

<CodeGroup>
  ```ts SDK theme={null}
  import { createClient, outputUrl } from "@rendobar/sdk";

  const client = createClient({ apiKey: "rb_YOUR_KEY" });

  const job = await client.jobs.create({
    type: "caption.burn",
    inputs: {
      source: "https://cdn.rendobar.com/assets/examples/sample.mp4",
      subtitles: "https://cdn.rendobar.com/assets/examples/sample.srt",
    },
    params: { fontFamily: "Inter", fontSize: 48, boxEnabled: true },
  });

  const result = await client.jobs.wait(job.id);
  console.log(outputUrl(result));
  ```

  ```python Python theme={null}
  import requests
  res = requests.post(
      "https://api.rendobar.com/jobs",
      headers={"Authorization": "Bearer rb_live_YOUR_KEY"},
      json={
          "type": "caption.burn",
          "inputs": {
              "source": "https://cdn.rendobar.com/assets/examples/sample.mp4",
              "subtitles": "https://cdn.rendobar.com/assets/examples/sample.srt",
          },
          "params": {"fontFamily": "Inter", "fontSize": 48, "boxEnabled": True},
      },
  )
  ```

  ```bash cURL theme={null}
  curl -X POST https://api.rendobar.com/jobs \
    -H "Authorization: Bearer rb_live_YOUR_KEY" \
    -H "Content-Type: application/json" \
    -d '{
      "type": "caption.burn",
      "inputs": {
        "source": "https://cdn.rendobar.com/assets/examples/sample.mp4",
        "subtitles": "https://cdn.rendobar.com/assets/examples/sample.srt"
      },
      "params": { "fontFamily": "Inter", "fontSize": 48, "boxEnabled": true }
    }'
  ```
</CodeGroup>

Omit `subtitles` to auto-transcribe. The spoken language is detected by default (`language: "auto"`). Pass an ISO-639-1 code to skip detection.

## Inputs

<ParamField body="source" type="string" required>
  URL of the source video to caption.
</ParamField>

<ParamField body="subtitles" type="string">
  URL of an SRT, VTT, or ASS subtitle file. A provided ASS file is burned as-is, preserving its own styling. Omit to auto-transcribe the audio.
</ParamField>

## Parameters

<ParamField body="language" type="enum" default="auto">
  Spoken language for the auto-transcribe path, as an ISO-639-1 code (e.g. `en`, `es`, `ja`) or `auto` to detect. English uses a faster model. Everything else routes to multilingual transcription. Ignored when a subtitle file is provided.
</ParamField>

<ParamField body="fontFamily" type="string" default="Inter">
  Font family. Must resolve to a font available to the renderer.
</ParamField>

<ParamField body="fontSize" type="integer" default="48">
  Font size in output pixels. Range 8–400.
</ParamField>

<ParamField body="fontColor" type="string" default="#FFFFFF">
  Text fill color as web hex (`#RRGGBB` or `#AARRGGBB`, alpha first).
</ParamField>

<ParamField body="bold" type="boolean" default="true">
  Render the text bold.
</ParamField>

<ParamField body="italic" type="boolean" default="false">
  Render the text italic.
</ParamField>

<ParamField body="outlineColor" type="string" default="#000000">
  Outline (stroke) color as web hex.
</ParamField>

<ParamField body="outlineWidth" type="number" default="2">
  Outline thickness in pixels. Range 0–20.
</ParamField>

<ParamField body="shadow" type="number" default="1">
  Drop-shadow depth in pixels. Range 0–20. `0` disables the shadow.
</ParamField>

<ParamField body="boxEnabled" type="boolean" default="false">
  Draw a filled background box behind the text (the accessibility "subtitle bar").
</ParamField>

<ParamField body="boxColor" type="string" default="#000000">
  Background box color as web hex. Applies when `boxEnabled` is `true`.
</ParamField>

<ParamField body="boxOpacity" type="number" default="0.6">
  Background box opacity, `0` (transparent) to `1` (opaque).
</ParamField>

<ParamField body="position" type="enum" default="bottom">
  Vertical placement. One of `bottom`, `center`, `top`.
</ParamField>

<ParamField body="alignment" type="enum" default="center">
  Horizontal alignment. One of `left`, `center`, `right`.
</ParamField>

<ParamField body="marginV" type="integer" default="60">
  Vertical margin in pixels. Range 0–2000.
</ParamField>

<ParamField body="marginH" type="integer" default="40">
  Horizontal margin in pixels. Range 0–2000. Also bounds the line-wrap width.
</ParamField>

<ParamField body="maxCharsPerLine" type="integer">
  Maximum characters per line on the auto-transcribe path. Range 10–80.
</ParamField>

Like every job, this returns the standard response. See [Job output](/concepts/job#the-output) for the shape and how to read the result.

For animated word-level captions instead, see [captions.animate](/jobs/captions/animate).
