TXT · Text & Data tools

Check Digit Validator

Scheme
Values to check
Result
Luhn (mod 10)scheme0values0valid0invalid0unreadable

The mod 10 algorithm behind card numbers, IMEIs, and many national IDs.

Shareable link

Settings are written to the URL as you change them. Nothing differs from the defaults yet.

Validate a check digit

Paste identifiers into the left pane and each line comes back marked VALID, INVALID, or ERROR. Invalid lines report the digit that was expected, so a transposed pair is visible without recomputing anything by hand.

ERROR means the value could not be checked at all: an IMEI with 14 digits, a VIN containing the letter O, an ISBN-10 with a check character other than 0-9 or X. Those are structural problems, not failed arithmetic.

Add check digit

Switch the mode when you have the payload and need the final character. Feed 400638133393 to the EAN-13 scheme and it returns 4006381333931. Feed GBWEST12345698765432 to the IBAN scheme and it returns GB82WEST12345698765432.

Two schemes behave differently here. IBAN check digits sit in positions 3 and 4, so paste the country code followed by the account body. A VIN check character sits in position 9, so paste all 17 characters and the ninth is replaced.

Mod 10, mod 11, and mod 97

Most consumer identifiers use one of three families.

Mod 10 covers Luhn (card numbers, IMEI, ISIN) and the GTIN weights behind EAN, UPC, and ISBN-13. It catches every single-digit error, but it misses the transposition 09 to 90, which is why it is not used where digits are read aloud.

Mod 11 covers ISBN-10, ISSN, and VIN. The extra modulus catches transpositions, at the cost of a remainder of 10 that will not fit in one digit. That is what the X check character is for.

Mod 97 covers IBAN. The whole account number is rearranged, letters expand to two digits, and the result must leave a remainder of 1. It catches far more than a single-digit scheme because the check is 2 digits wide.

Verhoeff and Damm

Verhoeff and Damm are the schemes to reach for when you are designing an identifier rather than reading someone else’s. Both catch every single-digit error and every adjacent transposition, including 09 to 90.

Verhoeff needs a dihedral multiplication table, a permutation table, and an inverse table. Damm needs one quasigroup table and no exceptions at all, which makes it the easier of the two to implement correctly.

Batch checks

Batch by newline reads each line as a separate value, so a column pasted from a spreadsheet returns one verdict per row. The counters below the panes total the valid, invalid, and unreadable lines, which is usually the fastest way to confirm an export before importing it somewhere stricter.

Frequently Asked Questions

Luhn, credit card numbers, IMEI, IBAN, ABA routing numbers, ISBN-10, ISBN-13, EAN-13, EAN-8, UPC-A, GTIN-14, ISSN, VIN, ISIN, Verhoeff, and Damm.

Paste one value per line. Spaces, dashes, and other separators are stripped before the check runs, so a card number formatted in groups of four works as pasted.

It takes the payload without its final check character and returns the complete value. For an IBAN it recomputes both check digits in positions 3 and 4; for a VIN it recomputes position 9.

No. A check digit only proves the value is internally consistent. A card number can pass Luhn and still belong to no account, and an IBAN can pass mod 97 and still name a closed one.

Checking one kind of number over and over?

Pages locked to one scheme

Explore Our Tools

Browse all tools