The most expensive word in document AI is a confident guess
A language model would rather invent an IBAN than admit the scan is blurry. In a demo that looks like magic; in lending, onboarding or payouts it is a landmine. A single hallucinated income figure poisons a whole scorecard, and nobody finds out until the audit — or the default.
Fieldry is built on the opposite rule: missing means null, never invented. This post explains the three mechanisms that enforce it and how to work with them.
Mechanism 1: Grammar-constrained generation
The interpreter doesn't free-write JSON. Generation is constrained to your schema — types, required fields, enums — so structurally invalid output can't happen in the first place. Across our fixture suite this holds schema-validity at or above 99%.
That covers shape. Values are the harder problem, which is why constraints alone aren't the story.
Mechanism 2: Null-honesty with status
Every field resolves to one of three outcomes:
| Outcome | Meaning | Your move |
|---|---|---|
value + high confidence |
Found and trusted | Use it |
value + low confidence |
Found but uncertain | Review threshold routes it to a human |
null + status: missing |
Not on the document | Treat as absent, request resubmission, or skip |
The third row is the one most parsers get wrong. They backfill, interpolate, or copy a nearby number. We return null. Downstream code can branch on status instead of sniffing for suspicious values.
Never treat null as zero. A missing total and a zero total are different business facts — your schema consumers must handle missing as its own case.
Mechanism 3: Evidence you can click
Each value carries confidence, page number, source text and a normalized bounding box. An auditor — or your own QA script — samples values and lands on the exact source line. Evidence turns "trust the model" into "verify in one click."
Set review thresholds per field, not per document. A 0.99 invoice number and a 0.62 smudged date deserve different fates, and the API gives you the numbers to split them.
Putting it together
A robust pipeline looks like this: extract with a described schema, auto-accept high-confidence values, queue low-confidence ones with their evidence attached, and branch on missing explicitly. No repair loops, no silent defaults, no surprises at audit time.
Common questions
Slightly — and that's the point. A null routes to a fast human check; a hallucination routes to a loss. Measure automation on correct decisions, not on untouched documents.
Start at 0.85 per field (our review_required default), then tune from your own correction logs. High-stakes fields like amounts deserve higher bars than names.
Yes — the evidence snippet and bbox show exactly what the model read. Blurry source, cropped edge, or genuinely ambiguous handwriting: you'll see which.
No. Confidence, page, text and bbox ship on every value, free. Competitors charge for citations or confidence — we consider them the product, not the upsell.