NHTSA vPIC often returns a SeatBeltType field on DecodeVinValues-style payloads: a catalog token describing belt type when the pattern includes it. That string is useful on a free VIN decode card. The trap is turning it into a "premium restraint package," brochure safety suite, or IIHS-equivalent claim that a seat-belt catalog value never asserted.
This post is about honest display: show SeatBeltType when vPIC provides it, refuse restraint-package inventing, and allow a clean "not provided" state when the field is empty. Keep seat-belt catalog values separate from airbag locations, pretensioner marketing, and crash-test grades. A sourced token is still only a token: it does not prove belts are installed correctly, unmodified, or undamaged on the listed vehicle. (Airbag location honesty is a separate topic; here the focus is SeatBeltType alone.)
What SeatBeltType is (and is not)
SeatBeltType is a catalog attribute associated with the VIN decode. It answers a narrow question: which seat-belt type token did the decode associate with this pattern?
It does not answer:
- Whether the vehicle earned an IIHS or NHTSA star rating
- Whether a dealer "Premium Restraint Package" or OEM suite name is equipped
- Pretensioner health, load-limiter status, or aftermarket belt changes
- Whether belts work today or were replaced after an incident
- A composite "restraint completeness" score built from missing neighboring fields
Empty SeatBeltType does not authorize a default "3-Point" badge, and a positive token does not mean "premium restraint package verified." Do not fill gaps from Make/Model/Year folklore or a chart keyed only by model year.
Normalize empties, do not invent packages
Treat blank, "Not Applicable", "N/A", and similar tokens as missing. Keep a sourced string when present; do not rewrite it into "Premium Restraint Package" or an IIHS-style grade.
const EMPTY = new Set([
"",
"not applicable",
"n/a",
"na",
"null",
"none",
"unknown",
]);
export type SeatBeltTypeView = {
value: string | null;
source: "vpic" | "missing";
};
export function viewSeatBeltType(fields: {
SeatBeltType?: string | null;
}): SeatBeltTypeView {
const raw = (fields.SeatBeltType ?? "").trim();
if (!raw || EMPTY.has(raw.toLowerCase())) {
return { value: null, source: "missing" };
}
return { value: raw, source: "vpic" };
}
export function seatBeltTypeLines(view: SeatBeltTypeView): string[] {
if (view.source === "missing") {
return [
"Seat belt type: not provided by vPIC for this VIN",
];
}
return [
`Seat belt type (vPIC): ${view.value}`,
"Catalog token only -- not a restraint package or crash-grade claim",
];
}
The footnote matters. Buyers over-read a belt token as a verified safety suite. Show the sourced value; if blank, say "not provided" -- no greyed "3-Point Standard" and no invented package name.
Forbidden upgrades
Product pressure often asks for:
- Mapping any non-empty SeatBeltType into "Premium Restraint Package"
- Inventing IIHS / Euro NCAP / star-equivalent language from belt catalog fields
- Bundling SeatBeltType with airbag location fields into "Full Restraint Suite"
- Defaulting blank SeatBeltType to "3-Point" so mid-trim cars look complete
- Renaming catalog tokens into OEM restraint marketing names you did not source
Refuse those. If you show airbag or other restraint catalog fields from separate sourced keys, show each on its own row. Never invent a package name inside the SeatBeltType mapper.
export function assertNoRestraintPackageInvent(
moduleSource: string,
): void {
const banned = [
/premium restraint/i,
/restraint package/i,
/iihs/i,
/5-star equivalent/i,
/full restraint suite/i,
/euro ncap/i,
];
for (const re of banned) {
if (re.test(moduleSource)) {
throw new Error(
`SeatBeltType module must not invent restraint packages: ${re}`,
);
}
}
}
export type CardRow = { label: string; value: string };
export function cardRows(fields: {
SeatBeltType?: string | null;
AirBagLocFront?: string | null;
AirBagLocSide?: string | null;
}): CardRow[] {
const view = viewSeatBeltType(fields);
const out: CardRow[] = [];
if (view.source === "missing") {
out.push({
label: "Seat belt type",
value: "not provided",
});
} else {
out.push({
label: "Seat belt type",
value: String(view.value),
});
}
const front = (fields.AirBagLocFront ?? "").trim();
if (front && !EMPTY.has(front.toLowerCase())) {
out.push({ label: "Front airbag loc (vPIC)", value: front });
}
const side = (fields.AirBagLocSide ?? "").trim();
if (side && !EMPTY.has(side.toLowerCase())) {
out.push({ label: "Side airbag loc (vPIC)", value: side });
}
return out;
}
Keep airbag locations on their own labeled rows. Never concatenate belts with airbags into "Premium Restraint Package."
UI copy that stays honest
Prefer:
- "Seat belt type (vPIC): Manual"
- "Seat belt type: not provided by vPIC for this VIN"
- A short footnote: catalog token, not a restraint package claim
Avoid:
- "Premium Restraint Package verified"
- "IIHS Good -- belt system complete"
- Grey placeholders that look like real belt data when the field was empty
Quick checks
import assert from "node:assert/strict";
assert.equal(viewSeatBeltType({}).source, "missing");
assert.deepEqual(
seatBeltTypeLines(viewSeatBeltType({})),
["Seat belt type: not provided by vPIC for this VIN"],
);
const manual = viewSeatBeltType({ SeatBeltType: "Manual" });
assert.equal(manual.value, "Manual");
assert.ok(
seatBeltTypeLines(manual).some((l) =>
/not a restraint package/i.test(l),
),
);
assert.ok(
!seatBeltTypeLines(manual).some((l) =>
/premium|iihs|full restraint/i.test(l),
),
);
const rows = cardRows({
SeatBeltType: "",
AirBagLocFront: "1st Row (Driver and Passenger)",
AirBagLocSide: "1st Row (Driver and Passenger)",
});
assert.ok(
rows.some(
(r) =>
r.label.includes("Seat belt") && r.value === "not provided",
),
);
assert.ok(rows.some((r) => r.label.includes("Front airbag")));
assert.ok(rows.some((r) => r.label.includes("Side airbag")));
assert.ok(!rows.some((r) => /premium restraint|iihs/i.test(r.value)));
Review rule: seat-belt modules must not contain restraint-package marketing phrases except in forbidding tests. Never upgrade a blank into "3-Point."
Takeaway
SeatBeltType is a catalog token. Display it with clear sourcing, allow "not provided," and never use it as a key into invented premium restraint packages, crash grades, or bundled airbag suites. Your free VIN UI stays trustworthy when seat-belt data is either a real vPIC value with a modest footnote -- or absent -- and restraint marketing lives somewhere else, clearly labeled, or not at all.
I maintain VIN Lookup, a free VIN decode based on NHTSA data.
Top comments (0)