Comparisons

Which Document Extraction API Can You Actually Trust?

We ran the same finance and medical documents through six extraction APIs and scored every result with checks you can rerun. The values agreed more than the confidence signals did.

Unsiloed AI12 min read

Unsiloed AI, Extend, Reducto, LlamaIndex, Mistral OCR, and Anthropic's Claude all turn documents into structured data through an API. On clean digital documents they are hard to tell apart, so we didn't test those. We took three documents from the kind of work where extraction errors cost money, a banking table, a medical record, and a holdings sheet.

Unsiloed led the comparison, but what really sets it apart is that it is the only tool that reliably tells you when it is wrong: Reducto stamped fabricated lab values "high confidence", LlamaParse and Mistral silently dropped 124 and 102 of 171 rows from an oversized sheet, and Extend, the closest competitor on accuracy, returned empty confidence fields on every value, so its errors looked exactly like its right answers.

How document pipelines failthe short version
Most pipelines
661.6worn scan
extractapi
"deposits_time": "881.8"looks fine
database
✗ found weeks later
With a score on every value
661.6same scan
extractapi
"661.8" 0.52flagged
reviewhuman
✓ caught before it ships
A wrong value returned by an extraction API looks exactly like a right one. The failure isn't the misread; it's that nothing in the response tells you which values to distrust.

What Each Tool Offers

The specialized document extraction models of Unsiloed, Extend, Reducto, LlamaIndex, and Mistral OCR all provide a similar platform. Put simply, each provides an API that allows you to input a document and get back structured data in the format that you want. The APIs give you endpoints for parsing (turning the whole document into structured markdown) and extraction (pulling out specific fields that match a schema you define). Most of them also return a confidence score that is meant to tell you how sure the model is about each value.

