OCR: Images & Scanned PDFs to Text avatar

OCR: Images & Scanned PDFs to Text

Pricing

$3.00 / 1,000 page ocr'ds

Go to Apify Store
OCR: Images & Scanned PDFs to Text

OCR: Images & Scanned PDFs to Text

OCR for images and scanned PDFs: per-page text, a confidence score and optional word boxes, in 27 languages (Tesseract). Give file URLs or a key-value store. Pages with no text and failed files are not charged.

Pricing

$3.00 / 1,000 page ocr'ds

Rating

0.0

(0)

Developer

Data Gleaner

Data Gleaner

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Security

Limited permissions

Share

Give it images or scanned PDFs, get the text of every page back, with a confidence score and optional word boxes. Runs the open-source Tesseract 5 OCR engine with 27 languages built in. Works on PNG, JPEG, TIFF (multi-page fax scans too), GIF, BMP, WebP and PDF. No API key, no Google account, no subscription.

Price: $0.003 per page ($3 per 1,000 pages), no start fee. Pages with no text, and files that fail to download or open, are returned with the reason and not charged. See Pricing below.

Why use this one

  • Plain OCR, priced per page. One flat price per page that has text. Blank pages, photos without text and broken files cost nothing.
  • One row per page. Each page has its own text, confidence (0 to 100) and wordCount, so you can send low-confidence pages to a person for review and process the rest automatically.
  • Word boxes when you need them. Turn on includeWordBoxes and every word comes with its pixel box and confidence, plus its block, paragraph and line number, for highlighting, redaction, form reading or layout work.
  • 27 languages in the image. English, German, French, Spanish, Italian, Portuguese, Dutch, Polish, Czech, Swedish, Danish, Norwegian, Finnish, Turkish, Russian, Ukrainian, Greek, Arabic, Hebrew, Hindi, Thai, Vietnamese, Indonesian, Chinese (Simplified and Traditional), Japanese and Korean. Mix up to 5 per run.
  • Your files, not a scraper. Give file links or a key-value store with files you uploaded. The Actor fetches only the files you name, and keeps nothing after the run.
  • Safe on bad input. One broken link never stops the run: every file returns at least one row, and an error field says what happened.

Minimal input

{"urls": [{"url": "https://keencrest-guides.web.app/samples/sample-scan.png"}], "languages": ["eng"]}

Start it with no input and it reads a built-in 3-page sample scan made by Keencrest (one PNG and a 2-page image-only PDF), and says so in the run's status message.

Image to text

Turn a photo, screenshot or scan into text: give the Actor links to PNG, JPEG, TIFF, GIF, BMP or WebP files and it returns the text of each image, with a confidence score. For a scanned PDF to text, give the PDF link and you get one row per page. Use single_block for receipts and labels, sparse for screenshots and forms, and list up to 5 languages (for example ["deu", "eng"]) for mixed-language letters. Extract text from an image, run PDF OCR on an archive, or feed pages to a search index or an AI model.

What does it do?

