.pdf → .jsonFree · 25 pages a month
Convert bank statements to JSON.
The JSON export is the most complete view of a conversion. It contains the normalised transactions, the statement metadata (institution, masked account number, period, opening and closing balances), the reconciliation result with each test's outcome, and a confidence value and flag list on every row.
- Balances checked before download
- No card required
- Original PDF deleted after 24 hours
Convert a statement to JSON
STEP 1 / 3Drop a PDF statement here, or
Choose a PDF- PDF only
- text-based or scanned
- password-protected
- up to 5 MB on the free plan
No card required. Files are checked as soon as they are added; originals are deleted 24 hours after processing.
- Protected in transit with TLS
- Original PDF deleted after 24 hours
- Delete-now control available
- See how we protect your data
What the JSON contains.
The complete view of a conversion: statement metadata, typed transactions with a confidence value and flag list on every row, the reconciliation result for each test, and the parser version that produced it.
Excerpt
{
"institution": "Northgate Bank",
"account_number_masked": "****2210",
"currency": "USD",
"statement_start_date": "2026-08-01",
"statement_end_date": "2026-08-31",
"opening_balance": "8420.00",
"closing_balance": "9300.63",
"transactions": [
{
"ordinal": 1,
"transaction_date": "2026-08-02",
"description": "Payroll deposit ACME Design LLC",
"debit": null,
"credit": "2500.00",
"amount": "2500.00",
"balance": "10920.00",
"source_page": 1,
"confidence": 1.0,
"flags": []
}
],
"validation": { "reconciled": true, "confidence": 1.0, "issues": [] },
"parser_version": "1"
}Shape of the normalized profile (fictional statement, abbreviated)
| Path | Example value | Notes |
|---|---|---|
institution | "Northgate Bank" | Detected from the header; may be null |
account_number_masked | "****2210" | Only the last digits are kept |
statement_start_date / statement_end_date | "2026-08-01" / "2026-08-31" | ISO 8601 dates |
opening_balance / closing_balance | "8420.00" / "9300.63" | Decimal strings, never floats |
transactions[2].description | "Check 1042" | Wrapped lines merged |
transactions[2].amount | "-1200.00" | Signed; debit and credit also provided |
transactions[2].source_page / source_bbox | 1 / [72.0, 412.5, 540.0, 424.0] | Where the row sits on the PDF page |
validation.reconciled | true | Balance and continuity tests passed |
validation.confidence | 1.0 | Weighted score between 0 and 1 |
Why convert bank statements to JSON here.
- 01
Precise money
Amounts are decimal strings, never floats, so 0.10 stays 0.10. Parse them with Decimal, BigDecimal or your language's equivalent.
- 02
Every row traceable
Each transaction carries source_page and source_bbox in PDF points, so you can render the page and highlight the row exactly as the review screen does.
- 03
Validation you can act on
The validation object reports the balance test, running-balance chain, period, duplicate, page-boundary and totals tests, plus a weighted confidence score and an issues list.
- 04
Normalized or raw
Normalized gives parsed values only. Raw keeps the original cell text next to each parsed value, useful for auditing the parser or handling an unusual layout yourself.
- 05
Stable, documented schema
Field names are part of the API contract. Multi-account envelopes carry schema_version and every document carries parser_version, so pipelines can detect changes.
- 06
Same data through the API
The JSON you download is the response to GET /api/v1/statements/{id}, so an integration built against the download works unchanged with the API.
How to convert a bank statement to JSON
Upload your statement
Drop a PDF into the converter above. Text and scanned files are accepted on every plan, password-protected PDFs from Starter, and you see the page count before anything else happens.
Choose JSON
Select JSON as the output, then normalized (clean, typed data) or raw (parsed values alongside the original cell text) in the export options.
Review the result
The extracted rows are shown next to the original page. Flagged rows carry a reason; click any row to see where it came from and edit, merge or split it.
Download or fetch
Download the .json file, or fetch the same document from the API once the conversion completes. Exports are regenerated whenever you edit.
JSON technical notes.
What each part of the document guarantees, so downstream code can rely on it without defensive parsing.
Types
money: "1234.56" strings
dates: YYYY-MM-DD
debit, credit and signed amount on every rowFlags
MERGED_DESCRIPTION
LOW_OCR_CONFIDENCE
AMBIGUOUS_DATE
AMBIGUOUS_AMOUNTValidation object
reconciled
confidence
component scores (balance, continuity, amounts, dates, structure, OCR, period)
issues[]Envelope and versions
single account: flat object
API reference
multi-account: { schema_version, accounts[] }
parser_version, generated_at
Bank statement to JSON: questions
JSON numbers are usually parsed as binary floats, which cannot represent 0.10 exactly. Decimal strings keep cents precise; parse them with a decimal type.
Normalized gives you parsed values only. Raw keeps the original text of each cell next to the parsed value, which is useful when you want to audit the parser or handle an unusual layout yourself.
Use source_page (1-based) and source_bbox (x0, y0, x1, y1 in PDF points) to draw a highlight over the page image, the same way the review screen does.
Field names are part of the documented API contract. Multi-account envelopes carry a schema_version; every document carries parser_version. Breaking changes are announced on the changelog.
Yes. The API accepts a PDF and returns the same JSON once the conversion completes. API access is included in paid plans.
No. This format starts on Starter; the free plan converts to CSV and Excel. Every plan reconciles and reviews the statement the same way; only the export format differs. See pricing.
Other bank statement converters
Convert your bank statement to JSON now.
Free plan: 25 pages a month, no card required.
25 pages per month · No card required · No bank login