├── requierements.txt ├── libvin ├── __init__.py ├── nhtsa.py ├── decoding.py └── static.py ├── .gitignore ├── setup.py ├── tests ├── test_decoding.py └── __init__.py └── README.rst /requierements.txt: -------------------------------------------------------------------------------- 1 | requests 2 | requests_cache 3 | nose 4 | -------------------------------------------------------------------------------- /libvin/__init__.py: -------------------------------------------------------------------------------- 1 | from libvin.nhtsa import nhtsa_decode 2 | from libvin.decoding import Vin -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.py[co] 2 | 3 | # Packages 4 | *.egg 5 | *.egg-info 6 | dist 7 | build 8 | eggs 9 | parts 10 | bin 11 | var 12 | sdist 13 | develop-eggs 14 | .installed.cfg 15 | 16 | # Installer logs 17 | pip-log.txt 18 | 19 | # Unit test / coverage reports 20 | .coverage 21 | .tox 22 | 23 | #Translations 24 | *.mo 25 | 26 | #Mr Developer 27 | .mr.developer.cfg 28 | -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | from setuptools import setup, find_packages 2 | import sys, os 3 | 4 | VERSION = '0.0.3' 5 | 6 | REQUIRES = [ 7 | 'nose', 'requests', 8 | ] 9 | 10 | setup(name='libvin', 11 | version=VERSION, 12 | description="Vehicle Identification Number Library", 13 | classifiers=[], 14 | keywords='vin vinlib authentic', 15 | author='Maxime Haineault (based on the work of Lukasz Szybalski)', 16 | author_email='max@motion-m.ca', 17 | url='https://github.com/h3/python-libvin', 18 | license='LGPL', 19 | packages=find_packages(exclude=['ez_setup', 'examples', 'tests']), 20 | include_package_data=True, 21 | zip_safe=False, 22 | test_suite="nose.collector", 23 | tests_require=REQUIRES, 24 | install_requires=REQUIRES, 25 | ) 26 | -------------------------------------------------------------------------------- /libvin/nhtsa.py: -------------------------------------------------------------------------------- 1 | """ 2 | Fetch a VIN record from NHTSA 3 | (c) Copyright 2016 Dan Kegel 4 | License: AGPL v3.0 5 | """ 6 | 7 | # Note: client app may wish to 'import requests_cache' and install a cache 8 | # to avoid duplicate fetches 9 | import requests 10 | 11 | 12 | def nhtsa_decode(vin): 13 | ''' 14 | Return vpic.nhtsa.dot.gov's interpretation of the VIN in a dictionary, or None on error. 15 | 16 | ErrorCode member of dictionary is a string starting with '0' 17 | if NHTSA thinks it has good data for that vin. 18 | 19 | Fields set seem to depend on the manufacturer. 20 | Here's which fields seem to be set for a few makes: 21 | 22 | BodyClass, Make, Model, ModelYear, GVWR: all 23 | Doors: most 24 | EngineModel: Honda, Acura 25 | EngineCylinders: Dodge 26 | DisplacementCC: Infiniti, BMW, Dodge 27 | DriveType: Infiniti, Dodge, Mitsubishi 28 | Series: BMW, Dodge, Mitsubishi 29 | Trim: BMW, Dodge 30 | ''' 31 | 32 | url = 'https://vpic.nhtsa.dot.gov/api/vehicles/decodevinvalues/' + vin + '?format=json' 33 | try: 34 | r = requests.get(url) 35 | except requests.Timeout: 36 | print("nhtsa: connection timed out") 37 | return None 38 | except requests.ConnectionError: 39 | print("nhtsa: connection failed") 40 | return None 41 | try: 42 | jresult = r.json() 43 | results = jresult['Results'][0] 44 | except ValueError: 45 | print("nhtsa: could not parse result") 46 | return None 47 | 48 | # Strip trailing spaces (as in 'Hummer ') 49 | for key in results: 50 | results[key] = results[key].rstrip() 51 | 52 | return results 53 | -------------------------------------------------------------------------------- /tests/test_decoding.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from nose.tools import assert_equals, assert_true, raises 3 | 4 | from libvin.decoding import Vin 5 | from libvin.static import * 6 | 7 | from . import TEST_DATA 8 | 9 | # To run tests that depend on network, do e.g. 'NETWORK_OK=1 nose2' 10 | import os 11 | if 'NETWORK_OK' in os.environ: 12 | from time import sleep 13 | from libvin.nhtsa import nhtsa_decode 14 | 15 | 16 | class TestDecode(object): 17 | 18 | def test_country(self): 19 | for test in TEST_DATA: 20 | v = Vin(test['VIN']) 21 | print("Testing: %s" % test['VIN']) 22 | assert_equals(v.country, test['COUNTRY']) 23 | 24 | def test_is_pre_2010(self): 25 | for test in TEST_DATA: 26 | v = Vin(test['VIN']) 27 | print("Testing: %s" % test['VIN']) 28 | if test['YEAR'] < 2010: 29 | assert_true(v.is_pre_2010) 30 | else: 31 | assert_true(not v.is_pre_2010) 32 | 33 | def test_less_than_500_per_year(self): # no tests yet.. 34 | for test in TEST_DATA: 35 | v = Vin(test['VIN']) 36 | print("Testing: %s" % test['VIN']) 37 | assert_equals(v.less_than_500_built_per_year, test['FEWER_THAN_500_PER_YEAR']) 38 | 39 | def test_make(self): 40 | for test in TEST_DATA: 41 | v = Vin(test['VIN']) 42 | print("Testing: %s, %s" % (test['VIN'], v.make)) 43 | assert_equals(v.make, test['MAKE']) 44 | if 'NETWORK_OK' in os.environ: 45 | # Verify that our decoded make is the same as NHTSA's. 46 | n = nhtsa_decode(test['VIN']) 47 | if n['ErrorCode'][0] == '0': 48 | assert_equals(v.make.upper(), n['Make']) 49 | # Avoid swamping nhtsa server when cache empty. 50 | # FIXME: Using requests_cache throttling would be better, wouldn't slow down cache full case. 51 | sleep(0.05) 52 | 53 | def test_region(self): 54 | for test in TEST_DATA: 55 | v = Vin(test['VIN']) 56 | print("Testing: %s" % test['VIN']) 57 | assert_equals(v.region, test['REGION']) 58 | 59 | def test_vis(self): 60 | for test in TEST_DATA: 61 | v = Vin(test['VIN']) 62 | print("Testing: %s" % test['VIN']) 63 | assert_equals(v.vis, test['VIS']) 64 | 65 | def test_vds(self): 66 | for test in TEST_DATA: 67 | v = Vin(test['VIN']) 68 | print("Testing: %s" % test['VIN']) 69 | assert_equals(v.vds, test['VDS']) 70 | 71 | def test_vsn(self): 72 | for test in TEST_DATA: 73 | v = Vin(test['VIN']) 74 | print("Testing: %s" % test['VIN']) 75 | assert_equals(v.vsn, test['SEQUENTIAL_NUMBER']) 76 | 77 | def test_wmi(self): 78 | for test in TEST_DATA: 79 | v = Vin(test['VIN']) 80 | print("Testing: %s" % test['VIN']) 81 | assert_equals(v.wmi, test['WMI']) 82 | 83 | def test_year(self): 84 | for test in TEST_DATA: 85 | v = Vin(test['VIN']) 86 | print("Testing: %s - %s" % (test['VIN'], v.year)) 87 | assert_equals(v.year, test['YEAR']) 88 | 89 | def test_is_valid(self): 90 | for test in TEST_DATA: 91 | v = Vin(test['VIN']) 92 | print("Testing: %s" % test['VIN']) 93 | assert_equals(v.is_valid, True) 94 | -------------------------------------------------------------------------------- /README.rst: -------------------------------------------------------------------------------- 1 | python-libvin 2 | ============= 3 | 4 | `libvin` is a python library which can decode Vehicle Identification Numbers. 5 | 6 | Currently it can extract these informations: 7 | 8 | * Country 9 | * If the vehicle was build before 2010 10 | * If there is less than 500 of this vehicle model built per year 11 | * Region 12 | * Vehicle Descriptor Section 13 | * Vehicle Identifier Sequence 14 | * Vehicle Sequential Number 15 | * World Manufacturer Identifier 16 | * Year of the vehicle model 17 | 18 | This is a work in progress -- model lookup was only about 90% accurate 19 | in an informal test -- yet appears to be the most complete open source 20 | implementation of vin lookup available. Feel free to contribute ! 21 | 22 | Low level API example 23 | --------------------- 24 | 25 | .. code-block:: python 26 | 27 | >>> from libvin.decoding import Vin 28 | >>> 29 | >>> v = Vin('2A4GM684X6R632476') 30 | >>> v.region 31 | north_america 32 | >>> v.country 33 | Canada 34 | >>> v.year 35 | 2006 36 | >>> v.make 37 | Chrysler 38 | >>> v.manufacturer 39 | Chrysler Canada 40 | >>> v.is_pre_2010 41 | True 42 | >>> v.wmi 43 | 2A4 44 | >>> v.vds 45 | GM684X 46 | >>> v.vis 47 | 6R632476 48 | >>> v.vsn 49 | 632476 50 | >>> v.less_than_500_built_per_year 51 | False 52 | 53 | 54 | Methods 55 | ------- 56 | 57 | +------------------------------+----------------------------------------------------------------+ 58 | | Method | Description | 59 | +==============================+================================================================+ 60 | | country | Manufacturer's country | 61 | +------------------------------+----------------------------------------------------------------+ 62 | | is_pre_2010 | If the vehicle was build before 2010 | 63 | +------------------------------+----------------------------------------------------------------+ 64 | | less_than_500_built_per_year | If there is less than 500 of this vehicle model built per year | 65 | +------------------------------+----------------------------------------------------------------+ 66 | | make | Brand (e.g. Ford) | 67 | +------------------------------+----------------------------------------------------------------+ 68 | | manufacturer | Company (e.g. Ford Motor Company) | 69 | +------------------------------+----------------------------------------------------------------+ 70 | | region | Region | 71 | +------------------------------+----------------------------------------------------------------+ 72 | | vds | Vehicle Descriptor Section | 73 | +------------------------------+----------------------------------------------------------------+ 74 | | vis | Vehicle Identifier Sequence | 75 | +------------------------------+----------------------------------------------------------------+ 76 | | vsn | Vehicle Sequential Number | 77 | +------------------------------+----------------------------------------------------------------+ 78 | | wmi | World Manufacturer Identifier | 79 | +------------------------------+----------------------------------------------------------------+ 80 | | year | Year of the vehicle model | 81 | +------------------------------+----------------------------------------------------------------+ 82 | 83 | 84 | Standards 85 | --------- 86 | 87 | There are at least four competing standards used to calculate VIN. 88 | 89 | * FMVSS 115, Part 565: Used in United States and Canada 90 | * ISO Standard 3779: Used in Europe and many other parts of the world 91 | * SAE J853: Very similar to the ISO standard 92 | * ADR 61/2: used in Australia, referring back to ISO 3779 and 3780 93 | 94 | Here's a breakdown of the most common types: 95 | 96 | ISO 3779 97 | ^^^^^^^^ 98 | 99 | :: 100 | 101 | 1 2 3 | 4 5 6 7 8 9 | 10 11 12 13 14 15 16 17 102 | ----- ----------- ----------------------- 103 | | | | 104 | | | Vehicle Identifier Section 105 | | | 106 | | Vehicle Descriptor Section 107 | | 108 | World Manufacturer Idendified 109 | 110 | 111 | European Union & North America (>500 vehicles/year) 112 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 113 | 114 | :: 115 | 116 | 1 2 3 | 4 5 6 7 8 | 9 | 10 | 11 | 12 13 14 15 16 17 117 | ----- --------- - -- -- ----------------- 118 | | | | | | | 119 | | | | | | Sequential Number 120 | | | | | | 121 | | | | | Plant Code 122 | | | | | 123 | | | | Model Year 124 | | | | 125 | | | Check Digit 126 | | | 127 | | Vehicle Attributes 128 | | 129 | World Manufacturer Idendified 130 | 131 | 132 | European Union & North America (<500 vehicles/year) 133 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 134 | 135 | :: 136 | 137 | 1 2 3 | 4 5 6 7 8 | 9 | 10 | 11 | 12 13 14 | 15 16 17 138 | ----- --------- - -- -- -------- -------- 139 | | | | | | | | 140 | | | | | | | Sequential Number 141 | | | | | | | 142 | | | | | | Manufacturer Identifier 143 | | | | | | 144 | | | | | Plant Code 145 | | | | | 146 | | | | Model Year 147 | | | | 148 | | | Check Digit 149 | | | 150 | | Vehicle Attributes 151 | | 152 | World Manufacturer Idendified 153 | 154 | 155 | Note to contributors 156 | -------------------- 157 | 158 | When submitting a bug fix, please add an entry to TEST_DATA in 159 | tests/__init__.py that tickles the bug you're fixing, and make 160 | sure the test suite passes. 161 | 162 | To run the test suite with nose:: 163 | 164 | $ pip install nose 165 | $ nosetests 166 | 167 | To run the test suite with nose2:: 168 | 169 | $ pip install nose2 170 | $ nose2 171 | 172 | Either should output a few test status lines, then end with something like:: 173 | 174 | Ran 11 tests in 0.007s 175 | 176 | OK 177 | 178 | The following free VIN decoder services may come in handy when preparing 179 | test cases, at least for cars sold in the United States. 180 | * http://vpic.nhtsa.dot.gov/api/ 181 | * http://vpic.nhtsa.dot.gov/decoder/ 182 | 183 | To find all VIN coding guides from a manufacturer, visit 184 | * http://vpic.nhtsa.dot.gov/mid/ 185 | Then check the "Part 565" checkbox, enter part of a manufacturer's 186 | name, leave DBA blank, enter a % wildcard for City, State, Country, 187 | and Filename, and click Search. 188 | The resulting filenames are cryptic, and you have to slog 189 | 190 | References 191 | ---------- 192 | 193 | * http://en.wikipedia.org/wiki/Vehicle_Identification_Number 194 | * http://www.nisrinc.com/include/common/VIN.html 195 | * http://vpic.nhtsa.dot.gov 196 | * http://vpic.nhtsa.dot.gov/mid/ 197 | -------------------------------------------------------------------------------- /libvin/decoding.py: -------------------------------------------------------------------------------- 1 | """ 2 | libvin - VIN Vehicle information number checker 3 | (c) Copyright 2012 Maxime Haineault 4 | (c) Copyright 2016 Dan Kegel 5 | """ 6 | 7 | from libvin.static import * 8 | 9 | 10 | class Vin(object): 11 | def __init__(self, vin): 12 | self.vin = vin.upper() 13 | 14 | @property 15 | def country(self): 16 | """ 17 | Returns the World Manufacturer's Country. 18 | """ 19 | countries = WORLD_MANUFACTURER_MAP[self.vin[0]]['countries'] 20 | 21 | for codes in countries: 22 | if self.vin[1] in codes: 23 | return countries[codes] 24 | 25 | return 'Unknown' 26 | 27 | def decode(self): 28 | return self.vin 29 | 30 | @property 31 | def is_pre_2010(self): 32 | """ 33 | Returns true if the model year is in the 1980-2009 range 34 | 35 | In order to identify exact year in passenger cars and multipurpose 36 | passenger vehicles with a GVWR of 10,000 or less, one must read 37 | position 7 as well as position 10. For passenger cars, and for 38 | multipurpose passenger vehicles and trucks with a gross vehicle 39 | weight rating of 10,000 lb (4,500 kg) or less, if position 7 is 40 | numeric, the model year in position 10 of the VIN refers to a year 41 | in the range 1980-2009. If position 7 is alphabetic, the model year 42 | in position 10 of VIN refers to a year in the range 2010-2039. 43 | """ 44 | return self.vin[6].isdigit() 45 | 46 | @property 47 | def is_valid(self): 48 | """ 49 | Returns True if a VIN is valid, otherwise returns False. 50 | """ 51 | if len(self.vin) != 17: 52 | """ 53 | For model years 1981 to present, the VIN is composed of 17 54 | alphanumeric values 55 | """ 56 | return False 57 | 58 | if any(x in 'IOQ' for x in self.vin): 59 | """ 60 | The letters I,O, Q are prohibited from any VIN position 61 | """ 62 | return False 63 | 64 | if self.vin[9] in 'UZ0': 65 | """ 66 | The tenth position of the VIN represents the Model Year and 67 | does not permit the use of the characters U and Z, as well 68 | as the numeric zero (0) 69 | """ 70 | return False 71 | 72 | products = [VIN_WEIGHT[i] * VIN_TRANSLATION[j] for i, j in enumerate(self.vin)] 73 | check_digit = sum(products) % 11 74 | if check_digit == 10: 75 | check_digit = 'X' 76 | 77 | if self.vin[8] != str(check_digit): 78 | """ 79 | The ninth position of the VIN is a calculated value based on 80 | the other 16 alphanumeric values, it's called the 81 | "Check Digit". The result of the check digit can ONLY be a 82 | numeric 0-9 or letter "X". 83 | """ 84 | return False 85 | 86 | return True 87 | 88 | @property 89 | def less_than_500_built_per_year(self): 90 | """ 91 | A manufacturer who builds fewer than 500 vehicles 92 | per year uses a 9 as the third digit 93 | """ 94 | try: 95 | return int(self.vin[2]) is 9 96 | except ValueError: 97 | return False 98 | 99 | @property 100 | def region(self): 101 | """ 102 | Returns the World Manufacturer's Region. Possible results: 103 | """ 104 | return WORLD_MANUFACTURER_MAP[self.vin[0]]['region'] 105 | 106 | @property 107 | def vis(self): 108 | """ 109 | Returns the Vehicle Idendifier Sequence (ISO 3779) 110 | Model Year, Manufacturer Plant and/or Serial Number 111 | """ 112 | return self.vin[-8:] 113 | 114 | @property 115 | def vds(self): 116 | """ 117 | Returns the Vehicle Descriptor Section (ISO 3779) 118 | Assigned by Manufacturer; Check Digit is Calculated 119 | """ 120 | return self.vin[3:9] 121 | 122 | @property 123 | def vsn(self): 124 | """ 125 | Returns the Vehicle Sequential Number 126 | """ 127 | if self.less_than_500_built_per_year: 128 | return self.vin[-3:] 129 | else: 130 | return self.vin[-6:] 131 | 132 | @property 133 | def wmi(self): 134 | """ 135 | Returns the World Manufacturer Identifier (any standards) 136 | Assigned by SAE 137 | """ 138 | return self.vin[0:3] 139 | 140 | @property 141 | def manufacturer(self): 142 | wmi = self.wmi 143 | if wmi[:3] in WMI_MAP: 144 | return WMI_MAP[wmi[:3]] 145 | if wmi[:2] in WMI_MAP: 146 | return WMI_MAP[wmi[:2]] 147 | return 'Unknown' 148 | 149 | @property 150 | def make(self): 151 | ''' 152 | This is like manufacturer, but without country or other suffixes, and should be short common name. 153 | Should be same as values from e.g. http://www.fueleconomy.gov/ws/rest/vehicle/menu/make?year=2012 154 | Should probably have a static table instead of doing late fixup like this. 155 | ''' 156 | man = self.manufacturer 157 | for suffix in [ 158 | 'Argentina', 159 | 'Brazil', 160 | 'Canada', 161 | 'Cars', 162 | 'France', 163 | 'Hungary', 164 | 'Hungary', 165 | 'Mexico', 166 | 'Motor Company', 167 | 'Truck USA', 168 | 'Trucks & Buses', 169 | 'Trucks', 170 | 'Turkey', 171 | 'USA - trucks', 172 | 'USA (AutoAlliance International)', 173 | 'USA', 174 | ]: 175 | if man.endswith(suffix): 176 | man = man.replace(" %s" % suffix, "") 177 | if man.endswith("(%s)" % suffix): 178 | man = man.replace(" (%s)" % suffix, "") 179 | if man == "General Motors": 180 | return "GMC" 181 | if man == 'Chrysler': 182 | # 2012 and later: first 3 positions became overloaded, some 'make' aka brand info moved further in; see 183 | # https://en.wikibooks.org/wiki/Vehicle_Identification_Numbers_(VIN_codes)/Chrysler/VIN_Codes 184 | # http://www.allpar.com/mopar/vin-decoder.html 185 | if self.year > 2011: 186 | brandcode = self.vin[4] 187 | if brandcode == 'D': 188 | return 'Dodge' 189 | if brandcode == 'F': 190 | return 'Fiat' 191 | if brandcode == 'J': 192 | return 'Jeep' 193 | if man == "Fuji Heavy Industries (Subaru)": 194 | return 'Subaru' 195 | if man == 'Nissan': 196 | # ftp://safercar.gov/MfrMail/ORG7377.pdf "MY12 Nissan VIN Coding System" 197 | # https://vpic.nhtsa.dot.gov/mid/home/displayfile/29173 "MY16 Nissan VIN Coding System" 198 | # say Ininiti if offset 4 is [JVY], Nissan otherwise. 199 | # ftp://safercar.gov/MfrMail/ORG6337.pdf "MY11 Nissan VIN Coding System" 200 | # says that plus Infiniti if offset 4 + 5 are S1. (Nissan Rogue is S5.) 201 | # ftp://ftp.nhtsa.dot.gov/mfrmail/ORG7846.pdf "MY13 Nissan VIN Coding System" 202 | # says that plus Infiniti if offset 4 + 5 are L0. 203 | if self.vin[4] in "JVY" or self.vin[4:6] == 'S1' or self.vin[4:6] == 'L0': 204 | return 'Infiniti' 205 | if man == 'Renault Samsung': 206 | # FIXME: they build other makes, too 207 | return 'Nissan' 208 | if man == 'Subaru-Isuzu Automotive': 209 | return 'Subaru' 210 | return man 211 | 212 | @property 213 | def year(self): 214 | """ 215 | Returns the model year of the vehicle 216 | """ 217 | if self.is_pre_2010: 218 | return YEARS_CODES_PRE_2010[self.vin[9]] 219 | else: 220 | return YEARS_CODES_PRE_2040[self.vin[9]] 221 | 222 | 223 | def decode(vin): 224 | v = Vin(vin) 225 | return v.decode() 226 | -------------------------------------------------------------------------------- /libvin/static.py: -------------------------------------------------------------------------------- 1 | WORLD_MANUFACTURER_REGIONS = { 2 | 'africa': 'ABCDEFGH', 3 | 'asia': 'JKLMNPR', 4 | 'north_america': '12345', 5 | 'south_america': '89', 6 | 'oceania': '67', 7 | } 8 | 9 | WORLD_MANUFACTURER_MAP = { 10 | 11 | # AFRICA 12 | 13 | 'A': {'region': 'africa', 'countries': { 14 | 'ABCDEFGH': 'south_africa', 15 | 'JKLMN': 'ivory_coast'}}, 16 | 17 | 'B': {'region': 'africa', 'countries': { 18 | 'ABCDE': 'angola', 19 | 'FGHIJK': 'kenya', 20 | 'LMNOPQR': 'tanzania'}}, 21 | 22 | 'C': {'region': 'africa', 'countries': { 23 | 'ABCDE': 'benin', 24 | 'FGHIJK': 'madagascar', 25 | 'LMNOPQR': 'tunisia'}}, 26 | 27 | 'D': {'region': 'africa', 'countries': { 28 | 'ABCDE': 'egypt', 29 | 'FGHIJK': 'morocco', 30 | 'LMNOPQR': 'zambia'}}, 31 | 32 | 'E': {'region': 'africa', 'countries': { 33 | 'ABCDE': 'ethiopia', 34 | 'FGHIJK': 'mozambique'}}, 35 | 36 | 'F': {'region': 'africa', 'countries': { 37 | 'ABCDE': 'ghana', 38 | 'FGHIJK': 'nigeria'}}, 39 | 40 | # ASIA 41 | 42 | 'J': {'region': 'asia', 'countries': { 43 | 'ABCDEFGHIJKLMNOPQRST': 'Japan'}}, 44 | 45 | 'K': {'region': 'asia', 'countries': { 46 | 'ABCDE': 'Sri Lanka', 47 | 'FGHIJK': 'Israel', 48 | 'LMNOPQR': 'Korea (South)'}}, 49 | 50 | 'L': {'region': 'asia', 'countries': { 51 | 'ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890': 'China'}}, 52 | 53 | 'M': {'region': 'asia', 'countries': { 54 | 'ABCDE': 'India', 55 | 'FGHIJK': 'Indonesia', 56 | 'LMNOPQR': 'Thailand'}}, 57 | 58 | 'N': {'region': 'asia', 'countries': { 59 | 'ABCDE': 'Philippines', 60 | 'FGHIJK': 'Singapore', 61 | 'LMNOPQR': 'Malaysia'}}, 62 | 63 | 'P': {'region': 'asia', 'countries': { 64 | 'ABCDE': 'United Arab Emirates', 65 | 'FGHIJK': 'Taiwan', 66 | 'LMNOPQR': 'Vietnam', 67 | 'STUVWXYZ0': 'Saudi Arabia'}}, 68 | 69 | # Europe 70 | 71 | 'S': {'region': 'europe', 'countries': { 72 | 'ABCDEFGHIJKLM': 'United Kingdom', 73 | 'NOPQRST': 'Germany', 74 | 'UVWXYZ': 'Poland', 75 | '1234': 'Latvia'}}, 76 | 77 | 'T': {'region': 'europe', 'countries': { 78 | 'ABCDEFGH': 'Switzerland', 79 | 'JKLMNOP': 'Czech Republic', 80 | 'RSTUV': 'Hungary', 81 | 'WXYZ1234567890': 'Portugal'}}, 82 | 83 | 'U': {'region': 'europe', 'countries': { 84 | 'HIJKLM': 'Denmark', 85 | 'NOPQRST': 'Ireland', 86 | 'UVWXYZ': 'Romania', 87 | '567': 'Slovakia'}}, 88 | 89 | 'V': {'region': 'europe', 'countries': { 90 | 'ABCDE': 'Austria', 91 | 'FGHIJKLMNOPQR': 'France', 92 | 'STUVW': 'Spain', 93 | 'XYZ12': 'Serbia', 94 | '345': 'Croatia', 95 | '67890': 'Estonia'}}, 96 | 97 | 'W': {'region': 'europe', 'countries': { 98 | 'ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890': 'Germany'}}, 99 | 100 | 'X': {'region': 'europe', 'countries': { 101 | 'ABCDE': 'Bulgaria', 102 | 'FGHIJK': 'Greece', 103 | 'LMNOPQR': 'Netherlands', 104 | 'STUVW': 'USSR', 105 | 'XYZ2': 'Luxembourg', 106 | '34567890': 'Russia'}}, 107 | 108 | 'Y': {'region': 'europe', 'countries': { 109 | 'ABCDE': 'Belgium', 110 | 'FGHIJK': 'Finland', 111 | 'LMNOPQR': 'Malta', 112 | 'STUVW': 'Sweden', 113 | 'XYZ12': 'Norway', 114 | '345': 'Belarus', 115 | '67890': 'Ukraine'}}, 116 | 117 | 'Z': {'region': 'europe', 'countries': { 118 | 'ABCDEFGHIJKLMNOPQR': 'Italy', 119 | 'STUVW': 'Finland', 120 | 'XYZ12': 'Slovenia', 121 | '345': 'Lithuania'}}, 122 | 123 | # Nort America 124 | 125 | '1': {'region': 'north_america', 'countries': { 126 | 'ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890': 'United States'}}, 127 | 128 | '2': {'region': 'north_america', 'countries': { 129 | 'ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890': 'Canada'}}, 130 | 131 | '3': {'region': 'north_america', 'countries': { 132 | 'ABCDEFGHIJKLMNOPQRSTUVW3': 'Mexico', 133 | 'XYZ124567': 'Costa Rica', 134 | '890': 'Cayman Islands'}}, 135 | 136 | '4': {'region': 'north_america', 'countries': { 137 | 'ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890': 'United States'}}, 138 | 139 | '5': {'region': 'north_america', 'countries': { 140 | 'ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890': 'United States'}}, 141 | 142 | # Oceania 143 | 144 | '6': {'region': 'oceania', 'countries': { 145 | 'ABCDEFGHIJKLMNOPQRSTUVW': 'Australia'}}, 146 | 147 | '7': {'region': 'oceania', 'countries': { 148 | 'ABCDE': 'New Zealand'}}, 149 | 150 | # South America 151 | 152 | '8': {'region': 'south_america', 'countries': { 153 | 'ABCDE': 'Argentina', 154 | 'FGHIJK': 'Chile', 155 | 'LMNOPQR': 'Ecuador', 156 | 'STUVW': 'Peru', 157 | 'XYZ12': 'Venezuela'}}, 158 | 159 | '9': {'region': 'south_america', 'countries': { 160 | 'ABCDE': 'Brazil', 161 | 'FGHIJK': 'Colombia', 162 | 'LMNOPQR': 'Paraguay', 163 | 'STUVW': 'Uruguay', 164 | 'XYZ12': 'Trinidad & Tobago', 165 | '3456789': 'Brazil'}}, 166 | 167 | } 168 | 169 | YEARS_CODES_PRE_2010 = { 170 | 'A': 1980, 'L': 1990, 'Y': 2000, 171 | 'B': 1981, 'M': 1991, '1': 2001, 172 | 'C': 1982, 'N': 1992, '2': 2002, 173 | 'D': 1983, 'P': 1993, '3': 2003, 174 | 'E': 1984, 'R': 1994, '4': 2004, 175 | 'F': 1985, 'S': 1995, '5': 2005, 176 | 'G': 1986, 'T': 1996, '6': 2006, 177 | 'H': 1987, 'V': 1997, '7': 2007, 178 | 'J': 1988, 'W': 1998, '8': 2008, 179 | 'K': 1989, 'X': 1999, '9': 2009, 180 | } 181 | 182 | YEARS_CODES_PRE_2040 = { 183 | 'A': 2010, 'L': 2020, 'Y': 2030, 184 | 'B': 2011, 'M': 2021, '1': 2031, 185 | 'C': 2012, 'N': 2022, '2': 2032, 186 | 'D': 2013, 'P': 2023, '3': 2033, 187 | 'E': 2014, 'R': 2024, '4': 2034, 188 | 'F': 2015, 'S': 2025, '5': 2035, 189 | 'G': 2016, 'T': 2026, '6': 2036, 190 | 'H': 2017, 'V': 2027, '7': 2037, 191 | 'J': 2018, 'W': 2028, '8': 2038, 192 | 'K': 2019, 'X': 2029, '9': 2039, 193 | } 194 | 195 | # Possible sources for missing entries: 196 | # https://en.wikibooks.org/wiki/Vehicle_Identification_Numbers_(VIN_codes) 197 | # https://en.wikibooks.org/wiki/Vehicle_Identification_Numbers_(VIN_codes)/World_Manufacturer_Identifier_(WMI) 198 | # http://www.civicx.com/threads/2016-civic-vin-translator-decoder-guide.889/ 199 | # https://www.nicb.org/theft_and_fraud_awareness/vin-manuals 200 | WMI_MAP = { 201 | 'AFA': 'Ford South Africa', 202 | 'AAV': 'Volkswagen South Africa', 203 | 'JA3': 'Mitsubishi', 204 | 'JA4': 'Mitsubishi', 205 | 'JA': 'Isuzu', 206 | 'JF': 'Fuji Heavy Industries (Subaru)', 207 | 'JHM': 'Honda', 208 | 'JHG': 'Honda', 209 | 'JHL': 'Honda', 210 | 'JH4': 'Acura', 211 | 'JK': 'Kawasaki (motorcycles)', 212 | 'JM': 'Mazda', 213 | 'JN': 'Nissan', 214 | 'JS': 'Suzuki', 215 | 'JT': 'Toyota', 216 | 'JTH': 'Lexus', 217 | 'JTJ': 'Lexus', 218 | 'KL': 'Daewoo General Motors South Korea', 219 | 'KM8': 'Hyundai', 220 | 'KMH': 'Hyundai', 221 | 'KNA': 'Kia', 222 | 'KNB': 'Kia', 223 | 'KNC': 'Kia', 224 | 'KND': 'Kia', 225 | 'KNM': 'Renault Samsung', 226 | 'KPA': 'Ssangyong', 227 | 'KPT': 'Ssangyong', 228 | 'L56': 'Renault Samsung', 229 | 'L5Y': 'Merato Motorcycle Taizhou Zhongneng', 230 | 'LDY': 'Zhongtong Coach, China', 231 | 'LFV': 'FAW-Volkswagen Automotive, China', 232 | 'LGH': 'Dong Feng (DFM), China', 233 | 'LKL': 'Suzhou King Long, China', 234 | 'LSY': 'Brilliance Zhonghua', 235 | 'LTV': 'Toyota Tian Jin', 236 | 'LVS': 'Ford Chang An', 237 | 'LVV': 'Chery, China', 238 | 'LZM': 'MAN China', 239 | 'LZE': 'Isuzu Guangzhou, China', 240 | 'LZG': 'Shaanxi Automobile Group, China', 241 | 'LZY': 'Yutong Zhengzhou, China', 242 | 'MA1': 'Mahindra', 243 | 'MA3': 'Suzuki India', 244 | 'MA7': 'Honda Siel Cars India', 245 | 'MAL': 'Hyundai', 246 | 'MHR': 'Honda Indonesia', 247 | 'MNB': 'Ford Thailand', 248 | 'MNT': 'Nissan Thailand', 249 | 'MMB': 'Mitsubishi Thailand', 250 | 'MMM': 'Chevrolet Thailand', 251 | 'MMT': 'Mitsubishi Thailand', 252 | 'MM8': 'Mazda Thailand', 253 | 'MPA': 'Isuzu Thailand', 254 | 'MP1': 'Isuzu Thailand', 255 | 'MRH': 'Honda Thailand', 256 | 'MR0': 'Toyota Thailand', 257 | 'NLE': 'Mercedes-Benz Turk Truck', 258 | 'NM0': 'Ford Turkey', 259 | 'NM4': 'Tofas Turk', 260 | 'NMT': 'Toyota Turkiye', 261 | 'PE1': 'Ford Phillipines', 262 | 'PE3': 'Mazda Phillipines', 263 | 'PL1': 'Proton, Malaysia', 264 | 'SAL': 'Land Rover', 265 | 'SAJ': 'Jaguar', 266 | 'SAR': 'Rover', 267 | 'SCA': 'Rolls Royce', 268 | 'SCB': 'Bentley', 269 | 'SCC': 'Lotus Cars', 270 | 'SCE': 'DeLorean Motor Cars N. Ireland (UK)', 271 | 'SCF': 'Aston Martin', 272 | 'SDB': 'Peugeot UK', 273 | 'SFD': 'Alexander Dennis UK', 274 | 'SHS': 'Honda UK', 275 | 'SJN': 'Nissan UK', 276 | 'SU9': 'Solaris Bus & Coach (Poland)', 277 | 'TK9': 'SOR (Czech Republic)', 278 | 'TDM': 'QUANTYA Swiss Electric Movement (Switzerland)', 279 | 'TMB': 'Skoda (Czech Republic)', 280 | 'TMK': 'Karosa (Czech Republic)', 281 | 'TMP': 'Skoda trolleybuses (Czech Republic)', 282 | 'TMT': 'Tatra (Czech Republic)', 283 | 'TM9': 'Skoda trolleybuses (Czech Republic)', 284 | 'TN9': 'Karosa (Czech Republic)', 285 | 'TRA': 'Ikarus Bus', 286 | 'TRU': 'Audi Hungary', 287 | 'TSE': 'Ikarus Egyedi Autobuszgyar, (Hungary)', 288 | 'TSM': 'Suzuki, (Hungary)', 289 | 'UU1': 'Renault Dacia, (Romania)', 290 | 'VF1': 'Renault', 291 | 'VF3': 'Peugeot', 292 | 'VF6': 'Renault (Trucks & Buses)', 293 | 'VF7': 'Citroen', 294 | 'VF8': 'Matra', 295 | 'VLU': 'Scania France', 296 | 'VNE': 'Irisbus (France)', 297 | 'VNK': 'Toyota France', 298 | 'VSE': 'Suzuki Spain (Santana Motors)', 299 | 'VSK': 'Nissan Spain', 300 | 'VSS': 'SEAT', 301 | 'VSX': 'Opel Spain', 302 | 'VS6': 'Ford Spain', 303 | 'VS9': 'Carrocerias Ayats (Spain)', 304 | 'VWV': 'Volkswagen Spain', 305 | 'VX1': 'Zastava / Yugo Serbia', 306 | 'WAG': 'Neoplan', 307 | 'WAU': 'Audi', 308 | 'WA1': 'Audi', 309 | 'WBA': 'BMW', 310 | 'WBS': 'BMW', 311 | 'WDB': 'Mercedes-Benz', 312 | 'WDC': 'Mercedes-Benz', 313 | 'WDD': 'Mercedes-Benz', 314 | 'WDY': 'Mercedes-Benz (Sprinter)', 315 | 'WDP': 'Mercedes-Benz (Sprinter)', 316 | 'WDR': 'Mercedes-Benz (Sprinter)', 317 | 'WCD': 'Mercedes-Benz (Sprinter)', 318 | 'WDZ': 'Mercedes-Benz (Sprinter)', 319 | 'WDA': 'Daimler AG (Sprinter)', 320 | 'WD3': 'Daimler AG (Sprinter)', 321 | 'WD4': 'Daimler AG (Sprinter)', 322 | 'WEB': 'Evobus GmbH (Mercedes-Bus)', 323 | 'WF0': 'Ford Germany', 324 | 'WMA': 'MAN Germany', 325 | 'WMW': 'MINI', 326 | 'WP0': 'Porsche', 327 | 'W04': 'Buick', 328 | 'W0L': 'Opel', 329 | 'WUA': 'Audi', 330 | 'WVG': 'Volkswagen', 331 | 'WVW': 'Volkswagen', 332 | 'WV1': 'Volkswagen Commercial Vehicles', 333 | 'WV2': 'Volkswagen Bus/Van', 334 | 'WV3': 'Volkswagen Trucks', 335 | 'WVW': 'Volkswagen', 336 | 'XL9': 'Spyker', 337 | 'XMC': 'Mitsubishi (NedCar)', 338 | 'XTA': 'Lada/AutoVaz (Russia)', 339 | 'YH4': 'Fisker', 340 | 'YK1': 'Saab', 341 | 'YS2': 'Scania AB', 342 | 'YS3': 'Saab', 343 | 'YS4': 'Scania Bus', 344 | 'YV1': 'Volvo Cars', 345 | 'YV4': 'Volvo Cars', 346 | 'YV2': 'Volvo Trucks', 347 | 'YV3': 'Volvo Buses', 348 | 'ZAM': 'Maserati Biturbo', 349 | 'ZAP': 'Piaggio/Vespa/Gilera', 350 | 'ZAR': 'Alfa Romeo', 351 | 'ZCG': 'Cagiva SpA', 352 | 'ZDM': 'Ducati Motor Holdings SpA', 353 | 'ZDF': 'Ferrari Dino', 354 | 'ZD4': 'Aprilia', 355 | 'ZFA': 'Fiat', 356 | 'ZFC': 'Fiat V.I.', 357 | 'ZFF': 'Ferrari', 358 | 'ZHW': 'Lamborghini', 359 | 'ZLA': 'Lancia', 360 | 'ZOM': 'OM', 361 | '1C3': 'Chrysler', 362 | '1C4': 'Chrysler', 363 | '1C6': 'Chrysler', 364 | '1D3': 'Dodge', 365 | '1D7': 'Dodge', 366 | '1FA': 'Ford Motor Company', 367 | '1FB': 'Ford Motor Company', 368 | '1FC': 'Ford Motor Company', 369 | '1FD': 'Ford Motor Company', 370 | '1FM': 'Ford Motor Company', 371 | '1FT': 'Ford Motor Company', 372 | '1FU': 'Freightliner', 373 | '1FV': 'Freightliner', 374 | '1F9': 'FWD Corp.', 375 | '1G': 'General Motors USA', 376 | '1GB': 'Chevrolet USA', 377 | '1GC': 'Chevrolet Truck USA', 378 | '1GT': 'GMC Truck USA', 379 | '1G1': 'Chevrolet USA', 380 | '1G2': 'Pontiac USA', 381 | '1G3': 'Oldsmobile USA', 382 | '1G4': 'Buick USA', 383 | '1G6': 'Cadillac USA', 384 | '1GM': 'Pontiac USA', 385 | '1GN': 'Chevrolet USA', 386 | '1G8': 'Saturn USA', 387 | '1GY': 'Cadillac', 388 | '1H': 'Honda USA', 389 | '1HD': 'Harley-Davidson', 390 | '1J4': 'Jeep', 391 | '1L': 'Lincoln USA', 392 | '1ME': 'Mercury USA', 393 | '1M1': 'Mack Truck USA', 394 | '1M2': 'Mack Truck USA', 395 | '1M3': 'Mack Truck USA', 396 | '1M4': 'Mack Truck USA', 397 | '1N': 'Nissan USA', 398 | '1NX': 'NUMMI USA', 399 | '1P3': 'Plymouth USA', 400 | '1R9': 'Roadrunner Hay Squeeze USA', 401 | '1V1': 'Volkswagen USA (Commercials)', 402 | '1VW': 'Volkswagen USA', 403 | '1XK': 'Kenworth USA', 404 | '1XP': 'Peterbilt USA', 405 | '1YV': 'Mazda USA (AutoAlliance International)', 406 | '1ZV': 'Ford Motor Company', 407 | '137': 'Hummer', 408 | '19U': 'Acura', 409 | '19V': 'Acura', 410 | '19X': 'Honda', 411 | '2A4': 'Chrysler Canada', 412 | '2B3': 'Dodge Canada', 413 | '2C3': 'Chrysler Canada', 414 | '2C4': 'Chrysler Canada', 415 | '2CN': 'CAMI', 416 | '2D3': 'Dodge Canada', 417 | '2D4': 'Dodge Canada', 418 | '2FA': 'Ford Motor Company Canada', 419 | '2FB': 'Ford Motor Company Canada', 420 | '2FC': 'Ford Motor Company Canada', 421 | '2FM': 'Ford Motor Company Canada', 422 | '2FT': 'Ford Motor Company Canada', 423 | '2FU': 'Freightliner', 424 | '2FV': 'Freightliner', 425 | '2FZ': 'Sterling', 426 | '2G': 'General Motors Canada', 427 | '2GC': 'Chevrolet Canada', 428 | '2GN': 'Chevrolet Canada', 429 | '2G1': 'Chevrolet Canada', 430 | '2G2': 'Pontiac Canada', 431 | '2G3': 'Oldsmobile Canada', 432 | '2G4': 'Buick Canada', 433 | '2G6': 'Cadillac', 434 | '2HG': 'Honda Canada', 435 | '2HK': 'Honda Canada', 436 | '2HM': 'Hyundai Canada', 437 | '2HN': 'Acura', 438 | '2LM': 'Lincoln', 439 | '2M': 'Mercury', 440 | '2P3': 'Plymouth Canada', 441 | '2T': 'Toyota Canada', 442 | '2T2': 'Lexus Canada', 443 | '2V4': 'Volkswagen Canada', 444 | '2WK': 'Western Star', 445 | '2WL': 'Western Star', 446 | '2WM': 'Western Star', 447 | '3C3': 'Chrysler', 448 | '3C4': 'Dodge Mexico', 449 | '3C6': 'Chrysler', 450 | '3CZ': 'Honda Mexico', 451 | '3D3': 'Dodge Mexico', 452 | '3D4': 'Dodge Mexico', 453 | '3D7': 'Dodge Mexico', 454 | '3MZ': 'Mazda Mexico', 455 | '3FA': 'Ford Motor Company Mexico', 456 | '3FE': 'Ford Motor Company Mexico', 457 | '3G': 'General Motors Mexico', 458 | '3GC': 'Chevrolet Mexico', 459 | '3GN': 'Chevrolet Mexico', 460 | '3GY': 'Cadillac', 461 | '3H': 'Honda Mexico', 462 | '3LN': 'Lincoln', 463 | '3N': 'Nissan Mexico', 464 | '3P3': 'Plymouth Mexico', 465 | '3TM': 'Toyota Mexico', 466 | '3VW': 'Volkswagen Mexico', 467 | '4A3': 'Mitsubishi', 468 | '4A4': 'Mitsubishi', 469 | '4F': 'Mazda USA', 470 | '4JG': 'Mercedes-Benz', 471 | '4M': 'Mercury', 472 | '4S': 'Subaru-Isuzu Automotive', 473 | '4T': 'Toyota', 474 | '4US': 'BMW USA', 475 | '4UZ': 'Frt-Thomas Bus', 476 | '4V1': 'Volvo', 477 | '4V2': 'Volvo', 478 | '4V3': 'Volvo', 479 | '4V4': 'Volvo', 480 | '4V5': 'Volvo', 481 | '4V6': 'Volvo', 482 | '4VL': 'Volvo', 483 | '4VM': 'Volvo', 484 | '4VZ': 'Volvo', 485 | '5F': 'Honda USA', 486 | '5FR': 'Acura', 487 | '5GA': 'Buick', 488 | '5GN': 'Hummer', 489 | '5GR': 'Hummer', # general motors 490 | '5J6': 'Honda', 491 | '5J8': 'Acura', 492 | '5L': 'Lincoln', 493 | '5N1': 'Nissan USA', 494 | '5NP': 'Hyundai USA', 495 | '5T': 'Toyota USA - trucks', 496 | '5UM': 'BMW', 497 | '5UX': 'BMW', 498 | '5XX': 'Kia', 499 | '5YF': 'Toyota', 500 | '55S': 'Mercedes-Benz', 501 | '58A': 'Lexus', 502 | '6AB': 'MAN Australia', 503 | '6F4': 'Nissan Motor Company Australia', 504 | '6F5': 'Kenworth Australia', 505 | '6FP': 'Ford Motor Company Australia', 506 | '6G1': 'General Motors-Holden (post Nov 2002)', 507 | '6G2': 'Pontiac Australia (GTO & G8)', 508 | '6H8': 'General Motors-Holden (pre Nov 2002)', 509 | '6MM': 'Mitsubishi Motors Australia', 510 | '6T1': 'Toyota Motor Corporation Australia', 511 | '6U9': 'Privately Imported car in Australia', 512 | '8AG': 'Chevrolet Argentina', 513 | '8GG': 'Chevrolet Chile', 514 | '8AP': 'Fiat Argentina', 515 | '8AF': 'Ford Motor Company Argentina', 516 | '8AD': 'Peugeot Argentina', 517 | '8GD': 'Peugeot Chile', 518 | '8A1': 'Renault Argentina', 519 | '8AK': 'Suzuki Argentina', 520 | '8AJ': 'Toyota Argentina', 521 | '8AW': 'Volkswagen Argentina', 522 | '8BR': 'Mercedes-Benz Argentina', 523 | '93U': 'Audi Brazil', 524 | '93V': 'Audi Brazil', 525 | '9BG': 'Chevrolet Brazil', 526 | '935': 'Citroen Brazil', 527 | '9BD': 'Fiat Brazil', 528 | '9BF': 'Ford Motor Company Brazil', 529 | '93H': 'Honda Brazil', 530 | '9BM': 'Mercedes-Benz Brazil', 531 | '936': 'Peugeot Brazil', 532 | '93Y': 'Renault Brazil', 533 | '9BS': 'Scania Brazil', 534 | '93R': 'Toyota Brazil', 535 | '9BW': 'Volkswagen Brazil', 536 | '9FB': 'Renault Colombia', 537 | } 538 | 539 | VIN_TRANSLATION = { 540 | 'A': 1, 'L': 3, 'Y': 8, 541 | 'B': 2, 'M': 4, 'Z': 9, 542 | 'C': 3, 'N': 5, '1': 1, 543 | 'D': 4, 'P': 7, '2': 2, 544 | 'E': 5, 'R': 9, '3': 3, 545 | 'F': 6, 'S': 2, '4': 4, 546 | 'G': 7, 'T': 3, '5': 5, 547 | 'H': 8, 'V': 5, '6': 6, 548 | 'J': 1, 'W': 6, '7': 7, 549 | 'K': 2, 'X': 7, '8': 8, 550 | '9': 9, '0': 0, 'U': 4, 551 | } 552 | 553 | VIN_WEIGHT = [8, 7, 6, 5, 4, 3, 2, 10, 0, 9, 8, 7, 6, 5, 4, 3, 2] 554 | -------------------------------------------------------------------------------- /tests/__init__.py: -------------------------------------------------------------------------------- 1 | # To run tests that depend on network, do e.g. 'NETWORK_OK=1 nose2' 2 | import os 3 | if 'NETWORK_OK' in os.environ: 4 | import requests 5 | import requests_cache 6 | # Cache responses for 7 days to be kind to servers (and rerun quickly) 7 | requests_cache.install_cache('libvin_tests_cache', expire_after=7*24*60*60) 8 | 9 | # Sorted alphabetically by VIN 10 | TEST_DATA = [ 11 | # http://www.vindecoder.net/?vin=137ZA903X1E412677&submit=Decode unchecked 12 | {'VIN': '137ZA903X1E412677', 'WMI': '137', 'VDS': 'ZA903X', 'VIS': '1E412677', 13 | 'MODEL': 'H1', 'MAKE': 'Hummer', 'YEAR': 2001, 'COUNTRY': 'United States', 14 | 'REGION': 'north_america', 'SEQUENTIAL_NUMBER': '412677', 'FEWER_THAN_500_PER_YEAR': False}, 15 | 16 | # http://www.fueleconomy.gov/ws/rest/vehicle/37075 17 | {'VIN': '19XFC1F7XGE028370', 'WMI': '19X', 'VDS': 'FC1F7X', 'VIS': 'GE028370', 18 | 'MODEL': 'Civic', 'MAKE': 'Honda', 'YEAR': 2016, 'COUNTRY': 'United States', 19 | 'REGION': 'north_america', 'SEQUENTIAL_NUMBER': '028370', 'FEWER_THAN_500_PER_YEAR': False, 20 | }, 21 | 22 | # http://www.vindecoder.net/?vin=1C4RJEAG2EC476429&submit=Decode 23 | {'VIN': '1C4RJEAG2EC476429', 'WMI': '1C4', 'VDS': 'RJEAG2', 'VIS': 'EC476429', 24 | 'MODEL': 'Grand Cherokee', 'MAKE': 'Jeep', 'YEAR': 2014, 'COUNTRY': 'United States', 25 | 'REGION': 'north_america', 'SEQUENTIAL_NUMBER': '476429', 'FEWER_THAN_500_PER_YEAR': False}, 26 | 27 | # http://www.vindecoder.net/?vin=1D7RB1CP8BS798034&submit=Decode 28 | {'VIN': '1D7RB1CP8BS798034', 'WMI': '1D7', 'VDS': 'RB1CP8', 'VIS': 'BS798034', 29 | 'MODEL': 'Ram 1500', 'MAKE': 'Dodge', 'YEAR': 2011, 'COUNTRY': 'United States', 30 | 'REGION': 'north_america', 'SEQUENTIAL_NUMBER': '798034', 'FEWER_THAN_500_PER_YEAR': False}, 31 | 32 | # http://www.vindecoder.net/?vin=1D7RB1CT1BS488952&submit=Decode 33 | {'VIN': '1D7RB1CT1BS488952', 'WMI': '1D7', 'VDS': 'RB1CT1', 'VIS': 'BS488952', 34 | 'MODEL': 'Ram 1500', 'MAKE': 'Dodge', 'YEAR': 2011, 'COUNTRY': 'United States', 35 | 'REGION': 'north_america', 'SEQUENTIAL_NUMBER': '488952', 'FEWER_THAN_500_PER_YEAR': False}, 36 | 37 | # https://vpic.nhtsa.dot.gov/api/vehicles/decodevinvalues/1GB0C4EGXGZ280783 38 | {'VIN': '1GB0C4EGXGZ280783', 'WMI': '1GB', 'VDS': '0C4EGX', 'VIS': 'GZ280783', 39 | 'MODEL': 'Silverado', 'MAKE': 'Chevrolet', 'YEAR': 2016, 'COUNTRY': 'United States', 40 | 'REGION': 'north_america', 'SEQUENTIAL_NUMBER': '280783', 'FEWER_THAN_500_PER_YEAR': False, 41 | }, 42 | 43 | # http://www.fueleconomy.gov/ws/rest/vehicle/36354 44 | {'VIN': '1GNKRHKD2GJ223195', 'WMI': '1GN', 'VDS': 'KRHKD2', 'VIS': 'GJ223195', 45 | 'MODEL': 'Traverse AWD', 'MAKE': 'Chevrolet', 'YEAR': 2016, 'COUNTRY': 'United States', 46 | 'REGION': 'north_america', 'SEQUENTIAL_NUMBER': '223195', 'FEWER_THAN_500_PER_YEAR': False, 47 | }, 48 | 49 | # https://vpic.nhtsa.dot.gov/api/vehicles/decodevinvalues/1N4BL3AP5DN508203 50 | {'VIN': '1N4BL3AP5DN508203', 'WMI': '1N4', 'VDS': 'BL3AP5', 'VIS': 'DN508203', 51 | 'MODEL': 'Altima', 'MAKE': 'Nissan', 'YEAR': 2013, 'COUNTRY': 'United States', 52 | 'REGION': 'north_america', 'SEQUENTIAL_NUMBER': '508203', 'FEWER_THAN_500_PER_YEAR': False, 53 | }, 54 | 55 | # http://www.vindecoder.net/?vin=19UUA65694A043249&submit=Decode 56 | # http://acurazine.com/forums/vindecoder.php?vin=19UUA65694A043249 57 | {'VIN': '19UUA65694A043249', 'WMI': '19U', 'VDS': 'UA6569', 'VIS': '4A043249', 58 | 'MODEL': 'TL', 'MAKE': 'Acura', 'YEAR': 2004, 'COUNTRY': 'United States', 59 | 'REGION': 'north_america', 'SEQUENTIAL_NUMBER': '043249', 'FEWER_THAN_500_PER_YEAR': False}, 60 | 61 | # http://www.vindecoder.net/?vin=19XFB4F24DE547421&submit=Decode says unknown 62 | # http://www.civicx.com/threads/2016-civic-vin-translator-decoder-guide.889/ 63 | {'VIN': '19XFB4F24DE547421', 'WMI': '19X', 'VDS': 'FB4F24', 'VIS': 'DE547421', 64 | 'MODEL': 'Civic Hybrid', 'MAKE': 'Honda', 'YEAR': 2013, 'COUNTRY': 'United States', 65 | 'REGION': 'north_america', 'SEQUENTIAL_NUMBER': '547421', 'FEWER_THAN_500_PER_YEAR': False}, 66 | 67 | # http://www.vindecoder.net/?vin=1FAHP3FN8AW139719&submit=Decode 68 | {'VIN': '1FAHP3FN8AW139719', 'WMI': '1FA', 'VDS': 'HP3FN8', 'VIS': 'AW139719', 69 | 'MODEL': 'Focus', 'MAKE': 'Ford', 'YEAR': 2010, 'COUNTRY': 'United States', 70 | 'REGION': 'north_america', 'SEQUENTIAL_NUMBER': '139719', 'FEWER_THAN_500_PER_YEAR': False}, 71 | 72 | # http://www.vindecoder.net/?vin=1GKEV13728J123735&submit=Decode 73 | {'VIN': '1GKEV13728J123735', 'WMI': '1GK', 'VDS': 'EV1372', 'VIS': '8J123735', 74 | 'MODEL': 'Acadia', 'MAKE': 'GMC', 'YEAR': 2008, 'COUNTRY': 'United States', 75 | 'REGION': 'north_america', 'SEQUENTIAL_NUMBER': '123735', 'FEWER_THAN_500_PER_YEAR': False}, 76 | 77 | # http://www.vindecoder.net/?vin=1GT020CG4EF828544&submit=Decode 78 | {'VIN': '1GT020CG4EF828544', 'WMI': '1GT', 'VDS': '020CG4', 'VIS': 'EF828544', 79 | 'MODEL': 'Sierra 2500', 'MAKE': 'GMC', 'YEAR': 2014, 'COUNTRY': 'United States', 80 | 'REGION': 'north_america', 'SEQUENTIAL_NUMBER': '828544', 'FEWER_THAN_500_PER_YEAR': False}, 81 | 82 | # http://www.vindecoder.net/?vin=1GYFC56299R410242&submit=Decode didn't have model 83 | # http://www.vindecoderz.com/EN/check-lookup/1GYFC56299R410242 84 | # http://www.fueleconomy.gov/ws/rest/vehicle/menu/model?year=2009&make=Cadillac confirms Escalade ESV 85 | {'VIN': '1GYFC56299R410242', 'WMI': '1GY', 'VDS': 'FC5629', 'VIS': '9R410242', 86 | 'MODEL': 'Escalade ESV', 'MAKE': 'Cadillac', 'YEAR': 2009, 'COUNTRY': 'United States', 87 | 'REGION': 'north_america', 'SEQUENTIAL_NUMBER': '410242', 'FEWER_THAN_500_PER_YEAR': False}, 88 | 89 | # https://vpic.nhtsa.dot.gov/api/vehicles/decodevinvalues/1YVHZ8DH0C5M33844 90 | {'VIN': '1YVHZ8DH0C5M33844', 'WMI': '1YV', 'VDS': 'HZ8DH0', 'VIS': 'C5M33844', 91 | 'MODEL': 'Mazda6', 'MAKE': 'Mazda', 'YEAR': 2012, 'COUNTRY': 'United States', 92 | 'REGION': 'north_america', 'SEQUENTIAL_NUMBER': 'M33844', 'FEWER_THAN_500_PER_YEAR': False, 93 | }, 94 | 95 | # https://vpic.nhtsa.dot.gov/api/vehicles/decodevinvalues/1ZVBP8CF4E5242560 96 | {'VIN': '1ZVBP8CF4E5242560', 'WMI': '1ZV', 'VDS': 'BP8CF4', 'VIS': 'E5242560', 97 | 'MODEL': 'Mustang', 'MAKE': 'Ford', 'YEAR': 2014, 'COUNTRY': 'United States', 98 | 'REGION': 'north_america', 'SEQUENTIAL_NUMBER': '242560', 'FEWER_THAN_500_PER_YEAR': False, 99 | }, 100 | 101 | # http://www.vindecoder.net/?vin=19VDE2E5XEE644230&submit=Decode unchecked 102 | # http://acurazine.com/forums/vindecoder.php?vin=19VDE2E5XEE644230 103 | {'VIN': '19VDE2E5XEE644230', 'WMI': '19V', 'VDS': 'DE2E5X', 'VIS': 'EE644230', 104 | 'MODEL': 'ILX', 'MAKE': 'Acura', 'YEAR': 2014, 'COUNTRY': 'United States', 105 | 'REGION': 'north_america', 'SEQUENTIAL_NUMBER': '644230', 'FEWER_THAN_500_PER_YEAR': False}, 106 | 107 | # http://www.vindecoder.net/?vin=2A4GM684X6R632476&submit=Decode 108 | {'VIN': '2A4GM684X6R632476', 'WMI': '2A4', 'VDS': 'GM684X', 'VIS': '6R632476', 109 | 'MODEL': 'Pacifica', 'MAKE': 'Chrysler', 'YEAR': 2006, 'COUNTRY': 'Canada', 110 | 'REGION': 'north_america', 'SEQUENTIAL_NUMBER': '632476', 'FEWER_THAN_500_PER_YEAR': False}, 111 | 112 | # http://www.vindecoder.net/?vin=2B3KA43G27H825762&submit=Decode 113 | {'VIN': '2B3KA43G27H825762', 'WMI': '2B3', 'VDS': 'KA43G2', 'VIS': '7H825762', 114 | 'MODEL': 'Charger', 'MAKE': 'Dodge', 'YEAR': 2007, 'COUNTRY': 'Canada', 115 | 'REGION': 'north_america', 'SEQUENTIAL_NUMBER': '825762', 'FEWER_THAN_500_PER_YEAR': False}, 116 | 117 | # http://www.vindecoder.net/?vin=2C3CDYAGXDH825982&submit=Decode doesn't have good info 118 | # http://dodgeforum.com/forum/vindecoder.php?vin=2C3CDYAGXDH825982 119 | {'VIN': '2C3CDYAGXDH825982', 'WMI': '2C3', 'VDS': 'CDYAGX', 'VIS': 'DH825982', 120 | 'MODEL': 'Challenger', 'MAKE': 'Dodge', 'YEAR': 2013, 'COUNTRY': 'Canada', 121 | 'REGION': 'north_america', 'SEQUENTIAL_NUMBER': '825982', 'FEWER_THAN_500_PER_YEAR': False}, 122 | 123 | # http://www.vindecoder.net/?vin=2C4RDGBG4FR987134&submit=Decode 124 | {'VIN': '2C4RDGBG4FR987134', 'WMI': '2C4', 'VDS': 'RDGBG4', 'VIS': 'FR987134', 125 | 'MODEL': 'Grand Caravan', 'MAKE': 'Dodge', 'YEAR': 2015, 'COUNTRY': 'Canada', 126 | 'REGION': 'north_america', 'SEQUENTIAL_NUMBER': '987134', 'FEWER_THAN_500_PER_YEAR': False}, 127 | 128 | # http://www.vindecoder.net/?vin=2D4RN6DX5AR939562&submit=Decode 129 | {'VIN': '2D4RN6DX5AR939562', 'WMI': '2D4', 'VDS': 'RN6DX5', 'VIS': 'AR939562', 130 | 'MODEL': 'Grand Caravan', 'MAKE': 'Dodge', 'YEAR': 2010, 'COUNTRY': 'Canada', 131 | 'REGION': 'north_america', 'SEQUENTIAL_NUMBER': '939562', 'FEWER_THAN_500_PER_YEAR': False}, 132 | 133 | # http://www.vindecoder.net/?vin=2FTCF15F2ECA55516&submit=Decode 134 | {'VIN': '2FTCF15F2ECA55516', 'WMI': '2FT', 'VDS': 'CF15F2', 'VIS': 'ECA55516', 135 | 'MODEL': 'F-150', 'MAKE': 'Ford', 'YEAR': 1984, 'COUNTRY': 'Canada', 136 | 'REGION': 'north_america', 'SEQUENTIAL_NUMBER': 'A55516', 'FEWER_THAN_500_PER_YEAR': False}, 137 | 138 | # https://vpic.nhtsa.dot.gov/api/vehicles/decodevinvalues/2GCEC13C981202392 139 | {'VIN': '2GCEC13C981202392', 'WMI': '2GC', 'VDS': 'EC13C9', 'VIS': '81202392', 140 | 'MODEL': 'Silverado', 'MAKE': 'Chevrolet', 'YEAR': 2008, 'COUNTRY': 'Canada', 141 | 'REGION': 'north_america', 'SEQUENTIAL_NUMBER': '202392', 'FEWER_THAN_500_PER_YEAR': False, 142 | }, 143 | 144 | # https://vpic.nhtsa.dot.gov/api/vehicles/decodevinvalues/2GNFLPE55C6105926 145 | {'VIN': '2GNFLPE55C6105926', 'WMI': '2GN', 'VDS': 'FLPE55', 'VIS': 'C6105926', 146 | 'MODEL': 'Equinox', 'MAKE': 'Chevrolet', 'YEAR': 2012, 'COUNTRY': 'Canada', 147 | 'REGION': 'north_america', 'SEQUENTIAL_NUMBER': '105926', 'FEWER_THAN_500_PER_YEAR': False, 148 | }, 149 | 150 | # http://www.vindecoder.net/?vin=2G61W5S83E9422251&submit=Decode 151 | # ftp://safercar.gov/MfrMail/ORG7595.pdf "General Motors LLC 2013 Vehicle Identification Numbering Standard" 152 | {'VIN': '2G61W5S83E9422251', 'WMI': '2G6', 'VDS': '1W5S83', 'VIS': 'E9422251', 153 | 'MODEL': 'XTS', 'MAKE': 'Cadillac', 'YEAR': 2014, 'COUNTRY': 'Canada', 154 | 'REGION': 'north_america', 'SEQUENTIAL_NUMBER': '422251', 'FEWER_THAN_500_PER_YEAR': False}, 155 | 156 | # http://www.vindecoder.net/?vin=2HNYD18975H033218&submit=Decode 157 | # http://acurazine.com/forums/vindecoder.php?vin=2HNYD18975H033218 158 | {'VIN': '2HNYD18975H033218', 'WMI': '2HN', 'VDS': 'YD1897', 'VIS': '5H033218', 159 | 'MODEL': 'MDX', 'MAKE': 'Acura', 'YEAR': 2005, 'COUNTRY': 'Canada', 160 | 'REGION': 'north_america', 'SEQUENTIAL_NUMBER': '033218', 'FEWER_THAN_500_PER_YEAR': False}, 161 | 162 | # http://www.vindecoder.net/?vin=2LMHJ5AT9CB565906&submit=Decode 163 | {'VIN': '2LMHJ5AT9CB565906', 'WMI': '2LM', 'VDS': 'HJ5AT9', 'VIS': 'CB565906', 164 | 'MODEL': 'MKT', 'MAKE': 'Lincoln', 'YEAR': 2012, 'COUNTRY': 'Canada', 165 | 'REGION': 'north_america', 'SEQUENTIAL_NUMBER': '565906', 'FEWER_THAN_500_PER_YEAR': False}, 166 | 167 | # http://www.toyodiy.com/parts/q?vin=2t1kr32e26c557497 says ATM 4-SPEED FLOOR SHIFT (how's it know?) 168 | {'VIN': '2T1KR32E16C583752', 'WMI': '2T1', 'VDS': 'KR32E1', 'VIS': '6C583752', 169 | 'MODEL': 'Matrix', 'MAKE': 'Toyota', 'YEAR': 2006, 'COUNTRY': 'Canada', 170 | 'REGION': 'north_america', 'SEQUENTIAL_NUMBER': '583752', 'FEWER_THAN_500_PER_YEAR': False, 171 | }, 172 | 173 | # https://vpic.nhtsa.dot.gov/api/vehicles/decodevinvalues/2T2BGMCA0GC004299 174 | {'VIN': '2T2BGMCA0GC004299', 'WMI': '2T2', 'VDS': 'BGMCA0', 'VIS': 'GC004299', 175 | 'MODEL': 'RX', 'MAKE': 'Lexus', 'YEAR': 2016, 'COUNTRY': 'Canada', 176 | 'REGION': 'north_america', 'SEQUENTIAL_NUMBER': '004299', 'FEWER_THAN_500_PER_YEAR': False, 177 | }, 178 | 179 | # http://www.vin-decoder.org/details?vin=3C3CFFCR9FT528063 180 | # http://www.fiat500usa.com/2013/08/decoding-fiat-500-vin.html 181 | # Chrysler Passenger Car Vehicle Identification Number Code Guide 182 | # ftp://ftp.nhtsa.dot.gov/MfrMail/ORG9653.pdf 183 | {'VIN': '3C3CFFCR9FT528063', 'WMI': '3C3', 'VDS': 'CFFCR9', 'VIS': 'FT528063', 184 | 'MODEL': '500', 'MAKE': 'Fiat', 'YEAR': 2015, 'COUNTRY': 'Mexico', 185 | 'REGION': 'north_america', 'SEQUENTIAL_NUMBER': '528063', 'FEWER_THAN_500_PER_YEAR': False}, 186 | 187 | # http://www.fueleconomy.gov/ws/rest/vehicle/34122 188 | {'VIN': '3C4PDCBG3ET296933', 'WMI': '3C4', 'VDS': 'PDCBG3', 'VIS': 'ET296933', 189 | 'MODEL': 'Journey', 'MAKE': 'Dodge', 'YEAR': 2014, 'COUNTRY': 'Mexico', 190 | 'REGION': 'north_america', 'SEQUENTIAL_NUMBER': '296933', 'FEWER_THAN_500_PER_YEAR': False, 191 | }, 192 | 193 | # http://www.vindecoder.net/?vin=3C6JD7CT4CG104778&submit=Decode 194 | # ftp://safercar.gov/MfrMail/ORG7565.pdf 195 | {'VIN': '3C6JD7CT4CG104778', 'WMI': '3C6', 'VDS': 'JD7CT4', 'VIS': 'CG104778', 196 | 'MODEL': 'Ram 1500 Pickup', 'MAKE': 'Dodge', 'YEAR': 2012, 'COUNTRY': 'Mexico', 197 | 'REGION': 'north_america', 'SEQUENTIAL_NUMBER': '104778', 'FEWER_THAN_500_PER_YEAR': False}, 198 | 199 | # https://vpic.nhtsa.dot.gov/api/vehicles/decodevinvalues/3CZRU5H35GM739695 200 | {'VIN': '3CZRU5H35GM739695', 'WMI': '3CZ', 'VDS': 'RU5H35', 'VIS': 'GM739695', 201 | 'MODEL': 'HR-V', 'MAKE': 'Honda', 'YEAR': 2016, 'COUNTRY': 'Mexico', 202 | 'REGION': 'north_america', 'SEQUENTIAL_NUMBER': '739695', 'FEWER_THAN_500_PER_YEAR': False, 203 | }, 204 | 205 | # http://www.vindecoder.net/?vin=3D4PH6FV5AT152960&submit=Decode 206 | # http://www.rambodybuilder.com/2010/docs/intro/vin.pdf 207 | {'VIN': '3D4PH6FV5AT152960', 'WMI': '3D4', 'VDS': 'PH6FV5', 'VIS': 'AT152960', 208 | 'MODEL': 'Journey', 'MAKE': 'Dodge', 'YEAR': 2010, 'COUNTRY': 'Mexico', 209 | 'REGION': 'north_america', 'SEQUENTIAL_NUMBER': '152960', 'FEWER_THAN_500_PER_YEAR': False}, 210 | 211 | # http://www.vindecoder.net/?vin=3D4PH7FG1BT808130&submit=Decode 212 | {'VIN': '3D4PH7FG1BT808130', 'WMI': '3D4', 'VDS': 'PH7FG1', 'VIS': 'BT808130', 213 | 'MODEL': 'Journey', 'MAKE': 'Dodge', 'YEAR': 2011, 'COUNTRY': 'Mexico', 214 | 'REGION': 'north_america', 'SEQUENTIAL_NUMBER': '808130', 'FEWER_THAN_500_PER_YEAR': False}, 215 | 216 | # http://www.vindecoder.net/?vin=3D73Y3CL0BG113805&submit=Decode 217 | # Edmunds has this as Dodge up to 2010, RAM thereafter, 218 | # but EPA confused; https://www.fueleconomy.gov/feg/EPAGreenGuide/txt/all_alpha_11.txt has it as Dodge still 219 | # ftp://safercar.gov/MfrMail/ORG7565.pdf bit confused too 220 | # ftp://safercar.gov/MfrMail/ORG5870.pdf is for 2011, but calls it Dodge still 221 | # Heck, http://www.rambodybuilder.com/2012/docs/intro/vin.pdf is 2012, and still calls it Dodge 222 | # Screw it, let's go with Dodge, as I have no way of getting this right 223 | {'VIN': '3D73Y3CL0BG113805', 'WMI': '3D7', 'VDS': '3Y3CL0', 'VIS': 'BG113805', 224 | 'MODEL': 'Ram 3500', 'MAKE': 'Dodge', 'YEAR': 2011, 'COUNTRY': 'Mexico', 225 | 'REGION': 'north_america', 'SEQUENTIAL_NUMBER': '113805', 'FEWER_THAN_500_PER_YEAR': False}, 226 | 227 | # https://vpic.nhtsa.dot.gov/api/vehicles/decodevinvalues/3GCEC13078G157479 228 | {'VIN': '3GCEC13078G157479', 'WMI': '3GC', 'VDS': 'EC1307', 'VIS': '8G157479', 229 | 'MODEL': 'Silverado', 'MAKE': 'Chevrolet', 'YEAR': 2008, 'COUNTRY': 'Mexico', 230 | 'REGION': 'north_america', 'SEQUENTIAL_NUMBER': '157479', 'FEWER_THAN_500_PER_YEAR': False, 231 | }, 232 | 233 | # http://www.fueleconomy.gov/ws/rest/vehicle/23047 234 | {'VIN': '3GNFK16387G115163', 'WMI': '3GN', 'VDS': 'FK1638', 'VIS': '7G115163', 235 | 'MODEL': 'Suburban', 'MAKE': 'Chevrolet', 'YEAR': 2007, 'COUNTRY': 'Mexico', 236 | 'REGION': 'north_america', 'SEQUENTIAL_NUMBER': '115163', 'FEWER_THAN_500_PER_YEAR': False, 237 | }, 238 | 239 | # http://www.vindecoder.net/?vin=3GYVKMEF5AG416315&submit=Decode 240 | {'VIN': '3GYVKMEF5AG416315', 'WMI': '3GY', 'VDS': 'VKMEF5', 'VIS': 'AG416315', 241 | 'MODEL': 'Escalade', 'MAKE': 'Cadillac', 'YEAR': 2010, 'COUNTRY': 'Mexico', 242 | 'REGION': 'north_america', 'SEQUENTIAL_NUMBER': '416315', 'FEWER_THAN_500_PER_YEAR': False}, 243 | 244 | # http://www.vindecoder.net/?vin=3LNHL2GC1BR262548&submit=Decode 245 | {'VIN': '3LNHL2GC1BR262548', 'WMI': '3LN', 'VDS': 'HL2GC1', 'VIS': 'BR262548', 246 | 'MODEL': 'MKZ', 'MAKE': 'Lincoln', 'YEAR': 2011, 'COUNTRY': 'Mexico', 247 | 'REGION': 'north_america', 'SEQUENTIAL_NUMBER': '262548', 'FEWER_THAN_500_PER_YEAR': False}, 248 | 249 | # https://vpic.nhtsa.dot.gov/mid/home/displayfile/6089 250 | {'VIN': '3MZBM1K72GM303265', 'WMI': '3MZ', 'VDS': 'BM1K72', 'VIS': 'GM303265', 251 | 'MODEL': 'Mazda3', 'MAKE': 'Mazda', 'YEAR': 2016, 'COUNTRY': 'Mexico', 252 | 'REGION': 'north_america', 'SEQUENTIAL_NUMBER': '303265', 'FEWER_THAN_500_PER_YEAR': False, 253 | }, 254 | 255 | # https://vpic.nhtsa.dot.gov/api/vehicles/decodevinvalues/3TMCZ5AN2GM040551 256 | {'VIN': '3TMCZ5AN2GM040551', 'WMI': '3TM', 'VDS': 'CZ5AN2', 'VIS': 'GM040551', 257 | 'MODEL': 'Tacoma', 'MAKE': 'Toyota', 'YEAR': 2016, 'COUNTRY': 'Mexico', 258 | 'REGION': 'north_america', 'SEQUENTIAL_NUMBER': '040551', 'FEWER_THAN_500_PER_YEAR': False, 259 | }, 260 | 261 | # http://www.vindecoder.net/?vin=4A31K3DT4CE403200&submit=Decode 262 | {'VIN': '4A31K3DT4CE403200', 'WMI': '4A3', 'VDS': '1K3DT4', 'VIS': 'CE403200', 263 | 'MODEL': 'Eclipse', 'MAKE': 'Mitsubishi', 'YEAR': 2012, 'COUNTRY': 'United States', 264 | 'REGION': 'north_america', 'SEQUENTIAL_NUMBER': '403200', 'FEWER_THAN_500_PER_YEAR': False}, 265 | 266 | # https://vpic.nhtsa.dot.gov/api/vehicles/decodevinvalues/4JGDA6DB9GA764832 267 | {'VIN': '4JGDA6DB9GA764832', 'WMI': '4JG', 'VDS': 'DA6DB9', 'VIS': 'GA764832', 268 | 'MODEL': 'GLE', 'MAKE': 'Mercedes-Benz', 'YEAR': 2016, 'COUNTRY': 'United States', 269 | 'REGION': 'north_america', 'SEQUENTIAL_NUMBER': '764832', 'FEWER_THAN_500_PER_YEAR': False, 270 | }, 271 | 272 | # http://www.fueleconomy.gov/ws/rest/vehicle/36406 273 | {'VIN': '4S3BNAH62G3049699', 'WMI': '4S3', 'VDS': 'BNAH62', 'VIS': 'G3049699', 274 | 'MODEL': 'Legacy', 'MAKE': 'Subaru', 'YEAR': 2016, 'COUNTRY': 'United States', 275 | 'REGION': 'north_america', 'SEQUENTIAL_NUMBER': '049699', 'FEWER_THAN_500_PER_YEAR': False, 276 | }, 277 | 278 | # https://vpic.nhtsa.dot.gov/api/vehicles/decodevinvalues/55SWF4JB6GU104745 279 | {'VIN': '55SWF4JB6GU104745', 'WMI': '55S', 'VDS': 'WF4JB6', 'VIS': 'GU104745', 280 | 'MODEL': 'C-Class', 'MAKE': 'Mercedes-Benz', 'YEAR': 2016, 'COUNTRY': 'United States', 281 | 'REGION': 'north_america', 'SEQUENTIAL_NUMBER': '104745', 'FEWER_THAN_500_PER_YEAR': False, 282 | }, 283 | 284 | # https://vpic.nhtsa.dot.gov/api/vehicles/decodevinvalues/58ABK1GG4GU016219 285 | {'VIN': '58ABK1GG4GU016219', 'WMI': '58A', 'VDS': 'BK1GG4', 'VIS': 'GU016219', 286 | 'MODEL': 'ES', 'MAKE': 'Lexus', 'YEAR': 2016, 'COUNTRY': 'United States', 287 | 'REGION': 'north_america', 'SEQUENTIAL_NUMBER': '016219', 'FEWER_THAN_500_PER_YEAR': False, 288 | }, 289 | 290 | # http://www.vindecoder.net/?vin=5FRYD3H26GB020813&submit=Decode unchecked 291 | {'VIN': '5FRYD3H26GB020813', 'WMI': '5FR', 'VDS': 'YD3H26', 'VIS': 'GB020813', 292 | 'MODEL': 'MDX', 'MAKE': 'Acura', 'YEAR': 2016, 'COUNTRY': 'United States', 293 | 'REGION': 'north_america', 'SEQUENTIAL_NUMBER': '020813', 'FEWER_THAN_500_PER_YEAR': False}, 294 | 295 | # http://www.vindecoder.net/?vin=5GADS13S072592644&submit=Decode 296 | # https://service.gm.com/dealerworld/vincards/ 297 | # https://service.gm.com/dealerworld/vincards/pdf/vincard07.pdf 298 | # ftp://www-nrd.nhtsa.dot.gov/MfrMail/ORG5807.pdf 299 | {'VIN': '5GADS13S072592644', 'WMI': '5GA', 'VDS': 'DS13S0', 'VIS': '72592644', 300 | 'MODEL': 'Ranier', 'MAKE': 'Buick', 'YEAR': 2007, 'COUNTRY': 'United States', 301 | 'REGION': 'north_america', 'SEQUENTIAL_NUMBER': '592644', 'FEWER_THAN_500_PER_YEAR': False}, 302 | 303 | # http://www.vindecoder.net/?vin=5GNRNGEE9A8215904&submit=Decode 304 | {'VIN': '5GNRNGEE9A8215904', 'WMI': '5GN', 'VDS': 'RNGEE9', 'VIS': 'A8215904', 305 | 'MODEL': 'H3T', 'MAKE': 'Hummer', 'YEAR': 2010, 'COUNTRY': 'United States', 306 | 'REGION': 'north_america', 'SEQUENTIAL_NUMBER': '215904', 'FEWER_THAN_500_PER_YEAR': False}, 307 | 308 | # http://www.vindecoder.net/?vin=5J6TF1H33CL339137&submit=Decode 309 | {'VIN': '5J6TF1H33CL339137', 'WMI': '5J6', 'VDS': 'TF1H33', 'VIS': 'CL339137', 310 | 'MODEL': 'Crosstour', 'MAKE': 'Honda', 'YEAR': 2012, 'COUNTRY': 'United States', 311 | 'REGION': 'north_america', 'SEQUENTIAL_NUMBER': '339137', 'FEWER_THAN_500_PER_YEAR': False}, 312 | 313 | # http://www.vindecoder.net/?vin=5J8TB1H27CA348655&submit=Decode 314 | {'VIN': '5J8TB1H27CA348655', 'WMI': '5J8', 'VDS': 'TB1H27', 'VIS': 'CA348655', 315 | 'MODEL': 'RDX', 'MAKE': 'Acura', 'YEAR': 2012, 'COUNTRY': 'United States', 316 | 'REGION': 'north_america', 'SEQUENTIAL_NUMBER': '348655', 'FEWER_THAN_500_PER_YEAR': False}, 317 | 318 | # https://vpic.nhtsa.dot.gov/api/vehicles/decodevinvalues/5N1AL0MM1DC339116 319 | {'VIN': '5N1AL0MM1DC339116', 'WMI': '5N1', 'VDS': 'AL0MM1', 'VIS': 'DC339116', 320 | 'MODEL': 'JX35', 'MAKE': 'Infiniti', 'YEAR': 2013, 'COUNTRY': 'United States', 321 | 'REGION': 'north_america', 'SEQUENTIAL_NUMBER': '339116', 'FEWER_THAN_500_PER_YEAR': False, 322 | }, 323 | 324 | # http://www.vindecoder.net/?vin=5N1CR2MN6EC875492&submit=Decode 325 | {'VIN': '5N1CR2MN6EC875492', 'WMI': '5N1', 'VDS': 'CR2MN6', 'VIS': 'EC875492', 326 | 'MODEL': 'Pathfinder', 'MAKE': 'Nissan', 'YEAR': 2014, 'COUNTRY': 'United States', 327 | 'REGION': 'north_america', 'SEQUENTIAL_NUMBER': '875492', 'FEWER_THAN_500_PER_YEAR': False}, 328 | 329 | # http://www.vindecoder.net/?vin=5UMDU93436L421092&submit=Decode 330 | {'VIN': '5UMDU93436L421092', 'WMI': '5UM', 'VDS': 'DU9343', 'VIS': '6L421092', 331 | 'MODEL': 'M', 'MAKE': 'BMW', 'YEAR': 2006, 'COUNTRY': 'United States', 332 | 'REGION': 'north_america', 'SEQUENTIAL_NUMBER': '421092', 'FEWER_THAN_500_PER_YEAR': False}, 333 | 334 | # https://vpic.nhtsa.dot.gov/mid/home/displayfile/6197 "BMW Model Year 2015 Decipherment of VINs in Accordance with Part 565" 335 | # http://www.vindecoder.net/?vin=5UXXW5C54F0791433&submit=Decode 336 | # http://www.partesymas.com/VIN-Interpretation-Tables-2026.pdf showed 4-7 were the model,body,engine code 337 | # http://www.autoredbook.com/ distinguished between the two X4 models 338 | {'VIN': '5UXXW5C54F0791433', 'WMI': '5UX', 'VDS': 'XW5C54', 'VIS': 'F0791433', 339 | 'MODEL': 'X4 xDrive35i', 'MAKE': 'BMW', 'YEAR': 2015, 'COUNTRY': 'United States', 340 | 'REGION': 'north_america', 'SEQUENTIAL_NUMBER': '791433', 'FEWER_THAN_500_PER_YEAR': False}, 341 | 342 | # http://www.fueleconomy.gov/ws/rest/vehicle/34949 343 | {'VIN': '5XXGM4A7XFG459047', 'WMI': '5XX', 'VDS': 'GM4A7X', 'VIS': 'FG459047', 344 | 'MODEL': 'Optima', 'MAKE': 'Kia', 'YEAR': 2015, 'COUNTRY': 'United States', 345 | 'REGION': 'north_america', 'SEQUENTIAL_NUMBER': '459047', 'FEWER_THAN_500_PER_YEAR': False, 346 | }, 347 | 348 | # http://www.fueleconomy.gov/ws/rest/vehicle/35500 349 | {'VIN': '5YFBURHE9FP280940', 'WMI': '5YF', 'VDS': 'BURHE9', 'VIS': 'FP280940', 350 | 'MODEL': 'Corolla', 'MAKE': 'Toyota', 'YEAR': 2015, 'COUNTRY': 'United States', 351 | 'REGION': 'north_america', 'SEQUENTIAL_NUMBER': '280940', 'FEWER_THAN_500_PER_YEAR': False, 352 | }, 353 | 354 | # http://www.vindecoder.net/?vin=JA4AD2A3XEZ426420&submit=Decode didn't have model 355 | # https://www.mitsubishicars.com/owners/support/vin-information 356 | {'VIN': 'JA4AD2A3XEZ426420', 'WMI': 'JA4', 'VDS': 'AD2A3X', 'VIS': 'EZ426420', 357 | 'MODEL': 'Outlander ES', 'MAKE': 'Mitsubishi', 'YEAR': 2014, 'COUNTRY': 'Japan', 358 | 'REGION': 'asia', 'SEQUENTIAL_NUMBER': '426420', 'FEWER_THAN_500_PER_YEAR': False}, 359 | 360 | # https://vpic.nhtsa.dot.gov/api/vehicles/decodevinvalues/JF2SJGVC3GH555328 361 | {'VIN': 'JF2SJGVC3GH555328', 'WMI': 'JF2', 'VDS': 'SJGVC3', 'VIS': 'GH555328', 362 | 'MODEL': 'Forester', 'MAKE': 'Subaru', 'YEAR': 2016, 'COUNTRY': 'Japan', 363 | 'REGION': 'asia', 'SEQUENTIAL_NUMBER': '555328', 'FEWER_THAN_500_PER_YEAR': False, 364 | }, 365 | 366 | # http://www.vindecoder.net/?vin=JH4CW2H53BC567925&submit=Decode 367 | {'VIN': 'JH4CW2H53BC567925', 'WMI': 'JH4', 'VDS': 'CW2H53', 'VIS': 'BC567925', 368 | 'MODEL': 'TSX', 'MAKE': 'Acura', 'YEAR': 2011, 'COUNTRY': 'Japan', 369 | 'REGION': 'asia', 'SEQUENTIAL_NUMBER': '567925', 'FEWER_THAN_500_PER_YEAR': False}, 370 | 371 | # http://www.vindecoder.net/?vin=JN1CV6FE4EM164066&submit=Decode 372 | # http://infinitihelp.com/diy/common/infiniti_vin.php 373 | {'VIN': 'JN1CV6FE4EM164066', 'WMI': 'JN1', 'VDS': 'CV6FE4', 'VIS': 'EM164066', 374 | 'MODEL': 'Q60 Convertible', 'MAKE': 'Infiniti', 'YEAR': 2014, 'COUNTRY': 'Japan', 375 | 'REGION': 'asia', 'SEQUENTIAL_NUMBER': '164066', 'FEWER_THAN_500_PER_YEAR': False}, 376 | 377 | # https://vpic.nhtsa.dot.gov/api/vehicles/decodevinvalues/JN1AJ0HP7CM401080 378 | {'VIN': 'JN1AJ0HP7CM401080', 'WMI': 'JN1', 'VDS': 'AJ0HP7', 'VIS': 'CM401080', 379 | 'MODEL': 'EX35', 'MAKE': 'Infiniti', 'YEAR': 2012, 'COUNTRY': 'Japan', 380 | 'REGION': 'asia', 'SEQUENTIAL_NUMBER': '401080', 'FEWER_THAN_500_PER_YEAR': False, 381 | }, 382 | 383 | # And another random JN1 that isn't Infiniti 384 | # http://nissanvindecoder.com/vins/jn1az44ex9m403788 385 | {'VIN': 'JN1AZ44EX9M403788', 'WMI': 'JN1', 'VDS': 'AZ44EX', 'VIS': '9M403788', 386 | 'MODEL': '370Z', 'MAKE': 'Nissan', 'YEAR': 2009, 'COUNTRY': 'Japan', 387 | 'REGION': 'asia', 'SEQUENTIAL_NUMBER': '403788', 'FEWER_THAN_500_PER_YEAR': False}, 388 | 389 | # http://www.vindecoder.net/?vin=JN8BS1MW7EM920252&submit=Decode 390 | {'VIN': 'JN8BS1MW7EM920252', 'WMI': 'JN8', 'VDS': 'BS1MW7', 'VIS': 'EM920252', 391 | 'MODEL': 'QX70', 'MAKE': 'Infiniti', 'YEAR': 2014, 'COUNTRY': 'Japan', 392 | 'REGION': 'asia', 'SEQUENTIAL_NUMBER': '920252', 'FEWER_THAN_500_PER_YEAR': False}, 393 | 394 | # http://www.vindecoder.net/?vin=JN8CS1MU0DM236239&submit=Decode 395 | {'VIN': 'JN8CS1MU0DM236239', 'WMI': 'JN8', 'VDS': 'CS1MU0', 'VIS': 'DM236239', 396 | 'MODEL': 'FX37', 'MAKE': 'Infiniti', 'YEAR': 2013, 'COUNTRY': 'Japan', 397 | 'REGION': 'asia', 'SEQUENTIAL_NUMBER': '236239', 'FEWER_THAN_500_PER_YEAR': False}, 398 | 399 | # http://www.vindecoder.net/?vin=JTHBW1GG7D2369737&submit=Decode has no model 400 | # http://www.autocalculator.org/VIN/WMI.aspx agrees JTH is Lexus 401 | # http://www.clublexus.com/forums/vindecoder.php?vin=JTHBW1GG7D2369737 402 | {'VIN': 'JTHBW1GG7D2369737', 'WMI': 'JTH', 'VDS': 'BW1GG7', 'VIS': 'D2369737', 403 | 'MODEL': 'ES 300h', 'MAKE': 'Lexus', 'YEAR': 2013, 'COUNTRY': 'Japan', 404 | 'REGION': 'asia', 'SEQUENTIAL_NUMBER': '369737', 'FEWER_THAN_500_PER_YEAR': False}, 405 | 406 | # http://www.vindecoder.net/?vin=JTJHY7AX4D4667505&submit=Decode 407 | {'VIN': 'JTJHY7AX4D4667505', 'WMI': 'JTJ', 'VDS': 'HY7AX4', 'VIS': 'D4667505', 408 | 'MODEL': 'LX 570', 'MAKE': 'Lexus', 'YEAR': 2013, 'COUNTRY': 'Japan', 409 | 'REGION': 'asia', 'SEQUENTIAL_NUMBER': '667505', 'FEWER_THAN_500_PER_YEAR': False}, 410 | 411 | # http://www.vindecoder.net/?vin=JM1BL1SF3A1267720&submit=Decode 412 | {'VIN': 'JM1BL1SF3A1267720', 'WMI': 'JM1', 'VDS': 'BL1SF3', 'VIS': 'A1267720', 413 | 'MODEL': 'MAZDA3', 'MAKE': 'Mazda', 'YEAR': 2010, 'COUNTRY': 'Japan', 414 | 'REGION': 'asia', 'SEQUENTIAL_NUMBER': '267720', 'FEWER_THAN_500_PER_YEAR': False}, 415 | 416 | # http://www.vindecoder.net/?vin=KNDJT2A54D7883468&submit=Decode 417 | {'VIN': 'KNDJT2A54D7883468', 'WMI': 'KND', 'VDS': 'JT2A54', 'VIS': 'D7883468', 418 | 'MODEL': 'Soul', 'MAKE': 'Kia', 'YEAR': 2013, 'COUNTRY': 'Korea (South)', 419 | 'REGION': 'asia', 'SEQUENTIAL_NUMBER': '883468', 'FEWER_THAN_500_PER_YEAR': False}, 420 | 421 | # http://www.fueleconomy.gov/ws/rest/vehicle/36940 422 | {'VIN': 'KNMAT2MT0GP672329', 'WMI': 'KNM', 'VDS': 'AT2MT0', 'VIS': 'GP672329', 423 | 'MODEL': 'Rogue', 'MAKE': 'Nissan', 'YEAR': 2016, 'COUNTRY': 'Korea (South)', 424 | 'REGION': 'asia', 'SEQUENTIAL_NUMBER': '672329', 'FEWER_THAN_500_PER_YEAR': False, 425 | }, 426 | 427 | # http://www.vindecoder.net/?vin=SCBEC9ZA1EC225243&submit=Decode 428 | # https://www.vinaudit.com/vin-search?vin=SCBEC9ZA1EC225243 got model slightly wrong 429 | # http://www.fueleconomy.gov/ws/rest/vehicle/menu/model?year=2014&make=Bentley confirms model name 430 | {'VIN': 'SCBEC9ZA1EC225243', 'WMI': 'SCB', 'VDS': 'EC9ZA1', 'VIS': 'EC225243', 431 | 'MODEL': 'Flying Spur', 'MAKE': 'Bentley', 'YEAR': 2014, 'COUNTRY': 'United Kingdom', 432 | 'REGION': 'europe', 'SEQUENTIAL_NUMBER': '225243', 'FEWER_THAN_500_PER_YEAR': False}, 433 | 434 | # http://www.vindecoder.net/?vin=SCFAD01A65G199359&submit=Decode 435 | # http://www.fueleconomy.gov/ws/rest/vehicle/menu/model?year=2005&make=Aston%20Martin verifies spelling 436 | {'VIN': 'SCFAD01A65G199359', 'WMI': 'SCF', 'VDS': 'AD01A6', 'VIS': '5G199359', 437 | 'MODEL': 'DB9', 'MAKE': 'Aston Martin', 'YEAR': 2005, 'COUNTRY': 'United Kingdom', 438 | 'REGION': 'europe', 'SEQUENTIAL_NUMBER': '199359', 'FEWER_THAN_500_PER_YEAR': False}, 439 | 440 | # http://www.vindecoder.net/?vin=TRUSC28N711268458&submit=Decode 441 | {'VIN': 'TRUSC28N711268458', 'WMI': 'TRU', 'VDS': 'SC28N7', 'VIS': '11268458', 442 | 'MODEL': 'TT', 'MAKE': 'Audi', 'YEAR': 2001, 'COUNTRY': 'Hungary', 443 | 'REGION': 'europe', 'SEQUENTIAL_NUMBER': '268458', 'FEWER_THAN_500_PER_YEAR': False}, 444 | 445 | # http://www.vindecoder.net/?vin=VNKJTUD36FA838549&submit=Decode 446 | {'VIN': 'VNKJTUD36FA838549', 'WMI': 'VNK', 'VDS': 'JTUD36', 'VIS': 'FA838549', 447 | 'MODEL': 'Yaris', 'MAKE': 'Toyota', 'YEAR': 2015, 'COUNTRY': 'France', 448 | 'REGION': 'europe', 'SEQUENTIAL_NUMBER': '838549', 'FEWER_THAN_500_PER_YEAR': False}, 449 | 450 | # http://www.vindecoder.net/?vin=W04GW5EV0B1603732&submit=Decode 451 | # http://gmvindecoder.net/vins/W04GW5EV0B1603732 452 | {'VIN': 'W04GW5EV0B1603732', 'WMI': 'W04', 'VDS': 'GW5EV0', 'VIS': 'B1603732', 453 | 'MODEL': 'Regal', 'MAKE': 'Buick', 'YEAR': 2011, 'COUNTRY': 'Germany', 454 | 'REGION': 'europe', 'SEQUENTIAL_NUMBER': '603732', 'FEWER_THAN_500_PER_YEAR': False}, 455 | 456 | # http://www.vindecoder.net/?vin=WA1EY74LX9D205644&submit=Decode 457 | # https://vindecoder.eu/check-vin/WA1EY74LX9D205644 458 | {'VIN': 'WA1EY74LX9D205644', 'WMI': 'WA1', 'VDS': 'EY74LX', 'VIS': '9D205644', 459 | 'MODEL': 'Q7', 'MAKE': 'Audi', 'YEAR': 2009, 'COUNTRY': 'Germany', 460 | 'REGION': 'europe', 'SEQUENTIAL_NUMBER': '205644', 'FEWER_THAN_500_PER_YEAR': False}, 461 | 462 | # http://www.vindecoder.net/?vin=WBSWL9C54AP786013&submit=Decode 463 | {'VIN': 'WBSWL9C54AP786013', 'WMI': 'WBS', 'VDS': 'WL9C54', 'VIS': 'AP786013', 464 | 'MODEL': 'M3 Convertible', 'MAKE': 'BMW', 'YEAR': 2010, 'COUNTRY': 'Germany', 465 | 'REGION': 'europe', 'SEQUENTIAL_NUMBER': '786013', 'FEWER_THAN_500_PER_YEAR': False}, 466 | 467 | # http://www.vindecoder.net/?vin=WDCYC7DF3FX109287&submit=Decode 468 | # http://www.vindecoderz.com/EN/check-lookup/WDCYC7DF3FX109287 469 | # http://www.autocalculator.org/VIN/WMI.aspx says WDC is Mercedes-Benz, hmm 470 | # http://www.fueleconomy.gov/ws/rest/vehicle/menu/make?year=2015 spells it Mercedes-Benz, too, let's go with that 471 | {'VIN': 'WDCYC7DF3FX109287', 'WMI': 'WDC', 'VDS': 'YC7DF3', 'VIS': 'FX109287', 472 | 'MODEL': 'G643', 'MAKE': 'Mercedes-Benz', 'YEAR': 2015, 'COUNTRY': 'Germany', 473 | 'REGION': 'europe', 'SEQUENTIAL_NUMBER': '109287', 'FEWER_THAN_500_PER_YEAR': False}, 474 | 475 | # http://www.vindecoder.net/?vin=WDDNG7BB4AA522219&submit=Decode 476 | # ftp://safercar.gov/MfrMail/ORG4488.pdf 477 | {'VIN': 'WDDNG7BB4AA522219', 'WMI': 'WDD', 'VDS': 'NG7BB4', 'VIS': 'AA522219', 478 | 'MODEL': 'S550', 'MAKE': 'Mercedes-Benz', 'YEAR': 2010, 'COUNTRY': 'Germany', 479 | 'REGION': 'europe', 'SEQUENTIAL_NUMBER': '522219', 'FEWER_THAN_500_PER_YEAR': False}, 480 | 481 | # http://www.vindecoder.net/?vin=WUADUAFG6AN410499&submit=Decode 482 | {'VIN': 'WUADUAFG6AN410499', 'WMI': 'WUA', 'VDS': 'DUAFG6', 'VIS': 'AN410499', 483 | 'MODEL': 'R8', 'MAKE': 'Audi', 'YEAR': 2010, 'COUNTRY': 'Germany', 484 | 'REGION': 'europe', 'SEQUENTIAL_NUMBER': '410499', 'FEWER_THAN_500_PER_YEAR': False}, 485 | 486 | # http://www.vindecoder.net/?vin=WVGAV7AX9BW549850&submit=Decode unchecked 487 | # http://acurazine.com/forums/vindecoder.php?vin=WVGAV7AX9BW549850 488 | {'VIN': 'WVGAV7AX9BW549850', 'WMI': 'WVG', 'VDS': 'AV7AX9', 'VIS': 'BW549850', 489 | 'MODEL': 'Tiguan', 'MAKE': 'Volkswagen', 'YEAR': 2011, 'COUNTRY': 'Germany', 490 | 'REGION': 'europe', 'SEQUENTIAL_NUMBER': '549850', 'FEWER_THAN_500_PER_YEAR': False}, 491 | 492 | # http://www.vindecoder.net/?vin=YV1902FH5D1796335&submit=Decode doesn't have model 493 | # http://www.vindecoderz.com/EN/check-lookup/YV1902FH5D1796335 494 | # http://www.fueleconomy.gov/ws/rest/vehicle/menu/model?year=2013&make=Volvo confirms XC60 495 | {'VIN': 'YV1902FH5D1796335', 'WMI': 'YV1', 'VDS': '902FH5', 'VIS': 'D1796335', 496 | 'MODEL': 'XC60', 'MAKE': 'Volvo', 'YEAR': 2013, 'COUNTRY': 'Sweden', 497 | 'REGION': 'europe', 'SEQUENTIAL_NUMBER': '796335', 'FEWER_THAN_500_PER_YEAR': False}, 498 | 499 | ] 500 | --------------------------------------------------------------------------------