Send a bank or credit-card statement — PDF, scan, or phone photo — and get back account holder, bank, period, opening and closing balance, and every transaction. Then get something no other statement API gives you: a reconciliation that checks the parse against the statement's own arithmetic.
Opening + credits − debits = closing. Every response says whether it closes — and by how much when it doesn't.
When the statement prints a running balance, we name the exact rows that don't follow. Review three lines, not three hundred.
Digital PDFs are read through their text layer in concurrent chunks. A 60-page statement is a normal request, not a timeout.
Documents are never stored, extracted data is never stored, bodies are never logged. No third-party AI vendor in the path.
Quota counts statements, not pages. A 60-page statement is one call — because our inference cost is ~$0.
Submit up to 25 statements, poll for results, and purge the job the moment you've read it.
A mis-parsed transaction isn't a typo — it's a bad lending decision. So we turned the scariest thing about the category into the feature we lead with. Bank statements ship with a built-in checksum, and we run it on every response.
Opening + credits − debits equals the closing balance printed on the statement. The transaction list is arithmetically complete.
The arithmetic doesn't close. We return the expected balance, the reported balance, and the exact difference — and tell you not to rely on the list without review. We say so rather than quietly handing back wrong numbers.
| Field | Type | Required | Description |
|---|---|---|---|
| pdf_url | string | one source | Public URL of a PDF statement. |
| pdf_b64 | string | one source | Base64-encoded PDF bytes. |
| image_url | string | one source | Public URL (or data: URI) of a scanned/photographed page. |
| image_b64 | string | one source | Base64 image bytes. |
| text | string | one source | Statement text you've already extracted. |
| language | string | optional | Output language code (default en). |
| max_pages | number | optional | Cap pages read from a PDF (default 120). |
curl -X POST \
"https://statements.carterstack.com/v1/statement-parse" \
-H "Content-Type: application/json" \
-H "X-API-Key: YOUR_KEY" \
-d '{ "pdf_url": "https://carterstack.com/sample-statement.pdf" }'
A synthetic statement you can point the API at: sample-statement.pdf
{
"account_holder": "JORDAN A. RIVERA",
"bank_name": "MERIDIAN NATIONAL BANK",
"account_number_masked": "****4417",
"account_type": "checking",
"currency": "USD",
"statement_period_start": "2026-06-01",
"statement_period_end": "2026-06-30",
"opening_balance": 4820.55,
"closing_balance": 8098.06,
"transactions": [
{ "date": "2026-06-02",
"description": "ACH DEPOSIT - MERIDIAN PAYROLL",
"amount": 3121.11,
"direction": "credit",
"running_balance": 7857.47,
"page": 1 }
],
"reconciliation": {
"status": "pass",
"total_credits": 6754.31,
"total_debits": 3476.80,
"expected_closing": 8098.06,
"reported_closing": 8098.06,
"difference": 0.0,
"transactions_counted": 22
},
"running_balance_check": {
"checked": 22, "consistent": 22,
"inconsistent": 0, "suspect_rows": []
},
"pages_read": 1, "source": "text"
}
Quota counts statements, not pages. The category's entry points are $499–$1,000/mo and the leader has no free tier at all.
| Plan | Price / mo | Quota | Overage |
|---|---|---|---|
| Basic | $0 | 50 statements/mo | — |
| Prorecommended | $29 | 500 statements/mo | $0.09/statement |
| Ultra | $99 | 2,500 statements/mo | $0.055/statement |
| Mega | $299 | 10,000 statements/mo | $0.035/statement |
For a bank or credit union that cannot send borrower financials off its own network at all, the same engine deploys inside your infrastructure — your hardware, your network, no egress. That's a direct conversation, not a self-serve plan.
Read the data posture →