How Lenders Verify Bank Statements — and the Forgery Layer They Miss

This article is a snapshot — content was accurate as of July 2026 (code examples tested against the API as of June 2026). The product evolves actively; specific counts, examples, and detection rules may have changed since publication — see the changelog for the current state.
A borrower submits a three-month bank statement to support a loan application. The deposits line up with the stated salary. The running balance never dips below the threshold. The bank logo is crisp, the columns are aligned, the totals add up. Your underwriter cross-checks the numbers, sees nothing out of place, and clears the file.
Every step of that review was done correctly. And the document could still be forged.
The reason is that the manual verification process checks whether the content of a statement is plausible. It was never designed to check whether the file itself was edited after the bank produced it. Those are two different questions, and a borrower who opens the real PDF in an editor and types over one number defeats the second one completely — while passing the first without trouble.
This article walks through how lenders and underwriters actually verify bank statements today, exactly where that process breaks on a well-altered PDF, and the structural forensic layer that closes the gap. It is written for risk and fraud operations teams, not developers — though there is a short integration section at the end.
How Lenders Verify Bank Statements Today
Bank statement verification in lending is a layered process. No single check carries the decision; underwriters build confidence by stacking several. Here is what a competent manual review actually does.
Cross-check deposits against the pay cycle. The underwriter confirms that the income claimed on the application actually lands in the account, on a regular cadence, in amounts consistent with the stated salary. A borrower claiming $6,000/month in W-2 income should show roughly that, roughly twice a month, on predictable dates. Irregular timing or amounts that don’t match the employer’s pay schedule are flagged.
Trace large or irregular deposits. Most lenders require any non-payroll deposit above a set threshold — often around $200 for mortgages — to be sourced and seasoned. Sourced means the borrower can prove where the money came from. Seasoned means it has been in the account long enough (commonly 60 days) to rule out a last-minute borrowed lump sum dressed up as savings.
Check the running balance math. The closing balance of one day should equal the opening balance of the next. Each line should move the balance by exactly the transaction amount. Underwriters scan for arithmetic that doesn’t reconcile — a balance that jumps without a matching transaction, or a total that doesn’t follow from the lines above it.
Look for round numbers and patterns that look wrong. Genuine spending is messy: $4.37 here, $112.94 there. Suspiciously clean figures — a deposit of exactly $5,000.00, a balance that always ends in round hundreds — get a second look, because fabricated numbers tend to be tidy.
Verify against the source. The strongest manual checks reach outside the document. The underwriter may call the issuing bank, request a verification of deposit, or confirm employment directly with the employer. Increasingly, lenders skip the document entirely and pull the data through an open-banking connection like Plaid — connecting straight to the bank’s own API so the borrower never hands over a PDF at all.
Each of these is a real, valuable control. Stacked together they catch a great deal of fraud — clumsy fakes, inconsistent stories, deposits that don’t reconcile. The question is not whether this process works. It is what it was built to verify.
The One Thing the Checklist Doesn’t Verify
Read that list again and notice the common thread: every check verifies whether the numbers on the page are plausible. Do the deposits match the pay cycle? Does the balance reconcile? Is the large deposit sourced? These are content questions. They ask, “Could a real account have produced these figures?”
None of them ask the other question: “Was this file edited after the bank generated it?”
That is the gap a competent forger lives in. Consider what actually happens in the most common bank statement fraud case in lending:
- The borrower logs into their real bank portal and downloads their real statement as a PDF.
- They open it in a desktop or online PDF editor.
- They change one number — inflate a balance, raise a deposit, delete an overdraft line.
- They re-save and upload.
The result is a document where the layout is the bank’s real template, the logo is the bank’s real logo, the fonts are right, and — critically — the forger had every opportunity to make the edited numbers internally consistent. They can recompute the running balance by hand so it reconciles. They can pick a deposit amount that matches the stated pay cycle. They can avoid round numbers. A patient borrower produces a file that passes every content check on the underwriter’s list, because the content was tuned specifically to pass those checks.
Visual review fares no better. On screen, an edited number is indistinguishable from an original one — the editor renders it in the same font, at the same position. The human eye has nothing to catch.
This is why bank statement fraud is so persistent. According to fraud-analytics firm SEON, bank statements are the single most commonly falsified document in lending applications, cited in a majority of fraudulent loan files. They are easy to obtain, trivial to edit with free tools, and — once edited carefully — invisible to a process designed to verify content rather than file integrity.
What Open Banking Solves, and What It Doesn’t
Open-banking connectors like Plaid are the strongest answer to this problem, and it would be dishonest to pretend otherwise. When a borrower links their account through Plaid, the lender pulls transaction data straight from the bank’s API. There is no PDF in the loop, so there is nothing to edit. For applicants whose institution is supported and who consent to connect, this is the gold standard for income source-of-truth checks. HTPBE? does not replace it, and you should keep it.
But open banking has a coverage boundary, and fraud concentrates exactly at that boundary.
- Unsupported institutions. Plaid and its peers connect to a large but finite set of banks. Borrowers at smaller credit unions, regional banks, or non-US institutions often can’t connect at all.
- International income. Lenders serving immigrants, expats, and cross-border earners routinely see statements from banks no open-banking network reaches.
- Applicants who simply won’t connect. Some borrowers decline the bank link — out of privacy concern, friction, or because they have something to hide — and fall back to uploading a PDF.
- Product types that lean on documents. BNPL, merchant cash advance, and many alternative-lending products still take PDF statements as a primary input.
In every one of these cases, the lender is back to a human reviewing an uploaded PDF — the exact scenario where content checks can’t see an edit. Open banking removes the document for the applicants it covers. For everyone else, the document is the only evidence, and its integrity goes unchecked. KYC and identity platforms don’t fill this gap either: they confirm who is applying — face match, ID document, watchlist — not whether a submitted financial PDF was altered.
That uploaded-PDF case is precisely where a structural layer earns its place. It is additive: it catches what open banking sidesteps and what the manual checklist can’t see.
The Missing Layer: Structural File Forensics
A PDF is not a flat picture. It is a structured file with an internal record of how it was built and saved — when it was created, what software produced it, whether it carries a digital signature, and how many times it was written to disk. When someone opens a bank’s original PDF and saves an edit, that act leaves traces in the file’s structure, regardless of how plausible the visible numbers are.
Structural forensics reads that internal record and returns a verdict. It never looks at whether $6,000 is a believable salary — that’s the underwriter’s job and the content layer’s job. It looks at whether the file’s own construction is consistent with a clean, single-pass export from an institutional banking system, or whether it bears the marks of having been opened and re-saved in an editing tool after the fact.
HTPBE? is a self-serve API that performs exactly this analysis. You send it a PDF; it returns one of three verdicts plus a list of named markers describing what it found. Crucially, it is not a KYC or identity vendor and was never meant to be one — it answers a single, narrow question: was this file altered after it was created?
The three verdicts
intact— no evidence of post-creation modification, and the file looks like a genuine institutional export. The structural layer found nothing to flag.modified— the file carries forensic evidence that it was changed after it was first generated. This is the case that matters most for fraud: a statement that should be a clean bank export but instead shows the fingerprints of an editing session.inconclusive— the file was produced by consumer software, an online editor, or a scanner, so there is no institutional baseline to check integrity against. This is not a pass. It is a routing signal, and in lending it is often the most useful verdict of all (more on that below).
What it actually catches — in plain terms
Without turning this into a how-to for forgers, here is the kind of structural evidence the analysis surfaces, described as outcomes rather than recipes:
- Editing-tool fingerprints. Genuine bank statements are produced by server-side institutional systems. When a file instead carries the signature of a consumer PDF editor or an online conversion service, that origin is inconsistent with a real bank pipeline. The marker
HTPBE_EDITING_TOOL_FINGERPRINTflags this. - Disagreeing internal timestamps. A clean export’s creation and modification timestamps line up. When they contradict each other — the file claims to have been created on one date but was last written days later — that gap is recorded structurally even though it’s invisible on the page.
HTPBE_DATES_DISAGREEcovers this. - Multiple revision layers. Each time a PDF is edited and saved, the change is appended as a new layer on top of the original. A document that should have been generated in a single pass but instead shows several stacked write sessions reveals that it was modified after creation. The marker is
HTPBE_MULTIPLE_REVISION_LAYERS. - Producer identity that’s been overwritten or spoofed. Some tools try to disguise their involvement by rewriting the file’s stated generator. When that identity has been blanked or forged, the analysis flags it (
HTPBE_IDENTITY_OVERWRITTEN,HTPBE_PRODUCER_IDENTITY_FORGED). - Tampering around a digital signature. Where a statement is digitally signed, the analysis detects content changed after signing (
HTPBE_POST_SIGNATURE_EDIT) or a signature stripped off entirely (HTPBE_SIGNATURE_REMOVED). These are among the most conclusive signals there are.
None of these depend on the visible numbers being implausible. A perfectly reconciled, perfectly tidy forged balance still sits inside a file that was edited — and the edit is what gets caught.
Want to see it on a real document? You can drop a PDF into the free check on this site and get a verdict in a few seconds — no account needed. It’s the same engine the API runs, and it’s a fast way to sanity-check a single suspicious statement before you decide whether to wire it into your intake.
What inconclusive Means in a Lending Context
The inconclusive verdict is the one that trips people up, so it’s worth being precise.
inconclusive means the file was created in software that anyone can use to build a document from scratch — Word, Excel, an online editor, a scanner. Because there’s no institutional baseline, the structural layer can’t say whether the content was tampered with. It’s telling you, honestly, “I can’t verify integrity here.”
The power of that verdict comes from context — specifically, what bank the borrower claims it’s from.
Major retail banks generate their statements on server-side institutional systems. A statement that genuinely came from one of them should look like an institutional export. So if a borrower hands you a statement claiming to be from a large bank, and the analysis returns inconclusive because the file was actually built in a word processor or run through an online editor, the verdict is doing real work: a real statement from that bank would not look like that. That mismatch is a reason to escalate, not to wave through.
The same inconclusive verdict on a statement from a small credit union or a fintech neobank — where consumer-style export is genuinely normal — is routine, and you’d treat it as such. The verdict is identical; the action depends on whether the claimed issuer is supposed to produce institutional files. Used this way, inconclusive isn’t a dead end. It’s a fork in your workflow.
Honest Limits — What This Layer Cannot Catch
Structural forensics is a powerful additional control, not a fraud oracle. Two scenarios sit outside its reach, and a serious fraud team should know them.
Documents fabricated entirely from scratch in the right kind of software. If a forger doesn’t edit a real bank export but instead builds a fake statement from zero using a tool that produces institutional-looking output, there is no “original” to compare against and no editing event to detect. The file may look clean structurally because, structurally, it is a clean single-pass file — it just contains invented data. This is why the layer complements rather than replaces content checks and source verification: open-banking data, verification of deposit, and calling the bank remain the right controls for fabricated-from-scratch fraud. The structural layer’s strength is the far more common case — editing a real document.
Legitimately consumer-generated statements. Some smaller institutions really do export through generic print drivers or consumer tools. For those, inconclusive is the correct and expected verdict, and reading it as guilt would generate false positives. The signal only carries weight when the claimed issuer has an institutional baseline to deviate from.
Being upfront about these limits is the point. The structural layer is designed to slot alongside your existing verification process — catching the altered-PDF case that content checks and open banking can’t — not to be a single switch that decides applications on its own. The same mechanics apply to income documents: altered paystubs and W-2s slip past underwriting in exactly the same way.
Wiring It Into Your Intake
For teams that decide the structural layer belongs in their workflow, integration is deliberately small. The pattern is three steps.
1. Analyze the uploaded PDF. When a borrower uploads a statement, send its URL to the analyze endpoint. There is no numeric risk score to interpret — you get a verdict and named markers.
curl -X POST https://api.htpbe.tech/v1/analyze \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"url": "https://your-storage.example.com/statements/applicant-7821.pdf"}'The response is just the check ID:
{ "id": "506a6b1b-1360-48a2-b389-abb346f85d04" }2. Fetch the verdict. Retrieve the result by ID. The response is a flat object — the two fields your policy cares about are status and modification_markers.
curl https://api.htpbe.tech/v1/result/506a6b1b-1360-48a2-b389-abb346f85d04 \
-H "Authorization: Bearer YOUR_API_KEY"{
"status": "modified",
"modification_markers": ["HTPBE_EDITING_TOOL_FINGERPRINT", "HTPBE_DATES_DISAGREE"],
"modification_confidence": "certain"
}3. Route on the verdict. Wire the three outcomes into your existing review queue rather than auto-deciding on any single marker:
modified→ route to manual review, request a fresh download direct from the bank portal, or — for the most conclusive markers like a post-signature edit — reject.inconclusive→ branch on the claimed issuer. A consumer-software origin on a statement claimed to be from a major bank is worth escalating; the same verdict from a neobank is routine.intact→ no structural evidence of alteration; proceed with your normal content verification.
Store the check ID against the application record. If a credit decision is ever disputed, the forensic result is retrievable as a permanent audit trail showing exactly which structural signals fired — useful for both compliance and chargeback defense.
Who Should Add This Layer
If you run risk or fraud operations at an alternative lender, a fintech, a BNPL or MCA provider — anywhere a meaningful share of applicants upload PDF bank statements instead of connecting through open banking — this is the gap in your stack worth closing. Your underwriters are already verifying content well. What they cannot see, by design, is whether the file in front of them was edited after the bank made it. That blind spot is exactly where careful borrowers operate, and it’s exactly what a structural layer covers.
For a deeper look at how this works as a workflow rather than a single call, see the fake bank statement detection use case. When you’re ready to put a verdict behind your intake, the self-serve API is documented end-to-end with test keys you can wire up before you spend a credit.