OCR API — Image & Scanned PDF to Text, 100+ Languages avatar

OCR API — Image & Scanned PDF to Text, 100+ Languages

Pricing

from $1.40 / 1,000 images

Go to Apify Store
OCR API — Image & Scanned PDF to Text, 100+ Languages

OCR API — Image & Scanned PDF to Text, 100+ Languages

OCR API: text, confidence, paragraphs and word boxes from images and scanned PDFs for $2 per 1,000 images. Tesseract OCR by URL, optional hOCR/TSV, many languages. Unofficial OCR API.

Pricing

from $1.40 / 1,000 images

Rating

0.0

(0)

Developer

yestrue

yestrue

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

7 hours ago

Last modified

Share

Turn images and scanned PDF pages into text by URL: the full text, a confidence score, paragraphs and words with bounding boxes, optional hOCR / TSV, many languages. One record per image or PDF page.

Price: $2.00 per 1,000 images (one PDF page = one image) on the Free plan, from $1.40 on higher Apify plans. Images with no recognisable text and failed downloads are free.

Run it now — the Input tab is prefilled, one click starts a run.

TypeSize pxWordsConfidenceTextms
png1486×6685893.5Mild Splendour of the various-vested Ni…1032
png1486×6689692.6O Tannenbaum © Tannenbaum, O Tannenbaum…1690
pdf1190×1684395.7Dummy PDF file216

Sample rows from a live run on 2026-10-19; every record has more fields.

Read the text out of images at public links — screenshots, photos of documents, scanned pages, labels — and out of the first pages of scanned PDFs, with the open-source Tesseract engine (tesseract.js). Every record carries the text, a mean confidence score, the paragraphs with their pixel bounding boxes, and optionally every word, the hOCR layout or tesseract's TSV. Pick the languages (English ships with the Actor; a hundred more download on demand) and the page segmentation mode that fits your images. No API key, no upload: give it links, get text.

Try it in 1 minute:

  1. Press Start — the prefilled input reads tesseract's two demo images, an English poem and a German paragraph, with the languages set to eng and deu (German data is fetched once at the start of the run).
  2. The Output tab shows one record per image: the text, confidence, word and line counts and the paragraphs with their boxes. In a test on 19 October 2026 the 1486 × 668 px English demo image gave 58 words at confidence 93.5 in 1,364 ms, after 476 ms to start the worker.
  3. Download JSON, CSV or Excel, or call the Actor from the API, Make, Zapier, n8n or an AI agent through the Apify MCP server.

Price: $2.00 per 1,000 images on the Free plan, from $1.40 on higher Apify plans (one PDF page = one image). Images with no recognisable text, missing files, web pages and unsupported files are free.

Use it to:

  • Make screenshots, memes, receipts and photographed documents searchable or readable by an LLM.
  • Read scanned PDFs page by page — the ones a PDF text extractor returns empty — up to 50 pages per file.
  • Extract labels, serial numbers or captions from product photos with the bounding box of every word.
  • Check which parts of an image were read with low confidence before trusting them, with minConfidence.
  • Feed hOCR or TSV to your own layout analysis, highlighting or redaction tools.

How it works

  1. Each link is downloaded directly (the proxy only retries a download that failed on the network). The bytes decide what the file is: PNG, JPEG, WebP, BMP, GIF, TIFF or PDF. A web page, an SVG or anything else is a free NOT_AN_IMAGE record.
  2. One Tesseract worker per concurrency slot (default 2) is started once with your languages and page segmentation mode, then reused for every image. English language data is built into the Actor image; other languages are downloaded once per run from tesseract.js's CDN (a few MB each).
  3. A PDF is rendered page by page with pdf.js at about 144 dpi, and each page is read like an image — one record per page with page and pageCount.
  4. Tesseract's result is flattened: the whole text, the mean word confidence, counts, the paragraphs as blocks[] with boxes, and — if you ask — words[], hocr or tsv. An image in which nothing was read comes back as a free NO_TEXT record instead of an empty success.

Input

