# Image OCR Bulk - Text from Images (40 Languages) (`tiger19935/image-ocr-bulk`) Actor

Extract text from images in bulk with OCR in 40+ languages. Paste image URLs, get clean text, confidence and word positions as JSON. Fast, cheap, no setup.

- **URL**: https://apify.com/tiger19935/image-ocr-bulk.md
- **Developed by:** [Andrew Boiko](https://apify.com/tiger19935) (community)
- **Stats:** 1 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.00 / 1,000 image ocrs

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Image OCR - Extract Text from Images in 40 Languages

Turn photos, scans, screenshots, receipts, invoices and documents into text. Paste a list of image links and get clean recognised text back, with a confidence score and, if you need it, the position of every line and word. No API key, no account at a third-party service, no per-minute quota.

### What you get

- **Recognised text** for each image, with paragraphs and line breaks kept.
- **Confidence score** (0-100) per image, per line and per word.
- **Coordinates**: bounding boxes for lines and words (left, top, width, height in pixels) for redaction, highlighting and form parsing.
- **40 languages**, including English, German, French, Spanish, Italian, Portuguese, Russian, Ukrainian, Polish, Turkish, Arabic, Chinese, Japanese, Korean, Hindi, Vietnamese, Thai and more. Mix languages with a plus sign, for example eng+deu.
- **Auto-rotate** for sideways and upside-down pages; EXIF orientation applied automatically.
- **Image clean-up** before recognition: grayscale, contrast, sharpening and enlarging of small images, which noticeably improves results on phone photos and screenshots.
- **Bulk mode**: hundreds of images per run, processed in parallel.

### Typical uses

- Digitise receipts, invoices and business cards.
- Extract text from screenshots and memes for search and moderation.
- Read scanned contracts, forms and archives.
- Feed image text into LLM and RAG pipelines.
- Read labels, number plates and signs from photos.

### Input

| Field | Description |
|---|---|
| Image URLs | Direct links to JPG, PNG, WebP, TIFF, GIF or BMP files (required). |
| Languages | For example eng, eng+deu, rus+ukr. |
| Layout mode | Automatic, single block, single line, single word or sparse text. |
| Auto-rotate pages | Detect and fix sideways text. |
| Improve image before OCR | Grayscale, contrast, sharpen, enlarge. |
| Return lines / words with coordinates | Add bounding boxes. |
| Minimum word confidence | Drop uncertain words. |

Example input:

```
{
    "startUrls": [{ "url": "https://tesseract.projectnaptha.com/img/eng_bw.png" }],
    "languages": "eng",
    "includeLines": true
}
```

### Output

```
{
    "url": "https://tesseract.projectnaptha.com/img/eng_bw.png",
    "text": "Mild Splendour of the various-vested Night!\nMother of wildly-working visions! hail!",
    "confidence": 93.4,
    "language": "eng",
    "wordCount": 24,
    "lineCount": 3,
    "width": 600,
    "height": 130,
    "rotation": 0,
    "scrapedAt": "2026-10-14T08:00:00.000Z"
}
```

### Pricing

You pay only for images in which text was found. Images without text and failed downloads are free.

| Event | Price |
|---|---|
| Image with recognised text | $0.005 per image |

Volume discounts apply automatically for Bronze, Silver and Gold Apify subscribers. 1,000 images cost about $5. Set a maximum cost per run to stay in control.

### Tips for better accuracy

- Choose the right language. A wrong language is the most common reason for poor results.
- Keep Improve image before OCR on for phone photos and screenshots; switch it off for clean 300 DPI scans.
- For one line of text (a plate, a label) use Single line layout.
- For screenshots with many small labels use Sparse text.
- Handwriting is not supported; printed text works best.

### Limits

- Links must return the image file itself, not a web page.
- Images up to 25 MB by default (configurable).
- Please make sure you have the right to process the images you submit.

### FAQ

**Is it free to try?** New Apify accounts receive free monthly credit that covers hundreds of images.

**Can I OCR PDFs?** Use our PDF Text and Table Extractor, which includes OCR for scanned pages.

**How is confidence calculated?** It is the average of the recognition confidence of all words in the image.

**Can I get the text in a file?** Export the dataset as JSON, CSV, Excel, XML or HTML from the Storage tab or via the API.

### More tools by the same author

- [PDF Text and Table Extractor](https://apify.com/tiger19935/pdf-text-table-extractor): PDF to text, tables and Markdown with OCR
- [Bulk Image and File Downloader](https://apify.com/tiger19935/bulk-image-file-downloader): Bulk download of images and files
- [Video Frame Extractor](https://apify.com/tiger19935/video-frame-extractor): Extract frames and scenes from video
- [Website Screenshot API](https://apify.com/tiger19935/website-screenshot-api): Full-page and mobile screenshots in bulk

# Actor input Schema

## `startUrls` (type: `array`):

Direct links to image files, one per row. Public URLs only.

## `languages` (type: `string`):

Tesseract language codes joined with a plus sign, for example eng or eng+deu or rus+ukr. Available: eng, deu, fra, spa, ita, por, rus, ukr, pol, nld, tur, ara, chi_sim, chi_tra, jpn, kor, hin, ces, swe, heb, vie, tha, ron, dan, fin, nor, hun, bul, srp, hrv, slk, slv, lit, lav, est, cat, ind, msa, ben, tam.

## `pageSegmentation` (type: `string`):

How the text is laid out on the image. Automatic suits documents and photos; use single block for a paragraph, single line for a caption or number plate, sparse text for screenshots with scattered labels.

## `autoRotate` (type: `boolean`):

Detect sideways or upside-down text and rotate the image before recognition. EXIF orientation is always applied.

## `preprocess` (type: `boolean`):

Convert to grayscale, normalise contrast, sharpen and enlarge small images. Turn off for clean, high-resolution scans.

## `includeLines` (type: `boolean`):

Add an array of text lines with bounding boxes (left, top, width, height in pixels) and confidence.

## `includeWords` (type: `boolean`):

Add an array of words with bounding boxes and confidence. Makes the output larger.

## `minConfidence` (type: `integer`):

Drop words recognised with lower confidence (0-100). 0 keeps everything.

## `maxConcurrency` (type: `integer`):

How many images to process at the same time.

## `maxFileSizeMb` (type: `integer`):

Larger images are skipped.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://tesseract.projectnaptha.com/img/eng_bw.png"
    }
  ],
  "languages": "eng",
  "pageSegmentation": "auto",
  "autoRotate": true,
  "preprocess": true,
  "includeLines": false,
  "includeWords": false,
  "minConfidence": 0,
  "maxConcurrency": 4,
  "maxFileSizeMb": 25
}
```

# Actor output Schema

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

No description

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

No description

# 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 = {
    "startUrls": [
        {
            "url": "https://tesseract.projectnaptha.com/img/eng_bw.png"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("tiger19935/image-ocr-bulk").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 = { "startUrls": [{ "url": "https://tesseract.projectnaptha.com/img/eng_bw.png" }] }

# Run the Actor and wait for it to finish
run = client.actor("tiger19935/image-ocr-bulk").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 '{
  "startUrls": [
    {
      "url": "https://tesseract.projectnaptha.com/img/eng_bw.png"
    }
  ]
}' |
apify call tiger19935/image-ocr-bulk --silent --output-dataset

```

## MCP server setup

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

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/pm8ntUTy2IffQ059U/builds/rB11ESX6oScCYx3r0/openapi.json
