apyhub
Back
▣ DATA VALIDATION · FINANCE

US Routing Number Validation API

What it does

Routing Number Validator checks whether a U.S. routing number is valid. Send a 9-digit routing_number in the query string, and get a response indicating the result back.

Use it when you need to verify bank routing data before creating a payment flow, storing customer banking details, or running preflight checks on ACH-related forms. The endpoint is focused on one job: The endpoint validates the routing number format, checksum, and attempts to match it against the FedACH routing directory.

The request schema is simple and strict: a single routing_number string exactly 9 characters long. If your app collects bank details from users, this endpoint fits into the step where you reject malformed routing numbers early and keep invalid records out of downstream systems.

GET
Validate routing number
https://api.eu.apyhub.com/dosvak/validate-routing-number

QUICKSTART

GUIDE

Quickstart

Validate a routing number by passing the required routing_number as a query parameter.

curl -X GET "https://api.eu.apyhub.com/dosvak/validate-routing-number?routing_number=021000021" \
  -H "apy-token: $APY_TOKEN"

What you'll get back

Returns a JSON object containing the validation result, checksum status, reference match status, bank information (when available), and attribution details.

{
  "input": "021000021",
  "normalized": "021000021",
  "checksum_valid": true,
  "valid": true,
  "reason": "ok",
  "reference_status": "matched",
  "reference_match": true,
  "bank": {
    "routing_number": "021000021",
    "customer_name": "JPMORGAN CHASE",
    "city": "TAMPA",
    "state": "FL",
    "zip_code": "336100000",
    "phone": "8134323700",
    "institution_status_code": "1",
    "source": "fedach",
    "updated_at": "2026-07-29T17:19:03.916039Z"
  },
  "attribution": []
}
TRY ITLIVE · 100 ATOMS
Loading your default key…
The full key is used to call the gateway and stays in this tab — never sent to orbit or saved.

About this endpoint

What it does

Validates a routing number supplied on the request. Returns the checksum result, whether the number matches the FedACH reference data, and the bank record when a match is found.

Query Parameter(s)

AttributeTypeMandatoryDescription
routing_numberStringYesRouting number; exactly 9 characters long (minLength: 9, maxLength: 9).

Response

Returns a JSON object with the validation result, checksum status, reference match status, the bank record when available, and attribution information.

ParameterTypeMandatoryDescription
inputStringYesThe routing number supplied in the request.
normalizedStringYesThe routing number after whitespace and separators are stripped.
checksum_validBooleanYestrue when the number passes the ABA checksum.
validBooleanYesOverall verdict. true when the number passes the checksum and, where applicable, matches reference data.
reasonStringYesWhy the verdict was reached, for example ok.
reference_statusStringYesOutcome of the reference-data lookup, for example matched.
reference_matchBooleanYestrue when the number was found in the FedACH reference data.
bankObjectNoThe matched bank record. Absent when no reference match was found.
bank.routing_numberStringNoThe bank's 9-digit routing number.
bank.customer_nameStringNoRegistered name of the institution.
bank.cityStringNoCity.
bank.stateStringNoTwo-letter state code.
bank.zip_codeStringNoZIP code, including the +4 extension when present.
bank.phoneStringNoContact phone number, digits only.
bank.institution_status_codeStringNoFedACH institution status code.
bank.sourceStringNoDataset the record came from, for example fedach.
bank.updated_atStringNoWhen the record was last refreshed. Format: date-time.
attributionObject ArrayNoSource attribution entries for the dataset. Empty when no attribution is required.
▣ COMMON ERRORS

Errors any endpoint can return

400bad_request

Required parameter missing or malformed body.

401unauthorized

API key missing, revoked, or not authorized for this service.

429rate_limited

Your plan's per-second rate exceeded. Retry with exponential backoff.

503upstream_busy

Backend temporarily unavailable. Try again in a few seconds.