Skip to content

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.
Statement of account · XXXX-XX-4821B-4Page 4 of 608–25 APR 2025INRSample
Schedule B-4 · page 4 of the sample statement, re-footed
RowDateDescriptionAmountBalanceCheckNote
0108 AprBALANCE B/F FROM PAGE 325,000.00p3 closed 23,760.00
0208 AprUPI/swiggy@icici/2291−486.0024,514.00
0309 AprNEFT IN/REFUND-ORD-7790+1,299.0025,813.00
0410 AprPOS/RELIANCE FRESH−1,603.0024,210.00
0511 AprINT CREDIT Q4+790.0025,000.00
0612 AprSALARY CREDIT MERIDIANEMP+84,120.001,09,120.00
0712 AprUPI/rahul@ybl/456102−250.001,08,870.00
0813 AprATM WDL BLR-KRMR-013−5,000.001,03,870.00
0914 AprPOS/AMAZON RETAIL IN−3,499.001,00,371.00
1015 AprEMI/MTB-HOME LOAN 88112−32,180.0068,191.00
1116 AprRTGS IN/CLIENT-INV-1092+45,000.001,13,191.00
1217 AprPOS/BIGBASKET GROCERY−2,140.001,11,051.00
1318 AprUPI/mom@sbi/PERSONAL−10,000.001,01,051.00
1420 AprIMPS IN /INVOICE 2O81+0.001,01,051.00OCR read 0.62 < 0.75
1522 AprPOS/APOLLO PHARMACY−1,890.0099,161.00
1624 AprPOS/UBER 5T4A9−14,951.0084,210.00
1725 AprIMPS IN/JOE-K PAYMENT+12,500.0091,710.0084,210 + 12,500 = 96,710
Carried to page 5, as printed91,710.00should 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
Whole statement, live: W/P A

Click a finding. The page turns to it.

W/P A

This 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
meridian_apr25_statement.pdf6 pages · 2.1 MB · 4.8s
FAIL4 findings
PAGE 04 · 08–25 APR 2025continued from p3MERIDIAN TRUST BANKStatement of AccountACCOUNTXXXX-XX-4821HOLDERRajesh SharmaPRODUCERMicrosoft Word 2016#DATEDESCRIPTIONDEBITCREDITBALANCE0108 AprBALANCE B/F FROM PAGE 3··25,000.000208 AprUPI/swiggy@icici/2291486.00·24,514.000309 AprNEFT IN/REFUND-ORD-7790·1,299.0025,813.000410 AprPOS/RELIANCE FRESH1,603.00·24,210.000511 AprINT CREDIT Q4·790.0025,000.000612 AprSALARY CREDIT MERIDIANEMP·84,120.001,09,120.000712 AprUPI/rahul@ybl/456102250.00·1,08,870.000813 AprATM WDL BLR-KRMR-0135,000.00·1,03,870.000914 AprPOS/AMAZON RETAIL IN3,499.00·1,00,371.001015 AprEMI/MTB-HOME LOAN 8811232,180.00·68,191.001116 AprRTGS IN/CLIENT-INV-1092·45,000.001,13,191.001217 AprPOS/BIGBASKET GROCERY2,140.00·1,11,051.001318 AprUPI/mom@sbi/PERSONAL10,000.00·1,01,051.001420 AprIMPS IN /INVOICE 2O81·0.001,01,051.001522 AprPOS/APOLLO PHARMACY1,890.00·99,161.001624 AprPOS/UBER 5T4A914,951.00·84,210.001725 AprIMPS IN/JOE-K PAYMENT·12,500.0091,710.00CARRIED TO P591,710.00MERIDIAN TRUST BANK LIMITED · REGD. OFFICE MERIDIAN HOUSE, MUMBAICIN U65999MH2020PLC000000 · SAMPLE FOR DEMONSTRATIONPAGE 4 / 6
page4of 6
SAMPLE · synthetic document. Drop, paste, or click to try a real one
FINDINGS
2 FAIL2 REVIEW0 CLEAR
Click or Enter to pin · Esc to clearproofmart.shop/d/req_8fk2

Four passes, bytes to verdict.

W/P B

Every 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.

