apyhub
Back
▣ MODEL KIT · VERIFICATION KIT

Decode and Validate VIN API

What it does

VIN Decoder validates a vehicle identification number and returns decoded vehicle details from the VIN. Send a 17-character VIN, and get back whether it is valid, whether the check digit matches, and what vehicle data NHTSA VPIC can decode from it.

Use the GET decode endpoint when you want a single VIN checked and decoded. The response includes the VIN, a valid flag, a cached flag, the source, a validation object with checkDigitValid and warnings, and a vehicle object with fields such as make, model, modelYear, series, trim, bodyClass, vehicleType, doors, driveType, fuelType, engine, transmission, and plant. If you pass modelYear, it is applied as a query parameter for decoding.

Use the local validation endpoint when you only need structural VIN checks. It returns the VIN, valid, length, checkDigit, structure, modelYear, modelYearAmbiguous, region, errors, and warnings. That makes it useful for form validation, intake workflows, and filtering bad VINs before you call downstream systems.

For batch jobs, send up to 50 VINs in one request. The batch decode endpoint returns a count and a results array, where each item includes the VIN, valid, optional error and message, and, when available, the decoded vehicle and validation data. The recall endpoint uses a VIN to list NHTSA recall campaigns and returns recallsAvailable, count, recalls, vehicle, warnings, cached, and source.

▣ ENDPOINT 01 / 04
GET
Decode a VIN
https://api.eu.apyhub.com/corsair96/decode-and-validate-vin-api/vin/decode

QUICKSTART

GUIDE

Quickstart

Checks a VIN by sending it as a query parameter and returns the decoded vehicle details.

curl -X GET "https://api.eu.apyhub.com/corsair96/decode-and-validate-vin-api/vin/decode?vin=1HGCM82633A004352" \
  -H "apy-token: $APY_TOKEN"

What you'll get back

Returns a JSON object with vin, valid, vehicle, validation, source, and cached fields. vehicle is an object with the decoded vehicle details, and validation is an object with checkDigitValid and warnings.

{
  "vin": "1HGCM82633A004352",
  "valid": true,
  "vehicle": {
    "make": "HONDA",
    "model": "Accord",
    "modelYear": 2003,
    "series": "EX",
    "trim": "EX",
    "bodyClass": "Sedan/Saloon",
    "vehicleType": "PASSENGER CAR",
    "doors": 4,
    "driveType": "FWD/Front-Wheel Drive",
    "fuelType": "Gasoline",
    "engine": {
      "cylinders": 4,
      "displacementL": 2.4,
      "horsepower": 160
    },
    "transmission": "Automatic",
    "plant": {
      "city": "MARYSVILLE",
      "country": "UNITED STATES (USA)",
      "company": "HONDA OF AMERICA MFG., INC."
    }
  },
  "validation": {
    "checkDigitValid": true,
    "warnings": []
  },
  "source": "nhtsa-vpic",
  "cached": false
}
TRY ITLIVE · 25 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

Decodes a VIN and returns a JSON object with the decoded vehicle details, validation flags, and metadata about the lookup result. The request accepts the VIN as a query parameter and can optionally include a model year to refine decoding.

Query Parameter(s)

AttributeTypeMandatoryDescription
vinStringYesThe 17-character VIN to decode.
modelYearIntegerNoOptional model year hint for decoding. Minimum: 1981.

Response

Returns a JSON object with required top-level fields vin (string), valid (boolean), vehicle (object), validation (object), source (string), and cached (boolean). The source field is fixed to nhtsa-vpic.

ParameterTypeMandatoryDescription
vinStringYesThe VIN that was decoded.
validBooleanYesIndicates whether the VIN is valid.
cachedBooleanYesIndicates whether the response was served from cache.
sourceStringYesFixed value: nhtsa-vpic.
vehicleObjectYesDecoded vehicle details. Includes make, model, modelYear, series, trim, bodyClass, vehicleType, doors, driveType, fuelType, engine, transmission, and plant.
vehicle.makeStringYesVehicle make. May be null.
vehicle.modelStringYesVehicle model. May be null.
vehicle.modelYearIntegerYesVehicle model year. May be null.
vehicle.seriesStringYesVehicle series. May be null.
vehicle.trimStringYesVehicle trim. May be null.
vehicle.bodyClassStringYesVehicle body class. May be null.
vehicle.vehicleTypeStringYesVehicle type. May be null.
vehicle.doorsIntegerYesNumber of doors. May be null.
vehicle.driveTypeStringYesDrive type. May be null.
vehicle.fuelTypeStringYesFuel type. May be null.
vehicle.transmissionStringYesTransmission description. May be null.
vehicle.engineObjectYesEngine details, or null. Includes cylinders, displacementL, and horsepower.
vehicle.engine.cylindersIntegerYesEngine cylinders. May be null.
vehicle.engine.displacementLNumberYesEngine displacement in liters. May be null.
vehicle.engine.horsepowerIntegerYesEngine horsepower. May be null.
vehicle.plantObjectYesPlant details, or null. Includes city, country, and company.
vehicle.plant.cityStringYesPlant city. May be null.
vehicle.plant.countryStringYesPlant country. May be null.
vehicle.plant.companyStringYesPlant company. May be null.
validationObjectYesValidation details. Includes checkDigitValid and warnings.
validation.checkDigitValidBooleanYesIndicates whether the VIN check digit is valid. May be null.
validation.warningsString ArrayYesValidation warnings returned by the decoder.
▣ ENDPOINT 02 / 04
GET
List NHTSA recall campaigns
https://api.eu.apyhub.com/corsair96/decode-and-validate-vin-api/vin/recalls

