Burn captions
burn_captionsBurn captions into video with native ffmpeg and an ASS script generated from an AwesomeVideo preset. This is the paid server path and costs more per audio minute than transcription. The container uses a fast x264 preset, scales to a moderate resolution, copies the original audio, and scales to zero after the job. Pass subtitles (SRT, VTT, or JSON) or a transcription job id, plus a preset id or name. A key that cannot pay gets 402 insufficient_balance with requiredCents and howToBuy. For a render that costs AwesomeVideo nothing, call prepare_client_burn instead and burn in the browser or a future WebMCP client. Pass platform (tiktok, instagram_reels, youtube_shorts, youtube, ...) when the user names where the video goes, e.g. "subtítulos para TikTok" → platform=tiktok: captions move inside that app's safe zone (style unchanged, same price) and the result includes safe_zone {platform, margins}, plus a warning if the video shape does not match (e.g. 16:9 for TikTok; use shorts to crop to 9:16).
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| fileId | No | ||
| preset | No | Preset id or name, or custom:cp_... for your own saved preset. Use presetId or presetName too. | |
| autoFit | No | Default true: caption size, words per caption (4 on 9:16, 5 on 1:1, 7 on 16:9), and a default safe zone follow the video shape, so text reads the same at 720p and 1080p and stays clear of app UI. Pass false only when the user wants the preset's exact fixed pixel sizes. Same price. | |
| combined | No | Also return SRT, VTT, and transcript JSON. Same burn price. | |
| mediaUrl | No | ||
| platform | No | Where the video will be posted: tiktok, instagram_reels, youtube_shorts, facebook_reels, snapchat_spotlight, linkedin, youtube, x (aliases like reels, instagram, shorts, snap, twitter; case-insensitive). Keeps captions out of that app's buttons and text. If the user says "para TikTok" / "for Reels", pass it; if they did not say and it matters, ask. Same price. Unknown values return 422 invalid_platform before any charge. See list_platforms. | |
| presetId | No | ||
| faceAvoid | No | true = move captions off faces (samples faces at 2 fps, same price; result.faceAvoid.faceLayout). Shortcut for styleOverrides.faceAvoid. | |
| subtitles | No | SRT, VTT, or JSON cues. | |
| maxCredits | No | ||
| presetName | No | ||
| webhookUrl | No | ||
| audioVisual | No | Audio-only input (mp3/m4a/wav...): render the web editor's audio export (visualizer + captions) on the server, same price as the burn. On a video input it returns 422 audio_visual_needs_audio_input (not charged). Omit it on audio to get the default bars. | |
| notifyEmail | No | ||
| brandPresetId | No | Saved font, color, position, and optional logo. | |
| highlightColor | No | #RRGGBB for highlightWords. Default #FACC15. | |
| highlightWords | No | Shortcut: words or phrases to color in every caption (accent/case-insensitive), e.g. ["AwesomeVideo", "gratis"]. Maps to styleOverrides.wordHighlights rule {id:"custom", words, color}. Same price. | |
| styleOverrides | No | Per-call style changes deep-merged onto the preset (same fields as list_presets style; null removes a field), validated with the renderer schema and bundled fonts. Example {"fontSize":72,"maxWordsPerCaption":2,"wordEntrance":"bounce"}. Same price. No need to save_custom_preset. Every field with examples: get_style_reference. | |
| durationSeconds | No | ||
| transcriptionJobId | No |