The four passes of a verification, with sample timings
PassWhat it doesWritesSample time
01InspectConfirms the bytes are a real PDF, then classifies it as text-based, scanned or mixed, with a confidence score.pdfType · confidence · pages210 ms
02ExtractRecovers every text run with its position on the page. Pages without a usable text layer go through OCR, run in-process.runs · boxes · ocr1.4 s
03ReconcileRebuilds the ledger from column positions, then re-checks it: running balances, page carry-forwards, date order, duplicates.markers · evidence2.9 s
04DecideA fixed rule, not a score: any FAIL finding makes the verdict FAIL, else any REVIEW makes it REVIEW, else CLEAR.verdict · findings · coordinates260 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 C

Every 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 catalogue
MarkerFires whenCitesVerdict
BALANCE_BREAKArithmeticRunning balance disagrees with prior balance plus credit minus debit in a reconstructed ledger table.row · math · boxFAIL
CROSS_PAGE_TOTAL_MISMATCHArithmeticRunning balance fails to carry forward correctly across a page break.row · page · boxFAIL
DATE_SEQUENCE_ANOMALYSemanticA row's date is earlier than the row immediately before it in a reconstructed ledger.row · date · boxREVIEW
DUPLICATE_TRANSACTIONSemanticTwo or more rows share an identical date and amount.rows · matchREVIEW
OCR_LOW_CONFIDENCEExtractionPage classified as needing OCR: its text layer is unreliable or absent.page · confidenceREVIEW
ENCODING_ANOMALYExtractionBroken font encoding or CID mapping detected somewhere in the document.document · encodingREVIEW

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 D

The API returns JSON you can route on. A saved scan also exports as a signed PDF dossier that anyone can check, no account needed.

POST /v1/verify200 OK · application/jsonSample
{
"requestId": "req_8fk2",
"verdict": "FAIL",
"classification": {
"pdfType": "TextBased",
"documentKind": "bank_statement"
},
"findings": [
{
"markerId": "BALANCE_BREAK",
"verdict": "FAIL",
"severity": "critical",
"evidence": {
"summary": "Running balance differs by ₹5,000.00",
"detail": "84,210.00 + 12,500.00 = 96,710.00 · shows 91,710.00",
"coordinates": [
{ "page": 4, "rect": { "x": 26, "y": 653, "w": 590, "h": 24 } }
]
}
},
…3 more
],
"processing": { "processingTimeMs": 4800, "markersRun": […6] }
}
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.
ProofMart dossierreq_8fk2.dossier.pdfSample
Subjectmeridian_apr25_statement.pdf
VerdictFAIL4 findings · 2 fail, 2 review
  • 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.
Signeded25519 · check it at /v1/verify-signature

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 E

Send 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.

terminalPDF up to 20 MBSample
$ curl https://proofmart.shop/v1/verify \
-H "Authorization: Bearer $PROOFMART_API_KEY" \
-F "file=@meridian_apr25.pdf"
# 200 OK, summarised
FAIL 4 findings
break BALANCE_BREAK p4 · r17
break CROSS_PAGE_TOTAL_MISMATCH p3 → p4
query DUPLICATE_TRANSACTION p2 · r04,r07
query OCR_LOW_CONFIDENCE p4 · r14
  1. Upload

    No account

    The live scan on this page. Drop, paste or pick a PDF and get real findings back.

    drag · paste · click
  2. REST API

    API key

    Three depths of the same pipeline: classify only, extract, or the full verification.

    /v1/verify · /v1/extract · /v1/inspect
  3. Webhooks

    API key

    Every verification also posts its result to your URL, HMAC-signed and retried on failure.

    verification.completed · .failed
  4. CLI

    API key

    A 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 F

Start free with the full engine. Upgrade when your team runs ProofMart inside a review or underwriting loop.

Plans compared
Free₹0/ monthPro₹999/ month
ForFor trying ProofMart against real documents before committing to a plan.For teams running ProofMart in a review or underwriting loop.
Verify calls a month502,000
MarkersAll six, same engineAll six, same engine
Ways inUpload, REST API, webhooks, CLIUpload, REST API, webhooks, CLI
Support—Priority email support
Start freeUpgrade 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.

Create an account
Prepared byProofMart engine v0.9.14
Checks run6 markers, every balance re-added
Reviewed byyou

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.