Extraction & TablesPOST /v1/extract?options=tables

Extract Bank Statement Tables to JSON / CSV

Pulls tabular transaction history deterministically from native PDF text layers (zero model read charge for digital PDFs) or via high-precision vision OCR for scans. Returns structured rows, dates, descriptions, debit/credit columns, and validates closing balance reconciliations.

Instant execution

Run this verification workflow directly. For instant zero-auth testing with deterministic fixture data, include the Stp-Sandbox: true header.

bash
curl -X POST "https://www.stipple.sh/v1/extract?options=tables" \
  -H "Authorization: Bearer stp_live_your_key_here" \
  -F "file=@cba_statement_july2026.pdf"

Expected JSON response

The engine returns deterministic findings with evidence traces, confidence bounds, and recommended actions:

json
{
  "document_type": "bank_statement",
  "issuing_institution": "Commonwealth Bank of Australia",
  "account_holder": "ACME SOURCING PTY LTD",
  "account_number": "XXXX-1294",
  "statement_period": {
    "start_date": "2026-06-01",
    "end_date": "2026-06-30"
  },
  "opening_balance": 14250.80,
  "closing_balance": 18920.45,
  "tables": [
    {
      "page": 1,
      "source": "native_pdf",
      "rows": 48,
      "header": ["Date", "Description", "Debit", "Credit", "Balance"],
      "json": [
        {
          "Date": "01 Jun 2026",
          "Description": "OPENING BALANCE",
          "Debit": null,
          "Credit": null,
          "Balance": 14250.80
        },
        {
          "Date": "04 Jun 2026",
          "Description": "DIRECT DEBIT 48192 OFFICE LEASE",
          "Debit": 2200.00,
          "Credit": null,
          "Balance": 12050.80
        },
        {
          "Date": "12 Jun 2026",
          "Description": "CUSTOMER PAYMENT INV-8821",
          "Debit": null,
          "Credit": 6869.65,
          "Balance": 18920.45
        }
      ]
    }
  ]
}

AI agent prompt & MCP tool usage

When configuring autonomous agents (Claude Desktop, Cursor, Hermes), use this verified prompt pattern:

text
You are a financial analyst agent.
1. Call extract_fields(url="...", options="tables")
2. Compute the total deposits and total debits over the 90-day statement period.
3. Flag any gambling transactions or high-frequency payday loan debits.

Input parameters & headers

FieldTypeRequiredDescription
filefile (multipart)RequiredMulti-page PDF or high-resolution scan.
optionsstringOptionalComma-separated features: "tables", "classification", "redaction".
flag_belowfloat (0.0 - 1.0)OptionalConfidence threshold below which fields are flagged for human triage.

Diagnostic signals & failed checks

Each check reports exactly what it tested and what evidence it found. High severity signals trigger an escalated risk band:

table.balance_discrepancyhigh

Running transaction debits and credits do not reconcile with the reported closing balance.

table.page_break_skewinfo

Multi-page table continuation successfully normalized across page boundaries.

Production considerations & edge cases

  • Password Protected PDFs: Encrypted PDFs without passwords will return a 422 Unprocessable Entity error.
  • Non-standard transaction layouts: In statements where debits/credits share a single signed amount column (+/-), the engine normalizes to explicit debit/credit keys.

Related workflows

Take it to production

The snippets above run against the sandbox with Stp-Sandbox: true — no key, no credits, fixture data. Drop that header and the call is real, which needs a key.

A weekly credit allowance of your own, usage metering, and somewhere for purchased credits to live.

Every key gets a free weekly allowance. Past that, prepaid credit packs cover it, and Errors & limits says what happens when you run out.