ISBN-10 check digit
The nine digits 030640615 get the check digit 2, so the full ISBN-10 is 0306406152. Complete a ten-character code, or check one from an old catalog, invoice or donor list before a single wrong digit spoils a search. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Number
- 030640615
- Calculation mode
- Compute
- Input
- 030640615
- Check digit
- 2
- With check
- 0306406152
Legacy book identifiers still appear on spines, invoices, library catalogs, and publisher databases as ten-character ISBN-10 codes. The final character is not decorative: it is a mod-11 check digit chosen so mistyped registration groups, publisher codes, or title numbers fail a simple weighted sum. This capability computes that digit from any pure nine-digit body—returning 0 through 9 or the letter X when the remainder is ten—or validates a complete ISBN-10 you already have, including hyphenated forms after stripping separators.
What the ISBN-10 check digit is and why X appears
An ISBN-10 is a ten-character identifier for a book edition under the older ISO 2108 scheme. The first nine characters are decimal digits that encode registration group, publisher, and title; the tenth is a check character derived from those nine so that transcription errors are likely to break a modular condition. The standard multiplies the digits by descending weights ten through two, sums the products, and chooses a check value from zero through ten so that the full weighted sum with weight one on the check is divisible by eleven.
When that value would be ten, the character printed is the letter X rather than a two-digit string—hence valid codes such as 080442957X. This tool implements that exact mod-11 rule: compute mode returns the check character for a nine-digit body; validate mode recomputes the expected character and reports whether the full string is congruent to zero modulo eleven. It does not convert to ISBN-13, does not query a title database, and does not treat EAN-13 retail barcodes as interchangeable without the 978/979 prefix expansion you would perform elsewhere.
Knowing that ISBN-10 is a fixed-length book identifier with a distinct algorithm from Luhn mod-10 card checks or EAN-13 retail digits helps you pick the right tool: use this page when the string you care about is an ISBN-10 body or a full ten-character code with an optional X.
Where ISBN-10 check digits fit real systems
Publishers and packagers still emit ISBN-10 on older stock, remainder lists, and rights spreadsheets even after ISBN-13 became the retail default. Library and second-hand workflows receive donor lists typed from dusty title pages; a single transposed digit should fail validation before a failed OPAC search. Marketplace sellers paste mixed ISBN-10 and ISBN-13 columns into inventory tools—routing ten-character rows through this checker and thirteen-digit rows through an EAN-style path keeps each family honest.
A passing check does not prove the book exists, is in print, or matches a title—it only proves the string is well formed under the ISBN-10 check-digit algorithm, the same honesty bar you apply to any checksum.
What you can do with it
Audit legacy catalog columns
Batch-validate every ISBN-10 field in a library or rights export and quarantine rows whose check character no longer matches the recomputed expected value.
FAQ
What is an ISBN-10 check digit?
It is the tenth character of an ISBN-10, computed with a weighted mod-11 sum over the first nine digits so the full code is congruent to zero modulo eleven. When the remainder requires the value ten, the character is written as X.
Why does the check digit sometimes show as X?
ISBN-10 uses base eleven for the check value. When the required value is ten, the standard prints X instead of a digit so the code stays ten characters long.
Is the ISBN-10 check digit tool free?
The browser tool is free and runs locally.
How is the ISBN-10 check digit calculated?
Multiply the nine digits by 10, 9, 8 and so on down to 2, and add the products. The check digit is the value from 0 to 10 that makes the total, with the check counted once, a multiple of 11; 10 is written as X.
Can I paste an ISBN-10 with hyphens?
Yes. Spaces and hyphens are removed first, so a form such as 0-306-40615-2 can be checked directly. Any letter other than a final X is refused.
Related tools
For developers — API access
Everything on this page is available programmatically. This section is for teams who want to wire it into their own systems; everyone else can just use the tool above.
API endpoint
Prefer to automate it? One authenticated POST creates the task; the result comes back by webhook or a signed link. The same capability also runs here on the web, by email and from Telegram — and soon from our app too.
Call it from your stack
curl -X POST https://api.kit.forhosting.com/enc/isbn10 \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"number":"030640615"}'const res = await fetch("https://api.kit.forhosting.com/enc/isbn10", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"number": "030640615"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/enc/isbn10",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"number": "030640615"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/enc/isbn10", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"number":"030640615"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"number":"030640615"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/enc/isbn10", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"number": "030640615"
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "enc.isbn10",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}The API is asynchronous: the call returns a task_id immediately and the result arrives by webhook. Polling is capped at 1 req/s per task.
Pricing
Published price — no tokens, no invented credits. A failed task is never charged.
Errors
| HTTP | Code | Meaning |
|---|---|---|
401 | unauthorized | Missing or invalid API key. |
402 | insufficient_balance | Your balance doesn't cover the task price. |
404 | unknown_type | That task type doesn't exist. |
429 | rate_limited | Too many requests. Use the webhook instead of polling. |
Technical notes
It rejects letters other than a trailing X, wrong lengths, and empty input with a clear invalid_input error instead of guessing. Use it free in the browser or call the KIT API at the published price; both paths run the same deterministic arithmetic with no network and no stored catalog lookup.
How to compute a check digit or validate a full ISBN-10
Send a number field containing the digits (and, for validation, the trailing check character). Leading and trailing whitespace is trimmed; internal hyphens and spaces are stripped so common publisher forms such as 0-306-40615-2 can be validated without a separate cleaner. Mode compute is the default: provide exactly nine digits after stripping. Mode validate expects a full ten-character ISBN-10 after stripping—nine digits followed by 0-9 or X (case-insensitive X is uppercased). Empty strings, wrong lengths, letters other than a trailing X, and invalid mode values fail before any sum runs and are not billed. The response includes check_digit as a one-character string (0-9 or X), with_check as the nine digits plus that character, the normalized nine-digit input, length ten, and algorithm isbn10. The response reports valid true when the weighted sum is divisible by eleven, and always includes the supplied check_digit, expected_check_digit recomputed from the first nine digits alone, the nine-digit payload, and length ten. That shape supports “you typed X, expected Y” messaging in forms without a second call. Because the path is pure parse with no clock, random source, or network, the same input always yields the same JSON on the free browser tool and on the API. At $0.002 per successful request you can protect bulk catalog imports, onboarding forms, and label printers without negotiating a custom tier. Prefer compute when you mint or complete partial numbers; prefer validate when a user, partner file, or scanner supplies a full ISBN-10 and you need a boolean gate before lookup.
Where ISBN-10 check digits fit real systems
Print shops that still produce ISBN-10 barcodes or human-readable lines can call compute mode after the nine-digit body is assigned and print with_check without hand-calculating X cases.
Integration use cases
Complete a nine-digit book number
After assigning a registration group, publisher, and title body, call compute mode and store or print with_check so every ISBN-10 carries the correct trailing digit or X.
Validate typed or pasted ISBN-10 codes
When a form or CSV supplies a full ten-character code (hyphens allowed), call validate mode and block lookup when valid is false, showing expected_check_digit to help correct a mistype.
Technical questions
How do I compute an ISBN-10 check digit with this API?
POST with number set to nine digits and mode compute (or omit mode). The response includes check_digit (0-9 or X) and with_check (the full ten-character ISBN-10).
How do I validate a full ISBN-10?
POST with the full ten-character code (hyphens optional) and mode validate. The response includes valid, check_digit, expected_check_digit, and payload (the first nine digits).