Claude is the exception here being a general-purpose model that accepts PDFs directly, so we treat "send the document and a schema via tool use" as its extraction API, using Claude Sonnet 5. (Whether a general-purpose LLM is enough for document extraction on its own is a question we've dug into separately.)

Unsiloed AI Extend Reducto LlamaIndex Mistral OCR Claude Sonnet 5
Schema-based extraction Yes Yes Yes Yes (LlamaExtract) Yes (document annotations) Yes (tool use)
Parse to markdown Yes Yes Yes Yes (LlamaParse) Yes Prompted
Per-field confidence 0-1 score on every field Documented, but null on the extract API we used High/low flag plus numeric scores that disagree with it Nearly always 1.0 in our runs Per-word OCR confidence (opt-in), not per field None
Citations with bounding boxes Every field No Optional Opt-in; boxes cover whole blocks Page images No

What We're Testing

Each test document is hostile in a way document extractors are known to struggle with. The 1949 banking table is 65 rows of worn, smudged print where a 1 reads like a 7, and every cell feeds a printed total, so a single misread silently corrupts the dataset. The lab report is faxed at 120 dpi with noise and skew, right at the edge of readable, where OCR has to guess at digits it can't fully see. And the holdings sheet is a 143-megapixel page that blows past the image size limit most parsers have: they either shrink the page until the digits turn to mush or quietly stop reading partway through. On each one we're looking for two things: how much the tool gets right, and whether anything in its response tells you what it got wrong. All tests were run against each provider's production API in July 2026, with the same schema or parse request sent to every tool, and we saved every raw response; the card popups below show the exact requests and what came back.

Each round below shows the source document, Unsiloed's result as the reference, and the five competitors beside it. Every card marks whether the tool warned you when it was wrong; click any card to open the full result and see exactly how we ran each benchmark.

Backfile Digitization: A 1949 Banking Table

The first document is page 389 of the 1951 Statistical Abstract, from the scan hosted on census.gov: "All Active Banks, Summary by States and Other Areas", 65 rows by 9 columns of dollar figures in worn 1950s print. This is a job every financial data vendor knows: turning decades of old scans into a database. (If your backfile is still image-only PDFs, start with making the scans searchable — everything below assumes you're past that step and extracting structured values.)

The 1949 all-active-banks table, as scanned, with the Texas row marked in red The input: deposits split into demand and time, states grouped into regions, all of it adding up to printed totals. Those totals are how we score it: 136 sums to check per extraction. The red box marks the Texas row, the one line every tool read differently.

Each API received the same schema, one row per state; the badge on each card below shows how many of the sums it passed. Every tool misread something in this table. The cards show where each one went wrong and what its confidence score said about it, starting with the Texas row in the red box, printed in worn, slanted type, which no two tools agreed on:

1949 banking table6 tools
The page readstexas · deposits_time 661.6texas · deposits_total 6,710.3mississippi · deposits_total 764.7kentucky · total_assets 1,670.4arizona · us_govt_securities 191.1kentucky · us_govt_securities 769.1
Reference
Unsiloed AI133/136 checks (98%)
Read 661.8 and flagged it at 0.52: this cell needs a human.
texas · deposits_time661.80.52
Flagged
Details ↗
The other five tools
Mistral OCR100/135 (74%)
Misread Texas twice at 0.87 word confidence, and Mississippi at 0.94.
texas · deposits_time667.9word conf 0.87
texas · deposits_total6,793.3word conf 0.87
mississippi · deposits_total704.7word conf 0.94
Details ↗
Reducto116/133 (87%)
Invented 881.8 on Texas and misread Kentucky by 600 million, both cited "high".
texas · deposits_time881.8high confidence
kentucky · total_assets1,070.4high confidence
Details ↗
Claude Sonnet 5118/136 (87%)
Got both hard-to-read cells wrong, and the API has nothing to flag them with.
texas · deposits_time681.3no confidence API
texas · deposits_total6,730.3no confidence API
Details ↗
Extend130/136 (96%)
Read Texas right, but misread Arizona by 90 million dollars. Its confidence fields were empty both times.
texas · deposits_time661.6no confidence score
arizona · us_govt_securities101.1no confidence score
Details ↗
LlamaIndex131/135 (97%)
Read Texas right at confidence 1.0, and misread Kentucky by 60 million at the same 1.0.
texas · deposits_time661.6conf 1.00
kentucky · us_govt_securities709.1conf 1.00
Details ↗

Reading across the row: the printed total is 6,710.3 and demand is 6,048.7, so the time cell must be 661.6. Mistral misread it and the total. Reducto invented a number and vouched for it. Claude got both hard cells wrong. Extend and LlamaIndex read this row correctly, but both misread cells elsewhere in the same table: Extend was off by 90 million dollars on Arizona with its confidence fields empty, and LlamaIndex was off by 60 million on Kentucky at the same confidence 1.0 it gave the cells it got right. Unsiloed's 661.8 is off by 0.2, and it is the only reading that arrived flagged. One cell could be luck; the scoreboard above covers 136 of these sums. The flag is what turns a 98% extraction into something you can actually rely on, because the 2% shows up already marked.

Faxed Medical Records: A Degraded Lab Report

Labs still fax. We took a digital lab report (a blood count and a cholesterol panel, 28 values we know exactly), and made two fax copies of it: a moderate one at 170 dpi and a hard one at 120 dpi with noise, skew, and streaks.

The moderate fax matters as a baseline: all six tools scored a perfect 28/28 on it. Nothing below is about a tool being unable to read a fax.

The hard fax version of the lab report The hard fax. A human can read it with effort, which makes it exactly the document you want a machine to check first.

On the hard fax, LlamaExtract wins on accuracy: it read all 28 values correctly, and most of the field came within an error or two (each card's badge below shows its count). The more interesting question is what each tool told you about its own mistakes, and there the results look very different:

Faxed lab report · hard copy6 tools
The page readsdirect_ldl 100.39hemoglobin 14.5wbc_count 10570platelet_count 150000rdw_cv 13.60lymphocytes_pct 19
Reference
Unsiloed AI27/28 correct
One error in 28, and it came with a low score attached: 0.72.
direct_ldl100.350.72
Flagged
Details ↗
The other five tools
Reducto1/28 correct
Fabricated a plausible lab report and cited every value "high".
hemoglobin10.5high confidence
wbc_count7.9high confidence
platelet_count230000high confidence
Details ↗
Claude Sonnet 526/28 correct
Two wrong values headed for a patient record, both silent.
rdw_cv13.65no confidence API
lymphocytes_pct18no confidence API
Details ↗
Mistral OCR27/28 correct
One wrong digit, and its OCR confidence scored it 0.98.
rdw_cv13.50word conf 0.98
Details ↗
Extend27/28 correct
One wrong value, and no per-field confidence on the extract API to catch it.
lymphocytes_pct18no confidence score
Details ↗
LlamaIndex28/28 correct
The best read of the fax, but it says 1.0 even when it is wrong.
rdw_cv13.60conf 1.00
direct_ldl100.39conf 1.00
Details ↗

Five of the six tools landed within two errors of each other, so this round isn't about accuracy. Look at what full confidence meant on this one document, though: LlamaExtract said 1.0 about a perfect read, and Reducto said "high" about values it made up. The same signal covered the best result and the worst one, so the signal tells you nothing. And we only know LlamaExtract got 28/28 because we have the original file to check against. A real pipeline doesn't have that; all it sees is the score, and the score says 1.0 either way. Unsiloed is the only tool whose score pointed at its own mistake.

Oversized Pages: A 143-Megapixel Holdings Sheet

The parse round. We tiled four pages of the Dodge & Cox Income Fund's published portfolio holdings into a single 143-megapixel page: 171 bond rows, seven columns, the kind of oversized dense sheet you get whenever documents are stitched together, and a direct test of how much resolution a parser can really handle. (Tables that sprawl past a single page are their own failure mode — see why multi-page tables still break every extraction pipeline.) We built it from the original digital file, so we know exactly what every one of the 684 cells should say.

The tiled holdings sheet The input, all four tiles. At full size, every digit is crisp; any parser that shrinks the page to fit its image limit turns them to mush.

Each API's parse endpoint (for Claude, a transcription prompt) returned markdown, and we counted how many of the 684 cells came back:

143-megapixel holdings sheet6 tools
Reference
Unsiloed AI171/171 rows
Every row, every cell: the only perfect result in the field.
684/684
cells recovered
| Charter Communications, Inc. | United States |
|   191,783,000 | 171,314,087 | 4.500 | 5/01/32 |
Complete
Details ↗
The other five tools
LlamaIndex47/171 rows
124 of 171 rows never arrived. The worst result in the field.
176/684
cells recovered
74% lost
Details ↗
Mistral OCR69/171 rows
102 of 171 rows never arrived, and nothing says so.
188/684
cells recovered
73% lost
Details ↗
Claude Sonnet 5139/171 rows
Transcribes until the image budget runs out, then rows vanish.
537/684
cells recovered
21% lost
Details ↗
Reducto171/171 rows
One cell short of perfect.
683/684
cells recovered
Complete
Details ↗
Extend171/171 rows
One cell short of perfect.
683/684
cells recovered
Complete
Details ↗

The thing to worry about here is not a misread digit; it's the row that quietly disappears. If your pipeline is fed the LlamaParse or Mistral output, nothing in it tells you that 124, or 102, of the 171 holdings are missing.

Which Tool Tells You When It's Wrong

Most of these tools return some kind of confidence signal. The real differences are whether it applies to each extracted value, and whether it holds up when the document gets hard — the missing metric in document extraction, as we've argued before. Here is what each API actually gives you:

Unsiloed returned a score on every field we extracted, and the score follows the document. On clean pages it sits at 0.95 and up; on the hard fax the doubtful values drop to between 0.5 and 0.8; on the banking table, four of the document's five lowest scores land on the Texas row, the row whose deposits don't add up. The scores are a guide, not a guarantee: across both extraction rounds one misread still scored high (a cash cell off by six hundred thousand dollars at 0.93), but every other error we found scored 0.72 or lower.

Mistral OCR returns per-word OCR confidence. Two things hold it back: it scores recognized words, not the fields you extract, and it doesn't move on the values Mistral got wrong. On the banking table its lowest word score anywhere was 0.83; on the hard fax the digit it misread scored 0.98, the same as the values it got right. It tells you how sure the OCR is of the characters, not whether the number is correct.

Reducto returns three signals per citation: a high/low flag, a numeric extract_confidence, and a parse_confidence for whole blocks of the page. They disagree with each other. On the banking table, extract_confidence was empty on every value and parse_confidence was a single number, 0.74, repeated across the entire 65-row table. On the hard fax, the flag said "high" on every made-up value while extract_confidence read 0.0 on most of them, and 0.68 to 0.94 on the rest, made-up values included; the one value it got right scored 0.85, below a made-up 0.94. A tool that scores the same invented number "high", 0.0, and 0.28 at once is not telling you when it is wrong; it is asking you to guess which of its three opinions to believe.

LlamaIndex (compared head-to-head with Unsiloed here) returns per-field confidence and citations when you switch them on, and we did. The score barely moves: 1.0 on 648 of the 650 banking-table fields, including every cell in the sums that fail, and 1.0 on all 28 fields of the 120 dpi fax. The only value it scored below 0.95 in roughly 700 fields is blank on the page. Its citations point at whole blocks rather than values: on the banking table every box covers about two-thirds of the page, and on the fax only 7 of the 28 fields came with a box at all.

Extend documents three confidence fields, one entry per extracted value. On the extraction API we used, all three came back empty on every field and every document, even on its most capable processor. Extend's confidence and review scoring appear to live in its Workflows product, which we didn't test.

Claude returns no per-field confidence through the Messages API.

So the difference isn't that only one tool has confidence scores; several return something with that name. Unsiloed's is the only one you could actually build on: a score for every value that drops when the document gets worse, with a citation that points at the exact spot on the page.

What Decides a Production Ready Pipeline

Unsiloed led the banking table, was the only tool to get the giant sheet fully right, and was one value behind the best read of the hard fax. Just as telling: it is the only tool that never had a disaster round. (This tracks with the public benchmarks: Unsiloed ranks #1 on olmOCR-Bench.)

Extend came within a few sums on the banking table, both Extend and Reducto came within one cell on the giant sheet, and LlamaExtract read the hard fax perfectly before LlamaParse dropped three-quarters of the sheet. But the deciding difference is elsewhere:

Only Unsiloed's confidence signal was actually useful. The others' scores were empty, attached to the wrong thing, in conflict with each other, or stuck at 1.0: there is no cutoff you could set on any of them that separates the right values from the wrong ones. None caught Reducto inventing a lab report and marking it "high", and none caught LlamaParse, Mistral, and Claude silently dropping 74%, 73%, and 21% of a dense sheet.

If you want a document extraction pipeline you can trust, run your own documents through Unsiloed's API.