# US Auto Dealer & Repair Shop Leads - DMV Registries (`scrapesage/us-auto-dealer-scraper`) Actor

Scrape US auto dealers, repair & body shops, inspection stations, salvage yards & tow operators from official state DMV/DOL registries (NY, WA, MD): business & owner name, license type/number/status, phone, surety bond, address & lead score. Filters + monitoring, no browser.

- **URL**: https://apify.com/scrapesage/us-auto-dealer-scraper.md
- **Developed by:** [Scrape Sage](https://apify.com/scrapesage) (community)
- **Categories:** Lead generation, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$5.00 / 1,000 automotive business 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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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

## US Auto Dealer & Repair Shop Leads Scraper — Official DMV Registries (NY, WA, MD)

Extract **US automotive-business leads** straight from official **state DMV / Department of Licensing registries** — car dealers, repair & body shops, inspection & emissions stations, salvage yards & dismantlers, tow operators & transporters, wholesalers and manufacturers — all in one actor. Get the **business name, owner / legal entity, license type & number, status, phone, surety-bond details, full address, dates, and a lead score** for ~90,000+ licensed automotive businesses.

Built on official state **open-data portals** — no login, no API key, no browser, no anti-bot. Fast, clean JSON.

### Why this auto dealer scraper?

Most "auto dealer lead" scrapers just re-scrape Google Maps business listings — so they miss businesses without a Maps profile and have **none of the regulatory data**. This actor pulls the **official licensing record**: the license number, license type, current status, surety bond, and the owner/legal entity behind the business — the data that proves a lead is a real, licensed operator.

| Data | Google-Maps lead scrapers | This actor |
|---|---|---|
| Official source (state DMV/DOL registry) | ❌ scraped Maps | ✅ |
| Every automotive category (not just dealers) | ❌ | ✅ dealers, repair, body, inspection, salvage, tow, mfr |
| Official license number, type & status | ❌ | ✅ |
| Owner / legal-entity name | partial | ✅ |
| Surety-bond details (carrier, amount, dates) | ❌ | ✅ (WA) |
| Phone | partial | ✅ (WA, MD) |
| Website | partial | ✅ (MD) |
| Multiple licenses merged into one business | ❌ | ✅ `licenses[]` |
| Issue / renewal / expiration dates | ❌ | ✅ |
| Lead score (0–100) | ❌ | ✅ |
| Monitoring — only new/renewed licenses | ❌ | ✅ |

#### Coverage

| State | Source | Records | Highlights |
|---|---|---|---|
| **New York** | DMV — Facilities Licensed by the DMV | ~54,600 | Dealers, repair & body shops, inspection stations, dismantlers, transporters; **owner name** + geo |
| **Washington** | Dept. of Licensing — Vehicle & Transportation Businesses | ~38,200 | Dealers, wholesalers, tow, wreckers, manufacturers; **phone + surety bond** |
| **Maryland** | MDE VEIP — Certified Emissions Repair Facilities | ~140 | Emissions repair shops; **phone + website** |

More states are added over time — the actor uses a per-state adapter, so new registries drop straight in.

### Use cases

- **Lead generation** — licensed automotive businesses are active B2B buyers: dealer-management systems (DMS), F\&I products & menus, floor-plan/inventory financing, digital-retail & CRM software, parts & tire distributors, garage/shop-management SaaS, warranty & GAP, reconditioning, signage, insurance (garage liability, dealer bonds), towing software, and marketing agencies. Target a category and score the leads.
- **Renewal & bond-timing outreach** — use `expiringBefore` to find licenses (and surety bonds) due to renew — ideal for bond/insurance brokers and compliance vendors.
- **Fresh-business prospecting** — use `issuedAfter` (+ monitoring) to capture newly-licensed dealers and shops the moment they appear.
- **License & bond verification** — confirm a license number, status, expiration, and surety-bond carrier/amount.
- **Market & territory intelligence** — count and map dealers, repair shops, and salvage yards by category, city, county, and state.
- **CRM enrichment** — match your existing accounts to the official registry to append license type, status, bond, and owner.

### How to use

1. [Sign up for Apify](https://console.apify.com/sign-up) — the free plan is enough to try this actor.
2. Open the **US Auto Dealer & Repair Shop Scraper**, pick states and `businessCategories` (e.g. `dealer`, `repair`), and click **Start**.
3. Watch results stream into the dataset table.
4. **Export** as JSON, CSV, Excel, XML, or RSS — or pull results programmatically via the [Apify API](https://docs.apify.com/api/v2).

### Input

```json
{
    "states": ["NY", "WA", "MD"],
    "businessCategories": ["dealer"],
    "statusActiveOnly": true,
    "cities": ["Brooklyn"],
    "issuedAfter": "2025-01-01",
    "maxResults": 1000,
    "sortNewestFirst": true,
    "monitorMode": false
}
```

- **states** — which registries to query (`NY`, `WA`, `MD`). Empty = all three.
- **businessCategories** — `dealer`, `repair`, `body`, `inspection`, `salvage`, `tow`, `manufacturer`, `forhire`, `broker`. Empty = all. A registry with no match for the chosen categories is skipped and logged.
- **statusActiveOnly** *(default true)* — active/current licenses only (for NY, keeps non-expired).
- **cities / zipCodes** — location filters.
- **counties** — county filter (NY, MD).
- **nameQuery** — business or owner name contains.
- **issuedAfter** — only licenses first issued on/after this date (fresh leads; NY/WA).
- **expiringBefore** — only licenses expiring before this date (renewal/bond-timing leads; NY/WA).
- **maxResults / maxResultsPerState** — output limits.
- **sortNewestFirst** *(default true)* — most recently issued/renewed first.
- **monitorMode / monitorKey** — emit only businesses new (or renewed) since the last run.
- **socrataAppToken** *(optional)* — higher rate limits for very large runs.

### Output

One record per **business** (`recordType: "auto_business"`). When a business holds several licenses (e.g. a dealer that also runs a repair shop and a dismantler), they're merged into a single record with a `licenses[]` array:

```json
{
    "recordType": "auto_business",
    "source": "WA",
    "sourceAgency": "WA State Department of Licensing",
    "businessName": "THE CAR CONNECTION",
    "legalEntityName": "BELNESS, INCORPORATED",
    "ownerName": "BELNESS, INCORPORATED",
    "businessCategory": "Dealer",
    "licenseType": "Motor Vehicle Dealer",
    "licenseNumber": "17763",
    "licenseStatus": "Active",
    "active": true,
    "phone": "(425) 742-1102",
    "website": null,
    "street": "13319 HWY 99",
    "city": "Everett",
    "state": "WA",
    "zipCode": "98204",
    "county": null,
    "addressFull": "13319 HWY 99, Everett, WA 98204",
    "issueDate": "2026-04-29",
    "expirationDate": "2027-04-30",
    "bondStatus": "Active",
    "bondAmount": 5000,
    "bondingCompany": "RLI INSURANCE CO",
    "bondNumber": "LSM5033054",
    "licenseCount": 1,
    "licenseTypes": ["Motor Vehicle Dealer"],
    "licenses": [{ "licenseType": "Motor Vehicle Dealer", "licenseNumber": "17763", "active": true, "bondAmount": 5000 }],
    "verifyUrl": "https://professions.dol.wa.gov/s/license-lookup",
    "leadScore": 88,
    "sourceFields": { "license_type": "Motor Vehicle Dealer", "bonding_company_name": "RLI INSURANCE CO", "...": "..." },
    "scrapedAt": "2026-06-20T18:00:00.000Z"
}
```

Fields vary by registry (each publishes a different set): **NY** adds `ownerName` + latitude/longitude; **WA** adds `phone`, full surety-bond details, and a separate mailing address; **MD** adds `phone` + `website`. Every record also carries the complete raw row in `sourceFields`. Fields are `null` only when that registry doesn't publish them.

### Automate & schedule

Run this actor on autopilot and pull results into your own stack:

- **[Apify API](https://docs.apify.com/api/v2)** — start runs, fetch datasets, and manage schedules over REST.
- **[apify-client for JavaScript](https://docs.apify.com/api/client/js/)** and **[apify-client for Python](https://docs.apify.com/api/client/python/)** — official SDKs.
- **[Schedules](https://docs.apify.com/platform/schedules)** — run it daily/weekly to capture newly-licensed dealers and upcoming renewals; combine with `monitorMode` so each run returns only what's new.
- **[Webhooks](https://docs.apify.com/platform/integrations/webhooks)** — trigger downstream actions (CRM import, Slack alert, email sequence) the moment a run finishes.

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

const client = new ApifyClient({ token: 'MY_APIFY_TOKEN' });

const run = await client.actor('scrapesage/us-auto-dealer-scraper').call({
    states: ['NY', 'WA'],
    businessCategories: ['dealer'],
    issuedAfter: '2025-01-01',
    maxResults: 2000,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(`Got ${items.length} automotive-business leads`);
```

### Integrate with any app

Connect the dataset to 5,000+ apps — no code required:

- **[Make](https://docs.apify.com/platform/integrations/make)** — multi-step automation scenarios.
- **[Zapier](https://docs.apify.com/platform/integrations/zapier)** — push new dealer leads straight into your CRM.
- **[Slack](https://docs.apify.com/platform/integrations/slack)** — get notified when a monitored search finds new businesses.
- **[Google Drive / Sheets](https://docs.apify.com/platform/integrations/drive)** — auto-export every run to a spreadsheet.
- **[Airbyte](https://docs.apify.com/platform/integrations/airbyte)** — pipe results into your data warehouse.
- **[GitHub](https://docs.apify.com/platform/integrations/github)** — trigger runs from commits or releases.

### Use with AI assistants (MCP)

The output is clean, LLM-ready JSON. You can call this actor from Claude, ChatGPT, or any agent framework through the **[Apify MCP server](https://docs.apify.com/platform/integrations/mcp)** — ask your assistant to "find active car dealers in New York and Washington" and let it run this scraper for you.

### Agent-ready: autonomous payments (x402 & Skyfire)

This actor is **agent-ready** — AI agents can discover it, run it, and **pay for it autonomously**, with no Apify account and no human in the loop. It uses [pay-per-event](https://docs.apify.com/platform/actors/publishing/monetize/pay-per-event) pricing and [limited permissions](https://docs.apify.com/platform/actors/development/permissions), so it qualifies for Apify's agentic-payment standards:

- **[x402](https://docs.apify.com/platform/integrations/x402)** — an open, HTTP-native payment protocol. Agents pay per run in USDC on the Base network directly through the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp) — no account, no API key.
- **[Skyfire](https://docs.apify.com/platform/integrations/skyfire)** — agent-to-service payments for fully autonomous AI-agent workflows.

Building an AI agent, MCP tool, or autonomous data pipeline? This scraper is ready to plug in and pay as it goes.

### More scrapers from scrapesage

Build a complete **US B2B lead-gen stack** with official-data siblings:

- **[US Professional License Scraper](https://apify.com/scrapesage/us-professional-license-scraper)** — every regulated profession across state boards.
- **[US Contractor License Scraper](https://apify.com/scrapesage/us-contractor-license-scraper)** — state contractor boards with surety bond & insurance data.
- **[US Business Formation Scraper](https://apify.com/scrapesage/us-business-formation-scraper)** — newly-registered LLCs & corporations (fresh business leads).
- **[SBA Loan Leads Scraper](https://apify.com/scrapesage/sba-loan-leads-scraper)** — recently-financed small businesses (7(a) & 504).
- **[FMCSA Trucking Scraper](https://apify.com/scrapesage/fmcsa-trucking-scraper)** — motor carriers & trucking-company leads.
- **[US Property Records Scraper](https://apify.com/scrapesage/us-property-records-scraper)** — property & owner leads with mailing addresses.
- **[NPI NPPES Scraper](https://apify.com/scrapesage/npi-nppes-scraper)** — 8M+ US healthcare providers from the national registry.
- **[TaxBuzz Scraper](https://apify.com/scrapesage/taxbuzz-scraper)** — CPA & tax-preparer leads.
- **[Insurance Agent Scraper](https://apify.com/scrapesage/insurance-agent-scraper)** — agency leads.

### Tips

- **Target a vertical**: set `businessCategories` (e.g. `["dealer"]`, `["repair","body"]`, `["salvage"]`) — it's matched per state, so one category reaches every registry.
- **Renewal & bond campaigns**: combine `expiringBefore` with a category to build a list of businesses due to renew (great for surety-bond & insurance brokers).
- **Fresh leads on a schedule**: set `issuedAfter` + `monitorMode` and run on a daily [Schedule](https://docs.apify.com/platform/schedules) to capture new businesses only.
- **One row per business**: a facility that holds several licenses (dealer + repair + dismantler) is merged into a single record — see `licenseCount` and the `licenses[]` array.

### FAQ

**Which states are covered?** New York, Washington, and Maryland — the states that publish complete, business-level automotive-licensing data on official open-data portals. More states are added over time.

**Do I need an API key?** No. The data comes from public state open-data portals; no key, login, or browser is required. An optional Socrata app token only raises rate limits for very large runs.

**Does it include phone numbers and websites?** Washington publishes a phone number for most businesses; Maryland publishes phone **and** website. New York's DMV registry publishes the owner name and address but not a phone — pair it with our [Website Contact Scraper](https://apify.com/scrapesage/website-contact-scraper) to enrich with emails/phones.

**Can I get one category across all states?** Yes — `businessCategories` is matched against each registry's own license codes, so a single value like `dealer` returns dealers from every selected registry in one run.

**How do I monitor new licenses automatically?** Turn on `monitorMode` and create a [Schedule](https://docs.apify.com/platform/schedules). Each run returns only businesses that are new (or newly renewed) since the last run, tagged `monitorEvent: "new"`.

**Is this legal?** This actor collects publicly available government records only. You are responsible for using the data in compliance with applicable laws and each portal's terms.

**A field is null — why?** Each registry publishes a different set of fields. A field is `null` when that particular registry doesn't publish it (e.g. NY has no phone; WA has no county; MD has no license number).

### Need help?

Open an issue on the actor's **Issues** tab, or visit the [Apify help center](https://help.apify.com/). Feature requests — including additional states — are welcome.

# Actor input Schema

## `states` (type: `array`):

Which official state automotive-licensing registries to query. <b>NY</b> — DMV facilities (~54.6K: dealers, repair & body shops, inspection stations, dismantlers, transporters; with owner name). <b>WA</b> — Dept. of Licensing vehicle businesses (~38.2K: dealers, wholesalers, tow, wreckers, manufacturers; with <b>phone + surety bond</b>). <b>MD</b> — VEIP-certified emissions repair facilities (with <b>phone + website</b>). Leave empty for all three.

## `businessCategories` (type: `array`):

Filter by automotive business category (matched across every registry's own license codes). Leave empty for ALL categories. Note: not every category exists in every state (e.g. WA has no repair/body shops in this dataset; MD is emissions-repair only) — a registry with no match for the chosen categories is skipped and logged.

## `statusActiveOnly` (type: `boolean`):

Only return businesses with an active/current license (for NY, which has no status field, this keeps licenses whose expiration date has not passed; MD facilities are listed as currently certified). Turn off to include expired, terminated and historical records.

## `cities` (type: `array`):

Filter by business city (case-insensitive, exact city name), e.g. <code>Brooklyn</code>, <code>Seattle</code>, <code>Baltimore</code>.

## `zipCodes` (type: `array`):

Filter by ZIP — full ZIP (<code>11201</code>) or a prefix (<code>112</code> matches all 112xx).

## `counties` (type: `array`):

Filter by county — applies to NY (DMV county) and MD (VEIP county), e.g. <code>Kings</code>, <code>Queens</code>, <code>Anne Arundel</code>. (Washington's dataset has no county field.)

## `nameQuery` (type: `string`):

Only return businesses whose name (trade name or owner / legal entity) contains this text (case-insensitive), e.g. <code>auto</code>, <code>toyota</code>, <code>collision</code>.

## `issuedAfter` (type: `string`):

Only licenses first issued on or after this date, <code>YYYY-MM-DD</code> — great for fresh leads (newly-licensed businesses). Applies to NY & WA (MD has no issue date and is skipped when this is set).

## `expiringBefore` (type: `string`):

Only licenses expiring before this date, <code>YYYY-MM-DD</code> — perfect for renewal-timing outreach (bonds, insurance, garage software, supplies). Applies to NY & WA.

## `maxResults` (type: `integer`):

Maximum number of automotive-business records to return in this run (across all selected states).

## `maxResultsPerState` (type: `integer`):

Cap how many records are pulled from each state before the global limit and sorting are applied. Leave blank to use the same value as Max results.

## `sortNewestFirst` (type: `boolean`):

Return the most recently issued / renewed licenses first (best for fresh leads). MD has no dates, so its records are returned in source order.

## `deduplicateResults` (type: `boolean`):

Skip duplicate records within this run (recommended).

## `monitorMode` (type: `boolean`):

Remember which businesses were already returned (in a named key-value store) and emit ONLY businesses that are new since the last run — each tagged <code>monitorEvent: "new"</code>. A renewal (new expiration date) also surfaces as new. Registries refresh regularly; run on a Schedule to capture newly-licensed dealers & shops as fresh leads. Works alongside Apify Schedules (the schedule starts the run; monitoring decides what's new).

## `monitorKey` (type: `string`):

Names the memory used by monitoring mode. Use a distinct key per saved watch (e.g. per state/category) so different monitors don't share state.

## `socrataAppToken` (type: `string`):

Optional Socrata app token for higher rate limits on very large runs. Not required — leave blank for normal use. Get one free at any state open-data portal.

## `proxyConfiguration` (type: `object`):

Optional proxy. State open data is fetched directly and needs no proxy — leave this off for the fastest runs. Enable Apify Proxy only if your network requires it.

## Actor input object example

```json
{
  "states": [
    "NY",
    "WA",
    "MD"
  ],
  "businessCategories": [
    "dealer"
  ],
  "statusActiveOnly": true,
  "maxResults": 1000,
  "sortNewestFirst": true,
  "deduplicateResults": true,
  "monitorMode": false,
  "monitorKey": "default",
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

All scraped automotive-business records as JSON items in the default dataset.

# 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 = {
    "states": [
        "NY",
        "WA",
        "MD"
    ],
    "businessCategories": [
        "dealer"
    ],
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapesage/us-auto-dealer-scraper").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 = {
    "states": [
        "NY",
        "WA",
        "MD",
    ],
    "businessCategories": ["dealer"],
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("scrapesage/us-auto-dealer-scraper").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 '{
  "states": [
    "NY",
    "WA",
    "MD"
  ],
  "businessCategories": [
    "dealer"
  ],
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call scrapesage/us-auto-dealer-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=scrapesage/us-auto-dealer-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/9xtiJRemXITiLhQWT/builds/xhuUx4OkohCdOaBxi/openapi.json
