ForHosting KIT · Developer Utilities

Validate a VIN check digit

A Vehicle Identification Number contains a check digit that helps reveal transcription mistakes before a VIN enters a vehicle record, inventory system, insurance workflow, or service database.

● BetaFree · in your browser
Use it from WebAPIEmailTelegramApp soon

This validator applies the standard transliteration and positional weighting calculation to all 17 characters, computes the expected ninth character, and compares it with the character supplied. The result clearly reports whether the VIN passes, along with both check digits and the modulo remainder, without looking up or storing vehicle details.

What the VIN check digit can tell you

A modern VIN is a structured 17-character identifier, and its ninth position is reserved for a check digit in systems that apply the standard validation rule. This validator answers one focused question: does the ninth character agree with the other characters under the weighted transliteration calculation? A passing result is useful evidence that the identifier was copied consistently. A failing result is a strong prompt to compare the VIN against the dashboard plate, certification label, registration document, or original source. It is not, however, proof that a vehicle is genuine, legally registered, or accurately described. A completely invented VIN can still be constructed with a mathematically correct check digit. Likewise, manufacturer, market, or historical differences may affect whether a VIN uses the check digit convention. Treat this result as an input-quality control that catches many ordinary typing and scanning errors, then use authoritative vehicle records for identity, title, theft, recall, ownership, or specification questions.

How the weighted transliteration calculation works

The calculation first converts every allowed letter to a numeric value while digits retain their own values. Letters I, O, and Q are excluded from VINs because they can be confused with numerals. Each of the 17 numeric values is multiplied by the weight assigned to its position: 8, 7, 6, 5, 4, 3, 2, 10, zero for the check-digit position, then 9, 8, 7, 6, 5, 4, 3, and 2. The products are added, and the sum is divided by 11. Its remainder becomes the expected check digit; remainders zero through nine use the matching numeral, while remainder 10 is represented by X. Giving the ninth position a weight of zero ensures that the supplied check digit does not influence its own calculation. This capability returns the normalized uppercase VIN, the supplied ninth character, the calculated character, and the remainder, making the decision inspectable instead of returning only a bare true-or-false value.

Using validation safely in forms and automated workflows

Send the VIN exactly as a 17-character string. Lowercase letters are accepted and normalized to uppercase, but spaces, punctuation, decorative separators, and line breaks are not silently removed. That strict behavior is intentional: an integration should identify unexpected input rather than alter an identifier behind the scenes. Inputs of any other length produce an invalid-input error, as do characters outside the VIN alphabet. A well-formed VIN with a mismatched check digit is different from malformed input, so it returns a normal result with valid set to false. This distinction lets a user interface explain whether the person must fix the field format or recheck the identifier itself. In batch intake, preserve the original source beside the normalized result, route failed comparisons for review, and avoid rejecting legal or historical records solely from this calculation when their jurisdiction or model year may follow different rules. API automation costs $0.002 per request, while the browser runner can perform the same deterministic calculation locally.

Catch dealership inventory entry mistakes

Check a typed or scanned VIN before creating an inventory record, and send mismatches back for comparison with the vehicle.

Validate service booking forms

Distinguish malformed identifiers from well-formed VINs whose ninth character does not match the calculated check digit.

Screen imported vehicle records

Add a deterministic quality-control field to an import pipeline while keeping authoritative identity checks as a separate step.

What does VIN check digit validation cost?

The API costs $0.002 per request. The browser runner performs the same deterministic calculation free on this page.

Which character is the VIN check digit?

The check digit is the ninth character of the 17-character VIN. It may be a numeral from 0 to 9 or X.

Why can the calculated check digit be X?

The calculation uses modulo 11. When the remainder is 10, the standard representation for the check digit is X.

Does a valid check digit prove that the vehicle is genuine?

No. It checks mathematical consistency only. Use authoritative records for vehicle identity, title, ownership, theft, recalls, and specifications.

Are lowercase VIN letters accepted?

Yes. Letters are normalized to uppercase. Spaces and punctuation are not removed, and I, O, and Q are rejected.

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.

POSThttps://api.kit.forhosting.com/misc2/vin-check-digit-validate

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.

curl -X POST https://api.kit.forhosting.com/misc2/vin-check-digit-validate \
  -H "Authorization: Bearer $KIT_KEY" \
  -H "Content-Type: application/json" \
  -d '{"vin":"1M8GDM9AXKP042788"}'
{
  "vin": "1M8GDM9AXKP042788"
}
{
  "task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
  "type": "misc2.vin_check_digit_validate",
  "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.

Per request$0.002

Published price — no tokens, no invented credits. A failed task is never charged.

HTTPCodeMeaning
401unauthorizedMissing or invalid API key.
402insufficient_balanceYour balance doesn't cover the task price.
404unknown_typeThat task type doesn't exist.
429rate_limitedToo many requests. Use the webhook instead of polling.

Read the full KIT documentation →