* * * OCR API FOR PYTHON * * *

OCR API for Python.

pip install pennyocr, three lines, and any PDF or image becomes markdown or plain text. No model downloads, no CUDA, no Tesseract compilation — the GPU is our problem.

START FREE — 100 PAGES
$0.75 / 1,000 PAGES
1,333 PAGES PER DOLLAR · NO CREDIT CARD
01 / TRY IT

ONE ENDPOINT.

POST a file, get JSON back — the extracted text, per page and joined. PDF, PNG, JPEG, WebP or TIFF.

curl https://api.pennyocr.com/v1/ocr \
  -H "Authorization: Bearer $PENNYOCR_API_KEY" \
  -F "file=@receipt.jpg"

# $0.75 per 1,000 pages, first 100 free
02 / USE CASES

THE WHOLE INTEGRATION.

INSTALL
pip install pennyocr — one dependency (httpx). Python 3.9+.
THREE LINES
from pennyocr import PennyOCR · client = PennyOCR(api_key=...) · client.ocr('invoice.pdf').text
PER-PAGE RESULTS
result.page_results gives page-by-page text for citations, chunking and pagination-aware pipelines.
OPENAI SDK WORKS TOO
Prefer the openai package? Point base_url at https://api.pennyocr.com/v1 and send image_url parts to model pennyocr-markdown.
03 / PRICE CHECK

HALF THE PRICE OF THE BIG CLOUDS.

Per 1,000 pages, public list prices, first tier.

PENNYOCR$0.75
AWS TEXTRACT$1.50
GOOGLE CLOUD VISION$1.50
AZURE DOC INTELLIGENCE$1.50
YOU KEEP50%
04 / FAIR QUESTIONS
GET YOUR API KEY
HELLO@PENNYOCR.COM
SYNC OR ASYNC?
The SDK is sync (httpx). For async today, call the REST endpoint with httpx.AsyncClient — it's one multipart POST. Async SDK is coming.
HOW DO ERRORS WORK?
PennyOCRError with a status_code: 401 bad key, 402 out of credits (buy more on the dashboard), 413 too large, 422 unreadable file.
WHERE'S THE SOURCE?
The SDK is tiny and readable — one file, MIT licensed. What you POST is what runs; zero retention by default.