# ⚙️ NHTSA Vehicle Data Scraper (`taroyamada/nhtsa-vehicle-recall-digest`) Actor

Query federal NHTSA endpoints to extract accurate automotive recall feeds, component defect notices, and compliance records for any vehicle fleet.

- **URL**: https://apify.com/taroyamada/nhtsa-vehicle-recall-digest.md
- **Developed by:** [太郎 山田](https://apify.com/taroyamada) (community)
- **Categories:** Developer tools, Automation
- **Stats:** 2 total users, 1 monthly users, 89.5% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $9.00 / 1,000 results

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## NHTSA Vehicle Recall Digest | Recalls + Complaints Watch

Build robust automotive data pipelines by extracting structured JSON directly from official National Highway Traffic Safety Administration (NHTSA) databases. Designed specifically for developers and data engineering teams, this web scraper reliably queries NHTSA endpoints to pull detailed vehicle recall data, safety complaints, and federal compliance rulings. Skip the hassle of building custom web scrapers or dealing with unreliable HTML parsing. By interacting straight with the official agency search endpoints, you can extract highly accurate, dataset-ready results for targeted vehicle identification numbers (VINs), broad model families, or complete manufacturer feeds.

Automate your safety data ingestion by scheduling the scraper to run daily or weekly, ensuring your downstream applications never miss a critical defect update. When you set up automated runs, you can effortlessly track changes to government safety notices and trigger real-time alerts the moment new items match your compliance watchlists.

The scraper's architecture is optimized for database insertion, outputting one clean, summary-first digest row per feed. You can expect concrete, parsed details such as the official agency docket number, the initial publication date, the number of affected units, and the precise component at fault. Integrate these scraped results directly into your backend systems or analytical tools to power VIN lookup apps, dealership inventory checkers, or enterprise fleet management software with authoritative government data.

### Store Quickstart

Run this actor with your target input. Results appear in the Apify Dataset and can be piped to webhooks for real-time delivery. Use `dryRun` to validate before committing to a schedule.

### Key Features

- 🏛️ **Government-sourced** — Pulls directly from official agency feeds — no third-party aggregators
- ⏱️ **Timely digests** — Daily/weekly rollups of new filings, rulings, or actions
- 🔍 **Keyword watchlists** — Flag items matching your compliance/legal watch terms
- 📊 **Structured metadata** — Agency, date, docket, document type, link — all dataset-ready
- 📡 **Webhook alerts** — Push to legal/compliance teams the moment new items match watchlist

### Use Cases

| Who | Why |
|-----|-----|
| Developers | Automate recurring data fetches without building custom scrapers |
| Data teams | Pipe structured output into analytics warehouses |
| Ops teams | Monitor changes via webhook alerts |
| Product managers | Track competitor/market signals without engineering time |

### Input

| Field | Type | Default | Description |
|-------|------|---------|-------------|
| feeds | array | — | One digest row per watched vehicle, VIN, or manufacturer feed. |
| recallLookbackDays | integer | `30` | Default recall lookback window used when a feed-specific override is not set. |
| complaintLookbackDays | integer | `90` | Default complaint lookback window used when a feed-specific override is not set. |
| maxRecallsPerVehicle | integer | `50` | Default cap on recall evidence rows per feed. |
| maxComplaintsPerVehicle | integer | `100` | Default cap on complaint evidence rows per feed. |
| maxDiscoveredModelsPerFeed | integer | `12` | Default cap on manufacturer model expansion before complaints and recalls are fetched. |
| maxEvidenceItems | integer | `10` | Upper bound on recall or complaint items retained in each digest section. |
| complaintAlertThreshold | integer | `3` | Complaint-count threshold that escalates a digest to action_needed. |

#### Input Example

```json
{
  "recallLookbackDays": 30,
  "complaintLookbackDays": 90,
  "maxRecallsPerVehicle": 50,
  "maxComplaintsPerVehicle": 100,
  "maxDiscoveredModelsPerFeed": 12,
  "maxEvidenceItems": 10,
  "complaintAlertThreshold": 3,
  "delivery": "dataset",
  "datasetMode": "all",
  "snapshotKey": "nhtsa-vehicle-recall-digest-state",
  "notifyOnNoNew": true,
  "requestTimeoutSeconds": 30,
  "batchDelayMs": 600,
  "dryRun": false
}
````

### Output

| Field | Type | Description |
|-------|------|-------------|
| `meta` | object |  |
| `errors` | array |  |
| `digests` | array |  |
| `digests[].feedId` | string |  |
| `digests[].feedName` | string |  |
| `digests[].feedType` | string |  |
| `digests[].checkedAt` | timestamp |  |
| `digests[].recallWindowStart` | timestamp |  |
| `digests[].complaintWindowStart` | timestamp |  |
| `digests[].recallLookbackDays` | number |  |
| `digests[].complaintLookbackDays` | number |  |
| `digests[].status` | string |  |
| `digests[].changedSinceLastRun` | boolean |  |
| `digests[].changeSummary` | string |  |
| `digests[].actionNeeded` | boolean |  |
| `digests[].requestedTarget` | object |  |
| `digests[].resolvedCoverage` | object |  |
| `digests[].newRecallCount` | number |  |
| `digests[].totalRecallCount` | number |  |
| `digests[].newComplaintCount` | number |  |
| `digests[].totalComplaintCount` | number |  |
| `digests[].seriousComplaintCount` | number |  |
| `digests[].newSeriousComplaintCount` | number |  |
| `digests[].linkedInvestigationCount` | number |  |
| `digests[].newLinkedInvestigationCount` | number |  |
| `digests[].componentHotspots` | array |  |
| `digests[].investigationSignal` | string |  |
| `digests[].recommendedAction` | string |  |
| `digests[].signalTags` | array |  |
| `digests[].newRecalls` | array |  |
| `digests[].newComplaints` | array |  |
| `digests[].linkedInvestigations` | array |  |
| `digests[].evidence` | object |  |
| `digests[].warnings` | array |  |
| `digests[].error` | null |  |

#### Output Example

```json
{
  "meta": {
    "generatedAt": "2026-04-06T00:00:00.000Z",
    "now": "2026-04-06T00:00:00.000Z",
    "feedCount": 1,
    "totalRecallsFound": 1,
    "newRecallsFound": 1,
    "totalComplaintsFound": 4,
    "newComplaintsFound": 2,
    "actionNeededCount": 1,
    "changedFeedCount": 1,
    "errorCount": 0,
    "snapshot": {
      "key": "nhtsa-f150-quickstart",
      "loadedFrom": "local",
      "savedTo": "local"
    },
    "warnings": [],
    "executiveSummary": {
      "overallStatus": "action_needed",
      "brief": "1 new recall(s); 2 new complaint(s); 1 feed(s) require review.",
      "actionItems": [
        "2021 Ford F-150: Review 1 new recall campaign(s) for 2021 Ford F-150. 1 linked NHTSA action number(s) are in scope."
      ],
      "feedStatuses": [
        {
          "feedId": "ford-f150-2021",
          "feedName": "2021 Ford F-150",
          "status": "new_recalls",
          "newRecallCount": 1,
          "newComplaintCount": 2,
          "actionNeeded": true
        }
      ]
    },
    "delivery": {
      "mode": "dataset",
      "status": "pending"
    }
  },
```

### API Usage

Run this actor programmatically using the Apify API. Replace `YOUR_API_TOKEN` with your token from [Apify Console → Settings → Integrations](https://console.apify.com/account/integrations).

#### cURL

```bash
curl -X POST "https://api.apify.com/v2/acts/taroyamada~nhtsa-vehicle-recall-digest/run-sync-get-dataset-items?token=YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "recallLookbackDays": 30, "complaintLookbackDays": 90, "maxRecallsPerVehicle": 50, "maxComplaintsPerVehicle": 100, "maxDiscoveredModelsPerFeed": 12, "maxEvidenceItems": 10, "complaintAlertThreshold": 3, "delivery": "dataset", "datasetMode": "all", "snapshotKey": "nhtsa-vehicle-recall-digest-state", "notifyOnNoNew": true, "requestTimeoutSeconds": 30, "batchDelayMs": 600, "dryRun": false }'
```

#### Python

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_API_TOKEN")
run = client.actor("taroyamada/nhtsa-vehicle-recall-digest").call(run_input={
  "recallLookbackDays": 30,
  "complaintLookbackDays": 90,
  "maxRecallsPerVehicle": 50,
  "maxComplaintsPerVehicle": 100,
  "maxDiscoveredModelsPerFeed": 12,
  "maxEvidenceItems": 10,
  "complaintAlertThreshold": 3,
  "delivery": "dataset",
  "datasetMode": "all",
  "snapshotKey": "nhtsa-vehicle-recall-digest-state",
  "notifyOnNoNew": true,
  "requestTimeoutSeconds": 30,
  "batchDelayMs": 600,
  "dryRun": false
})

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)
```

#### JavaScript / Node.js

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

const client = new ApifyClient({ token: 'YOUR_API_TOKEN' });
const run = await client.actor('taroyamada/nhtsa-vehicle-recall-digest').call({
  "recallLookbackDays": 30,
  "complaintLookbackDays": 90,
  "maxRecallsPerVehicle": 50,
  "maxComplaintsPerVehicle": 100,
  "maxDiscoveredModelsPerFeed": 12,
  "maxEvidenceItems": 10,
  "complaintAlertThreshold": 3,
  "delivery": "dataset",
  "datasetMode": "all",
  "snapshotKey": "nhtsa-vehicle-recall-digest-state",
  "notifyOnNoNew": true,
  "requestTimeoutSeconds": 30,
  "batchDelayMs": 600,
  "dryRun": false
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

### Tips & Limitations

- Run daily for active watchlists; weekly for passive monitoring.
- Webhook delivery works well for compliance team Slack channels — include docket URL for 1-click access.
- Use `watchKeywords` generously — false positives are cheap to triage, false negatives miss filings.
- Pair with `regulatory-change-monitor` for cross-agency coverage.
- Archive Dataset rows weekly for long-term compliance evidence retention.

### FAQ

**How far back does history go?**

This actor monitors forward-only — new items since first run. For historical data, use the agency's own search tool.

**What timezones are used?**

All timestamps are UTC. Use your downstream pipeline to convert to agency-local time if needed.

**Does it translate non-English content?**

No — original language is preserved. Use downstream translation services if needed.

**Is the data official?**

Yes — sourced directly from official government websites and feeds. Not a third-party aggregator.

**Can I use this for legal research?**

For alerting and monitoring, yes. For litigation research, cross-verify with primary sources (agency websites) — this actor is a monitoring tool, not a legal database.

### Related Actors

Government & Regulatory cluster — explore related Apify tools:

- [EPA Enforcement Digest | ECHO Compliance Risk Monitor](https://apify.com/taroyamada/epa-enforcement-digest) — Monitor EPA ECHO all-media facility search, corporate compliance screener, and enforcement case feeds with one summary-first digest row per watched company, facility, or case feed.
- [FDA Warning Letters Digest | Summary-First Feed](https://apify.com/taroyamada/fda-warning-letter-digest) — Monitor public FDA warning letters with one summary-first digest row per configured feed.
- [Federal Register Digest | Agency Rule & Notice Monitor](https://apify.com/taroyamada/federal-register-digest) — Monitor Federal Register documents — rules, proposed rules, and notices — per configured agency feed.
- [Government Contract Award Monitor | Award & Competitor Watch](https://apify.com/taroyamada/government-contract-award-monitor) — Monitor public-sector contract award notices for new wins, notable awardees, incumbent recompetes, and competitor signals — one digest row per configured feed without brittle broad crawling.
- [Grants.gov Funding Digest | Opportunity Watch & Signal Digest](https://apify.com/taroyamada/grants-gov-funding-digest) — Monitor Grants.
- [Product Safety Recall Digest | CPSC + openFDA Alerts](https://apify.com/taroyamada/product-safety-recall-digest) — Monitor CPSC saferproducts.
- [Regulatory Change Monitor API](https://apify.com/taroyamada/regulatory-change-monitor) — Monitor official regulator update feeds, government bulletin pages, and public compliance notices with one action-oriented digest row per monitored source.
- [OFAC Sanctions Change Digest | SDN List Monitor](https://apify.com/taroyamada/sanctions-change-digest) — Monitor the OFAC SDN (Specially Designated Nationals) sanctions list for additions and removals.
- [Tariff Trade Change Digest | Federal Register + HTS Monitor](https://apify.com/taroyamada/tariff-trade-change-digest) — Monitor U.
- [Treasury Fiscal Data Digest | Debt, Rates & Budget Monitor](https://apify.com/taroyamada/treasury-fiscal-data-digest) — Monitor the U.
- [USPTO Patent Monitor API | JSON + Webhook](https://apify.com/taroyamada/uspto-patent-scraper) — Search and monitor US patent filings with multi-source fallback.
- [Campaign Finance & Lobbying Digest | FEC + LDA Watch](https://apify.com/taroyamada/campaign-finance-lobbying-digest) — Monitor official FEC OpenFEC committee reports and LDA.

### Cost

**Pay Per Event**:

- `actor-start`: $0.01 (flat fee per run)
- `dataset-item`: $0.003 per output item

**Example**: 1,000 items = $0.01 + (1,000 × $0.003) = **$3.01**

No subscription required — you only pay for what you use.

### ⭐ Was this helpful?

If this actor saved you time, please [**leave a ★ rating**](https://apify.com/taroyamada/nhtsa-vehicle-recall-digest/reviews) on Apify Store. It takes 10 seconds, helps other developers discover it, and keeps updates free.

Bug report or feature request? Open an issue on the [Issues tab](https://apify.com/taroyamada/nhtsa-vehicle-recall-digest/issues) of this actor.

# Actor input Schema

## `feeds` (type: `array`):

One digest row per watched vehicle, VIN, or manufacturer feed.

## `recallLookbackDays` (type: `integer`):

Default recall lookback window used when a feed-specific override is not set.

## `complaintLookbackDays` (type: `integer`):

Default complaint lookback window used when a feed-specific override is not set.

## `maxRecallsPerVehicle` (type: `integer`):

Default cap on recall evidence rows per feed.

## `maxComplaintsPerVehicle` (type: `integer`):

Default cap on complaint evidence rows per feed.

## `maxDiscoveredModelsPerFeed` (type: `integer`):

Default cap on manufacturer model expansion before complaints and recalls are fetched.

## `maxEvidenceItems` (type: `integer`):

Upper bound on recall or complaint items retained in each digest section.

## `complaintAlertThreshold` (type: `integer`):

Complaint-count threshold that escalates a digest to action\_needed.

## `delivery` (type: `string`):

dataset writes digest rows to the Apify dataset. webhook POSTs the digest payload to webhookUrl.

## `webhookUrl` (type: `string`):

POST target used when delivery=webhook.

## `datasetMode` (type: `string`):

Choose whether delivery includes all digests, only action-needed digests, or only feeds with new evidence.

## `snapshotKey` (type: `string`):

Stable key used to persist seen recalls and complaints across recurring runs.

## `notifyOnNoNew` (type: `boolean`):

When false, stable feeds are omitted from delivery outputs unless they errored.

## `requestTimeoutSeconds` (type: `integer`):

Timeout for each NHTSA API request.

## `batchDelayMs` (type: `integer`):

Milliseconds to wait between feed fetches.

## `dryRun` (type: `boolean`):

Skip snapshot writes and webhook delivery while still producing local output.

## `nowIso` (type: `string`):

ISO timestamp used for deterministic tests and reproducible proofs.

## Actor input object example

```json
{
  "feeds": [
    {
      "id": "ford-f150-2021",
      "name": "2021 Ford F-150",
      "type": "vehicle",
      "make": "FORD",
      "model": "F-150",
      "modelYear": 2021
    }
  ],
  "recallLookbackDays": 30,
  "complaintLookbackDays": 90,
  "maxRecallsPerVehicle": 50,
  "maxComplaintsPerVehicle": 100,
  "maxDiscoveredModelsPerFeed": 12,
  "maxEvidenceItems": 10,
  "complaintAlertThreshold": 3,
  "delivery": "dataset",
  "datasetMode": "all",
  "snapshotKey": "nhtsa-vehicle-recall-digest-state",
  "notifyOnNoNew": true,
  "requestTimeoutSeconds": 30,
  "batchDelayMs": 600,
  "dryRun": false
}
```

# 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 = {
    "feeds": [
        {
            "id": "ford-f150-2021",
            "name": "2021 Ford F-150",
            "type": "vehicle",
            "make": "FORD",
            "model": "F-150",
            "modelYear": 2021
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("taroyamada/nhtsa-vehicle-recall-digest").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 = { "feeds": [{
            "id": "ford-f150-2021",
            "name": "2021 Ford F-150",
            "type": "vehicle",
            "make": "FORD",
            "model": "F-150",
            "modelYear": 2021,
        }] }

# Run the Actor and wait for it to finish
run = client.actor("taroyamada/nhtsa-vehicle-recall-digest").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "feeds": [
    {
      "id": "ford-f150-2021",
      "name": "2021 Ford F-150",
      "type": "vehicle",
      "make": "FORD",
      "model": "F-150",
      "modelYear": 2021
    }
  ]
}' |
apify call taroyamada/nhtsa-vehicle-recall-digest --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=taroyamada/nhtsa-vehicle-recall-digest",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "⚙️ NHTSA Vehicle Data Scraper",
        "description": "Query federal NHTSA endpoints to extract accurate automotive recall feeds, component defect notices, and compliance records for any vehicle fleet.",
        "version": "0.1",
        "x-build-id": "2TDLT4DmsTjRLUMt8"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/taroyamada~nhtsa-vehicle-recall-digest/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-taroyamada-nhtsa-vehicle-recall-digest",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/taroyamada~nhtsa-vehicle-recall-digest/runs": {
            "post": {
                "operationId": "runs-sync-taroyamada-nhtsa-vehicle-recall-digest",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/taroyamada~nhtsa-vehicle-recall-digest/run-sync": {
            "post": {
                "operationId": "run-sync-taroyamada-nhtsa-vehicle-recall-digest",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "feeds": {
                        "title": "Feeds to monitor",
                        "type": "array",
                        "description": "One digest row per watched vehicle, VIN, or manufacturer feed.",
                        "items": {
                            "type": "object",
                            "properties": {
                                "id": {
                                    "title": "Feed ID",
                                    "type": "string",
                                    "description": "Stable identifier used for snapshots and output rows."
                                },
                                "name": {
                                    "title": "Feed name",
                                    "type": "string",
                                    "description": "Human-readable label for the digest row."
                                },
                                "type": {
                                    "title": "Feed type",
                                    "type": "string",
                                    "enum": [
                                        "vehicle",
                                        "vin",
                                        "manufacturer"
                                    ],
                                    "description": "vehicle = make/model/year, vin = VIN decode watch, manufacturer = company portfolio."
                                },
                                "make": {
                                    "title": "Make",
                                    "type": "string",
                                    "description": "Vehicle make or manufacturer name used by vehicle and manufacturer feeds."
                                },
                                "model": {
                                    "title": "Model family",
                                    "type": "string",
                                    "description": "Used by vehicle feeds; the actor expands official model variants when possible."
                                },
                                "modelYear": {
                                    "title": "Model year",
                                    "type": "integer",
                                    "minimum": 1900,
                                    "maximum": 2100,
                                    "description": "Specific model year used by vehicle feeds."
                                },
                                "modelYears": {
                                    "title": "Model years",
                                    "type": "array",
                                    "items": {
                                        "type": "integer",
                                        "minimum": 1900,
                                        "maximum": 2100
                                    },
                                    "description": "Used by manufacturer feeds."
                                },
                                "models": {
                                    "title": "Models",
                                    "type": "array",
                                    "items": {
                                        "type": "string"
                                    },
                                    "description": "Optional model families for manufacturer feeds."
                                },
                                "vin": {
                                    "title": "VIN",
                                    "type": "string",
                                    "description": "17-character VIN for VIN feeds."
                                },
                                "recallLookbackDays": {
                                    "title": "Recall lookback days (override)",
                                    "type": "integer",
                                    "minimum": 1,
                                    "maximum": 3650,
                                    "description": "Optional feed-specific override for recall lookback days."
                                },
                                "complaintLookbackDays": {
                                    "title": "Complaint lookback days (override)",
                                    "type": "integer",
                                    "minimum": 1,
                                    "maximum": 3650,
                                    "description": "Optional feed-specific override for complaint lookback days."
                                },
                                "maxRecalls": {
                                    "title": "Max recalls (override)",
                                    "type": "integer",
                                    "minimum": 1,
                                    "maximum": 500,
                                    "description": "Optional feed-specific cap on recall evidence rows."
                                },
                                "maxComplaints": {
                                    "title": "Max complaints (override)",
                                    "type": "integer",
                                    "minimum": 1,
                                    "maximum": 500,
                                    "description": "Optional feed-specific cap on complaint evidence rows."
                                },
                                "maxModels": {
                                    "title": "Max discovered models (override)",
                                    "type": "integer",
                                    "minimum": 1,
                                    "maximum": 100,
                                    "description": "Optional feed-specific cap on manufacturer model expansion."
                                },
                                "complaintAlertThreshold": {
                                    "title": "Complaint alert threshold (override)",
                                    "type": "integer",
                                    "minimum": 1,
                                    "maximum": 50,
                                    "description": "Optional feed-specific threshold that elevates complaint spikes to action_needed."
                                }
                            }
                        }
                    },
                    "recallLookbackDays": {
                        "title": "Recall lookback days",
                        "minimum": 1,
                        "maximum": 3650,
                        "type": "integer",
                        "description": "Default recall lookback window used when a feed-specific override is not set.",
                        "default": 30
                    },
                    "complaintLookbackDays": {
                        "title": "Complaint lookback days",
                        "minimum": 1,
                        "maximum": 3650,
                        "type": "integer",
                        "description": "Default complaint lookback window used when a feed-specific override is not set.",
                        "default": 90
                    },
                    "maxRecallsPerVehicle": {
                        "title": "Max recalls per vehicle",
                        "minimum": 1,
                        "maximum": 500,
                        "type": "integer",
                        "description": "Default cap on recall evidence rows per feed.",
                        "default": 50
                    },
                    "maxComplaintsPerVehicle": {
                        "title": "Max complaints per vehicle",
                        "minimum": 1,
                        "maximum": 500,
                        "type": "integer",
                        "description": "Default cap on complaint evidence rows per feed.",
                        "default": 100
                    },
                    "maxDiscoveredModelsPerFeed": {
                        "title": "Max discovered models per feed",
                        "minimum": 1,
                        "maximum": 100,
                        "type": "integer",
                        "description": "Default cap on manufacturer model expansion before complaints and recalls are fetched.",
                        "default": 12
                    },
                    "maxEvidenceItems": {
                        "title": "Max evidence items per section",
                        "minimum": 1,
                        "maximum": 50,
                        "type": "integer",
                        "description": "Upper bound on recall or complaint items retained in each digest section.",
                        "default": 10
                    },
                    "complaintAlertThreshold": {
                        "title": "Complaint alert threshold",
                        "minimum": 1,
                        "maximum": 50,
                        "type": "integer",
                        "description": "Complaint-count threshold that escalates a digest to action_needed.",
                        "default": 3
                    },
                    "delivery": {
                        "title": "Delivery mode",
                        "enum": [
                            "dataset",
                            "webhook"
                        ],
                        "type": "string",
                        "description": "dataset writes digest rows to the Apify dataset. webhook POSTs the digest payload to webhookUrl.",
                        "default": "dataset"
                    },
                    "webhookUrl": {
                        "title": "Webhook URL",
                        "type": "string",
                        "description": "POST target used when delivery=webhook."
                    },
                    "datasetMode": {
                        "title": "Dataset mode",
                        "enum": [
                            "all",
                            "action_needed",
                            "new_only"
                        ],
                        "type": "string",
                        "description": "Choose whether delivery includes all digests, only action-needed digests, or only feeds with new evidence.",
                        "default": "all"
                    },
                    "snapshotKey": {
                        "title": "Snapshot key",
                        "type": "string",
                        "description": "Stable key used to persist seen recalls and complaints across recurring runs.",
                        "default": "nhtsa-vehicle-recall-digest-state"
                    },
                    "notifyOnNoNew": {
                        "title": "Notify when nothing is new",
                        "type": "boolean",
                        "description": "When false, stable feeds are omitted from delivery outputs unless they errored.",
                        "default": true
                    },
                    "requestTimeoutSeconds": {
                        "title": "Request timeout seconds",
                        "minimum": 5,
                        "maximum": 120,
                        "type": "integer",
                        "description": "Timeout for each NHTSA API request.",
                        "default": 30
                    },
                    "batchDelayMs": {
                        "title": "Delay between feeds (ms)",
                        "minimum": 0,
                        "maximum": 10000,
                        "type": "integer",
                        "description": "Milliseconds to wait between feed fetches.",
                        "default": 600
                    },
                    "dryRun": {
                        "title": "Dry run",
                        "type": "boolean",
                        "description": "Skip snapshot writes and webhook delivery while still producing local output.",
                        "default": false
                    },
                    "nowIso": {
                        "title": "Override current time",
                        "type": "string",
                        "description": "ISO timestamp used for deterministic tests and reproducible proofs."
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
