# VIN to risk record (`theusedcarindex/vin-to-risk-record`) Actor

Takes VINs. Returns the NHTSA vPIC decode, that model year's NHTSA complaints, recalls and investigations, and optionally Chicagoland listing history. Call it when you start from a VIN.

- **URL**: https://apify.com/theusedcarindex/vin-to-risk-record.md
- **Developed by:** [The Used Car Index](https://apify.com/theusedcarindex) (community)
- **Categories:** Developer tools, Business, AI
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $30.00 / 1,000 vin risk records

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## VIN to risk record

Turn VINs into records: each VIN is validated, decoded with NHTSA vPIC and matched to the NHTSA record for its make, model and model year (complaints, recalls, investigations, manufacturer communications and, where a verified sales source exists, complaints per 100k sold). Switch on listing history to add the stored listing changes for that VIN at Chicagoland dealers: new, price drops, delistings and relistings, with dates, prices and links. For dealers, appraisers and fleet or insurance analysts who start from a VIN, and for AI agents that need the recorded NHTSA facts behind it.

### Input examples

One VIN with its listing history:

```json
{
  "vins": ["19XFC1F91GE040781"],
  "includeListingHistory": true
}
```

Several VINs in one run, without history:

```json
{
  "vins": ["19XFC1F91GE040781", "2HKRW2H85KH627004", "5XYP6DGC3RG429595"],
  "includeListingHistory": false
}
```

### Sample output

Real output, fetched 2026-10-16 for the first input above and shaped by this Actor's own code, so the block below is exactly one dataset item. NHTSA vPIC decoded the VIN as a 2016 Honda Civic; `risk_record` is that model year's record from the data build of 2026-10-07 (data.built_at); `listing_events` are the stored listing changes for the VIN, newest first.

At a glance, the risk record holds 1,082 complaints (36 with a crash, 4 with a fire, 13 with an injury, 0 deaths), 5 recalls, 0 investigations and 327 manufacturer communications. It has no complaints-per-100k-sold rate: `rate.null_reason` is `variant_mismatch`, meaning no verified sales figure is matched to this model year. The listing history at Schaumburg Honda Automobiles: first seen 2026-10-07 at $16,800, delisted 2026-10-09, relisted 2026-10-10, price drop to $16,700 on 2026-10-11, price drop to $16,500 on 2026-10-15. A delisted listing can come back, as this one did, and delisted is never labeled sold.

```json
{
  "vin": "19XFC1F91GE040781",
  "decoded": { "make": "HONDA", "model": "Civic", "year": 2016 },
  "risk_record": {
    "vehicle": {
      "make": "HONDA",
      "model": "CIVIC",
      "year": 2016,
      "family_key": "CIVIC",
      "matched_models": [{ "model": "CIVIC", "complaints": 1081 }, { "model": "CIVIC SI", "complaints": 1 }],
      "other_names": ["CIVIC HYBRID"],
      "resolved_via": "vehicle_models"
    },
    "complaints": {
      "total": 1082,
      "with_crash": 36,
      "with_fire": 4,
      "with_injury": 13,
      "injuries": 16,
      "deaths": 0,
      "by_source": { "both": 1082, "bulk_only": 0, "api_only": 0 },
      "coverage_complete": true,
      "top_systems": [
        { "system": "STEERING", "count": 445, "share": 0.411275415896488 },
        { "system": "UNKNOWN OR OTHER", "count": 253, "share": 0.23382624768946395 },
        { "system": "ELECTRICAL SYSTEM", "count": 119, "share": 0.1099815157116451 },
        { "system": "ENGINE", "count": 95, "share": 0.0878003696857671 },
        { "system": "SERVICE BRAKES", "count": 92, "share": 0.08502772643253234 },
        { "system": "STRUCTURE", "count": 48, "share": 0.04436229205175601 },
        { "system": "VISIBILITY/WIPER", "count": 47, "share": 0.04343807763401109 },
        { "system": "POWER TRAIN", "count": 37, "share": 0.034195933456561925 },
        { "system": "EXTERIOR LIGHTING", "count": 30, "share": 0.027726432532347505 },
        { "system": "AIR BAGS", "count": 28, "share": 0.025878003696857672 }
      ],
      "top_subsystems": [
        { "system": "STRUCTURE", "subsystem": "BODY", "count": 45 },
        { "system": "EQUIPMENT", "subsystem": "APPLIANCE", "count": 13 },
        { "system": "VISIBILITY", "subsystem": "DEFROSTER/DEFOGGER/HVAC SYSTEM", "count": 13 },
        { "system": "FORWARD COLLISION AVOIDANCE", "subsystem": "AUTOMATIC EMERGENCY BRAKING", "count": 6 },
        { "system": "EQUIPMENT", "subsystem": "ELECTRICAL", "count": 3 },
        { "system": "FORWARD COLLISION AVOIDANCE", "subsystem": "WARNINGS", "count": 3 },
        { "system": "LANE DEPARTURE", "subsystem": "ASSIST", "count": 3 },
        { "system": "TIRES", "subsystem": "PRESSURE MONITORING AND REGULATING SYSTEMS", "count": 3 },
        { "system": "VISIBILITY", "subsystem": "SUN/MOON ROOF ASSEMBLY", "count": 3 },
        { "system": "ELECTRICAL SYSTEM", "subsystem": "INSTRUMENT PANEL", "count": 2 }
      ]
    },
    "recalls": {
      "total": 5,
      "do_not_drive": 0,
      "park_outside": 0,
      "potential_units_max": 2490460,
      "by_system": [
        { "system": "AIR BAGS", "count": 1 },
        { "system": "ENGINE AND ENGINE COOLING", "count": 1 },
        { "system": "EXTERIOR LIGHTING", "count": 1 },
        { "system": "FUEL SYSTEM, GASOLINE", "count": 1 },
        { "system": "PARKING BRAKE", "count": 1 }
      ],
      "latest": [
        {
          "campaign_number": "26V332000",
          "received_date": "2026-05-21",
          "systems": ["AIR BAGS"],
          "defect": "Honda (American Honda Motor Co.) is recalling certain 2018-2021, 2023 Acura TLX, 2019-2024 RDX, 2017-2020, 2022-2026 MDX, 2017-2021, 2023, 2025 Honda Ridgeline, 2017-2022 Pilot, 2019-2021 Passport, 2018-2026 Odyssey, 2019-2022 Insight, 2019-2021 HR-V, 2018-2020 Fit, 2020-2022 CR-V Hybrid, 2017-2022 CR-V, 2017-2018, 2021 Civic Type R, 2017-2021 Civic hatchback, 2016-2020 Civic coupe, 2016-2022 Civi",
          "consequence": "Air bags that deploy unintentionally during a crash increase the risk of injury.",
          "remedy": "Dealers will replace the seat weight sensors, free of charge. Owner notification letters were mailed July 7, 2026. Owners may contact Honda's customer service at 1-888-234-2138. Honda's numbers for this recall are BOL, WO9, OOA, WOM, XOH, NOC, POD, BOE, UOF, POB, EOG, AOI, QO8, TOJ, DO7, and SOK. This recall expands previous NHTSA recall number 24V064. Vehicle Identification Numbers (VINs) involve",
          "do_not_drive": false,
          "park_outside": false,
          "truncated": true,
          "url": "https://www.nhtsa.gov/recalls?nhtsaId=26V332000"
        },
        {
          "campaign_number": "23V858000",
          "received_date": "2023-12-18",
          "systems": ["FUEL SYSTEM, GASOLINE"],
          "defect": "Honda (American Honda Motor Co.) is recalling certain 2013-2023 Honda Accord, Civic Coupe, Civic Sedan, Civic Hatchback, Civic Type R, CR-V, HR-V, Ridgeline, Odyssey, Acura ILX, MDX, MDX Hybrid, RDX, RLX, TLX, 2019-2022 Honda Insight, Passport, 2020 Honda CR-V Hybrid, 2018-2019 Honda Clarity PHEV, Fit, and 2015-2020 Honda Accord Hybrid, Pilot, Acura NSX vehicles.  The fuel pump inside the fuel tan",
          "consequence": "Fuel pump failure can cause an engine stall while driving, increasing the risk of a crash.",
          "remedy": "Dealers will replace the fuel pump module, free of charge.  Owner letters were mailed September 6, 2024.  Owners may contact Honda customer service at 1-888-234-2138.  Honda's numbers for this recall are KGC and KGD.  This recall is an expansion of NHTSA recall numbers 21V-215 and 20V-314.",
          "do_not_drive": false,
          "park_outside": false,
          "truncated": true,
          "url": "https://www.nhtsa.gov/recalls?nhtsaId=23V858000"
        },
        {
          "campaign_number": "16V725000",
          "received_date": "2016-10-11",
          "systems": ["PARKING BRAKE"],
          "defect": "Honda (American Honda Motor Co.) is recalling certain model year 2016 Honda Civic two door and four door 1.5L turbo and 2.0L vehicles.  The electric parking brake (EPB) may not engage if it is applied immediately after turning the ignition off.",
          "consequence": "If the EPB is not applied, the vehicle may roll away, increasing the risk of a crash.",
          "remedy": "Honda will notify owners, and dealers will update the vehicle's software to allow the EPB to engage immediately after the ignition is turned off, free of charge.  The recall began on November 8, 2016.  Owners may contact Honda customer service at 1-888-234-2138.  Honda's number for this recall is KC6.",
          "do_not_drive": false,
          "park_outside": false,
          "truncated": false,
          "url": "https://www.nhtsa.gov/recalls?nhtsaId=16V725000"
        },
        {
          "campaign_number": "16V526000",
          "received_date": "2016-07-11",
          "systems": ["EXTERIOR LIGHTING"],
          "defect": "American Honda Motor Co. (Honda) is recalling certain model year 2016 Civic 2-Door vehicles manufactured February 23, 2016, through May 20, 2016.  The affected vehicles may have a damaged LED side marker light circuit board inside the taillight assembly, making the marker light inoperable.  As such, these vehicles fail to comply with the requirements of Federal Motor Vehicle Safety Standard (FMVSS",
          "consequence": "If a side marker light does not function, vehicle visibility can be decreased to other drivers, increasing the risk of a crash.",
          "remedy": "Honda will notify owners, and dealers will inspect both the taillight assemblies, replacing them as necessary, free of charge.  The recall began on August 31, 2016.  Owners may contact Honda customer service at 1-888-234-2138.  Honda's number for this recall is KB8.",
          "do_not_drive": false,
          "park_outside": false,
          "truncated": true,
          "url": "https://www.nhtsa.gov/recalls?nhtsaId=16V526000"
        },
        {
          "campaign_number": "16V074000",
          "received_date": "2016-02-09",
          "systems": ["ENGINE AND ENGINE COOLING"],
          "defect": "Honda (American Honda Motor Co.) is recalling certain model year 2016 Civic vehicles manufactured September 22, 2015, to February 3, 2016 and equipped with 2.0L engines.  The affected vehicles have engines with piston assemblies that may have been manufactured without a piston wrist pin circlip or with an incorrectly installed piston wrist pin circlip.",
          "consequence": "If a circlip is missing or incorrectly installed, the piston wrist pin may not be secure and may drift and damage the engine cylinder causing the engine to seize, and increasing the risk of a crash or a fire.",
          "remedy": "Honda will notify owners, and dealers will inspect and replace the piston assemblies and damaged engine components, as necessary, free of charge.  Parts are expected to be available in the Summer of 2016.  Owners were mailed an interim notification beginning March 31, 2016, and will be mailed a second notice when parts are available.  Owners may contact Honda customer service at 1-888-234-2138.  H",
          "do_not_drive": false,
          "park_outside": false,
          "truncated": true,
          "url": "https://www.nhtsa.gov/recalls?nhtsaId=16V074000"
        }
      ]
    },
    "investigations": { "total": 0, "open": 0, "items": [] },
    "manufacturer_communications": {
      "total": 327,
      "by_system": [
        { "system": "EQUIPMENT", "subsystem": "", "source_field": "nhtsa_component", "count": 143 },
        { "system": "ELECTRICAL SYSTEM", "subsystem": "", "source_field": "nhtsa_component", "count": 53 },
        { "system": "ENGINE", "subsystem": "", "source_field": "nhtsa_component", "count": 37 },
        { "system": "ENGINE AND ENGINE COOLING", "subsystem": "", "source_field": "nhtsa_component", "count": 30 },
        { "system": "VISIBILITY", "subsystem": "", "source_field": "nhtsa_component", "count": 30 },
        { "system": "FUEL SYSTEM, GASOLINE", "subsystem": "", "source_field": "nhtsa_component", "count": 25 },
        { "system": "POWER TRAIN", "subsystem": "", "source_field": "nhtsa_component", "count": 22 },
        { "system": "BACK OVER PREVENTION", "subsystem": "", "source_field": "nhtsa_component", "count": 18 },
        { "system": "EQUIPMENT ADAPTIVE/MOBILITY", "subsystem": "", "source_field": "nhtsa_component", "count": 18 },
        { "system": "STRUCTURE", "subsystem": "", "source_field": "nhtsa_component", "count": 18 },
        { "system": "EXTERIOR LIGHTING", "subsystem": "", "source_field": "nhtsa_component", "count": 7 },
        { "system": "FUEL/PROPULSION SYSTEM", "subsystem": "", "source_field": "nhtsa_component", "count": 5 },
        { "system": "AIR BAGS", "subsystem": "", "source_field": "nhtsa_component", "count": 4 },
        { "system": "SUSPENSION", "subsystem": "", "source_field": "nhtsa_component", "count": 4 },
        { "system": "VISIBILITY/WIPER", "subsystem": "", "source_field": "nhtsa_component", "count": 3 },
        { "system": "INTERIOR LIGHTING", "subsystem": "", "source_field": "nhtsa_component", "count": 2 },
        { "system": "LATCHES/LOCKS/LINKAGES", "subsystem": "", "source_field": "nhtsa_component", "count": 2 },
        { "system": "SERVICE BRAKES", "subsystem": "", "source_field": "nhtsa_component", "count": 2 },
        { "system": "STEERING", "subsystem": "", "source_field": "nhtsa_component", "count": 2 },
        { "system": "LANE DEPARTURE", "subsystem": "", "source_field": "nhtsa_component", "count": 1 },
        { "system": "PARKING BRAKE", "subsystem": "", "source_field": "nhtsa_component", "count": 1 },
        { "system": "SEATS", "subsystem": "", "source_field": "nhtsa_component", "count": 1 }
      ],
      "by_subsystem": [
        { "system": "EQUIPMENT", "subsystem": "ELECTRICAL", "source_field": "nhtsa_component", "count": 35 },
        { "system": "EQUIPMENT", "subsystem": "APPLIANCE", "source_field": "nhtsa_component", "count": 32 },
        { "system": "EQUIPMENT", "subsystem": "OTHER", "source_field": "nhtsa_component", "count": 32 },
        { "system": "ELECTRICAL SYSTEM", "subsystem": "SOFTWARE", "source_field": "nhtsa_component", "count": 25 },
        { "system": "POWER TRAIN", "subsystem": "AUTOMATIC TRANSMISSION", "source_field": "nhtsa_component", "count": 10 },
        { "system": "STRUCTURE", "subsystem": "BODY", "source_field": "nhtsa_component", "count": 9 },
        { "system": "VISIBILITY", "subsystem": "DEFROSTER/DEFOGGER/HVAC SYSTEM", "source_field": "nhtsa_component", "count": 8 },
        { "system": "POWER TRAIN", "subsystem": "AXLE ASSEMBLY", "source_field": "nhtsa_component", "count": 5 },
        { "system": "EXTERIOR LIGHTING", "subsystem": "BRAKE LIGHTS", "source_field": "nhtsa_component", "count": 4 },
        { "system": "FUEL SYSTEM, GASOLINE", "subsystem": "STORAGE", "source_field": "nhtsa_component", "count": 4 },
        { "system": "BACK OVER PREVENTION", "subsystem": "CAMERA SYSTEM", "source_field": "nhtsa_component", "count": 2 },
        { "system": "FUEL SYSTEM, GASOLINE", "subsystem": "DELIVERY", "source_field": "nhtsa_component", "count": 2 },
        { "system": "SUSPENSION", "subsystem": "MULTIPLE AXLE", "source_field": "nhtsa_component", "count": 2 },
        { "system": "BACK OVER PREVENTION", "subsystem": "SENSING SYSTEM", "source_field": "nhtsa_component", "count": 1 },
        { "system": "BACK OVER PREVENTION", "subsystem": "SOFTWARE", "source_field": "nhtsa_component", "count": 1 },
        { "system": "ELECTRICAL SYSTEM", "subsystem": "ADAS", "source_field": "nhtsa_component", "count": 1 },
        { "system": "EQUIPMENT", "subsystem": "MECHANICAL", "source_field": "nhtsa_component", "count": 1 },
        { "system": "LATCHES/LOCKS/LINKAGES", "subsystem": "DOORS", "source_field": "nhtsa_component", "count": 1 },
        { "system": "LATCHES/LOCKS/LINKAGES", "subsystem": "TRUNK LID", "source_field": "nhtsa_component", "count": 1 },
        { "system": "STEERING", "subsystem": "STEERING WHEEL/HANDLE BAR", "source_field": "nhtsa_component", "count": 1 },
        { "system": "VISIBILITY", "subsystem": "REARVIEW MIRRORS/DEVICES", "source_field": "nhtsa_component", "count": 1 }
      ],
      "recent": [
        {
          "nhtsa_id": "11037693",
          "document_id": ["A26-008"],
          "communication_date": "2026-09-25",
          "communication_type": ["Service Bulletin/Repair Instructions"],
          "campaign_id": null,
          "systems": ["ENGINE"],
          "mfr_system": null,
          "mfr_subsystem": null,
          "summary": "Service Bulletin - Under certain conditions, the cylinder head gasket effectiveness may be reduced which may cause vehicles to experience overheating, coolant loss, and/or misfire. In some cases, DTCs P0300 through P0304 may also be stored (DTCs are not required for repair)."
        },
        {
          "nhtsa_id": "11037695",
          "document_id": ["A26-009"],
          "communication_date": "2026-09-25",
          "communication_type": ["Service Bulletin/Repair Instructions"],
          "campaign_id": null,
          "systems": ["ENGINE"],
          "mfr_system": null,
          "mfr_subsystem": null,
          "summary": "Service Bulletin - Under certain conditions, the cylinder head gasket effectiveness may be reduced which may cause vehicles to experience overheating, coolant loss, and/or misfire. In some cases, DTCs P0300 through P0304 may also be stored (DTCs are not required for repair)."
        },
        {
          "nhtsa_id": "11037709",
          "document_id": ["A26-097"],
          "communication_date": "2026-09-25",
          "communication_type": ["Service Bulletin/Repair Instructions"],
          "campaign_id": null,
          "systems": ["ENGINE"],
          "mfr_system": null,
          "mfr_subsystem": null,
          "summary": "Service Bulletin - Under certain conditions, the cylinder head gasket effectiveness may be reduced which may cause vehicles to experience overheating, coolant loss, and/or misfire. In some cases, DTCs P0300 through P0304 may also be stored (DTCs are not required for repair)."
        },
        {
          "nhtsa_id": "11037711",
          "document_id": ["A26-099"],
          "communication_date": "2026-09-25",
          "communication_type": ["Service Bulletin/Repair Instructions"],
          "campaign_id": null,
          "systems": ["ENGINE"],
          "mfr_system": null,
          "mfr_subsystem": null,
          "summary": "Service Bulletin - Under certain conditions, the cylinder head gasket effectiveness may be reduced which may cause vehicles to experience overheating, coolant loss, and/or misfire. In some cases, DTCs P0300 through P0304 may also be stored (DTCs are not required for repair)."
        },
        {
          "nhtsa_id": "11036649",
          "document_id": ["A26-097"],
          "communication_date": "2026-08-28",
          "communication_type": ["Service Bulletin/Repair Instructions"],
          "campaign_id": null,
          "systems": ["ENGINE"],
          "mfr_system": null,
          "mfr_subsystem": null,
          "summary": "Service Bulletin - Under certain conditions, the cylinder head gasket effectiveness may be reduced which may cause vehicles to experience overheating, coolant loss, misfire, and/or DTCs P0300 thru P0304 stored."
        },
        {
          "nhtsa_id": "11036654",
          "document_id": ["A26-099"],
          "communication_date": "2026-08-28",
          "communication_type": ["Service Bulletin/Repair Instructions"],
          "campaign_id": null,
          "systems": ["ENGINE"],
          "mfr_system": null,
          "mfr_subsystem": null,
          "summary": "Service Bulletin - Under certain conditions, the cylinder head gasket effectiveness may be reduced which may cause vehicles to experience overheating, coolant loss, misfire, and/or DTCs P0300 thru P0304 stored."
        },
        {
          "nhtsa_id": "11036408",
          "document_id": ["A26-009"],
          "communication_date": "2026-08-26",
          "communication_type": ["Service Bulletin/Repair Instructions"],
          "campaign_id": null,
          "systems": ["ENGINE"],
          "mfr_system": null,
          "mfr_subsystem": null,
          "summary": "Service Bulletin - Under certain conditions, the cylinder head gasket effectiveness may be reduced which may cause vehicles to experience overheating, coolant loss, misfire and/or DTCs P0300 thru P0304 stored."
        },
        {
          "nhtsa_id": "11036417",
          "document_id": ["A26-097"],
          "communication_date": "2026-08-26",
          "communication_type": ["Service Bulletin/Repair Instructions"],
          "campaign_id": null,
          "systems": ["ENGINE"],
          "mfr_system": null,
          "mfr_subsystem": null,
          "summary": "Service Bulletin - Under certain conditions, the cylinder head gasket effectiveness may be reduced which may cause vehicles to experience overheating, coolant loss, misfire and/or DTCs P0300 thru P0304 stored."
        },
        {
          "nhtsa_id": "11036419",
          "document_id": ["A26-099"],
          "communication_date": "2026-08-26",
          "communication_type": ["Service Bulletin/Repair Instructions"],
          "campaign_id": null,
          "systems": ["ENGINE"],
          "mfr_system": null,
          "mfr_subsystem": null,
          "summary": "Service Bulletin - Under certain conditions, the cylinder head gasket effectiveness may be reduced which may cause vehicles to experience overheating, coolant loss, misfire and/or DTCs P0300 thru P0304 stored."
        },
        {
          "nhtsa_id": "11036424",
          "document_id": ["AEBM08262026901"],
          "communication_date": "2026-08-26",
          "communication_type": ["Other"],
          "campaign_id": null,
          "systems": ["ENGINE"],
          "mfr_system": null,
          "mfr_subsystem": null,
          "summary": "Dealer Message - Under certain conditions, the cylinder head gasket effectiveness may be reduced which may cause vehicles to experience overheating, coolant loss, misfire, and/or DTCs P0300 through P0304 stored."
        }
      ]
    },
    "rate": {
      "complaints_per_100k_sold": null,
      "units_sold": null,
      "sales_year": null,
      "basis": "calendar_year_us_sales_proxy_for_model_year",
      "source": null,
      "source_url": null,
      "null_reason": "variant_mismatch"
    },
    "model_tags": {
      "model": "typesafe/jev-1.13-20260917",
      "schema_version": "tag-v1",
      "tagged_complaints": 1082,
      "complaints_total": 1082,
      "tagged_share": 1,
      "failure_modes": [
        {
          "label": "loss_of_control",
          "count": 376,
          "share": 0.34750462107208874,
          "mean_confidence": 0.727792553191489,
          "high_confidence_count": 151,
          "low_confidence_count": 40
        },
        {
          "label": "mechanical_failure",
          "count": 224,
          "share": 0.20702402957486138,
          "mean_confidence": 0.6818750000000003,
          "high_confidence_count": 63,
          "low_confidence_count": 40
        },
        {
          "label": "noise_or_comfort",
          "count": 153,
          "share": 0.1414048059149723,
          "mean_confidence": 0.8285620915032681,
          "high_confidence_count": 101,
          "low_confidence_count": 10
        },
        {
          "label": "electrical_electronic",
          "count": 147,
          "share": 0.13585951940850277,
          "mean_confidence": 0.8663265306122445,
          "high_confidence_count": 113,
          "low_confidence_count": 12
        },
        {
          "label": "visibility_or_lighting",
          "count": 51,
          "share": 0.04713493530499076,
          "mean_confidence": 0.743921568627451,
          "high_confidence_count": 23,
          "low_confidence_count": 7
        },
        {
          "label": "fluid_or_fuel_leak",
          "count": 46,
          "share": 0.04251386321626617,
          "mean_confidence": 0.7510869565217391,
          "high_confidence_count": 22,
          "low_confidence_count": 7
        },
        {
          "label": "structural_or_corrosion",
          "count": 35,
          "share": 0.03234750462107209,
          "mean_confidence": 0.8494285714285712,
          "high_confidence_count": 25,
          "low_confidence_count": 5
        },
        {
          "label": "restraint_or_airbag",
          "count": 24,
          "share": 0.022181146025878003,
          "mean_confidence": 0.9187500000000001,
          "high_confidence_count": 20,
          "low_confidence_count": 1
        },
        {
          "label": "unclear",
          "count": 20,
          "share": 0.018484288354898338,
          "mean_confidence": 0.7995000000000001,
          "high_confidence_count": 13,
          "low_confidence_count": 2
        },
        {
          "label": "fire_or_overheating",
          "count": 6,
          "share": 0.005545286506469501,
          "mean_confidence": 0.8116666666666665,
          "high_confidence_count": 4,
          "low_confidence_count": 1
        }
      ],
      "severities": [
        {
          "label": "moderate",
          "count": 755,
          "share": 0.6977818853974121,
          "mean_confidence": 0.8754701986755012,
          "high_confidence_count": 593,
          "low_confidence_count": 32
        },
        {
          "label": "low",
          "count": 269,
          "share": 0.24861367837338263,
          "mean_confidence": 0.8246840148698883,
          "high_confidence_count": 183,
          "low_confidence_count": 26
        },
        {
          "label": "high",
          "count": 44,
          "share": 0.04066543438077634,
          "mean_confidence": 0.897272727272727,
          "high_confidence_count": 36,
          "low_confidence_count": 2
        },
        {
          "label": "none",
          "count": 12,
          "share": 0.011090573012939002,
          "mean_confidence": 0.7658333333333335,
          "high_confidence_count": 7,
          "low_confidence_count": 2
        },
        {
          "label": "critical",
          "count": 2,
          "share": 0.0018484288354898336,
          "mean_confidence": 0.835,
          "high_confidence_count": 1,
          "low_confidence_count": 0
        }
      ],
      "confidence_note": "Confidence is the model's own probability for the label it chose (0 to 1), not accuracy.",
      "note": "Model-generated labels on tagged complaints only. Model years 2013 and newer are tagged in full; 2012 in part (see tagged_share); earlier model years have no tags. NHTSA's own flags remain separate in the complaints block."
    },
    "model_tags_null_reason": null,
    "data": {
      "built_at": "2026-10-07T21:35:09.694572+00:00",
      "sources": [
        { "name": "NHTSA complaints API", "url": "https://api.nhtsa.gov/complaints/complaintsByVehicle" },
        { "name": "NHTSA bulk complaints", "url": "https://static.nhtsa.gov/odi/ffdd/cmpl/FLAT_CMPL.zip" },
        { "name": "NHTSA recalls (2010 and later)", "url": "https://static.nhtsa.gov/odi/ffdd/rcl/FLAT_RCL_POST_2010.zip" },
        { "name": "NHTSA recalls (before 2010)", "url": "https://static.nhtsa.gov/odi/ffdd/rcl/FLAT_RCL_PRE_2010.zip" },
        { "name": "NHTSA investigations", "url": "https://static.nhtsa.gov/odi/ffdd/inv/FLAT_INV.zip" },
        {
          "name": "NHTSA manufacturer communications (yearly archives, newest shown)",
          "url": "https://static.nhtsa.gov/odi/ffdd/tsbs/TSBS_RECEIVED_2025-2026.zip"
        }
      ],
      "notes": [
        "Complaints from the API and bulk file are merged and deduplicated by ODI number; the API alone misses records.",
        "System and subsystem counts are numbers of distinct complaints, recalls or communications that name them. One record can name several systems, so shares across systems can add to more than 100 percent; a single share never exceeds 100 percent.",
        "Recalls are counted once per campaign, investigations once per action and manufacturer communications once per NHTSA id, even when NHTSA lists several model names for the same record.",
        "A sales denominator is a calendar-year proxy, not the population of vehicles still in use. Rates are copied from verified pipeline output."
      ]
    }
  },
  "listing_events": [
    {
      "id": 15585,
      "event_date": "2026-10-15",
      "event_type": "price_drop",
      "vin": "19XFC1F91GE040781",
      "make": "Honda",
      "model": "Civic",
      "year": 2016,
      "price_old": 16700,
      "price_new": 16500,
      "mileage": 91777,
      "listing_url": "https://www.schaumburghondaautos.com/used-Schaumburg-2016-Honda-Civic-Touring-19XFC1F91GE040781",
      "source": "Schaumburg Honda Automobiles"
    },
    {
      "id": 11975,
      "event_date": "2026-10-11",
      "event_type": "price_drop",
      "vin": "19XFC1F91GE040781",
      "make": "Honda",
      "model": "Civic",
      "year": 2016,
      "price_old": 16800,
      "price_new": 16700,
      "mileage": 91777,
      "listing_url": "https://www.schaumburghondaautos.com/used-Schaumburg-2016-Honda-Civic-Touring-19XFC1F91GE040781",
      "source": "Schaumburg Honda Automobiles"
    },
    {
      "id": 10885,
      "event_date": "2026-10-10",
      "event_type": "relisted",
      "vin": "19XFC1F91GE040781",
      "make": "Honda",
      "model": "Civic",
      "year": 2016,
      "price_old": null,
      "price_new": 16800,
      "mileage": 91777,
      "listing_url": "https://www.schaumburghondaautos.com/used-Schaumburg-2016-Honda-Civic-Touring-19XFC1F91GE040781",
      "source": "Schaumburg Honda Automobiles"
    },
    {
      "id": 9777,
      "event_date": "2026-10-09",
      "event_type": "delisted",
      "vin": "19XFC1F91GE040781",
      "make": "Honda",
      "model": "Civic",
      "year": 2016,
      "price_old": null,
      "price_new": 16800,
      "mileage": 91777,
      "listing_url": "https://www.schaumburghondaautos.com/used-Schaumburg-2016-Honda-Civic-Touring-19XFC1F91GE040781",
      "source": "Schaumburg Honda Automobiles"
    },
    {
      "id": 1250,
      "event_date": "2026-10-07",
      "event_type": "new",
      "vin": "19XFC1F91GE040781",
      "make": "Honda",
      "model": "Civic",
      "year": 2016,
      "price_old": null,
      "price_new": 16800,
      "mileage": 91777,
      "listing_url": "https://www.schaumburghondaautos.com/used-Schaumburg-2016-Honda-Civic-Touring-19XFC1F91GE040781",
      "source": "Schaumburg Honda Automobiles"
    }
  ]
}
```

### Price

| Event | USD per event | When it is charged |
| --- | ---: | --- |
| `vin-risk-record` | $0.03 | Charged once per VIN that decodes, resolves to an API risk record and is successfully pushed to the dataset. Invalid VINs, decode failures, unknown vehicles, API or requested-history errors and failed dataset writes are not charged. |
| `vin-listing-history` | $0.01 | Charged once per VIN only when requested history contains at least one listing event and the complete VIN risk item is successfully pushed. History is not charged when disabled, empty, invalid, unavailable, or when decoding, risk lookup or dataset writing fails. |

- The first input above costs $0.03 + $0.01 = $0.04, because the VIN had stored listing events. The second input costs 3 x $0.03 = $0.09.
- 100 VINs without history cost $3.00; with history they cost at most $4.00.
- Repeating a VIN in a run is a separate item and a separate charge.
- Apify adds its own Actor start event to every run ($0.00005 on this Actor's Pricing tab on 2026-10-16).
- Cap a run with maxTotalChargeUsd (example below). The run stops at the cap and keeps what it saved.

### How to run

In Apify Console, open the Actor, paste an input example and press Start. To run it from code or from an agent:

#### Call from the Apify API

Use your Apify token. The Used Car Index API key is held by the Actor as a secret and is never part of your request, your dataset or the logs. This example caps the run at $1.

```sh
curl -X POST 'https://api.apify.com/v2/acts/theusedcarindex~vin-to-risk-record/run-sync-get-dataset-items?maxTotalChargeUsd=1' \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H 'Content-Type: application/json' \
  --data '{"vins":["19XFC1F91GE040781"],"includeListingHistory":true}'
```

#### Call from an MCP client

In an MCP client that supports remote Streamable HTTP, add this server URL with your Apify token as a bearer header:

```text
URL:    https://mcp.apify.com/?actors=theusedcarindex/vin-to-risk-record
Header: Authorization: Bearer <your Apify token>
```

Initialize the connection and call tools/list. The client then shows this Actor as a tool; call it with the first input example as its arguments. Tool names and wrapper fields come from tools/list, so read them there instead of assuming a name. If your client offers a generic Actor-run tool instead, select theusedcarindex/vin-to-risk-record and pass the same input. The run status and dataset come back with the tool result. This route needs access to the Actor from your Apify account.

### Related Actors and the direct API

| Actor | Use it for |
| --- | --- |
| [Vehicle risk record](https://apify.com/theusedcarindex/vehicle-risk-record) | The same NHTSA record starting from a make, model and model year instead of a VIN |
| [Chicagoland listing changes](https://apify.com/theusedcarindex/chicagoland-listing-changes) | The stored listing events for all of the Chicagoland dealers the collector watches, filtered by make, model, year, event type and date |

The same data is available without Apify from The Used Car Index at https://theusedcarindex.com: GET https://api.theusedcarindex.com/v1/vehicle_risk and /v1/listing_changes (which takes a vin filter), and an MCP endpoint at https://api.theusedcarindex.com/mcp that serves the API tools directly and does not run or charge these Actors. The MCP endpoint has a free tier that needs no key. As of 2026-10-16 it allows 20 requests per minute per IP and 2,000 per day shared, returns full vehicle risk records and returns up to 10 listing events per call with no paging. Plans with higher limits and cursor paging are at https://theusedcarindex.com/#pricing. The API and the MCP endpoint also serve recall_changes: new and updated NHTSA recalls, investigations and complaint-count changes recorded from a daily comparison of NHTSA's bulk files. Questions or a data issue: use the Issues tab on this Actor's page.

### What it returns

Input is a vins array of 1 to 100 strings and, optionally, includeListingHistory (default false). Each VIN is trimmed and uppercased. A valid VIN has 17 characters and no I, O or Q. VINs that start with 1 through 5, or with 7F through 7Z, must also pass the check digit; other VINs get the syntax check only. A non-string value in vins fails input validation before any work.

One dataset item per VIN:

| Item | When | Charged |
| --- | --- | --- |
| `vin`, `decoded`, `risk_record` and, with history on, `listing_events` | The VIN is valid, decodes and resolves to a risk record | Yes |
| `valid` false with `vin` and a `reason`: `invalid_length`, `invalid_characters` or `invalid_check_digit` | The text is not a valid VIN | No |
| `vin` and `error` | vPIC could not decode the VIN | No |
| `vin`, `decoded`, `found` false and `suggestions` | The decode has no risk record | No |
| `vin`, optional `decoded` and `error`, with a stable `code` and the HTTP `status` when there is one | Any other lookup failure, including a failed history request | No |

A VIN that fails validation, real output for the text BADVIN:

```json
{ "valid": false, "vin": "BADVIN", "reason": "invalid_length" }
```

`decoded` holds the make, model and year from the vPIC decode. `risk_record` is the record the Vehicle risk record Actor returns for that make, model and year; its README describes each block. vPIC requests run one at a time, with a 250 ms pause before every attempt and a descriptive User-Agent. A decode counts only when vPIC reports a clean decode with a make, a model and a model year from 2000 through 2027.

With history on, one request fetches up to 50 stored listing events for the VIN, newest first, after its risk record resolves. It does not follow the cursor, so a VIN with more events returns its 50 newest. `listing_events` is present even when empty. A failed history request gives an error item for that VIN instead of a partial record, and nothing is charged for it.

Both charges follow the complete item being saved, history first. Before each VIN the remaining budget must cover $0.04 with history on or $0.03 without it, so a run with a tight cap can stop before a VIN that would have had empty history. Input is validated before any lookup or charge. The run stops at your spending limit and keeps what it saved. A request that fails on the network, with HTTP 429 or with a 5xx status is tried up to three times in total.

### Sources and facts boundary

The decode comes from NHTSA vPIC. The risk record comes from NHTSA's published files and API; its `data.sources` lists each one with its URL. NHTSA complaints combine the complaints API and the bulk file, merged and deduplicated by ODI number. Rates divide complaints by calendar-year US sales from a named public source, a proxy for the model year, and appear only where that source is verified for the vehicle; otherwise `rate` is null with a reason. Model tags are model-generated labels (the model is named in `model_tags.model`), are marked as such and never replace NHTSA's own fields. The risk record describes the make, model and model year the VIN decodes to; it is not the recall or repair history of that individual car.

Listing events come from the public inventory pages of the watched dealer websites. Facts only: VIN, price, mileage, status, dates, link back. Never photos or dealer-written text. A listing that is no longer observed is reported as delisted, and delisted is never labeled sold. A delisted event means no longer listed; it does not establish a transaction. NHTSA official record text in risk records is distinct from dealer-written text. Dataset items never contain added agent instructions.

### Known gaps

- The NHTSA record is by make, model and model year. It does not say whether a specific car has an open recall or has been repaired.
- vPIC can be unavailable or return incomplete data; such VINs return an uncharged error item. A record reflects the NHTSA data build in `risk_record.data.built_at` (2026-10-07 on 2026-10-16), and a zero count is confirmed only when `complaints.coverage_complete` is true.
- Listing history covers the Chicagoland dealers the collector watches (59 dealer websites on 2026-10-16), not the whole market, and starts on 2026-10-07. An empty `listing_events` does not establish that a car was never listed.
- Rates use calendar-year sales as a proxy for the model year and exist only where a verified sales source matches the vehicle. Counts are not a reliability rating, prediction or repair recommendation.
- Some manufacturer communication and investigation summaries show stray characters where the source text has punctuation such as a dash or an apostrophe.
- Dataset writes and charges are separate operations. If a run stops after a write, an item can be saved without its charge, and running the same input again repeats items and charges.
- A run through an MCP client has not been tested end to end.

Owner setup, done once by the publisher and not by callers: set the secret environment variable UCI_API_KEY in the Apify Console; it is never accepted in input, logged or returned. UCI_API_BASE optionally selects another API origin (HTTPS, default https://api.theusedcarindex.com). Configure the custom events from .actor/pay_per_event.json and turn automatic dataset-item pricing off; the Actor stops before any lookup if the pricing does not match.

# Actor input Schema

## `vins` (type: `array`):

One through 100 VIN strings. Whitespace is trimmed and letters uppercased. Invalid VIN strings produce uncharged result items; malformed input fails the run.

## `includeListingHistory` (type: `boolean`):

Fetch one page of at most 50 stored listing events per resolved VIN. Nonempty history costs $0.01 in addition to the $0.03 risk record.

## Actor input object example

```json
{
  "vins": [
    "1HGCM82633A004352"
  ],
  "includeListingHistory": true
}
```

# Actor output Schema

## `results` (type: `string`):

Default dataset items, one per requested VIN: the decoded vehicle with its risk record and, when requested, its stored listing events; or an invalid-VIN, not-found or coded error item. The dataset schema describes every field.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "vins": [
        "1HGCM82633A004352"
    ],
    "includeListingHistory": false
};

// Run the Actor and wait for it to finish
const run = await client.actor("theusedcarindex/vin-to-risk-record").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "vins": ["1HGCM82633A004352"],
    "includeListingHistory": False,
}

# Run the Actor and wait for it to finish
run = client.actor("theusedcarindex/vin-to-risk-record").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "vins": [
    "1HGCM82633A004352"
  ],
  "includeListingHistory": false
}' |
apify call theusedcarindex/vin-to-risk-record --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,theusedcarindex/vin-to-risk-record"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/EWfQZzchqQ7R7WRB8/builds/Fr9Xf1DAUz9duOTfc/openapi.json
