# Image OCR Scraper (`muhammadafzal/image-ocr-scraper`) Actor

Extract text from public image URLs with local OCR. Process screenshots, receipts, menus, labels, and scanned documents into structured text and confidence scores.

- **URL**: https://apify.com/muhammadafzal/image-ocr-scraper.md
- **Developed by:** [Muhammad Afzal](https://apify.com/muhammadafzal) (community)
- **Categories:** AI, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 ocr images

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Image OCR Scraper

Extract text from public image URLs with local OCR. This actor is designed for developers, researchers, and AI agents that need a simple `image URL → structured OCR result` tool for screenshots, scanned documents, menus, labels, receipts, and other images they are authorized to process.

### What it does

- Downloads each supplied `http` or `https` image URL with retries.
- Runs Tesseract OCR locally in the actor using the selected language.
- Returns one dataset item per image with recognized text, confidence, content type, byte count, timestamp, and status.
- Keeps processing after an individual download or OCR failure, so mixed batches produce useful partial results.
- Charges PPE once per successfully processed image (`ocr-image`). Failed downloads and OCR errors are not charged.

### What it does not do

This actor does not log in, bypass paywalls or bot protection, crawl image galleries, discover image URLs from websites, or process private images without a reachable URL. Use only images that you have permission to access and process. Image URLs should point directly to image content; HTML pages containing an image are not supported.

### Input

```json
{
  "imageUrls": [
    "https://example.com/receipt.png",
    "https://example.com/menu.jpg"
  ],
  "language": "eng",
  "requestTimeoutSeconds": 30
}
```

`imageUrls` accepts up to 25 URLs per run. Supported language presets are `eng`, `deu`, `fra`, and `spa`. The first run downloads the selected Tesseract language data, so startup can be longer than later images in the same run. Images are limited to 25 MB each.

### Output

Each image produces a row like this:

```json
{
  "status": "succeeded",
  "imageUrl": "https://example.com/receipt.png",
  "language": "eng",
  "text": "TOTAL $42.00",
  "confidence": 93.41,
  "bytesDownloaded": 184220,
  "contentType": "image/png",
  "processedAt": "2026-08-13T00:00:00.000Z"
}
```

Failed rows have `status: "failed"` and an `error` message. A `not_charged` row means the actor's pay-per-event limit was reached before returning an OCR result.

### MCP and automation use

Use this actor when an agent already has direct image URLs and needs text extraction. It is intentionally narrow: pass URLs, choose a language, and read structured rows from the dataset. For a website-wide image crawl, pair it with a URL-discovery actor and pass the discovered direct image URLs into this actor.

### Pricing

Pay per usage: one successful OCR image is one billable event. The default event price is $0.002 per image; your final Store price and account settings control the amount charged in production.

### Limitations

OCR accuracy depends on image resolution, contrast, rotation, handwriting, typeface, and language. Confidence is Tesseract's estimate, not a guarantee. Pre-crop or enhance difficult images before processing when accuracy is important.

# Actor input Schema

## `imageUrls` (type: `array`):

Use this when you have one or more publicly reachable image URLs to OCR. Enter one http or https URL per line. Supported formats depend on Tesseract.js and the source image; direct image URLs work best.

## `language` (type: `string`):

Use this to select the Tesseract language data used for recognition. Use 'eng' for English, 'deu' for German, 'fra' for French, or 'spa' for Spanish. Language data is downloaded on the first run and cached by the worker.

## `requestTimeoutSeconds` (type: `integer`):

Use this to limit how long the actor waits for each image download. Enter a value from 5 to 120 seconds. Defaults to 30 seconds.

## `userAgent` (type: `string`):

Use this only when the image host requires a descriptive client user agent. Do not use it to impersonate a browser or evade access controls.

## Actor input object example

```json
{
  "imageUrls": [
    "https://tesseract.projectnaptha.com/img/eng_bw.png"
  ],
  "language": "eng",
  "requestTimeoutSeconds": 30,
  "userAgent": "Mozilla/5.0 (compatible; Apify Image OCR Scraper/1.0)"
}
```

# Actor output Schema

## `results` (type: `string`):

Link to the dataset containing OCR text, confidence, image URL, status, and diagnostics for each processed image.

## `summary` (type: `string`):

Link to the run summary containing requested, succeeded, failed, and uncharged image counts.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {};

// Run the Actor and wait for it to finish
const run = await client.actor("muhammadafzal/image-ocr-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {}

# Run the Actor and wait for it to finish
run = client.actor("muhammadafzal/image-ocr-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{}' |
apify call muhammadafzal/image-ocr-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,muhammadafzal/image-ocr-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/R4hI7QdZ5pgqaHbxg/builds/GRAdWAp8eqIVCOfBu/openapi.json