QUICKSTART

GUIDE

Quickstart

Look up recall information for a VIN using the required vin query parameter.

curl -X GET "https://api.eu.apyhub.com/corsair96/decode-and-validate-vin-api/vin/recalls?vin=1HGCM82633A004352" \
  -H "apy-token: $APY_TOKEN"

What you'll get back

Returns a JSON object with vin (string), vehicle (object), recallsAvailable (boolean), count (integer), recalls (array), source (string), cached (boolean), and warnings (array of strings).

{
  "vin": "1HGCM82633A004352",
  "vehicle": {
    "make": "Honda",
    "model": "Accord",
    "modelYear": 2003
  },
  "recallsAvailable": true,
  "count": 1,
  "recalls": [],
  "source": "nhtsa-recalls",
  "cached": false,
  "warnings": []
}
TRY ITLIVE · 35 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

Returns NHTSA recall campaign data for the VIN you provide, along with basic vehicle details, a recall count, source metadata, cache status, and any warnings. The VIN is supplied as a query parameter.

Query Parameter(s)

AttributeTypeMandatoryDescription
vinStringYesVIN to look up. Must be exactly 17 characters long (minLength: 17, maxLength: 17).

Response

Returns a JSON object with vin as a string, vehicle as an object, recallsAvailable as a boolean, count as an integer, recalls as an array of objects, source as a string, cached as a boolean, and warnings as an array of strings. The source field is fixed to nhtsa-recalls.

AttributeTypeMandatoryDescription
vinStringYesVIN returned by the service.
vehicleObjectYesVehicle details object containing make, model, and modelYear.
vehicle.makeStringYesVehicle make, or null if not available.
vehicle.modelStringYesVehicle model, or null if not available.
vehicle.modelYearIntegerYesVehicle model year, or null if not available.
recallsAvailableBooleanYesIndicates whether recall data was available from the upstream source. If this is false, do not interpret an empty recalls array as meaning there are no recalls.
countIntegerYesNumber of recall records returned.
recallsObject ArrayYesArray of recall campaign objects. Each item includes campaignNumber, component, summary, consequence, remedy, reportDate, and manufacturer.
recalls[].campaignNumberStringYesRecall campaign number, or null if not available.
recalls[].componentStringYesRecall component, or null if not available.
recalls[].summaryStringYesRecall summary, or null if not available.
recalls[].consequenceStringYesRecall consequence, or null if not available.
recalls[].remedyStringYesRecall remedy, or null if not available.
recalls[].reportDateStringYesReport date in ISO format (YYYY-MM-DD) when parsable; otherwise the upstream value. May be null.
recalls[].manufacturerStringYesRecall manufacturer, or null if not available.
sourceStringYesFixed value: nhtsa-recalls.
cachedBooleanYesIndicates whether the response was served from cache.
warningsString ArrayYesWarning messages returned by the service.
▣ ENDPOINT 03 / 04
POST
Decode up to 50 VINs
https://api.eu.apyhub.com/corsair96/decode-and-validate-vin-api/vin/batch

QUICKSTART

GUIDE

Quickstart

Decode and validate one or more VINs with the required vins array.

curl -X POST "https://api.eu.apyhub.com/corsair96/decode-and-validate-vin-api/vin/batch" \
  -H "apy-token: $APY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"vins":["1HGCM82633A004352"]}'

What you'll get back

Returns a JSON object with count as an integer, source as the string nhtsa-vpic, and results as an array of per-VIN validation results. Each result includes the vin string, valid boolean, and may also include error, message, vehicle, and validation.

{
  "count": 1,
  "source": "nhtsa-vpic",
  "results": [
    {
      "vin": "1HGCM82633A004352",
      "valid": true
    }
  ]
}
TRY ITLIVE · 150 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.
body*
vins*
Optional model year applied to every VIN. Must be 1981 or later and no later than next year.

