Veed Subtitles
Playground
Try it on WavespeedAI!VEED Subtitles is a fast AI video subtitle generation model that adds styled captions to videos using automatic transcription or supplied SRT files and subtitle content. Ready-to-use REST inference API for subtitled MP4 generation, social media videos, creator content, marketing clips, accessibility workflows, video localization, and professional captioning with simple integration, no coldstarts, and affordable pricing.
Features
VEED Subtitles
VEED Subtitles adds styled subtitles to a video with optional automatic transcription or user-supplied SRT subtitles. It supports multiple subtitle presets, placement controls, shadow styles, language selection, and resolution tiers, making it suitable for social content, marketing videos, explainers, interviews, and multilingual publishing workflows.
Why Choose This?
-
Automatic subtitle generation Upload a video and generate subtitles automatically with optional language selection.
-
Custom subtitle import Provide your own subtitles through raw
srt_contentor ansrt_file_url. -
Flexible subtitle styling Choose from a wide range of subtitle presets for different visual styles.
-
Position and shadow control Adjust subtitle placement and text shadow strength for better readability.
-
Multiple resolution tiers Choose
480p,720p, or1080pdepending on your delivery needs. -
Production-ready workflow Suitable for short-form content, branded videos, tutorials, interviews, and repurposed media.
Parameters
| Parameter | Required | Description |
|---|---|---|
| video | Yes | Input video URL. |
| target_resolution | No | Maximum resolution box used before subtitle generation. Supported values: 480p, 720p, 1080p. Default: 720p. |
| preset | No | Subtitle visual preset. Default: simple. Supported values: simple, plain, glass, whisper, glide2, fusion, glide, terminal, handwritten, beans, corpo, boo, shadeplay, casper, capri, lowkey, vinta, diego, ali, slay, kitty, hustle, karl, sprout, flex, mint, rizz, vegas. |
| position | No | Subtitle position. Supported values: top, center, bottom. Default: bottom. |
| shadow | No | Text shadow strength. Supported values: none, min, mid, max. Default: mid. |
| language | No | Optional transcription language locale such as en-US or zh-CN. Leave empty to auto-detect. |
| srt_file_url | No | Optional SRT subtitle file URL. Do not use together with srt_content. |
| srt_content | No | Optional raw SRT subtitle content. Do not use together with srt_file_url. |
How to Use
- Upload your video — provide the video you want to subtitle.
- Choose resolution — select
480p,720p, or1080p. - Choose a subtitle preset — pick the subtitle style that best matches your content.
- Set position and shadow (optional) — adjust placement and readability.
- Choose language (optional) — leave it empty for auto-detection, or set a specific locale.
- Add subtitles source (optional) — provide either
srt_contentorsrt_file_urlif you want to use your own subtitles instead of auto-generated ones. - Submit — run the model and download the subtitled video.
Example Use Case
Add clean, branded subtitles to a short interview clip, positioned at the bottom with a readable shadow style and 1080p output.
Pricing
Pricing is based on video duration and target resolution.
Billing Rules
- Base price is $0.10 per started minute
- Minimum billed duration is 1 minute
- Videos are billed in started 60-second units
1080pcosts 2× the base rate480pand720puse the same base ratepreset,position,shadow,language,srt_file_url, andsrt_contentdo not affect pricing
Example Costs
| Video Duration | 480p / 720p | 1080p |
|---|---|---|
| 1s–60s | $0.10 | $0.20 |
| 61s–120s | $0.20 | $0.40 |
| 121s–180s | $0.30 | $0.60 |
| 181s–240s | $0.40 | $0.80 |
Best Use Cases
- Short-form subtitles — Add captions to reels, shorts, and social media videos.
- Interviews and talking-head content — Improve accessibility and retention with readable subtitles.
- Branded content — Use preset styling to match visual identity.
- Localization workflows — Apply subtitles with a chosen language locale or imported SRT.
- Repurposed media — Turn existing videos into captioned assets for broader distribution.
Pro Tips
- Use
languageonly when you want to force a specific transcription locale; otherwise leave it empty for auto-detection. - Provide your own
srt_contentorsrt_file_urlwhen timing and wording must stay exact. - Use
1080ponly when you need higher-resolution output, since it doubles the price. - Try different presets to match the tone of the content, especially for social or branded videos.
- Choose
midormaxshadow when subtitles need to remain readable over busy backgrounds.
Notes
videois required.- Use either
srt_contentorsrt_file_url, not both. target_resolutiondefaults to720p.positiondefaults tobottom.shadowdefaults tomid.- Billing uses started-minute units, with a minimum of 1 minute.
480pand720pare billed at the same rate, while1080pis billed at double that rate.
Related Models
- Other VEED subtitle and captioning workflows — Useful when you need different caption automation or subtitle styling pipelines.
- Video transcription workflows — Useful when you need transcript-first processing before subtitle burn-in.
- Video editing and publishing workflows — Useful when subtitle generation is only one step in a larger post-production pipeline.
Authentication
For authentication details, please refer to the Authentication Guide.
API Endpoints
Submit Task & Query Result
# Submit the task
curl --location --request POST "https://api.wavespeed.ai/api/v3/veed/subtitles" \
--header "Content-Type: application/json" \
--header "Authorization: Bearer ${WAVESPEED_API_KEY}" \
--data-raw '{
"target_resolution": "720p",
"preset": "simple",
"position": "bottom",
"shadow": "mid"
}'
# Get the result
curl --location --request GET "https://api.wavespeed.ai/api/v3/predictions/${requestId}/result" \
--header "Authorization: Bearer ${WAVESPEED_API_KEY}"
Parameters
Task Submission Parameters
Request Parameters
| Parameter | Type | Required | Default | Range | Description |
|---|---|---|---|---|---|
| video | string | Yes | - | Input video URL. | |
| target_resolution | string | No | 720p | 480p, 720p, 1080p | Maximum resolution box used before subtitle generation. |
| preset | string | No | simple | simple, plain, glass, whisper, glide2, fusion, glide, terminal, handwritten, beans, corpo, boo, shadeplay, casper, capri, lowkey, vinta, diego, ali, slay, kitty, hustle, karl, sprout, flex, mint, rizz, vegas | Subtitle visual preset. |
| position | string | No | bottom | top, center, bottom | Subtitle position. |
| shadow | string | No | mid | none, min, mid, max | Text shadow strength. |
| language | string | No | - | af-ZA, am-ET, ar-AE, ar-BH, ar-DZ, ar-EG, ar-IL, ar-IQ, ar-JO, ar-KW, ar-LB, ar-MA, ar-MR, ar-OM, ar-PS, ar-QA, ar-SA, ar-TN, ar-YE, az-AZ, bg-BG, bn-BD, bn-IN, bs-BA, ca-ES, cs-CZ, cy-GB, da-DK, de-AT, de-CH, de-DE, el-GR, en-AU, en-CA, en-GB, en-GH, en-HK, en-IE, en-IN, en-KE, en-NG, en-NZ, en-PH, en-PK, en-SG, en-TZ, en-US, en-ZA, es-AR, es-BO, es-CL, es-CO, es-CR, es-CU, es-DO, es-EC, es-ES, es-GQ, es-GT, es-HN, es-MX, es-NI, es-PA, es-PE, es-PR, es-PY, es-SV, es-US, es-UY, es-VE, et-EE, eu-ES, fa-IR, fi-FI, fil-PH, fr-BE, fr-CA, fr-CH, fr-FR, gl-ES, gu-IN, he-IL, hi-IN, hr-HR, hu-HU, hy-AM, id-ID, is-IS, it-CH, it-IT, ja-JP, jv-ID, ka-GE, kk-KZ, km-KH, kn-IN, ko-KR, lo-LA, lt-LT, lv-LV, mk-MK, ml-IN, mn-MN, mr-IN, ms-MY, my-MM, ne-NP, nl-BE, nl-NL, no-NO, pa-Guru-IN, pl-PL, ps-AF, pt-BR, pt-PT, ro-RO, ru-RU, si-LK, sk-SK, sl-SI, so-SO, sq-AL, sr-RS, su-ID, sv-SE, sw-KE, sw-TZ, ta-IN, ta-LK, ta-MY, ta-SG, te-IN, th-TH, tr-TR, uk-UA, ur-IN, ur-PK, uz-UZ, vi-VN, zh-CN, zh-HK, zh-TW, zu-ZA | Optional transcription language locale, such as en-US or zh-CN. Leave empty to auto-detect. |
| srt_file_url | string | No | - | - | Optional SRT subtitle file URL. Do not use together with srt_content. |
| srt_content | string | No | - | - | Optional raw SRT subtitle content. Do not use together with srt_file_url. |
Response Parameters
| Parameter | Type | Description |
|---|---|---|
| code | integer | HTTP status code (e.g., 200 for success) |
| message | string | Status message (e.g., “success”) |
| data.id | string | Unique identifier for the prediction, Task Id |
| data.model | string | Model ID used for the prediction |
| data.outputs | array | Array of URLs to the generated content (empty when status is not completed) |
| data.urls | object | Object containing related API endpoints |
| data.urls.get | string | URL to retrieve the prediction result |
| data.status | string | Status of the task: created, processing, completed, or failed |
| data.created_at | string | ISO timestamp of when the request was created (e.g., “2023-04-01T12:34:56.789Z”) |
| data.error | string | Error message (empty if no error occurred) |
| data.timings | object | Object containing timing details |
| data.timings.inference | integer | Inference time in milliseconds |
Result Request Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| id | string | Yes | - | Task ID |
Result Response Parameters
| Parameter | Type | Description |
|---|---|---|
| code | integer | HTTP status code (e.g., 200 for success) |
| message | string | Status message (e.g., “success”) |
| data | object | The prediction data object containing all details |
| data.id | string | Unique identifier for the prediction, the ID of the prediction to get |
| data.model | string | Model ID used for the prediction |
| data.outputs | string | Array of URLs to the generated content. |
| data.urls | object | Object containing related API endpoints |
| data.urls.get | string | URL to retrieve the prediction result |
| data.status | string | Status of the task: created, processing, completed, or failed |
| data.created_at | string | ISO timestamp of when the request was created (e.g., “2023-04-01T12:34:56.789Z”) |
| data.error | string | Error message (empty if no error occurred) |
| data.timings | object | Object containing timing details |
| data.timings.inference | integer | Inference time in milliseconds |