NHTSA VIN Decoder
World-class VIN decoder with comprehensive offline database (2,015+ WMI codes) and NHTSA vPIC API integration
Author: Wal33D Email: aquataze@yahoo.com
⚡ Quick Start
Java - Offline Mode (No Internet Required)
import io.github.vindecoder.offline.OfflineVINDecoder;
import io.github.vindecoder.nhtsa.VehicleData;
OfflineVINDecoder decoder = new OfflineVINDecoder();
VehicleData vehicle = decoder.decode("1HGCM82633A004352");
System.out.println(vehicle.getModelYear() + " " +
vehicle.getMake() + " " +
vehicle.getModel());
// Output: 2003 Honda Accord
Python - With NHTSA API
from python.nhtsa_vin_decoder import NHTSAVinDecoder
decoder = NHTSAVinDecoder()
vehicle = decoder.decode("1HGCM82633A004352")
print(f"{vehicle.year} {vehicle.make} {vehicle.model}")
# Output: 2003 Honda Accord
Python - Offline Mode
from python.wmi_database import WMIDatabase
manufacturer = WMIDatabase.get_manufacturer("1HGCM82633A004352")
year = WMIDatabase.get_year("1HGCM82633A004352")
print(f"{year} {manufacturer}")
# Output: 2003 Honda
🎯 Overview
Advanced VIN decoder featuring both enhanced offline decoding capabilities and official NHTSA vPIC API integration. Provides complete vehicle specifications through manufacturer-specific decoders and a comprehensive WMI database with 2,015+ manufacturer codes.
✨ Features
- Enhanced Offline Decoder - Full VIN decoding without internet
- 2,015+ Manufacturer Codes - Comprehensive WMI database (6x industry standard)
- Manufacturer-Specific Decoders - Detailed model/trim/engine extraction
- VIN Validation - Check digit verification per ISO 3779
- Year Decoding - Accurate model year extraction (1980-2039)
- Official NHTSA API - Falls back to government database when online
- Automatic Fallback - Seamlessly switches between offline/online
- FREE - No API key required
- Caching - Built-in LRU cache to reduce API calls
- Multi-platform - Java/Android and Python implementations
📁 Directory Structure
nhtsa-vin-decoder/
├── java/io/github/vindecoder/
│ ├── offline/ # Offline decoder implementation
│ │ ├── OfflineVINDecoder.java # Main offline decoder
│ │ ├── VINValidator.java # VIN validation & structure
│ │ ├── WMIDatabase.java # 948+ manufacturer codes
│ │ └── MercedesBenzDecoder.java # Example manufacturer decoder
│ └── nhtsa/ # NHTSA API integration
│ ├── VINDecoderService.java
│ ├── VehicleData.java
│ └── NHTSAApiService.java
├── python/ # Python implementation
│ ├── nhtsa_vin_decoder.py # Main decoder with API
│ └── wmi_database.py # Offline WMI database
├── data/ # Reference data (not used at runtime)
│ ├── *.csv # Source WMI data from WALL-E/vin-decoder
│ ├── process_wmi.py # Script to regenerate database
│ └── wmi_database_generated.java # Generated code
└── docs/ # Documentation
├── ADDING_DECODERS.md # Guide for adding manufacturers
├── VIN_DECODER_RESOURCES.md # External data sources
├── API.md # Complete API reference
├── INSTALLATION.md # Setup guide
├── USAGE.md # Examples and best practices
└── WMI_DATABASE.md # Offline database details
🚀 What You Get
Offline Decoding (No Internet Required)
{
"vin": "4JGDA5HB7JB158144",
"make": "Mercedes-Benz",
"manufacturer": "Mercedes-Benz (Daimler AG)",
"model": "GLE-Class",
"year": "2018",
"trim": "GLE 350 4MATIC",
"vehicle_type": "Sport Utility Vehicle (SUV)",
"body_class": "Sport Utility Vehicle (SUV)",
"doors": "4",
"drive_type": "4MATIC",
"engine_model": "3.5L V6",
"engine_cylinders": "6",
"engine_displacement_l": "3.5",
"fuel_type": "Gasoline",
"transmission_style": "Automatic",
"transmission_speeds": "9",
"plant_city": "Tuscaloosa",
"plant_state": "Alabama",
"plant_country": "United States",
"gvwr": "6062",
"curb_weight": "4630"
}
Online Mode (Full NHTSA Data)
All of the above PLUS safety ratings, recalls, NCAP data, and more.
💻 Quick Start
Java - Offline Mode (No Internet)
import io.github.vindecoder.offline.OfflineVINDecoder;
import io.github.vindecoder.nhtsa.VehicleData;
OfflineVINDecoder decoder = new OfflineVINDecoder();
VehicleData vehicle = decoder.decode("4JGDA5HB7JB158144");
System.out.println("Vehicle: " + vehicle.getModelYear() + " " +
vehicle.getMake() + " " + vehicle.getModel());
// Output: Vehicle: 2018 Mercedes-Benz GLE-Class
System.out.println("Trim: " + vehicle.getTrim());
// Output: Trim: GLE 350 4MATIC
System.out.println("Engine: " + vehicle.getEngineModel());
// Output: Engine: 3.5L V6
Java - With NHTSA API
VINDecoderService decoder = VINDecoderService.getInstance();
decoder.decodeVIN("4JGDA5HB7JB158144", new VINDecoderCallback() {
@Override
public void onSuccess(VehicleData vehicle) {
// Full NHTSA data returned
System.out.println("Vehicle: " + vehicle.getDisplayName());
}
@Override
public void onError(String error) {
// Automatically falls back to offline decoder
VehicleData vehicle = new OfflineVINDecoder().decode(vin);
}
});
🧪 Testing
Java (Year Decoding Test)
- Using Gradle (recommended):
./gradlew test
This runs JUnit tests validating VIN model year decoding across the 30-year cycle, including 2031–2039 (digit codes with position 7 letter heuristic).
Python (Year Decoding Test)
- Run tests:
python3 tests/test_year.py
This validates the Python WMI fallback year-decoding heuristic matches the Java logic.
Python
from python.nhtsa_vin_decoder import NHTSAVinDecoder
decoder = NHTSAVinDecoder()
vehicle = decoder.decode("4JGDA5HB7JB158144")
print(f"Vehicle: {vehicle.year} {vehicle.make} {vehicle.model}")
# Output: Vehicle: 2018 Mercedes-Benz GLE-Class
📊 Offline Decoder Coverage
Global Manufacturer Support (2,015+ WMI Codes)
North America (Complete)
- United States: Ford, GM, Tesla, Rivian, Lucid
- Canada: All manufacturers
- Mexico: All manufacturers
Europe (Comprehensive)
- Germany: Mercedes-Benz, BMW, Audi, Porsche, Volkswagen
- Italy: Ferrari, Lamborghini, Alfa Romeo, Maserati
- UK: Jaguar, Land Rover, Aston Martin, Bentley, Rolls-Royce
- France: Renault, Peugeot, Citroën, Bugatti
Asia (Extensive)
- Japan: Toyota, Honda, Nissan, Mazda, Subaru, Mitsubishi
- Korea: Hyundai, Kia, Genesis
- China: BYD, NIO, XPeng, Geely, and 200+ manufacturers
Special Vehicle Types
- Motorcycles: Harley-Davidson, Yamaha, Honda, Ducati, BMW
- Commercial: Freightliner, Kenworth, Peterbilt, Mack
- Buses: Blue Bird, Thomas, Gillig
- Agricultural: John Deere
- Electric: Tesla, Rivian, Lucid, Polestar, Fisker
Manufacturer-Specific Decoders
Currently implemented:
- Mercedes-Benz: 115+ model variants with full specs
- Ford: 100+ model codes including F-Series, Mustang, Explorer, Edge
- GM: Chevrolet, Cadillac, Buick, GMC with RPO engine codes
- Toyota/Lexus: Comprehensive model and engine coverage
Easily extensible for:
- Honda, BMW, Nissan, etc.
- See ADDING_DECODERS.md for implementation guide
🔍 Comparison
Current Capabilities (What We Actually Have)
| Feature | Our Offline Decoder | NHTSA API (Online) | Basic WMI Only |
|---|---|---|---|
| Manufacturer | ✓ 2,015+ codes | ✓ All | ~100-300 codes |
| Make | ✓ All from WMI | ✓ All | ✓ Limited |
| Model | ✓ Ford, GM, Toyota, Mercedes* | ✓ All | ✗ |
| Year | ✓ 1980-2039 | ✓ All | ✗ |
| Trim/Series | ✓ Ford, GM, Toyota, Mercedes* | ✓ All | ✗ |
| Engine Details | ✓ Ford, GM, Toyota, Mercedes* | ✓ All | ✗ |
| Transmission | ✓ Ford, GM, Toyota, Mercedes* | ✓ All | ✗ |
| Body Style | ✓ Ford, GM, Toyota, Mercedes* | ✓ All | ✗ |
| Drive Type | ✓ Ford, GM, Toyota, Mercedes* | ✓ All | ✗ |
| Plant Location | ✓ Basic all | ✓ Detailed | ✗ |
| Weight Specs | ✓ Ford, GM, Toyota, Mercedes* | ✓ All | ✗ |
| VIN Validation | ✓ ISO 3779 | ✓ | Basic |
| Check Digit | ✓ Full validation | ✓ | ✗ |
| Region/Country | ✓ All | ✓ All | ✓ Basic |
| Safety Data | ✗ | ✓ NCAP ratings | ✗ |
| Recall Data | ✗ | ✓ | ✗ |
| Works Offline | ✓ Always | ✗ Needs internet | ✓ |
| Speed | <1ms | 200-500ms | <1ms |
| Free | ✓ | ✓ | ✓ |
*Can be extended to other manufacturers by adding decoders (see ADDING_DECODERS.md)
📈 Recent Improvements
Version 2.0 (October 2025)
- 6x More Coverage: Increased from 311 to 2,015+ WMI codes
- Fixed Year Bug: Now correctly decodes 2010+ model years
- 4 Manufacturer Decoders: Mercedes-Benz, Ford, GM, Toyota/Lexus with full specs
- Enhanced Validation: ISO 3779 check digit verification
- Extensible Architecture: Easy to add new manufacturers
- Reference Data: CSV sources included for transparency
🛠️ Installation
Java/Android
// Add as submodule
git submodule add https://github.com/Wal33D/nhtsa-vin-decoder.git modules/nhtsa-vin-decoder
// For NHTSA API support, add:
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
Python
# No external dependencies for offline mode
from python.wmi_database import WMIDatabase
# For API support:
pip install requests # Optional, uses urllib by default
📚 Documentation
- ADDING_DECODERS.md - Add manufacturer-specific decoders
- VIN_DECODER_RESOURCES.md - External data sources
- API Reference - Complete API documentation
- WMI Database - Offline database details
🔧 Extending the Decoder
Adding a New Manufacturer Decoder
See ADDING_DECODERS.md for complete guide.
Quick example for Ford:
public class FordDecoder {
public static VehicleInfo decode(String vin) {
// Extract model codes, engine, transmission
// See MercedesBenzDecoder.java for reference
}
}
Updating WMI Database
cd data/
# Edit CSV files to add new codes
python3 process_wmi.py
# Copy generated code to WMIDatabase.java
🧩 Using As a Gradle Submodule
- Add this repo as a Git submodule, e.g. under
modules/nhtsa-vin-decoder. - In your root
settings.gradle(orsettings.gradle.kts) include the project:
include ':nhtsa-vin-decoder'
project(':nhtsa-vin-decoder').projectDir = new File(rootDir, 'modules/nhtsa-vin-decoder')
- In your app module
build.gradleadd a dependency:
implementation project(':nhtsa-vin-decoder')
- If you use the online NHTSA API classes, add runtime dependencies in your app:
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
implementation 'com.google.code.gson:gson:2.10.1'
⚡ Performance
Speed Comparison
| Operation | Time | Throughput | Use Case |
|---|---|---|---|
| Offline Decode | <1ms | 1,000+ VINs/sec | Real-time apps, mobile |
| Online Decode | 200-500ms | ~2-5 VINs/sec | Complete data needed |
| Batch Offline | 0.5s/1000 VINs | 2,000 VINs/sec | Fleet management |
| Batch Online (parallel) | 10s/100 VINs | ~10 VINs/sec | Background processing |
Why Offline Mode is 500x Faster
Offline: VIN → HashMap lookup → Result (0.8ms)
Online: VIN → HTTP request → NHTSA server → Response parsing → Result (350ms)
Resource Usage
- Memory: ~100KB for WMI database (2,015+ codes)
- Storage: ~500KB total (includes manufacturer decoders)
- CPU: Negligible (<1% for typical usage)
- Network: Zero for offline mode, ~5KB per VIN for online
Real-World Performance Test
# Test: Decode 1,000 VINs
# Hardware: MacBook Pro M1, 16GB RAM
Offline mode: 0.534 seconds (1,873 VINs/sec)
Online mode: 342.8 seconds (2.9 VINs/sec)
Speedup: 642x faster
When to Use Each Mode
Use Offline Mode When:
- Speed is critical (<1ms response time)
- Working without internet connection
- Processing large batches (1,000+ VINs)
- Building mobile/embedded apps
- Need basic info (manufacturer, year, region)
Use Online Mode When:
- Need complete vehicle specifications
- Want safety ratings and recall data
- Require NCAP test results
- Need detailed engine/transmission specs
- Accuracy is more important than speed
🎯 Use Cases
- OBD-II Apps - Vehicle context without internet
- Fleet Management - Offline vehicle identification
- Insurance - Quick VIN validation
- Parts Lookup - Accurate model/engine matching
- Automotive Tools - Professional diagnostic apps
- Classic Cars - Decode vintage VINs (1980+)
🤝 Contributing
Found a missing WMI code or want to add a manufacturer decoder?
- Fork the repository
- Add codes to
data/*.csvor create new decoder injava/io/github/vindecoder/offline/ - Submit PR with test results
📄 License
MIT License - Free for commercial and non-commercial use
📧 Contact
Wal33D - aquataze@yahoo.com Repository: https://github.com/Wal33D/nhtsa-vin-decoder
🙏 Credits
- NHTSA for providing the free vPIC API
- WALL-E/vin-decoder for WMI CSV data
- ISO for VIN standards (ISO 3779:2009)
- US Department of Transportation
🔮 Roadmap
- Ford decoder (positions 4-8 patterns)
- GM/Chevrolet decoder
- Toyota/Lexus decoder
- Honda/Acura decoder
- BMW decoder (17-character patterns)
- Nissan/Infiniti decoder
Metadata
Release files for nhtsa-vin-decoder 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| nhtsa_vin_decoder-0.1.0.tar.gz | 49.1 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| nhtsa_vin_decoder-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 70.4 kB
Release files / nhtsa_vin_decoder-0.1.0.tar.gz
| Download URL | nhtsa_vin_decoder-0.1.0.tar.gz |
|---|---|
| Size | 49.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
ad095f24b1ae05923eeae062cbe8159b9ab1ca9689f3c6674bbbf60b142bfe1b
|
|
BLAKE2b-256 checksum How to use checksums |
e9c69b9f0717782f8eb9fa2bc3376e4460a77c5788d572ff2086eee9726e88fd
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.13.5
|
Release files / nhtsa_vin_decoder-0.1.0-py3-none-any.whl
| Download URL | nhtsa_vin_decoder-0.1.0-py3-none-any.whl |
|---|---|
| Size | 21.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
5979832027ebe42d02b8e7a12f65cb0adeae63b3f4c5d8cedcec0e4b9ebb6478
|
|
BLAKE2b-256 checksum How to use checksums |
e8c0e915eed738801fcbbd63ecc1ccc40cdaba77553b25f782535d6b0db772ad
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.13.5
|