About this endpoint

What it does

Decodes up to 50 VINs in a single request and returns a per-VIN validation result plus any decoded vehicle data available from the nhtsa-vpic source.

Request Body

ParameterTypeMandatoryDescription
vinsString ArrayYesVIN strings to decode. Minimum 1 item, maximum 50 items.
modelYearIntegerNoOptional model year applied to every VIN. Must be 1981 or later.

Response

Returns a JSON object with count integer, results array, and source string fields. count is the number of VINs processed, results contains one object per VIN, and source is fixed to nhtsa-vpic.

ParameterTypeMandatoryDescription
countIntegerYesNumber of VINs processed.
resultsObject ArrayYesPer-VIN decode results. Each item includes vin and valid, and may include error, message, vehicle, and validation.
sourceStringYesData source identifier. The schema constrains this to nhtsa-vpic.

Notes

The results array items are always keyed by vin and valid. When present, vehicle and validation may be null; the validation.checkDigitValid field itself may also be null.

▣ ENDPOINT 04 / 04
GET
Validate a VIN locally
https://api.eu.apyhub.com/corsair96/decode-and-validate-vin-api/vin/validate

QUICKSTART

GUIDE

Quickstart

Check a VIN by passing it as a query parameter.

curl -X GET "https://api.eu.apyhub.com/corsair96/decode-and-validate-vin-api/vin/validate?vin=1HGCM82633A004352" \
  -H "apy-token: $APY_TOKEN"

What you'll get back

Returns a JSON object with these top-level fields: vin (string), valid (boolean), errors (array of strings), length (integer), region (string or null), warnings (array of strings), modelYear (integer or null), structure (object or null), checkDigit (object), and modelYearAmbiguous (boolean).

The checkDigit object includes computed, provided, valid, and applicable. The structure object, when present, includes wmi, vds, checkDigit, modelYearCode, plantCode, and serial.

{
  "vin": "1HGCM82633A004352",
  "valid": true,
  "errors": [],
  "length": 17,
  "region": "north-america",
  "warnings": [],
  "modelYear": 2003,
  "structure": {
    "wmi": "1HG",
    "vds": "CM826",
    "checkDigit": "3",
    "modelYearCode": "3",
    "plantCode": "A",
    "serial": "004352"
  },
  "checkDigit": {
    "computed": "3",
    "provided": "3",
    "valid": true,
    "applicable": true
  },
  "modelYearAmbiguous": false
}
TRY ITLIVE · 5 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 VIN locally and returns a JSON object describing whether it is valid, along with the VIN length, region, warnings and errors, model year information, structure breakdown, and check-digit details.

Query Parameter(s)

AttributeTypeMandatoryDescription
vinStringYesVIN to validate locally. Must be exactly 17 characters long.

Response

Returns a JSON object with required top-level fields for the VIN, validity, length, check-digit data, structural breakdown, model year, region, errors, and warnings. The response shape is a single object, with structure either containing decoded VIN sections or null.

ParameterTypeMandatoryDescription
vinStringYesThe VIN that was validated.
validBooleanYesWhether the VIN is valid.
lengthIntegerYesLength of the VIN.
checkDigitObjectYesCheck-digit validation details. Contains computed, provided, valid, and applicable.
checkDigit.computedStringYesCheck digit computed from the VIN, or null if unavailable.
checkDigit.providedStringYesCheck digit present at position 9, or null if unavailable.
checkDigit.validBooleanYesWhether the provided check digit is valid, or null when the check digit does not apply to the VIN region.
checkDigit.applicableBooleanYesWhether the check digit rule applies to the VIN region.
structureObjectYesVIN structure breakdown, or null. When present, contains wmi, vds, checkDigit, modelYearCode, plantCode, and serial.
structure.wmiStringYesWorld Manufacturer Identifier (positions 1-3).
structure.vdsStringYesVehicle Descriptor Section (positions 4-8).
structure.checkDigitStringYesCheck digit (position 9).
structure.modelYearCodeStringYesModel year code (position 10).
structure.plantCodeStringYesPlant code (position 11).
structure.serialStringYesSerial number (positions 12-17).
modelYearIntegerYesDecoded model year, or null if it cannot be determined.
modelYearAmbiguousBooleanYesWhether the model year code is ambiguous because it repeats every 30 years and an older occurrence exists.
regionENUMYesVIN region. Allowed values: north-america, south-america, europe, asia, africa, oceania, null.
errorsString ArrayYesValidation errors returned by the decoder.
warningsString ArrayYesValidation warnings returned by the decoder.
▣ 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.