๐ TaxFormatter
Crypto CSVs and bank statement PDFs, parsed into tax-ready data.
REST API ยท MCP Server ยท Node SDK ยท Python SDK ยท Consumer Dashboard
๐ What It Does
TaxFormatter turns messy financial exports into structured, tax-ready data โ for humans and for AI agents.
Drop a CSV from Coinbase, a ZIP from Kraken, a .tar.gz from Binance, or a PDF statement from Chase, and get back a clean, normalized transaction set you can pipe into Koinly, TurboTax, CoinLedger, ZenLedger โ or straight into your own software.
Exchange CSV Clean, normalized
Bank PDF โ transactions (JSON / CSV)
XLSX / ZIP / TAR.GZ + AI-generated insights
โจ Features
๐ Developer REST API
Ship a crypto-tax or bank-ingestion feature into your product in an afternoon.
POST /v1/parseโ upload a CSV or PDF, get structured JSON backGET /v1/sourcesโ list every supported exchange, bank, and output format, each with averified/betastatusGET /v1/usageโ monthly quota, RPM limit, current consumptionGET /v1/healthโ liveness probe- Auth:
X-API-Keyheader withtf_live_*keys (SHA-256 hashed at rest) - Host:
https://api.taxformatter.com
๐ค MCP Server for AI Agents
Give Claude, Cursor, Windsurf, or any MCP-compatible agent the ability to parse crypto and bank data directly.
npx @taxformatter/mcp-server
๐ฆ Official SDKs
- Node.js โ
@taxformatter/sdkโ promise-based, fully typed - Python โ
taxformatterโ idiomatic, type-hinted
๐ฆ 14 Exchanges ยท 6 Banks ยท 4 Export Formats
Every public supported-source claim is generated from two registries, and drift tests fail CI if any surface disagrees with them:
- Exchanges โ
backend/configs/exchanges.yaml, mirrored bylib/exchange-registry.ts - Banks โ
backend/configs/banks/*.yaml, mirrored bylib/bank-registry.ts
GET /v1/sources serves the same lists. Every entry carries a status: verified means a fixture-backed parse test runs on every change; beta means the parser exists but has no fixture yet. A new status is earned by a test, never by editing a registry.
Exchanges (verified): Binance ยท Coinbase ยท Kraken ยท KuCoin ยท Bybit ยท Cash App ยท Robinhood ยท Crypto.com ยท Gemini ยท FTX ยท Bitfinex ยท OKX
Exchanges (beta): Venmo
Banks (verified): Chase ยท Mercury ยท Navy Federal
Banks (beta): Bank of America ยท Wells Fargo ยท Citi
Export formats: Koinly ยท TurboTax (Form 8949) ยท CoinLedger ยท ZenLedger
Per-exchange detail: content/docs/getting-started/supported-exchanges.md.
๐ง Tiered AI Insights
Every parsed file comes back with analysis scaled to your plan. Plans expose an insights level; the level โ model mapping lives in lib/insights-engine.ts and is published only in the API docs and blog Updates posts.
The insights contract is strict. Model output is validated against a fixed schema, and a refusal, truncation, or unparseable response falls back to the deterministic quick stats with an insights unavailable warning rather than partial flags. Every result is stamped with the model, prompt version, and effort that produced it, and every model call logs tokens, cache-hit rate, latency, and cost.
๐ฅ๏ธ Consumer Dashboard
Not a developer? The web app at taxformatter.com is a full drag-and-drop experience with real-time job status, exchange auto-detection, transformation previews, and one-click downloads.
๐๏ธ Tech Stack
๐ Repo Layout
trw/
โโโ app/ # Next.js App Router (marketing, dashboard, docs, blog)
โ โโโ api/ # Internal API routes (NextAuth, uploads, jobs, dev keys, cron/prune)
โ โโโ dashboard/ # Authenticated user area + /dashboard/developer
โ โโโ docs/ ยท blog/ # MDX-powered docs site and blog (content in content/)
โ โโโ playground/ # API playground
โ โโโ samples/ # Sample outputs
โ โโโ upload/ # Anonymous bank statement โ CSV landing page
โ
โโโ backend/ # Python processing layer (AWS Lambda)
โ โโโ handlers/ # scanner ยท processor ยท webhook ยท api
โ โโโ services/
โ โ โโโ engine.py # CSV parsing (14 exchange parsers)
โ โ โโโ format_converter.py # Koinly โ TurboTax/CoinLedger/ZenLedger
โ โ โโโ fingerprinting.py # Exchange auto-detection
โ โ โโโ ai_insights.py # Tiered AI analysis (schema-validated, refusal-safe)
โ โ โโโ api_auth.py # API key validation + rate limiting
โ โ โโโ bank_statement/ # PDF extraction pipeline
โ โโโ configs/
โ โ โโโ exchanges.yaml # Exchange source registry (serves /v1/sources)
โ โ โโโ banks/*.yaml # Bank source registry + parser configs
โ โโโ tests/ # pytest suite + parse fixtures
โ โโโ terraform/ # Infra as code
โ
โโโ packages/
โ โโโ mcp-server/ # @taxformatter/mcp-server (npm)
โ โโโ sdk-node/ # @taxformatter/sdk (npm)
โ โโโ sdk-python/ # taxformatter (PyPI)
โ
โโโ components/ # React components (marketing, dashboard, ui)
โโโ content/ # Docs (.md) and blog (.mdx) sources
โโโ lib/ # Business logic (auth, api-keys, stripe, email)
โ โโโ exchange-registry.ts # Mirrors backend/configs/exchanges.yaml
โ โโโ bank-registry.ts # Mirrors backend/configs/banks/*.yaml
โ โโโ tier-registry.ts # The one price list (plan, price, quota, RPM, insights level)
โ โโโ insights-engine.ts # The one model list (insights level โ model)
โ โโโ retention.ts # RETENTION_DAYS = 30
โโโ db/ # PostgreSQL schema + migrations
โโโ __tests__/ # Jest suite, incl. copy and registry drift guards
โโโ docs/ # Setup guides, plans, build reports
Full architectural reference: ARCHITECTURE.md
โก Quick Start
Run the web app
npm install
npm run dev
Open http://localhost:3000.
Try the API
curl -X POST https://api.taxformatter.com/v1/parse \
-H "X-API-Key: tf_live_..." \
-F "[email protected]"
Use the MCP server with Claude Code
{
"mcpServers": {
"taxformatter": {
"command": "npx",
"args": ["@taxformatter/mcp-server"],
"env": { "TAXFORMATTER_API_KEY": "tf_live_..." }
}
}
}
Install the Node SDK
npm install @taxformatter/sdk
import { TaxFormatter } from "@taxformatter/sdk";
const tf = new TaxFormatter(process.env.TF_API_KEY!);
// Parse a file by path, or pass a Buffer with a filename
const result = await tf.parse("./coinbase.csv");
const turbotax = await tf.parse(buffer, "coinbase.csv", { outputFormat: "turbotax" });
Install the Python SDK
pip install taxformatter
from taxformatter import TaxFormatter
tf = TaxFormatter("tf_live_...")
result = tf.parse("./coinbase.csv")
๐งช Testing
npm test # Jest (700+ tests: API routes, MCP, keys, registries, UI)
npm run test:e2e # Playwright end-to-end tests
npm run typecheck # TypeScript strict mode
npm run lint # ESLint
cd backend && pytest # Python engine, parsers, insights, API Lambda (370+ tests)
Public copy is tested too. Drift guards under __tests__/ fail if any surface hard-codes a price, quota, or model name outside the registries, names an exchange or bank the registries don't list, or carries a superseded retention or marketing claim.
๐ณ Pricing
One plan, two ways to use it โ drop a file in the dashboard or call our API. Same quota, same AI insights.
Source of truth: lib/tier-registry.ts (prices, quotas, limits) and lib/insights-engine.ts (which model serves each insights level). Model names are published in the API docs and blog Updates posts only.
๐ Security Highlights
- API payloads never stored โ request bodies are parsed in memory and never written to S3 or the database
- Metadata-only request log โ
api_requestsstores key id, endpoint, status, bytes, timing, detected source, error code, and caller IP; never file contents - API keys SHA-256 hashed at rest, prefixed
tf_live_for easy identification - Uploads only โ TaxFormatter never asks for exchange API keys or bank logins
- TLS 1.3 enforced everywhere
- AES-256 encryption on all stored uploads
- AWS WAF in front of the API
- 30-day retention โ uploads, outputs, and parsed rows are deleted within 30 days (sooner from the dashboard); enforced by an S3 lifecycle rule and a daily prune cron
Full disclosure at taxformatter.com/security.
๐ Documentation
- ARCHITECTURE.md โ Full system design
- content/docs/api/index.md โ API reference
- content/docs/getting-started/supported-exchanges.md โ per-exchange status, generated from the registry
- packages/mcp-server/README.md โ MCP setup guide
- RELIABILITY.md โ SLOs, incident playbooks
- docs/PARKED_UNTIL_REVIEW.md โ post-launch initiatives frozen until the Oct 28 review
- docs/ โ Stripe, Sentry, deployment guides, and build reports
License
Source-available, not open source. Copyright (c) 2026 Quantum Transfer Group, all rights reserved โ you may read and audit this code, but not run, copy, or build on it. Full terms in LICENSE; the published npm and PyPI client packages are licensed separately.
Security
Found a vulnerability? Report it privately โ see SECURITY.md. Please don't open a public issue.
Contributing
Bug reports are welcome, especially parsing failures against real exchange or bank exports. We don't accept outside pull requests โ see CONTRIBUTING.md.