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)

AttributeTypeDescription
routing_numberStringRouting 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.

ParameterTypeDescription
inputStringThe routing number supplied in the request.
normalizedStringThe routing number after whitespace and separators are stripped.
checksum_validBooleantrue when the number passes the ABA checksum.
validBooleanOverall verdict. true when the number passes the checksum and, where applicable, matches reference data.
reasonStringWhy the verdict was reached, for example ok.
reference_statusStringOutcome of the reference-data lookup, for example matched.
reference_matchBooleantrue when the number was found in the FedACH reference data.
bankObjectThe matched bank record. Absent when no reference match was found.
bank.routing_numberStringThe bank's 9-digit routing number.
bank.customer_nameStringRegistered name of the institution.
bank.cityStringCity.
bank.stateStringTwo-letter state code.
bank.zip_codeStringZIP code, including the +4 extension when present.
bank.phoneStringContact phone number, digits only.
bank.institution_status_codeStringFedACH institution status code.
bank.sourceStringDataset the record came from, for example fedach.
bank.updated_atStringWhen the record was last refreshed. Format: date-time.
attributionObject ArraySource 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.