For each file it downloads it (up to 50 MB, redirects followed, each hop checked against the host's robots.txt), detects the type from the file's first bytes, renders each PDF page at 300 DPI (you can change this), converts it to grayscale and runs Tesseract on it. Typical uses:

  • Scanned contracts, letters and archives turned into searchable text.
  • Invoices and receipts read into text for bookkeeping or for an AI model to extract fields from.
  • Image-only PDFs that a PDF text extractor returns empty.
  • Screenshots, slides and photos of signs (use the sparse page layout).
  • Old books and reports fed into search indexes, RAG pipelines and LLMs.
  • Multi-page TIFF fax scans, one row per page.

Input

FieldTypeWhat it does
urlslist of linksDirect links to image or PDF files. Leave empty (and no store) for the built-in sample.
keyValueStoreIdstore IDA key-value store whose records are images or PDFs, such as files you uploaded in Console > Storage, or another run's store.
keyValueStoreKeyslistOnly these record keys. Empty means every image or PDF record in the store (others are skipped).
languageslistTesseract language codes, up to 5. Default ["eng"].
includeWordBoxestrue/falseAdd the words array with boxes and confidences. Default false.
pageSegmentationModechoiceauto (default), single_column, single_block (receipts, labels), single_line, sparse (screenshots, signs, forms).
pdfDpi100 to 400Render resolution for PDF pages. Default 300.
pageRangetextFor example 1-5, 8 or 3-, applied to every file. Empty means all pages.
maxPagesPerFilenumberDefault 100.
maxPagesnumberCap on pages read in the whole run: your cost cap. Default 1,000.
maxFileSizeMbnumberDefault 50. Larger files are skipped and not charged.
maxConcurrency1 to 8Files read at once. Default 2.

Uploading your own files

In Apify Console open Storage > Key-value stores, create a store, upload your images or PDFs as records, and put the store's ID in keyValueStoreId. From code, write the files to a store with the Apify API or SDK and pass its ID. In an integration after another Actor, use {{resource.defaultKeyValueStoreId}}.

Output

One row per page. A file that fails before any page is read returns one row with pageNumber: null.

{
"source": "https://keencrest-guides.web.app/samples/sample-scan.png",
"sourceType": "url",
"finalUrl": "https://keencrest-guides.web.app/samples/sample-scan.png",
"fileName": "sample.pdf",
"fileType": "pdf",
"pageNumber": 1,
"pageCount": 2,
"status": "ok",
"billed": true,
"text": "Keencrest sample document\n\nThis short PDF is hosted by Keencrest so that the PDF to Markdown Actor has a sample it is allowed to read.\nIt contains headings, paragraphs, a list and ...",
"confidence": 96.0,
"wordCount": 111,
"charCount": 600,
"languages": ["eng"],
"imageWidth": 2481,
"imageHeight": 3508,
"dpi": 300,
"words": null,
"robotsBlocked": 0,
"error": null,
"failureReason": null,
"scrapedAt": "2026-11-02T12:00:00+00:00",
"input": {"source": "https://keencrest-guides.web.app/samples/sample-scan.png", "languages": ["eng"], "pageSegmentationMode": "auto", "includeWordBoxes": false, "pdfDpi": 300, "pageRange": null, "maxPagesPerFile": 100}
}

With includeWordBoxes: true, words holds objects like {"text": "Keencrest", "confidence": 96.4, "left": 300, "top": 410, "width": 380, "height": 70, "block": 1, "paragraph": 1, "line": 1} (pixels of the page image, whose size is imageWidth x imageHeight).

status is one of ok (text read, charged), no_text (the page has no readable text, free), failed (free, see error and failureReason) and notice (an input problem, free).

Pricing

Pay per event: $0.003 per page with text (ocr-page), no start fee, no monthly plan.

  • 1 scanned letter = $0.003. A 40-page scanned contract = $0.12. 1,000 receipts = $3.
  • Not charged: pages where no text is found, pages that fail to render or OCR, files that fail to download, refused links, and pages outside your pageRange or past maxPages.
  • Set a maximum total charge on the run and the Actor stops before reading a page it cannot charge for.

Limits

  • OCR quality depends on the scan. Straight, 300 DPI, high-contrast scans of printed text read best. Handwriting is not supported in practice, and photos taken at an angle read poorly. Check confidence: under about 60 usually means a poor scan.
  • The text is returned in reading order with lines and paragraphs. Tables come back as lines of text, not as table cells (use includeWordBoxes to rebuild columns).
  • Each page is OCR'd, even when a PDF already has a text layer (that keeps the output the same for every file). For digital PDFs with a text layer, a PDF text extractor is faster.
  • Files must download without a login. Links on social networks and other sites whose terms forbid automated downloads are refused with failureReason: refused_host and not charged.
  • Speed: a dense A4 page takes about 16 s at the default 1 GB memory and about 4 s at 4 GB (Apify gives more CPU with more memory). The price per page is the same either way, so raise memory for big batches.
  • A page that takes more than 120 seconds to OCR is stopped and returned as failed, free.

Use it from n8n, Make, Zapier or an AI agent

Call it through the Apify API with run-sync-get-dataset-items and a JSON body like the minimal input above. Each dataset item is one page, so a workflow can loop over pages, or join text by source for the whole document. AI agents can call it through Apify's MCP server as a tool that reads any image or scanned PDF link into text.

FAQ

Which OCR engine is this? Tesseract 5 (Apache-2.0) with its standard fast language models, running inside the Actor. Your files are not sent to any third-party OCR service.

Is it accurate? On clean printed scans Tesseract typically reads well over 95% of words correctly. On noisy photos, low resolution or unusual fonts it does worse, and the per-page confidence tells you which pages to check.

Can it read several languages on one page? Yes: list them all in languages, for example ["eng", "deu"]. Fewer languages are faster and more accurate.

Can I get the text of the whole document in one piece? Group the rows by source and join text in pageNumber order.

Why was a page not charged? Look at its status and error: no_text pages and every failed row are free.

Responsible use

Use it only on files you have the right to process. The Actor processes the files you give it on your behalf and keeps nothing after the run apart from the run's own dataset, which follows your Apify data retention. If your files contain personal data, you are the controller and the obligations that come with it (lawful basis, retention, data subject rights) rest with you. It is not meant for identity documents: do not use it to read passports, ID cards, driving licences or other KYC documents, and it gives no verification of any kind. It is not built to read handwriting or to get past any site's download restrictions.


Built by Keencrest. Questions or a missing feature: open an issue on the Actor's Issues tab.