orc — optical character recognition api
Scanned paperwork, CID-broken court rulings, notices photocopied into oblivion —
POST the file, get a job_id, pull clean text.
An async, language-agnostic OCR service behind a single endpoint.
curl -X POST https://api.orc.guru/v1/jobs -H "X-API-Key: $KEY" \ -F "file=@court-ruling.pdf" -F "lang=tur"{"job_id":"9cc2059d…", "status":"queued"} curl https://api.orc.guru/v1/jobs/9cc2059d… -H "X-API-Key: $KEY"{"status":"processing", "progress":{"pages_done":3, "pages_total":12}} curl https://api.orc.guru/v1/jobs/9cc2059d…/text -H "X-API-Key: $KEY"✓ succeeded · 12 pages · confidence 0.94CONSTITUTIONAL COURT RULING — Case No: 2025/…
orc was born inside some of the most stubborn paperwork there is: court notices published as raw page scans and CID-encoded rulings that refuse copy-paste. These files either have no text layer at all, or the layer is character soup — pdftotext returns nothing, search fails, pipelines stall.
The fix is always the same: rasterize the page, run it through Tesseract, measure confidence, stitch the text back together. orc packages that pipeline as one HTTP service — you send the PDF, the queue does the rest. Call it from any language, any project; nothing to install on the client side.
Every page is rasterized, read, and deleted one at a time. Memory use is independent of PDF size — a 600-page file costs the same RAM as a single page.
peak RAM ≈ 1 page @ 300dpiTesseract's per-word confidence values are aggregated; every result ships with a 0–1 score. Routing low-confidence output to a human is up to you.
"confidence": 0.94Default language is tur; combinations like tur+eng are
supported. Diacritics are first-class citizens — not an afterthought fix.
DELETE stops a running job instantly — the whole process group is killed.
When a job finishes, we can POST JSON to your webhook; polling is optional.
| Endpoint | Job |
|---|---|
POST /v1/jobs |
Upload PDF/PNG/JPEG/TIFF → 202 {job_id}. Fields: lang, dpi, first_page, last_page, region, webhook_url, retention_hours (0 = burn-after-read) |
GET /v1/jobs/{id} |
Status + page progress + confidence score |
GET /v1/jobs/{id}/text |
Extracted text, text/plain |
DELETE /v1/jobs/{id} |
Cancel or delete the job |
GET /healthz |
Liveness + queue depth (no key needed) |
Request an API key and send your first job in five minutes.