You need to verify whether ABA routing number 026009593 is valid, active, and suitable for ACH before releasing a US bank transfer. By the end of this guide you’ll know how to validate this specific routing number via a single POST request, parse the response in Python, and integrate the check into your ACH payment or onboarding flow with proper error handling and caching.
What you’re validating when you check routing number 026009593
Routing numbers (ABA numbers) are nine-digit identifiers used by US banks to route payments. They’re used on ACH and wire transfers, and on checks. A validation step typically covers:
- Format and checksum: the nine-digit pattern with a mod-10 weighted checksum.
- Directory lookup: find the bank name, address, office type, and contact info.
- Status and suitability: confirm whether the routing number is active and permitted for the selected payment rail (ACH vs wire).
For 026009593, you’ll want to confirm the bank record, ensure it’s active for ACH, and surface any metadata you may show to the end-user or log for compliance review.
Endpoint and request model
Use a single JSON POST to validate a routing number. The API returns a normalized record containing the identified bank, location, office type, phone, and status, plus the payment type you requested validation for. Authentication uses an X-API-Key header.
Endpoint:
- POST https://www.bankdatastack.com/api/v1/routing/validate
Headers:
- X-API-Key: YOUR_API_KEY
- Content-Type: application/json
Body fields you’ll use for this validation:
- routing_number: the 9-digit ABA routing number (e.g., 026009593)
- payment_type: ach or wire depending on your transfer rail
Full API reference is available in the Documentation. To get an API key, start with the 7-day trial on the Starter plan ($49.99/mo) via Register.
Validate 026009593 via cURL
Copy-paste the following request to validate routing number 026009593 for ACH. This is the canonical call and uses the exact endpoint and fields.
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":"026009593","payment_type":"ach"}'
Sample JSON response and what it means
The following is a representative success response for this routing number. Use it to wire up your parser and field mapping. Do not hardcode values in production—always call the API—this is to show shape and semantics.
{
"status": "success",
"data": {
"routingNumber": "026009593",
"paymentType": "ach",
"name": "Bank Of America N.a.",
"addressFull": "Richmond, VA",
"street": "P.O. BOX 27025",
"city": "Richmond",
"state": "VA",
"zip": "23261-7025",
"type": "Main Office",
"phone": "800-446-0135",
"active": true,
"lastUpdated": "2026-10-17",
"address": "P.O. BOX 27025"
}
}
Key fields you’ll actually use in your flow:
- status: success indicates the routing number was found and parsed.
- data.routingNumber: echoes the number you validated (026009593).
- data.paymentType: the rail you asked to validate, here ach.
- data.name: the identified bank (Bank Of America N.a.). Display it so users can confirm the destination institution.
- data.addressFull, street, city, state, zip: service address metadata for the routing entry. Useful for support or compliance logs.
- data.type: office type (e.g., Main Office). Some banks have separate routing numbers for wires vs ACH; office and rail help disambiguate.
- data.phone: bank directory contact.
- data.active: boolean indicator that the routing entry is active; reject or flag if false.
- data.lastUpdated: last directory update date (UTC date string). Use for cache TTL decisions.
Python example: validate then gate an ACH transfer
This Python snippet validates 026009593 for ACH before allowing a payout. It demonstrates request construction, basic error handling, and how to read the fields you need for a confirmation screen and compliance log.
import json
import os
import sys
import time
import urllib.request
API_KEY = os.environ.get("BANKDATASTACK_API_KEY", "YOUR_API_KEY")
URL = "https://www.bankdatastack.com/api/v1/routing/validate"
payload = {
"routing_number": "026009593",
"payment_type": "ach"
}
data = json.dumps(payload).encode("utf-8")
req = urllib.request.Request(
URL,
data=data,
headers={
"X-API-Key": API_KEY,
"Content-Type": "application/json"
},
method="POST"
)
try:
with urllib.request.urlopen(req, timeout=10) as resp:
body = resp.read().decode("utf-8")
j = json.loads(body)
except Exception as e:
print(f"Network or HTTP error validating routing number: {e}", file=sys.stderr)
sys.exit(1)
if j.get("status") != "success" or "data" not in j:
print("Routing validation failed or returned unexpected shape.", file=sys.stderr)
sys.exit(1)
data = j["data"]
# Hard gating rules
if not data.get("active", False):
print("Routing number is not active. Rejecting transfer.", file=sys.stderr)
sys.exit(1)
if data.get("paymentType") != "ach":
print("Routing number not validated for ACH as requested.", file=sys.stderr)
sys.exit(1)
# Display confirmation line to the operator or end-user
bank_name = data.get("name", "Unknown Bank")
city = data.get("city", "")
state = data.get("state", "")
print(f"Validated ACH routing 026009593: {bank_name} ({city}, {state})")
# Example: build a compliance log record
log_record = {
"ts": int(time.time()),
"routingNumber": data.get("routingNumber"),
"bankName": bank_name,
"officeType": data.get("type"),
"active": data.get("active"),
"lastUpdated": data.get("lastUpdated"),
"phone": data.get("phone"),
}
print(json.dumps(log_record, indent=2))
How to use these fields in ACH payment and onboarding flows
In a payment initiation form, request the customer’s routing number and account number. Before attempting the ACH transfer:
- Call the routing/validate endpoint with payment_type=ach.
- If active is false or status is not success, block submission and ask the user to re-check details.
- Display the resolved bank name (e.g., “Bank Of America N.a.”) so the payer can visually confirm they picked the right bank.
- Log the bank metadata and lastUpdated date with your payout record for auditability.
For onboarding (e.g., vendor or employee setup):
- Validate the routing number before you store the payout method.
- If your flow supports wires as well, run a separate validation pass with payment_type=wire to confirm that rail before enabling it.
- Depending on your risk posture, you may do reference checks again immediately before first payout if lastUpdated is older than your cache TTL.
Format and checksum basics for ABA routing numbers
ABA routing numbers are nine digits. The last digit is a checksum calculated with a weighted sum of the first eight digits, then mod 10. Invalid checksums should be rejected early to avoid unnecessary API calls. However, checksum-validation alone cannot confirm that a number is assigned, active, or appropriate for ACH vs wire—that requires a directory lookup (as performed by the API).
Common issues you’ll catch with validation:
- Transposed digits yielding a failing checksum or mismatched bank.
- Numbers that once existed but are not active anymore (active=false).
- Rail mismatches where a routing number is valid for wire but not ACH, or vice versa.
Handling “not found,” inactive, and mismatched rails
When status is not success or data is missing, treat the routing number as not found. This typically means the number fails format checks, does not exist in the current directory, or has been retired. Recommended handling:
- Block the transfer and prompt the user to re-enter the routing number.
- Do not auto-switch rails; if you requested ach and got a mismatch in paymentType, re-validate explicitly for wire instead of assuming suitability.
- Log the failure reason for support triage.
If active is false, the record exists but is not currently active. Reject the transfer and instruct the user to contact their bank for an updated routing number.
Caching strategy and update cadence
The response includes lastUpdated, which you can use to inform your caching logic. Practical guidance:
- Short-term cache: cache positive validations for a few hours to a day. Re-validate just-in-time before executing the first payout if the cached record is older than your threshold.
- Negative results: cache briefly (e.g., 15–60 minutes) in case of temporary directory refresh windows.
- Per-rail caching: cache distinct entries by routing number + payment_type since suitability can differ between ACH and wire.
Security and compliance notes
- Never store full card numbers in your systems. If you validate BINs elsewhere in your stack, persist only the BIN (first digits) and necessary metadata. The routing validation in this article does not require card data.
- Protect API keys: keep YOUR_API_KEY in server-side secrets and never expose it in client-side code.
- Log only what you need: the bank name and routing number are generally sufficient for audit trails. Avoid storing sensitive PII alongside reference data unnecessarily.
Comparing bank identifiers at a glance
Many fintech stacks validate multiple identifier types during onboarding or payouts. The USA does not use IBAN for domestic transfers. Here’s a quick comparison to anchor terminology while keeping this article focused on routing 026009593.
| Identifier | Scope | Example | Primary Use | Notes |
|---|---|---|---|---|
| Routing (ABA) | United States | 026009593 | ACH and wire routing | Nine digits; rail-specific suitability should be validated. |
| Routing (ABA) | United States | 021000021 | ACH and/or wire routing | Official fixture you can use in tests. |
| SWIFT/BIC | International | CHASUS33 | Cross-border wires | Identifies bank and country; not used for ACH. |
| IBAN | International (not US) | GB82WEST12345698765432 | Cross-border and domestic in IBAN countries | The USA does not use IBAN for domestic payments. |
| Card BIN | Global | 424242 | Card issuer identification | Store BINs only; never store full card PANs. |
Testing, environments, and rollout tips
- Use a sandbox environment internally by gating requests behind feature flags and pointing to your production keys only in secure server-side contexts.
- Program defensively: handle timeouts and parse errors, and keep retry logic idempotent. Avoid retry storms on payments—fail fast when the directory says not found or active=false.
- Instrument metrics: track validation success rate per rail and average latency. Alert if success rate drops—this can catch input regressions early (e.g., stripping leading zeroes).
Pricing and getting access
The Starter plan is $49.99 per month with a 7-day trial so you can validate routing numbers like 026009593 and wire the results directly into your onboarding and payout flows. Create your API key here: Register. For complete parameter and response-field details, visit the Documentation.
FAQ
Does validating a routing number confirm the customer’s bank account exists?
No. Routing validation confirms the bank directory details and status of the routing number itself, not whether a specific account number is open or has funds. Combine routing validation with account verification methods appropriate for your use case.
What does “active: true” guarantee?
It indicates the routing entry is active in the directory. It does not guarantee ACH acceptance for every transaction. Always submit payment_type to ensure rail suitability and handle declines from the downstream network.
How should I handle different rails (ACH vs wire)?
Validate per rail by setting payment_type accordingly. Some institutions use distinct routing numbers or configurations for ACH and wire. Cache results separately for each rail.
Can I cache validations for 026009593?
Yes. Cache positive results for a short period and re-validate if lastUpdated is older than your TTL or before a first payout. Cache negative results briefly to avoid UI thrash while allowing for directory refreshes.
Does the USA use IBAN?
No. The USA does not use IBAN for domestic payments. Use ABA routing numbers for ACH and wires, and SWIFT/BIC for cross-border wires.
Ready to validate routing number 026009593 in your flow? Create your API key and start your 7-day trial on the Starter plan: Register. For implementation details and field-by-field definitions, see the Documentation.