Skip to content

Image to Text (OCR)

Try for free

Read the text in images and PDFs from their links: screenshots, X/Twitter photos, scans, receipts, signs and posters. One row per image with the full text, detected language, confidence, size and an error field, plus one Markdown file with all the text. 30 languages, other scripts detected automatically. No login, no API key.

🔤 Image to Text (OCR)

Paste image links and get the text inside them: screenshots, X/Twitter photos, scanned letters, receipts, signs, posters and PDF pages. Every image becomes one row with the full text, its language, a confidence score and the image size, and all the text also lands in one Markdown file you can download. No login, no API key, $2.55 per 1,000 images with text on the Free plan.

✨ Why use Image to Text (OCR)?

  • 🖼️ Any image link — PNG, JPEG, WebP, GIF (first frame), BMP, TIFF and AVIF, plus PDFs page by page. X/Twitter media links (https://pbs.twimg.com/media/...) work as they are, and small Twitter sizes are fetched at the large size for a better read.
  • 🌙 Screenshots in dark mode too — every image is read in several prepared versions (dark mode turned into dark-on-light area by area, shadows and uneven light evened out) and the most confident reading is kept, so an editor screenshot with a dark code panel next to a white page reads in both parts.
  • 🌍 30 languages — choose the languages you expect. When an image holds enough clear text in Japanese, Chinese, Korean, Cyrillic, Arabic, Hebrew, Greek, Thai or Devanagari script, that language is added on its own.
  • 📝 One Markdown file with everything — OUTPUT.md in the run's storage holds the text of every image under its link, ready to paste into notes, a wiki or an AI prompt.
  • 🧾 Honest rows — a confidence score per image, the detected language, and a clear error for links that are not images, are gone or are blocked. Failed links cost nothing.
  • ⚡ Parallel — images download in parallel and are read on every CPU core the run has.

🎯 Use cases

  • 🐦 Social media research — read the text in the screenshots people post on X/Twitter, Instagram or Reddit (code snippets, bug reports, announcements, charts with labels).
  • 🛡️ Security and bug bounty notes — collect the payloads and request details shown in write-up screenshots into one searchable file.
  • 🧾 Receipts and invoices — pull the printed text from photos of receipts for bookkeeping.
  • 📚 Archives and scans — turn scanned letters, old newspaper pages and image-only PDFs into searchable text.
  • 🤖 AI pipelines — feed the Markdown file or the rows to a language model, a search index or a spreadsheet.
  • 🏷️ Product and shelf photos — read labels, signs and price tags.

🚀 How to use

  1. Paste image or PDF links into Image or PDF URLs, one per line.
  2. Pick the Languages of the text (English is the default; add German, French, Japanese and so on as needed).
  3. Click Start.
  4. Open the Output tab for one row per image, or download All text (Markdown). Export the rows to JSON, CSV or Excel, or read them through the API.

📥 Input

  • imageUrls — Image or PDF links, one per line. urls is accepted too.
  • languages — Languages of the text, e.g. ["eng", "deu"]. Default English.
  • detectScript — Add the matching language when an image is in a non-Latin script (default on).
  • pdfPages — Pages of a PDF to read, e.g. 1-5 or 1,3,8-10. Empty reads every page.
  • minConfidence — Leave out lines read with a confidence below this, 0 to 1 (default 0: keep every line).
  • proxyConfiguration — Proxy for the downloads (default: Scrape.ly datacenter proxy).
{
  "imageUrls": [
    "https://pbs.twimg.com/media/GBdPpssXIAADMot?format=jpg&name=large",
    "https://upload.wikimedia.org/wikipedia/commons/2/25/Screenshot_Wikipedia_Mobile_Smartphone.png"
  ],
  "languages": ["eng"]
}

📤 Output

  • url — The link you gave
  • imageUrl — The link that was downloaded (Twitter links at the large size)
  • text — All text found, line by line, in reading order
  • language — Detected language of the text (ISO 639-1 code such as en, de, ja)
  • confidence — How sure the reader is, from 0 to 1 (below about 0.6, check the text)
  • lineCount — Number of text lines
  • width, height — Image size in pixels (PDF pages at 200 dpi)
  • format — jpeg, png, webp, gif, pdf ...
  • fileBytes — Size of the downloaded file
  • pageNumber, pageCount — For PDFs: the page of this row and the number of pages
  • method — ocr, or pdf-text when a PDF page already had a text layer (read exactly, no OCR)
  • languagesUsed, script — Language packs used and the script detected
  • error, errorCode — Why a link could not be read (NOT_FOUND, NOT_AN_IMAGE, BLOCKED, TOO_LARGE, FETCH_FAILED, ...); empty when it worked

Example row (a dark-mode screenshot posted on X):

{
  "url": "https://pbs.twimg.com/media/GJLVNdSXYAAe_ij.png",
  "imageUrl": "https://pbs.twimg.com/media/GJLVNdSXYAAe_ij.png?name=large",
  "pageNumber": null,
  "pageCount": null,
  "text": "Successfully checkout\nbypassing the maximum number of each item\na Bug Bounty (Closed) - Submitted 22 Feb 2024 - Last activity 10 hours ago\nP4| | Unresolved\nGet-based Open Redirect functionality\na Bug Bounty (Closed) - Submitted 21 Feb 2024 - Last activity 10 hours ago - 2 Collaborators\nP4| | Unresolved\nIDOR view any orders\na Bug Bounty (Closed) - Submitted 21 Feb 2024 - Last activity 10 hours ago\nP4| | Unresolved\n5 points\nComment 1\n5 points\nComments 2\n5 points\nComment 1",
  "language": "en",
  "confidence": 0.953,
  "lineCount": 16,
  "width": 1081,
  "height": 358,
  "format": "png",
  "fileBytes": 11966,
  "languagesUsed": [
    "eng",
    "deu"
  ],
  "script": "Latin",
  "method": "ocr",
  "ocrMs": 2335,
  "error": null,
  "errorCode": null
}

A link that cannot be read comes back like this, and costs nothing:

{
  "url": "https://x.com/intigriti/status/2004494400601129247/photo/1",
  "text": null,
  "error": "This is a post page, not an image file. Use the post's image link (https://pbs.twimg.com/media/...), for example the mediaUrl field of a tweet scraper's results.",
  "errorCode": "NOT_AN_IMAGE"
}

💰 Pricing

You pay per image (or PDF page) that was read. Platform usage (compute and proxy) is included.

EventFreeStarterScaleBusiness
Image with text$0.00255$0.00229$0.00204$0.00165
Image without text$0.00085$0.00085$0.00085$0.00085

Links that fail (not found, not an image, blocked, too large) are free. Example: 1,000 screenshots with text cost $2.55 on the Free plan and $1.65 on Business.

❓ FAQ

Is it legal? Reading text from images you are allowed to access is fine. Respect the rights of the people who made the images and the terms of the sites that host them.

Do I need a login or an API key? No. Public image links are enough. Images behind a login cannot be downloaded.

How many images can I read in one run? As many as you like; the run reads them in parallel and streams the rows as it goes. More memory gives the run more CPU cores (one core per 4 GB) and reads faster.

Can I give a tweet link instead of an image link? No, the actor needs the image file itself. Run a tweet scraper first and pass the pbs.twimg.com/media/... links from its media field.

What if the text is empty or wrong? Very small, blurry, handwritten or stylised text reads poorly; the confidence field tells you which rows to check. Choosing the right language helps a lot.

Can I schedule it or use the API? Yes. Use the Scrape.ly API, the client libraries, MCP, or a schedule; the rows and OUTPUT.md are available after each run.

⚠️ Limits

  • This is optical character recognition, not image description: it returns the text it can see, not what the picture shows.
  • Best on screenshots, documents, scans and printed pages. Handwriting, very small or blurred text, heavy perspective, stylised or decorative lettering, neon and street signs read poorly or not at all; so does vertical Japanese or Chinese on signs. Handwritten pages usually come back without text (and are charged as an image without text). The confidence field shows which rows to check.
  • Files over 50 MB and images over about 179 million pixels are refused (memory safety); very large images are scaled to 4,000 pixels on the long side before reading.
  • Animated GIFs and WebPs: only the first frame is read.
  • Multi-column layouts can come out column by column or mixed, depending on spacing.
  • Images that need a login or that the host blocks cannot be read; their row says so in error.
  • Contact: hello@scrape.ly

Related actors

The internet is full of data.
Start owning yours.

Scrape.ly gives you the infrastructure, the tooling, and the team to extract, process, and operationalize web data at any scale. Setup takes minutes.

No credit card. No setup calls.