A routing number API validates a 9-digit ABA routing transit number (RTN) and returns the institution behind it. BankDataStack exposes that as POST https://www.bankdatastack.com/api/v1/routing/validate with header X-API-Key and JSON {"routing_number":"021000021"}. Optional payment_type is ach or wire — ACH and Fedwire often resolve the same RTN to different addresses.
The docs example 021000021 is JPMorgan Chase. ACH comes back as “Jpmorgan Chase Bank, Na” in Tampa, FL; wire as “JPMORGAN CHASE BANK” in New York, NY, with funds-transfer eligibility. Coverage is ~19,000 US institutions. Starter is $49.99/mo (1,000 requests, then $0.002; 60 req/min) with a 7-day trial on every plan. Docs: bankdatastack.com/docs.
Request: validate an ABA routing number
curl -X POST https://www.bankdatastack.com/api/v1/routing/validate \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"routing_number": "021000021"}'
Auto-detects payment type. To force a rail:
curl -X POST https://www.bankdatastack.com/api/v1/routing/validate \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"routing_number": "021000021", "payment_type": "ach"}'
curl -X POST https://www.bankdatastack.com/api/v1/routing/validate \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"routing_number": "021000021", "payment_type": "wire"}'
Response (ACH): 021000021
Official docs sample (lastUpdated 2025-11-12):
{
"status": "success",
"data": {
"routingNumber": "021000021",
"paymentType": "ach",
"name": "Jpmorgan Chase Bank, Na",
"addressFull": "Tampa, FL",
"city": "Tampa",
"state": "FL",
"type": "Main Office",
"phone": "813-432-3700",
"active": true,
"lastUpdated": "2025-11-12"
}
}
Response (Wire): same RTN, different record
Official docs sample (lastUpdated 2025-11-10). Note the name casing, city, and wire-only fields:
{
"status": "success",
"data": {
"routingNumber": "021000021",
"paymentType": "wire",
"name": "JPMORGAN CHASE BANK",
"addressFull": "NEW YORK, NY",
"city": "NEW YORK",
"state": "NY",
"telegraphicName": "JPMORGAN",
"fundsTransferEligible": "Eligible",
"bookEntrySecuritiesTransferEligible": "Eligible",
"lastUpdated": "2025-11-10"
}
}
If you only store ACH and a customer pastes a wire RTN (or the reverse), the city/phone you show in the UI will be wrong. Always send payment_type when you know the rail.
Go live
1. Register and start the 7-day trial.
2. Copy X-API-Key from the dashboard (not Bearer, not a query param).
3. POST https://www.bankdatastack.com/api/v1/routing/validate with {"routing_number":"021000021","payment_type":"ach"}
4. Gate checkout on data.active and, for wires, fundsTransferEligible. Cache by RTN + payment type.
FAQ: routing number API
What is an ABA routing number?
A 9-digit routing transit number assigned by the American Bankers Association. It identifies a US bank for ACH and Fedwire. BankDataStack looks it up — it does not invent checksum math in this endpoint; it returns the institution record.
Why does 021000021 show Tampa on ACH and New York on wire?
Because ACH and wire directories are different files. The same RTN can have a processing site (Tampa) and a wire desk (New York). Send payment_type.
Should I publish one blog post per routing number?
No. Rank for “routing number API” / “validate ABA”, and use well-known RTNs (like 021000021) as examples. A page per number does not help users and fragments the product.
Is there a BIN endpoint too?
Yes — POST /api/v1/bin/validate on the same key. Routing is the ABA path; BIN is cards. See the docs.




