parsr.
Document API for AI agents · EU-sovereign by default

Bank statements to JSON, in one API call.

Parse PDFs and images of bank statements, payslips, and receipts into structured JSON. Built for AI bookkeeping agents. EU and US regions, sovereign infrastructure, self-serve from €29/mo.

EU compute live · Exoscale Zürich
·200 free pages / mo + 500 signup credits·Built by Angelo, ex-BIS Control Rooms
python
from parsr import Parsr

parsr = Parsr(api_key="sk_eu_live_…")

result = parsr.parse_bank_statement(
    document="statement.pdf",
)

print(result.transactions[0])
# {
#   "date": "2026-04-15",
#   "description": "Salary payment",
#   "amount": 4250.00,
#   "currency": "EUR",
#   "confidence": 0.98,
#   "bbox": {"page": 1, "x": 412, "y": 188, "w": 88, "h": 14}
# }
parsr-python · v1.xRun this in 60 seconds
Why parsr

Three reasons teams switch

EU-sovereign by default

Region-bound API keys

EU keys hit Exoscale Zürich; US keys hit Hetzner Ashburn. Documents stay in their region — enforced at the key level, not your code.

Built for AI agents

Native LangChain, LlamaIndex, MCP

First-class tool wrappers and an MCP server. Drop into an agent loop in three lines instead of fighting through SDKs.

Developer-first pricing

From €29/mo, no quotes

Every plan ships every endpoint. Free tier needs no credit card. Cached re-uploads are free. Sandbox keys are unlimited.

What parsr extracts

One endpoint, every layout

All extractions ship with confidence scores, bounding boxes, and schema validation. Bank statements add a balance-chain check (opening + Σtransactions = closing) so sign errors never leak into your ledger.

NORDIC TRUST BANK · April 2026
Apr 03 · Salary payment+2,500.00
Apr 05 · Rent-1,200.00
Apr 08 · Café Lumière-15.00
Apr 11 · Albert Heijn-87.50
Apr 14 · Stripe payout+1,840.21
Apr 18 · NS · train-42.10
Apr 22 · Stripe payout+1,200.00
Apr 28 · Spotify-9.99
Closing balance2,159.59 EUR

Synthetic document · 12-page PDF · 47 transactions · 2.1s

json
{
  "schema_version": "bank_statement.v1",
  "result": {
    "institution_name": "NORDIC TRUST BANK",
    "account_iban": "BE12 3456 7890 1234",
    "currency": "EUR",
    "statement_period_start": "2026-04-01",
    "statement_period_end":   "2026-04-30",
    "opening_balance": 1000.00,
    "closing_balance": 2159.59,
    "transactions": [
      {
        "posted_date": "2026-04-03",
        "description": "Salary payment",
        "amount": 2500.00,
        "balance_after": 3500.00,
        "type": "credit",
        "confidence": 0.98
      },
      {
        "posted_date": "2026-04-05",
        "description": "Rent — Vesterbrogade 42",
        "amount": -1200.00,
        "balance_after": 2300.00,
        "type": "debit",
        "confidence": 0.99
      }
    ]
  },
  "warnings": []
}

Confidence + bounding-box fields trimmed from this view for clarity. Full schema in the docs.

See full bank-statement parser specs →
Built for

Three teams, one API

AI bookkeeping agents

Drop-in document layer for an autonomous accountant

Your agent ingests user uploads. parsr returns schema-validated JSON your LLM can reason over directly — no bespoke parsers, no per-bank training set.

python
from langchain_parsr import ParsrTool
from langchain.agents import create_react_agent

tool = ParsrTool(api_key="sk_eu_live_…")
agent = create_react_agent(llm, [tool])

agent.invoke({
    "input": "Categorize April expenses from statement.pdf"
})
Fintech engineers

Lending, BNPL, KYC, expense — wherever Open Banking can't reach

60-second sync mode for instant flows; HMAC-signed webhooks for the async path. Region-bound keys keep EU borrower data inside the EU. DPA on signup at Growth+ tiers.

bash
curl -sS https://eu-api.tryparsr.dev/v1/parse \
  -H "Authorization: Bearer sk_eu_live_…" \
  -H "Idempotency-Key: $(uuidgen)" \
  -F "document=@statement.pdf" \
  -F "type=bank_statement"

# 202 Accepted · webhook fires when done
Indie devs and small SaaS

€29/mo, no quote, no security review

Free tier ships every endpoint. Sandbox keys are unlimited. The first parse is usually live in 60 seconds — and you keep your weekend.

python
from parsr import Parsr

parsr = Parsr()  # reads PARSR_API_KEY from env
result = parsr.parse_bank_statement("statement.pdf")

for tx in result.transactions:
    print(tx.posted_date, tx.description, tx.amount)
How parsr compares

The honest comparison

Published prices, May 2026. Don’t take our word for it — click through and verify.

FeatureparsrMindeeDocuPipeReducto
Starting price€29 / mo€44 / mo$99 / moCustom
EU sovereigntyDefaultPro tier+ (€179)Growth tier
MCP serverYes
Async + signed webhooksYes (HMAC)Async onlyYesYes
See full comparison
Frequently asked

Six questions, six straight answers

Everything below is answered the same way in our public docs and in our DPA. No double-speak between sales and engineering.

Per-page billing in EUR, no quotes. Free tier ships 200 pages/mo + 500 signup credits with no credit card. Paid plans start at €29/mo for 1,000 pages. Annual billing saves 17%. Cached re-uploads and validation-failed parses don't count against quota.
EU keys (sk_eu_…) hit eu-api.tryparsr.dev on Exoscale Zürich (Swiss-jurisdiction operator, no US parent). Documents land on Cloudflare R2 with jurisdiction='eu'. Postgres + Stripe records are EU-hosted. Region binding is enforced at the API key — we cannot accidentally cross regions. No US Cloud Act exposure for the EU compute layer.
Yes. parsr ships an MCP server so any MCP-aware agent (Claude Desktop, Cursor, your own runtime) can call the parse tools directly. Native LangChain and LlamaIndex tool wrappers ship in the same release cycle.

Start parsing in 60 seconds

200 free pages every month, plus 500 bonus on signup. No credit card required.
EU keys default to Exoscale Zürich · US keys default to Hetzner Ashburn · region-bound at the key level