🏦 StatementIQ · Bank Statement → JSON · Data / Finance

Every transaction, as JSON — and proof the numbers add up.

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.

Why use it

✅ The parse checks itself

Opening + credits − debits = closing. Every response says whether it closes — and by how much when it doesn't.

🎯 Row-level fault finding

When the statement prints a running balance, we name the exact rows that don't follow. Review three lines, not three hundred.

📚 Long statements are the easy case

Digital PDFs are read through their text layer in concurrent chunks. A 60-page statement is a normal request, not a timeout.

🔒 Zero retention, on our hardware

Documents are never stored, extracted data is never stored, bodies are never logged. No third-party AI vendor in the path.

🧾 Per-statement pricing

Quota counts statements, not pages. A 60-page statement is one call — because our inference cost is ~$0.

⚡ Async batch built in

Submit up to 25 statements, poll for results, and purge the job the moment you've read it.

The self-check

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.

status: "pass"

Opening + credits − debits equals the closing balance printed on the statement. The transaction list is arithmetically complete.

status: "fail"

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.

When the statement has no printed opening or closing balance, the status is "unavailable" — an honest third answer instead of a false pass.

Endpoints

POST /v1/statement-parse — one statement → JSON + reconciliation
POST /v1/statement-parse/batch — up to 25 statements, async
GET /v1/statement-parse/batch/{job_id} — poll results
DELETE /v1/statement-parse/batch/{job_id} — purge immediately
FieldTypeRequiredDescription
pdf_urlstringone sourcePublic URL of a PDF statement.
pdf_b64stringone sourceBase64-encoded PDF bytes.
image_urlstringone sourcePublic URL (or data: URI) of a scanned/photographed page.
image_b64stringone sourceBase64 image bytes.
textstringone sourceStatement text you've already extracted.
languagestringoptionalOutput language code (default en).
max_pagesnumberoptionalCap pages read from a PDF (default 120).

Example

Request
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" }'
Try it on the sample

A synthetic statement you can point the API at: sample-statement.pdf

Response
{
  "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"
}
amount is always positive — the sign lives in direction (credit = money in, debit = money out). On a credit-card statement a purchase is a debit and a payment to the card is a credit.

Pricing

Quota counts statements, not pages. The category's entry points are $499–$1,000/mo and the leader has no free tier at all.

PlanPrice / moQuotaOverage
Basic$050 statements/mo
Prorecommended$29500 statements/mo$0.09/statement
Ultra$992,500 statements/mo$0.055/statement
Mega$29910,000 statements/mo$0.035/statement

Need it inside your own perimeter?

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 →