blog · 2026-07-31 · written for: ED-2 — the RFID / scanning systems-integrator practice (the field deployment engineer commissioning a site); B2D worked example

Scan the door jamb: VIN to vehicle, listing, and every other door

One thesis: a door-jamb Code 39 scan resolves all the way through the pipeline — validate, decode, linkset — with a typed failure at every step that can fail, so a commissioning day ends in verdicts you can read aloud to the client, not stack traces.

If you commission scanning sites for a living, the VIN is the identifier you meet in the ugliest conditions: a Code 39 strip behind a dusty door jamb, a B-pillar label at a bad angle, a hang-tag QR somebody laminated. You need the pipeline to work on site, that day, with failures you can read aloud to the client — not a stack trace, a verdict.

What the payload actually looks like

A Code 39 scan arrives framed: the symbology's start/stop character wraps the payload, so your reader hands you the seventeen characters — or, with some firmware configurations, the framing asterisk characters around them. First job is normalization: strip the framing, uppercase, and reject the three letters a VIN can never contain (I, O, Q — excluded by regulation precisely so they cannot be confused with digits). Everything after that is arithmetic.

barcoding verify 1HGCM82633A004352 --json

{
  "scheme": "vin",
  "canonical": "1HGCM82633A004352",
  "valid": true,
  "check": "iso3779 mod11 pass (pos 9 expects '3', found '3')",
  "fields": { "wmi": "1HG", "modelYear": "2003", "plant": "A" }
}

The check digit is not folklore; it is 49 CFR 565.15 — a public federal regulation anyone can read. Each character transliterates to a number, each of the seventeen positions carries a published weight, the weighted sum is taken mod eleven, and the remainder (with ten spelled as the letter X) must equal position nine. On the VIN above the weighted sum is 311; mod eleven that leaves 3; position nine reads 3; pass. When it fails, the error is typed — length, charset, or checkdigit — and the checkdigit failure names the exact character position nine should have contained. On a commissioning day, that one string is the difference between "bad scan, re-shoot the label" and "this VIN was keyed wrong upstream," and you can show the client which. The full worked transliteration table lives in the check-digit post, beside the EAN-13 twin.

From valid to answered

Validation is pure and local — no network, no account. Resolution is where the rails come in, and the VIN row's rails are unusually good. The public-domain floor is NHTSA's vPIC service: roughly 140 decoded attributes, no API key, plus a full database download, all public domain as U.S. government work. Above that floor runs the family's own rail, auto.dev — the smoke-tested decode endpoint answers GET /vin/{VIN} with the full record: check-digit confirmation, WMI, squish VIN, year, make, model, trim, body, engine, drive, transmission. Every attribute in the response rides the provenance envelope — value, source, fetched-at — because a vehicle record is a mosaic like any other and the envelope is the house law.

barcoding resolve 1HGCM82633A004352 --json | jq .enrichment.summary

{ "year": "2003", "make": "Honda", "model": "Accord",
  "source": "auto.dev", "fetched_at": "2026-07-31T…" }

The linkset: every door, each with its receipts

The resolver's answer is not one URL; it is a linkset — the same RFC 9264 shape the GS1-conformant side serves, extended to the vehicle scheme and labeled as such. The vehicle link types are modeled deliberately on GS1 Digital Link's vocabulary; one of them is an exact analogue:

linkTypeGS1 DL analogueDoorContext chip
historytraceabilityvehicle-history doorrecord count, last posted
recallStatusrecallStatus — exact matchopen-recalls dooropen campaigns, posted timestamp
stickerinstructions / specwindow-sticker doororiginal sticker availability
valuation(vehicle-specific)market-value doorcurrent value, posted timestamp
logisticslogisticsInfotransport doorquote from VIN plus two zips
purchasehasRetailerslistings doorlive listing chips

Two disciplines carry over from the vehicle estate's own rules, and your deployments benefit from both. Chips are live data or absent — a linkset entry carries posted context (counts, timestamps) or it does not appear; no marketing filler dressed as data. And serve, never home: the government and the OEMs home VIN allocation; this resolver serves resolution and stamps sameAs toward the identity spine rather than minting a competing vehicle identity. The general form of that law is the previous post.

Why this pipeline is demonstrable end to end

Line the VIN row up against the scheme-registry columns and every cell is lit: grammar public (federal regulation), check digit public (same) — the VIN post owns that published-by-law argument in full, worked to the last weight — decode rail public domain (vPIC) with an owned first-party rail above it (auto.dev), linkset live (the vehicle doors run in production today). No licensing wall, no aggregator, no scraping anywhere in the chain. That makes vehicles the scheme family where the whole pipeline — validate, resolve, enrich with provenance, fan out to doors — is demonstrable end to end on a thing parked outside your client's dock.

For a commissioning day: verify runs pure and local on the device you walked in with, and the demo costs nothing but a door jamb. The enrichment rail and the hosted linkset ride the network half of the verb set — get an API key, say that vehicles arrive at your door, and provisioning follows the list. Then wire the scan onward: a received vehicle is a custody event like any other case or pallet, and the event side of that story — with the observer carried honestly — is one scan, three layers.

Keys open the network half of the verb set. Get an API key — say what arrives at your door, and the provisioning order follows the list.

We answer in writing. We take at most five conversations a month, only when you ask for one, and only after you already have the written read.