How to Validate a US Routing Number (ABA) and Catch Typos Before You Send Money
Learn how a 9-digit ABA routing number is built, run the 3-7-1 checksum by hand on a real example, and catch a single-digit typo before an ACH or wire.
How to Validate a US Routing Number (ABA) and Catch Typos Before You Send Money
The first time a paycheck I was expecting failed to land, I spent two days assuming the payroll system was broken. It wasn't. I had copied my bank's routing number off a check and transposed two digits — wrote 02100021 shifted by one and padded it back to nine. The bank's clearing system happily accepted the malformed number, tried to route the deposit nowhere, and bounced it back almost a week later. The annoying part is that the error was catchable in about one second. A US routing number carries its own built-in error check, and a single bad digit almost always fails it on the spot.
This post walks through what those nine digits actually mean, the exact formula that validates them, and how to run it yourself before you trust a number in an ACH form or a wire transfer.
What a routing number is
A routing number — formally an ABA routing transit number, named after the American Bankers Association that introduced the system in 1910 — is the 9-digit code that identifies the bank an account belongs to. On a paper check it is the leftmost group of digits along the bottom MICR line, sitting before your account number. When you set up a direct deposit, send an ACH payment, or wire money, the routing number is what tells the clearing network which institution to pull from or push to.
It is public information. Every customer at a given branch shares the same routing number, so unlike your account number it is not a secret. That public, fixed-length, fixed-format nature is exactly why a checksum can validate it: the number has a known shape, and any deviation from that shape is a sign of a typo.
The structure of the nine digits
The nine positions are not arbitrary. They break down like this:
- Digits 1-2 — the Federal Reserve routing symbol. Values
01through12map to the twelve Federal Reserve districts, so11is District 11 (Dallas) and02is District 2 (New York). The21-32range covers those same twelve districts for thrift institutions,61-72handles electronic transactions,00is the US Government, and80is travelers checks. - Digits 3-4 — the ABA institution identifier, narrowing down to a specific Federal Reserve processing center or bank.
- Digits 5-8 — the bank's own identifier within that region.
- Digit 9 — the check digit, computed from the other eight so that the whole number satisfies the checksum below.
That last digit is the clever part. It is not random; it is calculated so the full nine-digit sequence passes a fixed arithmetic test.
The ABA checksum: the 3-7-1 formula
Here is the rule that makes routing-number validation possible. Label the nine digits d1 d2 d3 d4 d5 d6 d7 d8 d9. Weight them in a repeating 3, 7, 1 pattern and add the products:
3×(d1 + d4 + d7) + 7×(d2 + d5 + d8) + 1×(d3 + d6 + d9)
A valid routing number is one where that total is a multiple of 10. That's the whole test. The weights repeat 3, 7, 1 across the three groups of three positions, and the check digit d9 is chosen specifically to make the sum land exactly on a multiple of 10.
Why does this catch typos so reliably? Because the weights are coprime to 10 in a way that makes single-digit errors visible. Change any one digit and you shift the weighted sum by 1×, 3×, or 7× the size of that change — and none of those will leave the total divisible by 10 unless the change happens to be a multiple of 10, which a single decimal digit can never be. The 3-7-1 pattern also catches the most common real-world slip: swapping two adjacent digits. Transpose a pair weighted 3 and 7, for instance, and the sum moves by 4× the difference between them, which almost always breaks divisibility.
A worked example
Let's run the formula on 111000025, a well-known valid routing number.
Write out the nine digits and their positions:
position: 1 2 3 4 5 6 7 8 9
digit: 1 1 1 0 0 0 0 2 5
weight: 3 7 1 3 7 1 3 7 1
Now group by weight and multiply:
- Weight 3 (positions 1, 4, 7):
3 × (1 + 0 + 0) = 3 × 1 = 3 - Weight 7 (positions 2, 5, 8):
7 × (1 + 0 + 2) = 7 × 3 = 21 - Weight 1 (positions 3, 6, 9):
1 × (1 + 0 + 5) = 1 × 6 = 6
Add them: 3 + 21 + 6 = 30. Thirty is a multiple of 10, so the checksum passes. 111000025 is well-formed.
Now corrupt one digit to see the check fire. Suppose someone fat-fingers the eighth digit from 2 to 3, giving 111000035. The weight-7 group becomes 7 × (1 + 0 + 3) = 28, and the new total is 3 + 28 + 6 = 37. Thirty-seven is not divisible by 10, so the number fails — exactly the typo you want to catch before it reaches a payment form. That is the difference between a one-second fix and a bounced transfer a week later.
Where this fits, and what it does not prove
You can do this arithmetic by hand, but doing it for every number under deadline is how mistakes slip through. The Routing Number Validator runs the 3-7-1 checksum, confirms the length is exactly nine, and reads the Federal Reserve routing symbol from the first two digits — all locally in your browser, with nothing sent to a server. Paste a number, watch the verdict, flip a digit, and watch it turn red.
One honest limit worth repeating: passing the checksum proves the number is well-formed, not that a live bank owns it. Divisibility by 10 is a structural property, not a directory lookup. A carefully chosen 9-digit string can satisfy the formula and still belong to no active institution. To confirm a routing number is currently assigned to a real bank you need the Federal Reserve E-Payments directory or your own bank. Treat the checksum as a typo filter, never as proof that an account exists — and never wire money on the strength of a green verdict alone.
The same idea — a weighted-digit check that flags typos before a value is trusted — shows up across finance and identifiers. Card numbers use the Luhn algorithm rather than 3-7-1, and you can run that one the same way with the Luhn Validator. The pattern is everywhere: a few digits of redundancy turn a silent error into a loud one, right at the moment you can still fix it.
Made by Toolora · Updated 2026-06-13