A proof of address is edited in two minutes. Open the PDF in any editor, change the name or the address, export again, and at a glance it looks perfect. Whoever receives it on the other side —onboarding a customer, validating a tenant, filing a candidate— types the address and the amount by hand and trusts that the file arrived exactly as it left.
Multiply that by a thousand files a month. That’s hours of data entry, and zero certainty.
The problem isn’t reading the document
Reading text from an image has been a solved problem for years. Any generic OCR hands you the words on the bill. The problem is what comes next, and it’s three things plain OCR doesn’t give you:
- Structure. A wall of text isn’t a data point. “AV INSURGENTES SUR 1234” buried in the rest of the page is useless until someone decides that is the address. That someone is usually a person re-reading the PDF.
- Provenance. When a system tells you the amount is $842.00, which part of the page did it come from? Without that link you can’t audit anything: you either trust blindly or review everything by hand —exactly what you were trying to avoid.
- Integrity. The line that says “address” could have been edited. OCR reads it just as happily whether it’s real or pasted on top.
Why the amount and the date matter more than they seem
Here’s the detail you only see when you operate this daily: a proof of address doesn’t prove where you live, it proves when.
The amount on an electricity bill changes every billing period. So does the issue date. That’s why a bill works as proof of recency: not because it states your street —your ID does that— but because a bill with an amount and a date from two months ago proves the relationship with that address is still alive today.
And that’s why, when someone edits a bill to reuse it, they almost always touch two fields: the date, so it looks recent, and sometimes the amount, to make it add up. Those are exactly the two fields a serious process should scrutinize —and tie to their precise spot on the page, so a human confirms in one click instead of re-reading the whole document.
How we solved it
The approach is simple to state and less so to build: let the document enter the file already read.
- Automatic classification. You don’t tell it what the document is. It receives the file and figures out on its own whether it’s a payslip, a bank statement, a proof of address or an invoice —and, within “proof of address,” whether it’s electricity, water or gas—. No fixed catalog per bank or per provider: the same engine flattens issuers it has never seen.
- Every value, tied to its source. Each field comes out structured, with its confidence level and the coordinate on the page it was read from. Hovering over “address” highlights the exact line on the image. Auditing stops being re-reading.
- Tamper and consistency signals. The document is checked for traces of editing, and the values are cross-checked against each other: that the holder’s name agrees, that the date is recent, that the tax ID has the right shape for the person type.
None of this decides for you. It hands over the data and the signals; the call stays with your team. But the difference between “here’s the text, good luck” and “here’s each field, where it came from and how reliable it is” is the difference between manual capture and review-by-exception.
An example
You send the file and, seconds later, you get something like this over a webhook:
{
"status": "success",
"document_type": "recibo_cfe",
"category": "proof_of_address",
"issuer": "CFE",
"subtype": "electricity",
"document_date": "2026-07-18",
"document_age_days": 37,
"data": {
"holder": { "value": "MARIA LOPEZ GARCIA", "confidence": 0.98 },
"full_address": { "value": "AV. INSURGENTES SUR 1234, DEL VALLE, 03100, CDMX", "confidence": 0.95 },
"amount_cents": { "value": 84200, "confidence": 0.97 }
},
"consistency": { "overall": "match" },
"tamper": { "risk": "low" }
}
It detected the document type, issuer and subcategory on its own. document_age_days tells you at a glance how recent it is. And each value in data carries, in the full view, the location it was read from.
What to do now
Extraction isn’t verification —reading the amount on a bill doesn’t confirm it’s valid with the utility, and we say so plainly—. But it’s the first step to stop typing files by hand.
Upload a document in the test environment and see what comes back. It costs nothing.