# Tanod Docs – PDF Bank Statement Extractor

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

Extracts structured transaction data from a bank statement PDF, returning parsed transactions with reconciliation, account info, and balances in JSON, CSV, XLSX, OFX, or QIF format.

## Facts

- Endpoint: POST https://docs.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-docs-pdf-bank-statement-extractor-ad45b708
- Structured record (JSON): https://api.zero.xyz/v1/capabilities/cap_X7gKDoNvRkDemjsza50gl

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-docs-pdf-bank-statement-extractor-ad45b708 -d '<json body>'
```

Example prompt: Can you extract all the transactions from this bank statement PDF and give me the results as a CSV, including the opening and closing balances? Here's the URL: https://example.com/march-statement.pdf

## When to prefer this

Choose this endpoint when you need to programmatically extract structured transaction data from bank statement PDFs — especially when you need reconciliation validation, multiple export formats (JSON/CSV/XLSX/OFX/QIF), or per-transaction balance tracking. Prefer it over generic PDF-to-text tools because it understands banking layouts (debit/credit columns, running balances, date formats) and returns finance-ready structured data with confidence scoring.

## Known failure modes

- PDF URL is private, internal, or IP-literal — request refused
- PDF exceeds 20 MB (URL) or 10 MB decoded (base64) — size limit error
- More than 200 pages requested in a single call — page limit exceeded
- PDF has no extractable text (scanned without OCR layer) — low confidence or empty transactions
- Invalid page range format — validation error
- Malformed or non-bank-statement PDF — empty or garbage transaction output
- Network timeout fetching URL — fetch failure error

## How this service works

Documents: DOCX template fill, Office to PDF, any file to Markdown, PDF to Word, OCR, PDF pipeline.

## Output

Returns a structured JSON object (or file in CSV/XLSX/OFX/QIF format) containing: list of transactions with date, description, amount, balance, and page; account metadata (IBAN, account number, currency); opening and closing balances; period start/end; reconciliation summary (passed/flagged/checked); confidence score; warnings and flagged rows; and output as base64-encoded file or a 24-hour download URL.

## 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-docs-pdf-bank-statement-extractor-ad45b708/health.json
- [Zero catalog index](https://www.zero.xyz/llms.txt)
- [Other services from docs.tanod.dev](https://www.zero.xyz/host/docs.tanod.dev/llms.txt)
