A routing number database API lists US ABA numbers by state, city, ZIP, or bank name — not a single validate call. On BankDataStack that is POST https://www.bankdatastack.com/api/v1/routing/database/state with header X-API-Key. Official docs sample: state=TX, limit=10, page=1.
Starter is $49.99/mo (1,000 calls, then $0.002) with a 7-day trial. This is the local 19,000+ bank database, not the external /routing/validate path. Docs: bankdatastack.com/docs.
Request: Texas, page 1
curl -X POST "https://www.bankdatastack.com/api/v1/routing/database/state" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"state":"TX","limit":10,"page":1}'
Response: official state sample
{
"status": "success",
"message": "Found 10 routing number(s) for state: TX on page 1",
"state": "TX",
"data": [{
"routingNumber": "113110984",
"bank": "CITIZENS NATIONAL BANK",
"city": "CROCKETT",
"state": "TX",
"zip": "75835",
"phone": "(936) 544-9661",
"active": true
}],
"pagination": {
"current_page": 1,
"per_page": 10,
"total": 458,
"total_pages": 46,
"has_more": true
}
}
Walk pagination.has_more. Sibling paths: /routing/database/bank, /city, /zip, /lookup.
$ch = curl_init('https://www.bankdatastack.com/api/v1/routing/database/state');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => ['X-API-Key: ' . getenv('BANKDATA_KEY'), 'Content-Type: application/json'],
CURLOPT_POSTFIELDS => json_encode(['state' => 'TX', 'limit' => 10, 'page' => 1]),
]);
$json = json_decode(curl_exec($ch), true);
echo $json['data'][0]['routingNumber'] ?? '';
Go live
1. Register — 7-day trial.
2. Copy X-API-Key.
3. POST {"state":"TX"}.
4. Page until has_more is false.




