# Tanod pdfpeek Bank Statement Parser

> Tanod pdfpeek Bank Statement Parser is a paid API for AI agents from tanod.dev, paid per call via x402, $0.02/call, status unknown (last checked 2026-10-13).

Extracts dated, signed transactions with running-balance reconciliation from a PDF bank statement, returning JSON, CSV, XLSX, OFX, or QIF output.

## Facts

- Endpoint: POST https://tanod.dev/v1/pdf/bank-statement?utm_source=zero.xyz
- Price: $0.02/call
- Payment: x402
- Status: unknown
- Last checked: 2026-10-13
- Activations on Zero: 0
- Tags: x402
- Canonical page: https://www.zero.xyz/c/tanod-pdfpeek-bank-statement-parser-c8aadedd
- Structured record (JSON): https://api.zero.xyz/v1/capabilities/cap_GttqziztrLeEJZvj2GLPV

Status and success rate cover calls made through Zero and Zero's own probes. Third-party monitors may report differently.

## How to call it through Zero

Zero handles the 402 payment challenge and records the run. With the Zero CLI installed (`npm i -g @zeroxyz/cli`):

```sh
zero fetch --capability tanod-pdfpeek-bank-statement-parser-c8aadedd -d '<json body>'
```

Example prompt: Can you parse this bank statement PDF at https://example.com/statement.pdf and give me all the transactions with a running balance check as a CSV?

## When to prefer this

Use this endpoint when you need to programmatically extract structured transaction data from a PDF bank statement with running-balance reconciliation, especially when you need flexible output formats (JSON, CSV, XLSX, OFX, QIF) for downstream use in accounting, bookkeeping, or personal finance tools. Prefer this over generic PDF-to-text tools because it understands bank statement structure, produces signed dated transactions, and verifies the balance.

## Known failure modes

- PDF URL is private, internal, or IP-literal — returns refusal error
- PDF exceeds 20 MB (URL) or 10 MB decoded (base64) — returns size error
- PDF is password-protected or encrypted — returns parse error
- Page range references non-existent pages or exceeds 200-page limit — returns validation error
- PDF does not contain a recognizable bank statement layout — may return empty or partial transaction list
- Running balance does not reconcile — flagged in response but still returned
- Neither url nor file_base64 provided — returns input validation error

## How this service works

One MCP server and HTTP API with 193 pay-per-call tools for AI agents (security checks, chain data, finance, aviation, documents), plus free uptime and MikroTik monitoring and 130+ free browser tools. No signup; free daily tier. Operated by an AI.

## Output

Returns a structured list of dated, signed transactions extracted from the PDF bank statement, along with a running-balance reconciliation check. Output format is caller-specified: JSON (default, with full reconciliation metadata), CSV, XLSX (with Transactions and Summary sheets), OFX 1.0.2, or QIF (Quicken-compatible, MM/DD/YYYY dates).

## Request schema (JSON Schema)

```json
{
 "type": "object",
 "properties": {
  "url": {
   "anyOf": [
    {
     "type": "string",
     "maxLength": 2048,
     "minLength": 1
    },
    {
     "type": "null"
    }
   ],
   "default": null,
   "description": "Public http(s) URL of the PDF (at most 20 MB; private, internal and IP-literal hosts are refused); or use file_base64."
  },
  "pages": {
   "anyOf": [
    {
     "type": "string",
     "pattern": "^[0-9a-zA-Z ,\\-]+$",
     "maxLength": 200,
     "minLength": 1
    },
    {
     "type": "null"
    }
   ],
   "default": null,
   "description": "Pages to read (default all; at most 200 per call): N, N-M, N- (to the end), -M, last; comma separated, e.g. 1-5,9."
  },
  "format": {
   "enum": [
    "json",
    "csv",
    "xlsx",
    "ofx",
    "qif"
   ],
   "type": "string",
   "default": "json",
   "description": "json (default: the transactions with their reconciliation), csv, xlsx (a Transactions and a Summary sheet), ofx (OFX 1.0.2) or qif (Quicken, dates as MM/DD/YYYY)."
  },
  "output": {
   "enum": [
    "base64",
    "url"
   ],
   "type": "string",
   "default": "base64",
   "description": "base64 (default): the file comes back inline as base64. url: the file is stored for 24 hours and the reply carries a download link (url, expires_at, bytes, content_type, sha256) instead of the base64, which keeps the file out of your context window."
  },
  "file_base64": {
   "anyOf": [
    {
     "type": "string",
     "maxLength": 13398872,
     "minLength": 1
    },
    {
     "type": "null"
    }
   ],
   "default": null,
   "description": "The PDF as base64 (at most 10 MB decoded); or use url."
  }
 }
}
```

## Response schema (JSON Schema)

```json
{
 "type": "json",
 "example": {
  "order": "oldest_first",
  "format": "json",
  "layout": "debit_credit",
  "period": {
   "end": "2024-03-31",
   "start": "2024-03-01"
  },
  "account": {
   "iban": "DE89370400440532013000",
   "number": null
  },
  "currency": "EUR",
  "decimals": 2,
  "total_in": 3200,
  "warnings": [],
  "operation": "bank-statement",
  "total_out": 1720.65,
  "confidence": 0.99,
  "date_order": "dmy",
  "input_bytes": 2688,
  "input_pages": 1,
  "flagged_rows": [],
  "transactions": [
   {
    "row": 1,
    "date": "2024-03-04",
    "note": null,
    "page": 1,
    "amount": -950,
    "row_ok": true,
    "balance": 1530,
    "value_date": null,
    "description": "Rent March"
   },
   {
    "row": 2,
    "date": "2024-03-06",
    "note": null,
    "page": 1,
    "amount": -62.35,
    "row_ok": true,
    "balance": 1467.65,
    "value_date": null,
    "description": "Card payment SUPERMARKET BERLIN"
   },
   {
    "row": 3,
    "date": "2024-03-11",
    "note": null,
    "page": 1,
    "amount": 3200,
    "row_ok": true,
    "balance": 4667.65,
    "value_date": null,
    "description": "Salary ACME GmbH"
   },
   {
    "row": 4,
    "date": "2024-03-15",
    "note": null,
    "page": 1,
    "amount": -129.9,
    "row_ok": true,
    "balance": 4537.75,
    "value_date": null,
    "description": "Online order 4471-2209 Invoice for office chair"
   },
   {
    "row": 5,
    "date": "2024-03-22",
    "note": null,
    "page": 1,
    "amount": -78.4,
    "row_ok": true,
    "balance": 4459.35,
    "value_date": null,
    "description": "Electricity March"
   },
   {
    "row": 6,
    "date": "2024-03-29",
    "note": null,
    "page": 1,
    "amount": -500,
    "row_ok": true,
    "balance": 3959.35,
    "value_date": null,
    "description": "Transfer to savings"
   }
  ],
  "reconciliation": {
   "passed": 6,
   "checked": 6,
   "flagged": 0,
   "unchecked": 0,
   "balance_check": true
  },
  "closing_balance": 3959.35,
  "opening_balance": 2480,
  "pages_processed": 1,
  "date_order_source": "a day above 12",
  "transaction_count": 6,
  "untrusted_content": true,
  "pages_without_text": [],
  "closing_balance_source": "printed",
  "opening_balance_source": "printed"
 }
}
```

## More

- Live health (JSON, refreshed every minute): https://www.zero.xyz/c/tanod-pdfpeek-bank-statement-parser-c8aadedd/health.json
- [Zero catalog index](https://www.zero.xyz/llms.txt)
- [Other services from tanod.dev](https://www.zero.xyz/host/tanod.dev/llms.txt)
