VINinfo Library
VINinfo is a Python library (current version 1.9.2) designed to extract useful information from Vehicle Identification Numbers (VINs). It can operate as a standalone command-line application or be integrated as a Python package. The library provides both basic and detailed VIN information (where available) and offers functionality for VIN checksum verification. It is actively maintained with a recent release in September 2025 and focuses on decoding VINs using its internal databases, specifically enhancing data for brands like AvtoVAZ, Nissan, Opel, and Renault.
Warnings
- breaking The library has dropped support for older Python versions. `v1.0.0` removed Python 2 and Python 3.4 support. `v1.4.0` removed Python 3.5 support. The current version requires Python 3.10+.
- breaking In `v1.7.0`, the regions and countries list was updated according to ISO 3780. This change *may affect* information accuracy for vehicles manufactured before 2009. Additionally, the model year check within `Vin.verify_checksum()` became optional but defaults to 'on'.
- gotcha VINinfo decodes information based on its internal databases. Unlike some other VIN libraries (e.g., `pyvin`), it does not rely on external APIs (like NHTSA) for its primary data. Therefore, the depth and breadth of information might vary, especially for manufacturers not specifically supported with 'details extractors'.
- gotcha Detailed information (e.g., body, engine, model, plant) is currently only available for specific brands such as AvtoVAZ, Nissan, Opel, and Renault. For other manufacturers, only basic VIN segment information might be retrievable.
- gotcha A regression was fixed in `v1.9.2` related to `Vin.years` for unsupported year codes. While fixed, this highlights that parsing complex or unusual VINs, especially regarding year codes, can be an edge case that might require careful handling or validation.
Install
-
pip install vininfo -
pip install vininfo[cli]
Imports
- Vin
from vininfo import Vin
Quickstart
from vininfo import Vin
vin_number = 'VF1LM1B0H36666155' # Example Renault VIN
# For testing invalid VINs or edge cases, consider a generic placeholder
# vin_number = 'INVALIDVINTEST1234'
vin = Vin(vin_number)
print(f"VIN: {vin_number}")
print(f"Country: {vin.country}")
print(f"Manufacturer: {vin.manufacturer}")
print(f"Region: {vin.region}")
print(f"WMI: {vin.wmi}")
print(f"VDS: {vin.vds}")
print(f"VIS: {vin.vis}")
print(f"Checksum valid: {vin.verify_checksum()}")
# Accessing detailed information if available
details = vin.details
if details:
print("\nDetails:")
for key, value in details.items():
print(f" {key.replace('_', ' ').title()}: {value}")
else:
print("\nNo detailed information available for this VIN.")
# Example with annotation
annotated_vin = vin.annotate()
print(f"\nAnnotated VIN: {annotated_vin}")