# Image OCR - Image to Text in Bulk, Tesseract & AI Vision (`plotpointtech/image-to-text-ocr-bulk`) Actor

Extract text from many images at once: links, web pages or uploaded files. Fast Tesseract mode with line positions, or AI vision for handwriting, receipts, invoices and business cards. From $2 per 1,000 images.

- **URL**: https://apify.com/plotpointtech/image-to-text-ocr-bulk.md
- **Developed by:** [Plot Point Technologies](https://apify.com/plotpointtech) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.24 / 1,000 image read (fast ocr)s

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: Image to Text in Bulk, with Tesseract or AI Vision

**Extract text from many images in one run.** Give it direct image links, web pages whose images you want read, or an Apify key-value store full of image files, and get one clean result per image: the full text, its language, a confidence score, image size and, in fast mode, every line and block with its position. **From $2 per 1,000 images.**

Two modes:

- **Fast (Tesseract):** open-source OCR in 24 languages. Best for scans, printed documents, screenshots and clean images. Rotates sideways and upside-down pages automatically and returns bounding boxes for lines, blocks and (optionally) words.
- **AI vision:** a Claude vision model reads the image like a person would. Much better on handwriting, receipts, photos of signs, phone pictures, low-quality or skewed images and mixed languages. It can also return typed fields for **receipts, invoices and business cards**.

### What can this image to text tool do?

- **OCR images in bulk** from links (JPG, PNG, WebP, GIF, BMP, TIFF), web pages or a key-value store.
- **Return positions** of lines, blocks and words for layout-aware processing.
- **Turn receipts and invoices into data:** merchant, date, line items, subtotal, tax, tip, total, payment method; invoice numbers, dates, vendor, customer and totals; business card name, title, company, emails, phones and address.
- **Skip images without text** and small icons free of charge.

### What data do you get?

| Field | Description |
|---|---|
| `imageUrl`, `sourcePage`, `sourceType`, `mode`, `status` | The image and how it was read |
| `text` | Full text in reading order |
| `language`, `confidence` | Detected language and a 0-1 confidence |
| `width`, `height`, `format`, `lineCount`, `charCount` | Image and text stats |
| `lines`, `blocks`, `words` | Fast mode: text with `bbox` {x, y, width, height} and confidence |
| `documentType`, `readability`, `structured` | AI mode: kind of image and typed receipt/invoice/business-card fields |

### Who uses it?

- **Operations and finance teams** turning receipts and invoices into spreadsheet rows.
- **Researchers and archivists** transcribing scanned letters and historical documents.
- **E-commerce and marketing teams** reading text inside product images and banners.
- **Developers** who need an OCR step in an automation without hosting Tesseract or a vision model.

### How to use it

1. Click **Try for free** (or **Start**).
2. Add **Image URLs**, **Web pages** or a **Key-value store ID**.
3. Choose **OCR mode** (fast or ai) and **Languages**.
4. For receipts or invoices, choose AI mode and a **Structured fields** type.
5. Run it and export to Excel, CSV or JSON.

### Input example

```json
{
  "imageUrls": [
    {
      "url": "https://raw.githubusercontent.com/tesseract-ocr/tessdoc/main/images/eurotext.png"
    }
  ],
  "mode": "fast",
  "languages": [
    "eng",
    "deu"
  ],
  "includeBoundingBoxes": true,
  "skipImagesWithoutText": true
}
```

### Output example

```json
{
  "imageUrl": "https://raw.githubusercontent.com/tesseract-ocr/tessdoc/main/images/eurotext.png",
  "sourcePage": null,
  "sourceType": "url",
  "mode": "fast",
  "status": "ok",
  "width": 640,
  "height": 500,
  "format": "PNG",
  "text": "The (quick) [brown] {fox} jumps!\nOver the $43,456.78 <lazy> #90 dog\n& duck/goose, as 12.5% of E-mail\nfrom aspammer@website.com is spam.\nDer ,.schnelle” braune Fuchs springt\niiber den faulen Hund. Le renard brun\n«rapide»...",
  "language": "es",
  "confidence": 0.917,
  "lineCount": 12,
  "rotationApplied": 0,
  "ocrLanguages": "eng",
  "lines": [
    {
      "text": "The (quick) [brown] {fox} jumps!",
      "confidence": 0.958,
      "bbox": {
        "x": 65,
        "y": 41,
        "width": 450,
        "height": 30
      },
      "block": 1
    },
    {
      "text": "Over the $43,456.78 <lazy> #90 dog",
      "confidence": 0.943,
      "bbox": {
        "x": 65,
        "y": 72,
        "width": 490,
        "height": 31
      },
      "block": 1
    },
    {
      "text": "& duck/goose, as 12.5% of E-mail",
      "confidence": 0.948,
      "bbox": {
        "x": 64,
        "y": 103,
        "width": 458,
        "height": 26
      },
      "block": 1
    }
  ],
  "blocks": [
    {
      "text": "The (quick) [brown] {fox} jumps!\nOver the $43,456.78 <lazy> #90 dog\n& duck/goose, as 12.5% of E-mail\nfrom aspammer@website.com is spam.\nDer ,.schnelle” braune Fuchs springt\niiber den faulen Hund. Le renard brun\n«rapide»...",
      "confidence": 0.917,
      "bbox": {
        "x": 61,
        "y": 41,
        "width": 513,
        "height": 372
      }
    }
  ],
  "charCount": 414
}
```

### How much does it cost?

| Mode | Price per image | Per 1,000 images |
|---|---|---|
| Fast (Tesseract) | $0.002 | **$2** |
| AI vision | $0.009 | $9 |
| AI vision with your own Anthropic key | $0.003 | $3 (plus your own AI usage) |

Plus a $0.00005 start fee per run. Examples: 500 scanned pages in fast mode cost $1.00; 200 receipts in AI mode with structured fields cost $1.80. Errors, skipped small images and (with "Skip images without text") empty images are free.

**Volume discounts on higher Apify plans.** The prices above are for the Apify Free plan. Fast-mode OCR gets cheaper automatically on paid plans: about 15% lower on Bronze, 25% lower on Silver and 38% lower on Gold and above.

### Use it via API, Make, Zapier, n8n or an AI agent

**Apify API.** Start a run and get the results back in one HTTP request (replace `YOUR_API_TOKEN` with the token from Apify Console > Settings > Integrations):

```bash
curl -X POST "https://api.apify.com/v2/acts/plotpointtech~image-to-text-ocr-bulk/run-sync-get-dataset-items?token=YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"imageUrls": [{"url": "https://raw.githubusercontent.com/tesseract-ocr/tessdoc/main/images/eurotext.png"}], "mode": "fast", "languages": ["eng", "deu"], "includeBoundingBoxes": true, "skipImagesWithoutText": true}'
```

For longer jobs, start the run asynchronously and read the dataset when it finishes. Official `apify-client` libraries exist for Python and JavaScript; the **API** tab on this page has ready-made code.

**No-code automation.** Connect the tool to **Make, Zapier, n8n, Google Sheets, Slack, Airtable** or any webhook with Apify integrations, and use **Schedules** in Apify Console to run it hourly, daily or weekly.

**AI agents (MCP).** Give Claude, ChatGPT, Cursor, VS Code or any MCP-compatible agent direct access to this tool through the hosted Apify MCP server. Add this server URL to your client:

```
https://mcp.apify.com?tools=plotpointtech/image-to-text-ocr-bulk
```

The agent can then call the tool with the same input fields shown above and read the results.

### FAQ

**Is it legal to OCR images?**
Yes, for images you have the right to use. Business cards, receipts and documents can contain personal data: handle results according to the privacy rules that apply to you, such as GDPR.

**Which mode should I use?**
Fast for printed documents, scans and screenshots, especially when you need positions. AI for handwriting, photos, receipts, invoices, signs and low-quality images.

**Does AI mode translate?**
No. It transcribes the text as written. It may occasionally misread unclear characters, so check important figures.

**Which files are supported?**
JPG, PNG, WebP, GIF, BMP and TIFF up to 25 MB. SVG, HEIC and PDF are not supported (use our PDF to Text & Tables Extractor for PDFs).

**Is my API key safe?**
Your own Anthropic key is stored as an encrypted secret input and never logged.

### Related tools from Plot Point Technologies

- [PDF to Text & Tables Extractor - Markdown + OCR, $0.40/1K](https://apify.com/plotpointtech/pdf-text-markdown-tables-extractor): PDFs to text, Markdown and CSV tables, with OCR for scans.
- [Bulk Image Downloader - All Images from Any Website + ZIP](https://apify.com/plotpointtech/bulk-image-downloader-extractor): every image from a page or site, de-duplicated, with ZIP.
- [AI Web Scraper - Extract Any Website to JSON in Plain English](https://apify.com/plotpointtech/ai-page-extractor): describe the fields you want and get JSON from any web page.

Plot Point Technologies is not affiliated with Anthropic, Google or the Tesseract project.

***

If this tool saved you time, we would be grateful for a short review on this page; it helps other people find it. If something did not work as expected, please open an issue on the **Issues** tab and we will look into it quickly.

# Actor input Schema

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

Direct links to images (JPG, PNG, WebP, GIF, BMP, TIFF). One result per image.

## `pageUrls` (type: `array`):

Pages whose images should be read. The tool finds the images on each page (img, srcset, og:image) and OCRs them. Pages are fetched without a browser.

## `keyValueStoreId` (type: `string`):

OCR image files stored in an Apify key-value store (for example files you uploaded or another Actor saved). Pick the store or paste its ID.

## `keyPrefix` (type: `string`):

Only process key-value store records whose key starts with this text.

## `mode` (type: `string`):

Fast uses Tesseract and returns line and block bounding boxes. AI uses a vision model and is far better on handwriting, receipts, screenshots, photos of signs and low-quality images.

## `languages` (type: `array`):

Languages the text is in. Pick only what you need: each extra language slows OCR. In AI mode this is only a hint.

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

Detect page orientation and turn sideways or upside-down images upright before OCR.

## `includeBoundingBoxes` (type: `boolean`):

Return each text line and block with its position (x, y, width, height in pixels) and confidence.

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

Also return every word with its box. Makes results much larger.

## `structuredData` (type: `string`):

Also return typed fields for receipts, invoices or business cards. Auto detects which kind the image is.

## `anthropicApiKey` (type: `string`):

Use your own key and pay a lower per-image price. Stored encrypted and never logged.

## `skipImagesWithoutText` (type: `boolean`):

Do not save (or charge for) images where no text was found. Useful for web pages full of photos and icons.

## `maxImagesPerPage` (type: `integer`):

Limit for each web page.

## `minImageSize` (type: `integer`):

Images whose shorter side is smaller than this are skipped without charge (icons, spacers).

## `maxImages` (type: `integer`):

Stop after this many images. 0 means no limit.

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

How many images to process in parallel.

## Actor input object example

```json
{
  "imageUrls": [
    {
      "url": "https://raw.githubusercontent.com/tesseract-ocr/tessdoc/main/images/eurotext.png"
    }
  ],
  "mode": "fast",
  "languages": [
    "eng"
  ],
  "autoRotate": true,
  "includeBoundingBoxes": true,
  "includeWords": false,
  "structuredData": "none",
  "skipImagesWithoutText": false,
  "maxImagesPerPage": 20,
  "minImageSize": 60,
  "maxImages": 0,
  "maxConcurrency": 4
}
```

# Actor output Schema

## `results` (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 = {
    "imageUrls": [
        {
            "url": "https://raw.githubusercontent.com/tesseract-ocr/tessdoc/main/images/eurotext.png"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("plotpointtech/image-to-text-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 = { "imageUrls": [{ "url": "https://raw.githubusercontent.com/tesseract-ocr/tessdoc/main/images/eurotext.png" }] }

# Run the Actor and wait for it to finish
run = client.actor("plotpointtech/image-to-text-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 '{
  "imageUrls": [
    {
      "url": "https://raw.githubusercontent.com/tesseract-ocr/tessdoc/main/images/eurotext.png"
    }
  ]
}' |
apify call plotpointtech/image-to-text-ocr-bulk --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,plotpointtech/image-to-text-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/QvwDwxJ7es0h0tdas/builds/cIfAU5HQca1LvLnhc/openapi.json