FieldWhat it does
urlsPublic image or PDF links, one per line. Required.
languagesTesseract codes, default ["eng"]; several are combined (eng, deu → eng+deu). Only letters and underscores are valid (chi_sim, chi_tra, jpn, ara…).
outputFormattext (default), hocr (adds the hOCR HTML) or tsv (adds tesseract's TSV). Text is always delivered.
includeBlocksblocks[] paragraphs with text, confidence and bbox (default on).
includeWordswords[] every word with confidence and bbox (default off).
minConfidenceCount words under this confidence in wordsBelowMinConfidence; the text is never cut (default 0 = off).
psmPage segmentation mode 0-13 (default 3, automatic; 6 for a uniform block such as a screenshot, 7 one line, 11 sparse text).
maxPdfPagesPDF pages to read from the start (default 5, max 50).
maxConcurrencyTesseract workers (1-4, default 2). OCR is CPU-bound.
proxyConfigurationUsed only for network retries.

Output

One record per image or PDF page:

FieldWhat it is
url, contentType, bytes, typeFinal address, server content type, file size, type from the bytes (png, jpeg, webp, bmp, gif, tiff, pdf)
page, pageCountPDF only
width, heightPixels, from the file header (for a PDF page: of the rendered image)
languagesThe codes used
text, confidence, wordCount, lineCount, blockCountThe text, mean word confidence 0-100, counts
wordsBelowMinConfidenceWords under minConfidence
blocks[]{ text, confidence, bbox: { x0, y0, x1, y1 } } per paragraph
words[]{ text, confidence, bbox } with includeWords
hocr, tsvWith outputFormat hocr / tsv
durationMsRecognition time
input, status, error, scrapedAtWhat you gave, and why a link gave no text

Statuses: OK (charged), NO_TEXT, NOT_FOUND, NOT_AN_IMAGE, NOT_SUPPORTED, TOO_BIG, INVALID_INPUT, FAILED (all free).

Example

The real record for tesseract's demo image, 19 October 2026 (blocks[0].text shortened):

{
"input": "https://tesseract.projectnaptha.com/img/eng_bw.png",
"url": "https://tesseract.projectnaptha.com/img/eng_bw.png",
"contentType": "image/png",
"bytes": 26854,
"type": "png",
"width": 1486,
"height": 668,
"languages": ["eng"],
"text": "Mild Splendour of the various-vested Night!\nMother of wildly-working visions! hail\nI watch thy gliding, while with watery light\nThy weak eye glimmers through a fleecy veil;\nAnd when thou lovest thy pale orb to shroud\nBehind the gather’d blackness lost on high;\nAnd when thou dartest from the wind-rent cloud\nThy placid lightning o’er the awaken’d sky.",
"confidence": 93.5,
"wordCount": 58,
"lineCount": 8,
"blockCount": 1,
"wordsBelowMinConfidence": 0,
"blocks": [
{ "text": "Mild Splendour of the various-vested Night!\nMother of wildly-working visions! hail\n…", "confidence": 93.5, "bbox": { "x0": 28, "y0": 34, "x1": 1454, "y1": 640 } }
],
"durationMs": 1364,
"status": "OK",
"scrapedAt": "2026-10-19T13:05:12.000Z"
}

FAQ

Is this an official API? No, it's an unofficial API built on public files and the open-source Tesseract engine (tesseract.js) — there is no OCR vendor behind it, and no image leaves the Apify run.

How accurate is it? Tesseract reads clean, horizontal, reasonably large print very well (the demo above: 93.5 mean confidence) and struggles with handwriting, tiny text, strong skew or busy backgrounds. For such images a higher-resolution source, a crop, or the right psm helps more than anything else. Use confidence, blocks[].confidence and minConfidence to judge each result.

Which languages? Any Tesseract 4/5 language code: eng, deu, fra, spa, por, ita, nld, pol, rus, ukr, tur, ell, jpn, kor, chi_sim, chi_tra, ara, hin, vie and the rest of the 100+ list. English is built in; others are downloaded once per run. An unknown code makes the run stop with a clear message rather than guess.

How long does it take and why is concurrency low? Tesseract is CPU work: 1-3 seconds for a typical screenshot on one CPU, more for a full scanned page. Each worker needs about 150 MB; with 2 workers the Actor reads two images at a time. Give the run more memory (and so more CPU) to raise maxConcurrency up to 4.

Why is a GIF or TIFF sometimes FAILED? The engine reads PNG, JPEG, WebP and BMP reliably; GIF and TIFF are passed to it and work for common encodings, but an exotic compression may be rejected — the record then says so, and it is free.

Like it? A short review on the Store page helps other people find this Actor. Something missing or broken? Tell us on the Issues tab — we read every one.