Decode VINs in Google Sheets
Formula
Decode a column of VINs by the row. =VERVE("vindecoder", "1HGCM82633A004352") returns make, model, year and trim — Sheets or Excel.
=VERVE("vindecoder", A2)=VERVE.CALL("vindecoder", A2)A2 holds the vin you're looking up. Drag the formula down and each row resolves on its own.
With literal values
Nothing has to come from a cell — typed values work the same way.
=VERVE("vindecoder", "1HGCM82633A004352")Inputs
Required inputs are positional, in the order below. Everything else is passed as a "name", value pair after them — the same shape as SUMIFS.
| Input | Type | Where it goes | Description |
|---|---|---|---|
vinRequired | string | argument 2 | The Vehicle Identification Number to decode. Partial VINs are accepted and decode as far as the available characters allow. (e.g. 1HGCM82633A004352) |
What lands in your sheet
With no "field" pair the formula spills the whole response as two columns — field name on the left, value on the right — starting at the cell you typed in. Make sure the cells below and to the right are empty.
Pulling one value
Add a "field" pair to get a single cell back instead of a table. The field name is the dot-path from the table below.
=VERVE("vindecoder", A2, "field", "vin")=VERVE.CALL("vindecoder", A2, "field", "vin")Available fields
#PREMIUM(field) rather than a value, so a locked field never looks like a real answer.| Use as "field" | Type | Example cell value | Description |
|---|---|---|---|
vin | string | 1HGCM82633A004352 | The VIN that was decoded, normalized to uppercase |
valid | boolean | true | Whether the VIN passes all NHTSA checks, including the check digit |
decoded | boolean | true | Whether the VIN resolved to an identifiable vehicle |
vehicleDescriptor | string | 1HGCM826*3A | The portion of the VIN that identifies the vehicle build, with variable positions masked |
make | string | HONDA | Vehicle manufacturer or brand name |
model | string | Accord | Vehicle model name |
year | number | 2003 | Model year of the vehicle |
trimPremium | string | EX-V6 | Trim level or variant of the model |
trim2Premium | object | null | Secondary trim designation where the manufacturer provides one |
seriesPremium | object | null | Series designation of the vehicle |
series2Premium | object | null | Secondary series designation where the manufacturer provides one |
manufacturer | string | AMERICAN HONDA MOTOR CO., INC. | Full legal name of the manufacturing company |
vehicleType | string | PASSENGER CAR | Broad vehicle classification, such as passenger car or truck |
bodyClass | string | Coupe | Body style of the vehicle, such as coupe or sedan |
plantPremium | object | {…} | Manufacturing plant that built the vehicle, including city, state, country and company |
plant.country | string | UNITED STATES (USA) | |
plant.city | string | MARYSVILLE | |
plant.state | string | OHIO | |
enginePremium | object | {…} | Engine specifications, including displacement, cylinder count, configuration, horsepower, fuel type and electrification level |
engine.displacementL | string | 2.998832712 | |
engine.displacementCc | string | 2998.832712 | |
engine.displacementCi | string | 183 | |
engine.engineNumberOfCylinders | string | 6 | |
engine.engineBrakeHpFrom | string | 240 | |
engine.engineConfiguration | string | V-Shaped | |
engine.engineModel | string | J30A4 | |
engine.valveTrainDesign | string | Single Overhead Cam (SOHC) | |
engine.fuelTypePrimary | string | Gasoline | |
features | object | {…} | Equipment fitted to this build, grouped by area |
features.exteriorPremium | object | {…} | Exterior attributes including body, doors, dimensions, weight rating, wheels, and truck, bus, trailer or motorcycle specifics |
features.exterior.doors | string | 2 | |
features.exterior.grossVehicleWeightRatingFrom | string | Class 1C: 4,001 - 5,000 lb (1,814 - 2,268 kg) | |
features.exterior.grossVehicleWeightRatingTo | string | Class 1: 6,000 lb or less (2,722 kg or less) | |
features.mechanicalPremium | object | {…} | Mechanical attributes including transmission, drivetrain, brakes and battery |
features.mechanical.transmissionStyle | string | Automatic | |
features.mechanical.transmissionSpeeds | string | 5 | |
features.passiveSafetySystemPremium | object | {…} | Passive safety equipment including air bag locations and seat belt type |
features.passiveSafetySystem.seatBeltType | string | Manual | |
features.passiveSafetySystem.otherRestraintSystemInfo | string | Seat Belt (Rr center position) | |
features.passiveSafetySystem.frontAirBagLocations | string | 1st Row (Driver and Passenger) | |
features.passiveSafetySystem.sideAirBagLocations | string | 1st Row (Driver and Passenger) | |
features.passiveSafetySystem.curtainAirBagLocations | string | 1st and 2nd Rows | |
validation | object | {…} | Decode diagnostics reported by NHTSA |
validation.errorCode | string | 0 | NHTSA error code or codes for the decode, as a comma-separated string |
validation.errorCodes | array | ["0"] | The same NHTSA error codes split into an array for programmatic handling |
validation.errorText | string | 0 - VIN decoded clean. Check Digit (9th position) is correct | Human-readable explanation of each error code returned |
Filling a whole column
Hand the first argument a range instead of a cell and the add-in makes one batched call for the lot, then spills the answers down. That is faster than dragging the formula and costs the same credits — one per row looked up.
=VERVE("vindecoder", A2:A100, "field", "vin")=VERVE.CALL("vindecoder", A2:A100, "field", "vin")A2:A100 is the column of vin values. The result spills down alongside it, one row per input, blanks skipped.
When a cell doesn't fill
A failed lookup returns readable text starting with #ERR rather than a spreadsheet error, because Excel cannot show a custom message on a real error — you would get a bare #VALUE! with no reason. The trade-off is that IFERROR() won't catch it; test with LEFT(cell, 4) = "#ERR" instead.
| Cell reads | What happened |
|---|---|
#ERR Not connected | No API key saved. Open the side panel and connect your account. |
#ERR Replace <name> with a cell or value | The preview formula was copied as-is. Swap the placeholder for a cell reference. |
#ERR No "x" in vindecoder | An option name that this source doesn't take. The message lists the ones it does. |
#ERR No data point "…" | The "field" path isn't in the response. Check the dot-path against the table above. |
#PREMIUM(field) | The field exists but your plan doesn't include it. |
#ERR Out of credits | The month's credits are spent. Usage resets on your billing date. |
Before the formula works
The add-in reads the API key you saved once in the side panel — the key never goes in the formula, so a shared sheet doesn't leak it and a collaborator without access simply sees the last calculated values.
- Install the add-in for Google Sheets or Excel.
- Open the side panel and sign in, or paste a key from your dashboard.
- Type the formula above into any cell.
Other ways to use Decode VINs in Google Sheets
Set up Decode VINs in Google Sheets on VerveSheets, or reach the same source a different way. Your VerveSheets account and credits work on all of them — one key, one balance.
Frequently asked questions
Does Decode VINs in Google Sheets work in both Google Sheets and Excel?
Yes — the same source, the same arguments. Sheets calls it =VERVE("vindecoder", …) and Excel calls it =VERVE.CALL("vindecoder", …); that function name is the only difference.
Do the cells recalculate on their own?
They recalculate when the sheet does — on edit, on open, or on a manual recalc. Each recalculation is a fresh call and spends credits, so for a large static column it's worth copying the results and pasting them as values.
How many credits does a filled column cost?
5 credits per row looked up, whether you drag the formula or pass a range. The range form is one HTTP call instead of many, but the credit count is the same.
Can I share the sheet without sharing my key?
Yes. The key is stored against your account, not in the file. Collaborators see the values already in the cells; formulas only recalculate for someone who has connected their own account.
Why is a cell showing #ERR instead of an error?
So you can read the reason. Excel can't display a custom message on a real spreadsheet error, so the add-in returns the explanation as text on both platforms instead.