Kanto Labs
Video OCR icon

On-screen text · Apify actor

Extract the text shown on screen in any video file

Burned-in subtitles, captions, ad hook text, titles, lower-thirds, slide and screen-recording text: give this tool a video link and get every distinct piece of on-screen text once, with the time it appears and disappears, where it sits on the screen and a frame image, plus a timed transcript and an SRT/VTT track. A caption shown for 4 seconds is one row, not four. You pay only for frames that contain text, so a video without any on-screen text costs nothing.

$0.002 per frame with textFailed inputs are free

What it does

Video OCR, in short

  • Reads a frame every second (your choice, 0.25-60 s), skips frames that did not change and merges the same text in the same place into one timed segment
  • One row per text segment: text, start and end time, position on screen, OCR confidence and a frame image link
  • Per video: fullText (one line per segment with its time), hookText (text shown in the first 3 seconds) and SRT and VTT files
  • Text area option: bottom reads only subtitles, captions and lower-thirds and ignores signs and logos elsewhere
  • Reads English, Chinese, Japanese, Korean, Cyrillic, Arabic, Devanagari, Greek, Thai and accented Latin; open-source PP-OCR models run inside the actor, no API key
  • Chains with Video Frame Extractor: read the frames of one of its runs instead of a video

Who it's for

Built for

Burned-in subtitles to SRTRecover subtitles that only exist inside the picture, for example to translate or index them.
Ad and UGC teardownsPull the hook text, claims, prices and call-to-action overlays of ad creatives you have the files for.
News, interviews and webinarsLower-thirds tell you who appears when, with their title.
Video search and RAGPut the on-screen text next to the transcript so a model sees what the viewer reads.

Example

Input and output

One dataset row per result, downloadable as JSON, CSV or Excel, or read through the Apify API.

Input
{
  "videoUrls": ["https://example.com/ads/summer-sale.mp4"],
  "sampleIntervalSeconds": 1,
  "ocrLanguage": "en",
  "textRegion": "full"
}

One text-segment row from a run on the actor's built-in 30-second captioned sample, shortened. Each video also gets a summary row with fullText, hookText, srtUrl and vttUrl.

Output (one row)
{
  "type": "text",
  "fileName": "sample-ocr-captions.mp4",
  "segmentIndex": 5,
  "text": "There are 3 types of\nspectra that we can use",
  "startSeconds": 10,
  "endSeconds": 13,
  "durationSeconds": 3,
  "timecode": "00:00:10.000",
  "endTimecode": "00:00:13.000",
  "frameUrl": "https://api.apify.com/v2/key-value-stores/.../records/...-0007-000010000ms.jpg",
  "confidence": 0.9906,
  "box": { "x": 0.1444, "y": 0.6695, "width": 0.7097, "height": 0.0812 },
  "position": "bottom",
  "lineCount": 2,
  "framesSeen": 2,
  "isPersistent": false
}

Pricing

Pay per result. Failures are free.

$0.002frame with text · $2.00 per 1,000

No subscription, no monthly minimum. Apify platform compute is included in the price; Apify also adds a tiny start fee per run ($0.00005 per GB of run memory).

Example costs
You runYou pay
A 37-second promo with burned-in subtitles (32 frames with text)$0.064
A 71-second promo: title text and name lower-thirds (44 frames with text)$0.088
A 60-second interview with no on-screen text$0.00
An 18.7-minute subtitled documentary (382 frames with text)$0.764
Worked example. You read the burned-in subtitles of 50 one-minute clips at one frame per second. About 45 frames per clip show text, 5 clips have no on-screen text and 2 links are dead.43 × 45 = 1,935 frames × $0.002 = $3.87
5 clips without text = $0.00
2 failed downloads = $0.00

Not charged:

  • Frames in which no text was found, blank frames and frames identical to the previous one
  • The transcript, the SRT and VTT files and the summary row
  • Refused links, failed downloads and unreadable files

Each frame with text is charged once. Max frames per video (default 600) caps the cost of one video: longer videos are sampled evenly instead. You can set Maximum cost per run in the run options and the actor stops cleanly when it is reached.

FAQ

Questions

Is this the same as transcribing a video?

No. Transcription turns speech into text. Video OCR reads the text shown on screen, such as burned-in subtitles, captions and titles.

Which languages can it read?

English, Chinese and Japanese with the default setting; also accented Latin languages (French, German, Spanish, Portuguese, Czech, Polish and more), Cyrillic, Korean, Arabic, Devanagari, Greek and Thai. Pick the script in the input.

Can I use YouTube or TikTok links?

No. Those platforms forbid downloading in their terms, so the actor refuses them (free row). Use the original files.

What happens when a video has no text?

It gets a no-text summary row and is not charged.

What are the limits?

It is a fast CPU OCR model: clean captions, titles and lower-thirds read very well; tiny UI text, handwriting and heavily stylised or moving text can be misread or missed. Timing is accurate to the sampling interval. Videos up to 120 minutes and 2 GB by default (up to 600 minutes and 4 GB).

Try Video OCR on Apify

Apify's free plan includes monthly platform credit you can use to try it. Also callable from AI assistants through the Kanto Labs MCP server.

Run it on Apify