OCR
KSUG.AI #49 · Singapore · 21 October 2026
jina-ocr-v1
Faster Document Parsing on Low-Budget GPUs
Sa Zhang · Product marketing, inference at Elastic (Jina)
1968
OCR-A
A typeface drawn so machines could read it
1976
Kurzweil Reading Machine
Reads printed pages aloud for blind readers
1985 · 2005
Tesseract
Built at HP; open-sourced in 2005
Public record: OCR-A typeface (1968); Kurzweil Reading Machine (1976); Tesseract at HP (1985), open source (2005)
The page
INVOICE No. 2041 Item Qty Price Widget A412.00 Widget B29.50 Total67.00
Classical OCR output
INVOICE   No 2O41
Item Qty Price Widget
 A 4 12.0O  Wid get
B 2 9.5O Tota l
67 .00  ~ ._ ' ,
What retrieval needs
# Invoice 2041

<table>
 <tr><th>Item</th><th>Qty</th>
     <th>Price</th></tr>
 <tr><td>Widget A</td><td>4</td>
     <td>12.00</td></tr>
 <tr><td>Widget B</td><td>2</td>
     <td>9.50</td></tr>
</table>

**Total:** 67.00
Page image
Writes the text, one token at a time
# Invoice 2041\n<table><tr><th>Item</th>…
Markdown
# Invoice 2041

<table>
 <tr><th>Item…
</table>

$$ \sum … $$
every request also sends -H "Authorization: Bearer $JINA_API_KEY"
1
curl https://r.jina.ai/<web-page>
Web page
Clean Markdown
2
curl https://r.jina.ai/<scanned-invoice.pdf>
Scan, no header
No usable text
3
curl https://r.jina.ai/<scanned-invoice.pdf> \
-H "X-Respond-With: jina-ocr-v1"
Same scan + header
Markdown, table intact
4
curl https://r.jina.ai/<two-column-paper.pdf> \
-H "X-Respond-With: jina-ocr-v1" -H "X-Page: 3"
Two columns + equations
Right order, formulas as LaTeX
Until 2020Since 2025
How it's measured
Character error rate
Do the tables and layout come out right? (OmniDocBench, TEDS)
What costs the most
Finding text boxes, then reading them
Generating the output, token by token
What it's built on
Computer-vision pipelines
Language models: olmOCR, DeepSeek-OCR, PaddleOCR-VL
A 2026 course from DeepLearning.AI and LandingAI Document AI: From OCR to Agentic Doc Extraction
Step by step
Layout modeltrained on DocLayNet
→
OCR
→
Table model
e.g. Docling
You can check each step on its own.
One model, one pass
Page image
→
Model writes Markdown
olmOCRDeepSeek-OCRGranite-Docling-258Mjina-ocr-v1
Better on messy pages. Output is ready to index.
AI Engineer World's Fair 2026, as attendees reported it
  • 01RAG became infrastructure
  • 02Agents took centre stage
  • 03Vision & OCR got its own track
agent HTML ✓ HTML ✓ scans · PDFs
Sources: ai.engineer/worldsfair/2026 and published attendee recaps
https://r.jina.ai/https://any-page.example
Web page → Markdown. Many developers already use this inside their agents.
https://r.jina.ai/https://scan.example/page.pdf
-H "X-Respond-With: jina-ocr-v1"
Scanned PDF → Markdown. Same API key, same prefix, one extra header.
Surya OCR 2 jina-ocr-v1
tokens / second 3,760 2,792 tokens / page 3,568 1,085 pages / second 1.05 2.57
pages/s
= tok/s ÷ tok/page
Surya generates tokens faster, but writes over 3× as many per page.
What to measure
arXiv:2609.03181 · same-run throughput comparison · jina-ocr-v1 writes the shortest pages among systems above 83 on olmOCR-Bench
1Guess ahead, then check FastMTP
| Item | Qty | Qt ✓✓✗ a small head guesses 3 tokens The main model keeps the guesses it agrees with and fixes the first one it doesn't.
≈ 2×faster on one L4 GPU, one request at a time.
Same output as without it.
2Scored by code RLVR
formula table structure bracket closure checked byplain code partialcredit No judge model needed. Half-right still earns credit.
+7.4points on olmOCR-Bench vs. DeepSeek-OCR, the model we started from (76.0 → 83.4).
arXiv:2609.03181 · L4 timing: vLLM, batch 1, eager mode (42.7 → 83.1 tok/s) · not a concurrent-serving number
OmniDocBench v1.6
higherPaddleOCR-VL-1.6scores higher than us
91.14jina-ocr-v1570M active · 3.4B total
89.78Qwen3-VL-235B235B general model
olmOCR-Bench
higherchandra-ocr-2scores higher than us
83.4jina-ocr-v1570M active · 3.4B total
76.0DeepSeek-OCRthe model we started from
arXiv:2609.03181 · default dynamic resolution · ladders show order, not scale · scores of higher-ranked systems are in the paper's tables
  • 01One page per call. For multi-page PDFs, the service splits and rejoins the pages.
  • 02Output is Markdown, not word positions. If you need bounding boxes, use something else.
  • 03The weights are non-commercial (CC BY-NC 4.0). For commercial use, call the API.
  • 04It needs a GPU. It's not built to run on CPUs.
what Jina builds
01Parse
02Embed
03Rerank
04Your LLM answers
Put the Markdown into Elasticsearchor pass it to your agent
curl https://r.jina.ai/<url> -H "Authorization: Bearer $JINA_API_KEY" \
-H "X-Respond-With: jina-ocr-v1"
jina.ai/reader · huggingface.co/jinaai/jina-ocr-v1 · arxiv.org/abs/2609.03181
Appendix · for questions
  • 01Weights on Hugging Face: jinaai/jina-ocr-v1, loaded with trust_remote_code=True.
  • 02vLLM ≥ 0.21; call register() before serving.
  • 03Speculative config: method="eagle", num_speculative_tokens=3, mtp_heads=1, mtp_recursive=True.
  • 04Plain Transformers doesn't load the draft head, so there's no speedup.
  • 05It clearly helps with one request at a time. With many at once, measure first.
Appendix · for questions
  • 01Very old, damaged scans: 42.6 on OldScans. Not a strength.
  • 02Tables: 84.68 TEDS on OmniDocBench, not first. Test tables without borders or across pages.
  • 03Pulling out key fields works through a prompt. It won't always return valid JSON.
  • 04Instructions were trained in Chinese and English.
  • 05olmOCR-Bench rewards skipping headers and footers. We transcribe the whole page, so we lose points there.
Appendix · for questions
  • 01Still used every day: postcodes, licence plates, fixed forms.
  • 02Weak at full documents: tables, formulas, reading order.
  • 03Full documents now go to models that read the whole page.
KSUG.AI #49 · Singapore · jina-ocr-v1
Sa Zhang · Jina by Elastic · 21 Oct 2026