fin.codes

API

A free, read-only JSON API for US bank routing numbers, bank profiles, and our verification proof. No key, no signup, CORS-open. Built for developers and AI agents.

Quick start

No signup. Base URL https://fin.codes/api/v1. A verification lookup and exactly what comes back:

curl https://fin.codes/api/v1/verify/021000021
{
  "routing_number": "021000021",
  "bank": "JPMorgan Chase Bank",
  "verified": true,
  "status": "verified",
  "label": "Bank-verified",
  "summary": "021000021 is bank-verified for JPMorgan Chase Bank — confirmed against the bank's own published page, shown with a screenshot.",
  "proof": {
    "source_name": "Chase Wire Transfer FAQs",
    "source_url": "https://www.chase.com/digital/wire-transfer/faqs",
    "screenshot": "https://fin.codes/data/evidence/routing-official/...png",
    "captured_at": "2026-06-29"
  },
  "canonical_url": "https://fin.codes/routing-number/021000021"
}

Endpoints (base: /api/v1)

  • GET /api/v1/routing-number/{number} — the bank, use (ACH vs wire), and the full verification block + proof for a routing number
  • GET /api/v1/verify/{number} — a concise bank-verified / cross-checked / unconfirmed verdict + proof
  • GET /api/v1/bank/{slug} — a bank profile with its routing numbers and verification
  • GET /api/v1/banks?q=|state=|group= — search and filter banks (summaries)
  • GET /api/v1/explain/{topic} — plain-English explainers (ach-vs-wire, how-we-verify, …)

Response format

Routing responses include a verification object — a status (verified / cross-checked / unverified) and label, the source_url it was confirmed against, a proof_screenshot for bank-verified records, and the captured/last-reviewed dates. Every payload also carries a canonical_url back to the fin.codes page.

Scope & limits

Free tier: 30 requests/min per IP, read-only GET (HTTP 429 with Retry-After over the limit). A routing number is public and shared by everyone at a bank — confirm any payment with your bank before sending. Need higher limits, bulk access, or commercial use? Contact us.

API FAQ

Do I need an API key?

No. The API needs no key and no signup — it's free and CORS-open, so you can call it straight from the browser or any client.

What's the rate limit?

30 requests per minute per IP on the free tier. Over that you'll get an HTTP 429 with a Retry-After header. For higher limits, contact api@fin.codes.

Is it free for commercial use?

The free tier is fine for evaluation and low-volume use. For higher limits, bulk access, or commercial use, contact api@fin.codes — we offer a higher-volume tier.

How does fin.codes verify a routing number?

Bank-verified numbers are confirmed against the bank's own published page; the response carries the source URL and a dated, watermarked proof screenshot. Cross-checked numbers appear consistently across multiple public directories but aren't confirmed by the bank; unconfirmed numbers have weaker support and are kept out of the index until reviewed.

What's the difference between the ACH and wire routing number?

Use the ACH/direct-deposit number for payroll and everyday electronic transfers, and the wire number for domestic wires. At many banks they're different numbers and aren't interchangeable — each API response tells you which a number is for in its transfer_types.

Is there an MCP server for AI agents?

Yes. The same verified data is available over MCP at mcp.fin.codes/mcp, with tools to look up, verify, and search routing numbers and banks. See the /mcp page for setup.

AI agents can use the same data over MCP at mcp.fin.codes/mcp.

Routing data is sourced from official bank pages, FDIC and NCUA institution data, and public routing directories, current in this build as of August 2, 2026. Confirm routing or SWIFT details with the financial institution before sending money.