- p4 · r17BALANCE_BREAKRunning balance differs from prior + credit − debit by ₹5,000.00.
- p3→p4 · r01CROSS_PAGE_TOTAL_MISMATCHBalance brought forward to page 4 differs from page 3's closing balance by ₹1,240.00.
- p2 · r04,r07DUPLICATE_TRANSACTION2 transactions share date 06 Apr and amount 2,500.00.
- p4 · r14OCR_LOW_CONFIDENCEDescription text OCR confidence below the 0.75 threshold.
Footed, cross‑footed, ticked.
ProofMart re-adds every row of a PDF bank statement, ticks each balance that agrees and rings each one that doesn’t, with the sum that proves it. Then one verdict: FAIL, REVIEW or CLEAR.
- No model in the path
- Deterministic rules over the page's own arithmetic. No LLM, no score.
- Same bytes, same verdict
- Every result records the engine version that produced it.
- Nothing kept signed out
- A signed-out upload is deleted as soon as its scan finishes.
| Row | Date | Description | Amount | Balance | Check | Note |
|---|---|---|---|---|---|---|
| 01 | 08 Apr | BALANCE B/F FROM PAGE 3 | p3 closed 23,760.00 | |||
| 02 | 08 Apr | UPI/swiggy@icici/2291 | −486.00 | 24,514.00 | ||
| 03 | 09 Apr | NEFT IN/REFUND-ORD-7790 | +1,299.00 | 25,813.00 | ||
| 04 | 10 Apr | POS/RELIANCE FRESH | −1,603.00 | 24,210.00 | ||
| 05 | 11 Apr | INT CREDIT Q4 | +790.00 | 25,000.00 | ||
| 06 | 12 Apr | SALARY CREDIT MERIDIANEMP | +84,120.00 | 1,09,120.00 | ||
| 07 | 12 Apr | UPI/rahul@ybl/456102 | −250.00 | 1,08,870.00 | ||
| 08 | 13 Apr | ATM WDL BLR-KRMR-013 | −5,000.00 | 1,03,870.00 | ||
| 09 | 14 Apr | POS/AMAZON RETAIL IN | −3,499.00 | 1,00,371.00 | ||
| 10 | 15 Apr | EMI/MTB-HOME LOAN 88112 | −32,180.00 | 68,191.00 | ||
| 11 | 16 Apr | RTGS IN/CLIENT-INV-1092 | +45,000.00 | 1,13,191.00 | ||
| 12 | 17 Apr | POS/BIGBASKET GROCERY | −2,140.00 | 1,11,051.00 | ||
| 13 | 18 Apr | UPI/mom@sbi/PERSONAL | −10,000.00 | 1,01,051.00 | ||
| 14 | 20 Apr | IMPS IN /INVOICE 2O81 | +0.00 | 1,01,051.00 | OCR read 0.62 < 0.75 | |
| 15 | 22 Apr | POS/APOLLO PHARMACY | −1,890.00 | 99,161.00 | ||
| 16 | 24 Apr | POS/UBER 5T4A9 | −14,951.00 | 84,210.00 | ||
| 17 | 25 Apr | IMPS IN/JOE-K PAYMENT | +12,500.00 | 84,210 + 12,500 = 96,710 | ||
| Carried to page 5, as printed | should read 96,710.00 | |||||
Tickmarks used on this site
- Agrees with prior balance ± the row
- Break: verdict FAIL
- Query: verdict REVIEW
- Footed: the column re-added
Click a finding. The page turns to it.
W/P AThis is the real rail, running a six-page sample. Pin a finding and it opens the page it lives on and rings the row. Drop your own PDF on it and the same engine reads that instead.
- No account needed
- Deterministic rules, no ML model
- Signed-out uploads deleted after the scan
Four passes, bytes to verdict.
W/P BEvery pass writes to the same address space (page, x, y), so each finding points at the exact glyphs that produced it. Same bytes in, same result out, every time.
| Pass | What it does | Writes | Sample time |
|---|---|---|---|
| 01Inspect | Confirms the bytes are a real PDF, then classifies it as text-based, scanned or mixed, with a confidence score. | pdfType · confidence · pages | 210 ms |
| 02Extract | Recovers every text run with its position on the page. Pages without a usable text layer go through OCR, run in-process. | runs · boxes · ocr | 1.4 s |
| 03Reconcile | Rebuilds the ledger from column positions, then re-checks it: running balances, page carry-forwards, date order, duplicates. | markers · evidence | 2.9 s |
| 04Decide | A fixed rule, not a score: any FAIL finding makes the verdict FAIL, else any REVIEW makes it REVIEW, else CLEAR. | verdict · findings · coordinates | 260 ms |
| Sample scan req_8fk2, 6 pages. Real documents vary with length and how many pages need OCR. | 4.77 s | ||
Six checks. Each one shows its work.
W/P CEvery marker is a narrow rule with a fixed verdict. When one fires, the finding carries the page, the box and the comparison it made, so a reviewer can check it by eye.
| Marker | Fires when | Cites | Verdict |
|---|---|---|---|
| BALANCE_ | Running balance disagrees with prior balance plus credit minus debit in a reconstructed ledger table. | row · math · box | FAIL |
| CROSS_ | Running balance fails to carry forward correctly across a page break. | row · page · box | FAIL |
| DATE_ | A row's date is earlier than the row immediately before it in a reconstructed ledger. | row · date · box | REVIEW |
| DUPLICATE_ | Two or more rows share an identical date and amount. | rows · match | REVIEW |
| OCR_ | Page classified as needing OCR: its text layer is unreliable or absent. | page · confidence | REVIEW |
| ENCODING_ | Broken font encoding or CID mapping detected somewhere in the document. | document · encoding | REVIEW |
Not checked yet: producer and template mismatches, and font-metric edits. We don’t have the evidence to run them honestly, so we don’t. A CLEAR verdict means these six checks found nothing, not that the document is authentic.
One verdict, and the evidence.
W/P DThe API returns JSON you can route on. A saved scan also exports as a signed PDF dossier that anyone can check, no account needed.
- verdict
- FAIL, REVIEW or CLEAR, or INCONCLUSIVE when no check had enough data to run. One field to route on.
- evidence.detail
- The comparison the marker made, so a reviewer can redo it by hand.
- coordinates[].rect
- Where, on which page, in PDF points. Draw it over the page and you are looking at the cell.
Dossiers are signed from a saved, signed-in scan at /api/documents/[id]/dossier and checked by anyone at /v1/verify-signature. Signed-out scans aren’t saved, so there is nothing to sign.
One POST. Same engine everywhere.
W/P ESend a PDF as multipart form data with your API key; the response arrives inline. The upload on this page, the API, webhooks and the CLI all run the same pipeline.
Upload
No accountThe live scan on this page. Drop, paste or pick a PDF and get real findings back.
drag · paste · clickREST API
API keyThree depths of the same pipeline: classify only, extract, or the full verification.
/v1/verify · /v1/extract · /v1/inspectWebhooks
API keyEvery verification also posts its result to your URL, HMAC-signed and retried on failure.
verification.completed · .failedCLI
API keyA small, dependency-free client for the same public API, for scripts and batch jobs.
proofmart verify statement.pdf
Flat monthly. No per-page metering.
W/P FStart free with the full engine. Upgrade when your team runs ProofMart inside a review or underwriting loop.
| Free₹0/ month | Pro₹999/ month | |
|---|---|---|
| For | For trying ProofMart against real documents before committing to a plan. | For teams running ProofMart in a review or underwriting loop. |
| Verify calls a month | 50 | 2,000 |
| Markers | All six, same engine | All six, same engine |
| Ways in | Upload, REST API, webhooks, CLI | Upload, REST API, webhooks, CLI |
| Support | — | Priority email support |
| Start free | Upgrade to Pro |
Prices in INR, billed monthly. A call is one /v1/verify request, whatever the page count. Every key is also rate-limited to 60 requests a minute on both plans.
Run it on a statement you already doubt.
The live scan takes a real PDF. No account, and the file is deleted when the scan finishes.
For your security review
Read how documents are handled- Storage
- Private blob store. No public URLs; reads need a server-held credential.
- Access
- Row Level Security on every table. You only ever see your own rows.
- Retention
- Signed-out uploads are deleted after the scan. Saved ones stay until you delete them.
- Processing
- Parsing and OCR run inside ProofMart. No document goes to a third-party AI.