Bank Statement PDF to CSV and JSON, Balance-Checked
Pricing
from $30.00 / 1,000 statement pages
Bank Statement PDF to CSV and JSON, Balance-Checked
Convert US bank and credit card statement PDFs to transaction rows, including scanned statements. Every statement is checked against its own opening and closing balances. No AI, and billed only for statements that produce transactions.
Pricing
from $30.00 / 1,000 statement pages
Rating
0.0
(0)
Developer
Akshay Nair
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
5 days ago
Last modified
Categories
Security
Limited permissionsShare
Turn US bank and credit card statement PDFs into clean transaction rows: date, description, signed amount and running balance. Scanned statements work too.
Every statement is checked against its own printed balances: opening balance + every row = closing balance. You get told whether it adds up, so you know which conversions to trust without reading them line by line.
Why use it
- Checked, not guessed. Each statement comes back
balanced,off(with the exact difference) orunchecked. There's no LLM involved, so it can't invent a transaction. - Reads scans. Image-only PDFs go through built-in OCR at no extra charge.
- Handles real statement layouts. Separate debit and credit columns, tables grouped by type with unsigned amounts, checks listed several to a line, descriptions that wrap, statements with no year printed, and several accounts in one PDF.
- Credit cards too. Charges come out as money out, and the check runs against the balance owed.
- You only pay for results. Files that are unreadable, password-protected or contain no transactions aren't billed.
How to use it
- Point the actor at your PDFs, either way:
- Links to statement PDFs: paste direct links (signed S3, Drive or Dropbox links work).
- Stores with PDFs: choose key-value stores in your Apify account that hold the PDFs. Every PDF in a chosen store is read, and the actor gets read access to those stores only.
- Click Start.
- Get all transactions from the Output tab, as CSV, JSON, Excel or through the API.
Common uses: bookkeeping catch-up, loan and mortgage document processing, tax preparation, and feeding statements into accounting tools or AI agents. Banks usually export CSV for only recent activity, so older history often exists only as PDFs.
Input
| Field | What it does |
|---|---|
statements | Direct links to the PDFs. |
statementStores | Key-value stores in your account holding PDFs (records ending in .pdf). |
statementYear | Year to use for statements that print no year anywhere. Optional; defaults to the current year. Statements that print a year ignore it. |
Give at least one link or store.
{"statements": ["https://statementtospreadsheet.com/sample-statement.pdf"]}
Output
One dataset row per transaction, across all statements. Money out is negative.
{"statement": "sample-statement.pdf","date": "2025-12-28","description": "COFFEE CORNER #12","amount": -45.1,"balance": 954.9,"statementStatus": "balanced"}
A SUMMARY record in the run's key-value store, with one report per statement:
{"statement": "sample-statement.pdf","status": "balanced","pages": 1,"transactions": 4,"scanned": false,"yearAssumed": false,"card": false,"accounts": 1,"openingBalance": 1000,"closingBalance": 1764.75,"computedBalance": 1764.75,"difference": 0,"csvKey": "1-sample-statement.csv","note": "Opening balance plus every row equals the closing balance."}
A CSV for each statement, in the same store under its csvKey, ready for Excel or Google Sheets.
What each status means
| Status | Meaning | Billed? |
|---|---|---|
balanced | Opening balance plus every row equals the closing balance. | Yes |
off | The rows don't add up, usually because OCR misread a figure on a scan. difference says by how much. Check before relying on it. | Yes |
unchecked | Rows were found, but not the opening and closing balances. | Yes |
no-transactions | Nothing recognizable as transactions. | No |
password-protected | Remove the password and try again. | No |
unreadable | Not a readable PDF. | No |
download-failed | The file couldn't be fetched. note says why. | No |
over-budget | Your run's spending limit doesn't cover this statement, so it was skipped. | No |
Pricing
Pay per page, for statements that produce transactions, including their legal and marketing pages. There's no subscription. Set a maximum cost per run in Apify and the actor stops before going over it.
What it works with
US checking, savings and credit card statements in US dollars. It has been tested on statements in the layouts of Chase, Bank of America, Wells Fargo, Capital One, U.S. Bank, PNC, Navy Federal, USAA, Ally, Huntington, KeyBank, Chime and SoFi.
Limits to know about:
- Non-US statements aren't supported yet: day-first dates, other currencies and European number formats won't read correctly.
- OCR can misread figures on faint or fax-quality scans. The balance check catches this, and the statement comes back as
offinstead of looking fine. - Banks change their layouts. If yours comes back as
no-transactions, please open an issue on the Issues tab.
Privacy
Your files are processed on Apify's servers during the run. The actor reads only the links and stores you give it and sends your data nowhere else: no AI services and no third-party APIs. It doesn't write statement contents or file names to the run log. Results are saved in your own Apify storage, under your storage retention settings.
Want nothing uploaded at all? statementtospreadsheet.com does the same conversion entirely in your browser.
Disclaimer
Output is provided as-is. It isn't accounting, tax or financial advice, so check important figures against the original statement. This actor isn't affiliated with any bank named above.