Netflix subtitle limit: 42 characters per line, and max_chars
Netflix's English timed text spec allows 42 characters per line and two lines. Sume's caption design.phrasing.max_chars accepts 4 to 60, so 42 fits.

Netflix's English (USA) timed text spec sets a limit of 42 characters per line and a maximum of two lines. On Sume's video captions endpoint, the matching knob is design.phrasing.max_chars, which sets characters per on-screen phrase and accepts 4 to 60, so 42 is a valid value. The two limits are not the same thing, though: Sume burns captions into the picture, and Netflix specifies a timed text file.
The Netflix numbers come from Netflix's English (USA) Timed Text Style Guide, read 2026-10-02. The Sume side comes from the Video captions docs and the OpenAPI schema for VideoCaptionCreateRequest.
What does the Netflix guide say about line length?
The guide's character limitation rule reads "42 characters per line". Its line treatment rule reads "Maximum two lines", and adds that text should usually stay on one line unless it exceeds the character limit. It also asks for line breaks after punctuation and before conjunctions and prepositions.
The same page is the English (USA) guide. Netflix publishes a separate guide per language, so a Spanish or Korean deliverable has its own numbers on its own page.
| Setting | Netflix English (USA) guide | Sume video captions |
|---|---|---|
| Characters | 42 per line | design.phrasing.max_chars, 4 to 60, per on-screen phrase |
| Lines | Maximum two | Not a field; phrasing is set by max_words, max_chars and pause_seconds |
| Words | Not specified on that page | design.phrasing.max_words, 1 to 12 |
| Output | A timed text file for delivery | A burned-in captioned video; SRT uploads are unsupported |
How do I set 42 characters on a Sume caption job?
Send design.phrasing.max_chars on POST /v1/video-captions. Every design field is optional and merges over the style's own value, so this one key changes one thing. Numbers outside the documented range return 400 at request time instead of rendering wrong and billing.
A standalone caption job reserves and captures $0.20 for a video up to 60 seconds under the current fixed estimate; confirm live pricing in GET /v1/catalog. Remember design is not supported on the punch and tiktok-green styles.
curl -X POST https://api.sume.com/v1/video-captions \
-H "Authorization: Bearer $SUME_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: caption-42-chars-001" \
-d '{
"video_url": "https://media.sume.com/artifacts/example/clean.mp4",
"style": "slam",
"design": { "phrasing": { "max_chars": 42 } }
}'Does this make a file Netflix will accept?
No. The Sume docs describe a captioned video as the output and say SRT uploads are unsupported, so there is no timed text file to hand over. Treat max_chars: 42 as a readability setting that follows the same spirit as the Netflix rule, not as delivery compliance. If a platform asks for a sidecar subtitle file, that file has to come from your own tooling; the cue text and times can still come from speech-to-text sentence segments.
What should I do next?
Pick the limit from the platform page that governs your delivery, set max_chars to it, and render one short clip before the full batch. For wording that comes from a script rather than speech, see phrasing with max_words, max_chars and pause_seconds. The Sume docs do not say how a phrase longer than the limit is wrapped, so check a render for one that runs long.
Sources
Related posts
More in Developers
- Subtitle reading speed: check 20 characters per second before burning
Netflix caps English subtitles at 20 characters per second for adults, 17 for children. Check each cue's rate in a short script before a Sume caption render.
- NEXT_PUBLIC_ plus a Sume API key: why it ships to the browser
A NEXT_PUBLIC_ prefix inlines the value into client JavaScript at build time. Keep the Sume API key server-side, proxy via a route handler, rotate if it leaked.
- Poll a Sume job with AbortSignal.any in Node 26.10
Node 26.10.0 fixes AbortSignal.any() propagation. Here is a Sume job poll loop with a hard deadline and a caller cancel, using next_poll_after_seconds.
- Node fetch with AbortSignal.timeout: poll a Sume job
A Node recipe: submit a Sume job with fetch, bound each call with AbortSignal.timeout, poll status_url, read the result. A local timeout does not cancel it.
Written by Sume