OCR API — Image & Scanned PDF to Text, 100+ Languages
Pricing
from $1.40 / 1,000 images
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
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
7 hours ago
Last modified
Categories
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.
| Type | Size px | Words | Confidence | Text | ms |
|---|---|---|---|---|---|
| png | 1486×668 | 58 | 93.5 | Mild Splendour of the various-vested Ni… | 1032 |
| png | 1486×668 | 96 | 92.6 | O Tannenbaum © Tannenbaum, O Tannenbaum… | 1690 |
| 1190×1684 | 3 | 95.7 | Dummy PDF file | 216 |
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:
- Press Start — the prefilled input reads tesseract's two demo images, an English poem and a German paragraph, with the languages set to
enganddeu(German data is fetched once at the start of the run). - 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.
- 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
- 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_IMAGErecord. - 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).
- 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
pageandpageCount. - Tesseract's result is flattened: the whole text, the mean word confidence, counts, the paragraphs as
blocks[]with boxes, and — if you ask —words[],hocrortsv. An image in which nothing was read comes back as a freeNO_TEXTrecord instead of an empty success.
Input
| Field | What it does |
|---|---|
urls | Public image or PDF links, one per line. Required. |
languages | Tesseract codes, default ["eng"]; several are combined (eng, deu → eng+deu). Only letters and underscores are valid (chi_sim, chi_tra, jpn, ara…). |
outputFormat | text (default), hocr (adds the hOCR HTML) or tsv (adds tesseract's TSV). Text is always delivered. |
includeBlocks | blocks[] paragraphs with text, confidence and bbox (default on). |
includeWords | words[] every word with confidence and bbox (default off). |
minConfidence | Count words under this confidence in wordsBelowMinConfidence; the text is never cut (default 0 = off). |
psm | Page segmentation mode 0-13 (default 3, automatic; 6 for a uniform block such as a screenshot, 7 one line, 11 sparse text). |
maxPdfPages | PDF pages to read from the start (default 5, max 50). |
maxConcurrency | Tesseract workers (1-4, default 2). OCR is CPU-bound. |
proxyConfiguration | Used only for network retries. |
Output
One record per image or PDF page:
| Field | What it is |
|---|---|
url, contentType, bytes, type | Final address, server content type, file size, type from the bytes (png, jpeg, webp, bmp, gif, tiff, pdf) |
page, pageCount | PDF only |
width, height | Pixels, from the file header (for a PDF page: of the rendered image) |
languages | The codes used |
text, confidence, wordCount, lineCount, blockCount | The text, mean word confidence 0-100, counts |
wordsBelowMinConfidence | Words under minConfidence |
blocks[] | { text, confidence, bbox: { x0, y0, x1, y1 } } per paragraph |
words[] | { text, confidence, bbox } with includeWords |
hocr, tsv | With outputFormat hocr / tsv |
durationMs | Recognition time |
input, status, error, scrapedAt | What 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.
Related Actors
- PDF Text Extractor — text, pages and metadata from any PDF link
- PDF to Markdown API — headings, tables and text of a PDF
- Office Document to Text API — Word, Excel, PowerPoint and EPUB as Markdown
- Website Screenshot API — full page and mobile screenshots
- Article Extractor API — title, author, date and full text of any article