Benchmark methodology
The accuracy numbers on the front page are one run of one corpus with published rules, not a marketing aggregate. This page describes exactly what was measured, how matches are decided, and what we do not claim. Per-document results and the scoring code are available on request.
Canonical run, July 22, 2026. Claude Sonnet 4.6 on AWS Bedrock (the Managed profile), single pass, no retries. Every document in the corpus is included.
The corpus
37 filled documents. 28 come from five complete residential real-estate transaction packets: sale contracts, financing and appraisal riders, seller disclosures, lead-based-paint disclosures, inspection notices, broker compensation riders, and final walk-through notices, filled end to end as five coherent transactions (consistent parties, prices, and dates within each packet). The remaining 9 are the original real-world set: scanned paperwork, handwritten entries, and service orders with pricing tables, the documents that motivated the product. The corpus lives outside the repository and contains no customer data.
Ground truth
Packet ground truth is generated programmatically from the same data used to fill the forms, so there is no transcription step to introduce errors: the value the form was filled with is the value the extractor is graded against, recorded as printed on the page. The real-world set's ground truth was human-verified field by field. Absent values are recorded explicitly; the extractor is graded on reporting them as absent, not just on what it finds.
Scoring rules
- Fields: normalized exact match, no partial credit. Case, whitespace, number formatting ("$425,000.00" equals 425000), date separators, and unicode dash variants are unified before comparison; None, empty, "none", and "null" all count as absent. Anything else that differs is simply wrong: a transposed digit scores zero.
- Tables: cell-level F1 with greedy row alignment. Rows are matched by cell overlap so row order does not matter, then scored per cell: precision against extracted cells, recall against ground-truth cells. A 40-cell table with one wrong cell scores 0.975, not zero. The published number averages F1 across all tables in the corpus.
- Q&A: the expected answer must appear in the model's answer. A match is normalized equality, or the expected answer's tokens appearing contiguously inside the model's answer after function words (articles, prepositions, conjunctions) are dropped from both sides. Containment is one-directional on purpose: a terse expected answer must appear inside the verbose response, never the reverse, so a bare "No" can never match against "Notary". Multi-part answers require every part present.
What we do not claim
These numbers are measured on documents we filled or collected, with schemas we wrote. Your documents, your scans, and your schemas will differ, and the honest way to find out is to measure. That is exactly the design-partner offer: send ten of your real documents and you get back verified JSON and a per-document accuracy report scored with these same rules, free.
Send us your worst documents