# Edmunds Car Scraper 🚗 (`shahidirfan/edmunds-car-scraper`) Actor

Scrape Edmunds car listings, prices, vehicle specs, features, mileage, dealer details, ratings, and used & new car data. Extract structured automotive market data for price tracking, vehicle research, lead generation, analysis, and comparison.

- **URL**: https://apify.com/shahidirfan/edmunds-car-scraper.md
- **Developed by:** [Shahid Irfan](https://apify.com/shahidirfan) (community)
- **Categories:**
- **Stats:** 3 total users, 2 monthly users, 40.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

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

## 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

### What does Edmunds Car Scraper do?

Edmunds Car Scraper collects public new and used vehicle inventory from Edmunds.com and saves it as structured records in an Apify dataset. Use a direct Edmunds inventory URL or enter filters such as make, model, model year, ZIP code, radius, inventory type, and price range.

Each result can include VIN, vehicle specifications, pricing, mileage, colors, fuel economy, dealer contact information, photos, incentives, delivery information, and other listing attributes published by Edmunds. The dataset is useful for automotive market research, dealer inventory monitoring, price comparisons, valuation work, lead research, and recurring inventory snapshots.

### Why use Edmunds Car Scraper?

- **Search the inventory you need** - Use an existing Edmunds search URL or build a search from the available vehicle and location filters.
- **Keep rich listing data** - Records include normalized vehicle fields together with the source listing information, so important details are not lost during export.
- **Collect unique vehicles** - VIN-based deduplication prevents the same vehicle from being saved more than once across pages.
- **Control run size** - Set `results_wanted` for the number of records and `max_pages` as a safety limit for pagination.
- **Monitor prices and supply** - Run the same search on a schedule and compare inventory, advertised prices, mileage, dealers, and listing dates over time.
- **Use the output anywhere** - Download JSON, CSV, Excel, or XML, access the dataset through the Apify API, or connect it to webhooks and automation tools.

### What data can you extract from Edmunds?

The actor saves the complete non-empty listing object available in the Edmunds inventory results and adds stable top-level aliases for common workflows. Optional values are omitted when the source does not publish them.

### Output Data

Each dataset item represents one unique Edmunds vehicle listing. The normalized fields below are accompanied by the original nested listing objects when they are available.

#### Vehicle and pricing fields

| Field                | Type    | Description                                         |
| -------------------- | ------- | --------------------------------------------------- |
| `vin`                | String  | Vehicle Identification Number when published.       |
| `vid`                | String  | Edmunds vehicle listing identifier.                 |
| `year`               | Number  | Model year.                                         |
| `make`               | String  | Vehicle manufacturer.                               |
| `model`              | String  | Vehicle model.                                      |
| `trim`               | String  | Trim or style name.                                 |
| `title`              | String  | Combined year, make, model, and trim.               |
| `type`               | String  | Inventory classification such as new, used, or CPO. |
| `price`              | Number  | Advertised vehicle price in USD.                    |
| `msrp`               | Number  | Dealer or manufacturer MSRP when available.         |
| `mileage`            | Number  | Odometer reading.                                   |
| `stockNumber`        | String  | Dealer stock number.                                |
| `certified`          | Boolean | Certified status when published.                    |
| `inTransit`          | Boolean | Whether the vehicle is marked as in transit.        |
| `listedSince`        | Number  | Edmunds listing timestamp when available.           |
| `firstPublishedDate` | Number  | First publication timestamp when available.         |

#### Vehicle specifications and photos

| Field                    | Type   | Description                                                             |
| ------------------------ | ------ | ----------------------------------------------------------------------- |
| `engine`                 | String | Engine description or derived engine label.                             |
| `transmission`           | String | Transmission type.                                                      |
| `drivetrain`             | String | Drivetrain such as FWD, AWD, RWD, or 4WD.                               |
| `fuelType`               | String | Fuel or powertrain type.                                                |
| `exteriorColor`          | String | Exterior color.                                                         |
| `interiorColor`          | String | Interior color.                                                         |
| `bodyStyle`              | String | Body style or vehicle type.                                             |
| `mpgCity`                | Number | EPA city MPG when available.                                            |
| `mpgHighway`             | Number | EPA highway MPG when available.                                         |
| `doors`                  | Number | Number of doors.                                                        |
| `images`                 | Array  | Vehicle photo URLs available or derived from the listing photo data.    |
| `derivedGenericFeatures` | Array  | Highlighted equipment and feature labels from the listing.              |
| `vehicleInfo`            | Object | Original nested vehicle specifications, style, mileage, and photo data. |

#### Dealer, offer, and run metadata

| Field                 | Type   | Description                                                                                |
| --------------------- | ------ | ------------------------------------------------------------------------------------------ |
| `dealerName`          | String | Dealer name.                                                                               |
| `dealerAddress`       | String | Formatted dealer street, city, state, and ZIP address.                                     |
| `dealerPhone`         | String | Dealer phone number when published.                                                        |
| `dealerRating`        | Number | Dealer rating when available.                                                              |
| `dealerInfo`          | Object | Original dealer identity, address, franchise, rooftop, distance, phone, and retail fields. |
| `prices`              | Object | Original advertised, display, MSRP, savings, compliance, and payment fields.               |
| `incentives`          | Object | Incentive and eligibility information.                                                     |
| `deliveryOptions`     | Object | Delivery availability or fee information.                                                  |
| `computedInfo`        | Object | Edmunds calculated savings and related values.                                             |
| `computedDisplayInfo` | Object | Display, phone, price validation, and listing-age values.                                  |
| `url`                 | String | Vehicle detail URL when published or an Edmunds VIN URL.                                   |
| `sourcePage`          | String | Inventory search page used to collect the listing.                                         |
| `scrapedAt`           | String | ISO timestamp for the collection time.                                                     |

### How to use Edmunds Car Scraper

1. Open the Actor in Apify Console.
2. Paste a public Edmunds inventory search URL, or enter the filters you want to use.
3. Set `results_wanted` and, for larger searches, `max_pages`.
4. Run the Actor and inspect the dataset preview.
5. Download the results or connect the dataset to your database, spreadsheet, webhook, or application.

For cloud runs and larger collections, an Apify residential proxy configuration is recommended because Edmunds applies strong access controls. Start with a small result limit before scheduling repeated or high-volume runs.

### Input Parameters

| Parameter            | Type    | Required | Default              | Description                                                                                                                                                                              |
| -------------------- | ------- | -------- | -------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `startUrl`           | String  | No       | Empty                | Public Edmunds inventory URL. When provided, it takes priority over filter inputs.                                                                                                       |
| `make`               | String  | No       | Empty                | Manufacturer filter, such as `Toyota` or `Honda`.                                                                                                                                        |
| `model`              | String  | No       | Empty                | Model filter, such as `Camry` or `F-150`.                                                                                                                                                |
| `year`               | Integer | No       | Empty                | Model year filter.                                                                                                                                                                       |
| `zipCode`            | String  | No       | Empty                | ZIP code for a location-based search.                                                                                                                                                    |
| `radius`             | Integer | No       | `50`                 | Search radius in miles when `zipCode` is used.                                                                                                                                           |
| `inventoryType`      | String  | No       | `new`                | Inventory type. Supported values are `new` and `used`.                                                                                                                                   |
| `minPrice`           | Integer | No       | Empty                | Minimum price in USD.                                                                                                                                                                    |
| `maxPrice`           | Integer | No       | Empty                | Maximum price in USD.                                                                                                                                                                    |

| `results_wanted`     | Integer | No       | `20`                 | Maximum number of unique vehicle records to save.                                                                                                                                        |
| `max_pages`          | Integer | No       | `10`                 | Maximum number of inventory pages to process.                                                                                                                                            |
| `proxyConfiguration` | Object  | No       | Residential on cloud | Apify Proxy settings. Residential access is recommended for dependable Edmunds collection.                                                                                               |

### Usage Examples

#### Basic new-vehicle search

Collect new Toyota Camry inventory near Los Angeles:

```json
{
    "make": "Toyota",
    "model": "Camry",
    "inventoryType": "new",
    "zipCode": "90001",
    "radius": 50,
    "results_wanted": 20
}
```

#### Used-car price research

Collect used vehicles in a local price range and allow several pages for broader coverage:

```json
{
    "inventoryType": "used",
    "zipCode": "10001",
    "radius": 75,
    "minPrice": 15000,
    "maxPrice": 30000,
    "results_wanted": 100,
    "max_pages": 10
}
```

#### Reuse a filtered Edmunds URL

Pass a search URL when Edmunds already contains the exact filters you need. A starting `pagenumber` is respected:

```json
{
    "startUrl": "https://www.edmunds.com/inventory/srp.html?inventorytype=used&make=honda&model=accord&pagenumber=2",
    "results_wanted": 50,
    "max_pages": 5
}
```

### Sample Output

This representative item shows the normalized fields returned alongside the source listing data. The nested objects can contain additional values, and fields not published for a particular vehicle are omitted.

```json
{
    "vin": "3C63R3JL5VG391640",
    "vid": "d40bfaa533e7f781e9da354e90ebd737",
    "year": 2027,
    "make": "Ram",
    "model": "3500",
    "trim": "Laramie",
    "title": "2027 Ram 3500 Laramie",
    "type": "NEW",
    "price": 90645,
    "msrp": 90645,
    "mileage": 2,
    "stockNumber": "R16532",
    "engine": "6.7L 6-cylinder",
    "drivetrain": "4WD",
    "dealerName": "MJ McGuire Chrysler Dodge Jeep Ram",
    "dealerAddress": "520 3rd Ave SW, Rugby, North Dakota, 58368",
    "dealerPhone": "701-490-9732",
    "images": ["https://www.edmunds.com/assets/m2/for-sale/d0-3C63R3JL5VG391640/img-1-600x400.jpg"],
    "vehicleInfo": {
        "mileage": 2,
        "styleInfo": {
            "make": "Ram",
            "model": "3500",
            "trim": "Laramie",
            "year": 2027
        }
    },
    "prices": {
        "advertisedPrice": 90645,
        "displayPrice": 90645,
        "dealerMsrp": 90645,
        "savings": 0
    },
    "url": "https://www.edmunds.com/inventory/vin/3C63R3JL5VG391640/",
    "sourcePage": "https://www.edmunds.com/inventory/srp.html?inventorytype=new&radius=50",
    "scrapedAt": "2026-08-29T11:01:16.219Z"
}
```

### Tips for Best Results

- **Start with 20 records** - Use the schema prefill to confirm that the search and output match your needs.
- **Use a direct search URL for advanced filters** - Edmunds search URLs preserve filters that are not represented as separate Actor inputs.
- **Use focused searches** - Combining make, model, year, ZIP code, and price limits usually produces a more useful dataset.
- **Set a page cap** - `max_pages` prevents an unexpectedly broad search from running longer than intended.
- **Use residential access for cloud runs** - It is the most dependable choice for repeated or larger Edmunds collections.
- **Expect optional fields** - VINs, photos, dealer phones, ratings, fuel economy, incentives, and payment values are not present for every vehicle.
- **Compare repeat runs carefully** - Inventory changes quickly, so use VIN as the stable vehicle key and treat price and availability as time-sensitive values.

### Integrations and Export Formats

- **Google Sheets** - Review inventory, prices, dealers, and regional comparisons.
- **Airtable** - Build a searchable vehicle and dealer database.
- **Webhooks** - Send completed run notifications or records to another service.
- **Make or Zapier** - Trigger price alerts, reports, and downstream workflows.
- **Apify API** - Read datasets programmatically from an application or data pipeline.
- **JSON** - Use nested vehicle records in software and data workflows.
- **CSV** - Analyze normalized fields in spreadsheet applications.
- **Excel** - Share inventory and pricing reports.
- **XML** - Exchange records with systems that require XML.

### Frequently Asked Questions

#### Can I search by make, model, year, or ZIP code?

Yes. Provide any combination of the filter inputs, or use `startUrl` when you already have a configured Edmunds inventory search.

#### Can I collect both new and used vehicles?

Yes. Set `inventoryType` to `new` or `used`, or provide a direct URL whose inventory type is already configured.

#### Can I collect multiple pages?

Yes. The actor follows the Edmunds `pagenumber` pagination parameter, removes duplicate vehicles across pages, and stops at `results_wanted`, `max_pages`, or the last available page.

#### Why are some vehicle fields missing?

Edmunds does not publish the same fields for every listing. Missing prices, phones, ratings, MPG values, photos, incentives, or specifications usually reflect the individual listing.

#### How are duplicate vehicles handled?

Records are deduplicated primarily by VIN, with Edmunds vehicle identifiers and a conservative fallback key used when a VIN is not available.

#### Can I export the dataset to CSV or Excel?

Yes. Apify datasets can be downloaded as JSON, CSV, Excel, XML, and other supported formats after the run completes.

#### Can I schedule recurring inventory checks?

Yes. Create an Apify schedule with the same URL or filters to refresh pricing and inventory snapshots hourly, daily, weekly, or on another schedule.

#### Is it legal to collect Edmunds inventory data?

You are responsible for complying with Edmunds terms, applicable privacy and data-use laws, and any other rules that apply to your project. Collect public information responsibly and respect access limits.

### Related Actors

- [Cars.com Scraper](https://apify.com/shahidirfan/cars-com-scraper) - Collect vehicle listings, pricing, mileage, VINs, dealer details, locations, and images from Cars.com.
- [Autotrader.ca Scraper](https://apify.com/shahidirfan/autotrader-scraper) - Collect Canadian vehicle listings with specifications, prices, mileage, seller information, and photos from Autotrader Canada.

### Support

For issues, field requests, or feature suggestions, use the Issues tab on the Actor page in Apify Console. Include the public Edmunds search URL, the input values used, and a short description of the unexpected result. Do not include proxy credentials or private account information.

### Legal Notice

This Actor is intended for legitimate collection and analysis of publicly available vehicle inventory information. Users are responsible for using the data responsibly and complying with Edmunds terms, Apify policies, applicable privacy requirements, and other relevant laws.

# Actor input Schema

## `startUrl` (type: `string`):

Start scraping from a specific Edmunds inventory URL. If provided, search filters will be ignored.

## `make` (type: `string`):

Car manufacturer (e.g., 'Toyota', 'Honda', 'Ford'). Leave empty for all makes.

## `model` (type: `string`):

Car model (e.g., 'Camry', 'Accord', 'F-150'). Leave empty for all models.

## `year` (type: `integer`):

Model year (e.g., 2024). Leave empty for all years.

## `zipCode` (type: `string`):

ZIP code for location-based search (e.g., '90210'). Leave empty for nationwide search.

## `radius` (type: `integer`):

Search radius in miles from the ZIP code.

## `inventoryType` (type: `string`):

Type of inventory to scrape.

## `minPrice` (type: `integer`):

Minimum price filter in USD.

## `maxPrice` (type: `integer`):

Maximum price filter in USD.

## `results_wanted` (type: `integer`):

The maximum number of vehicles to collect.

## `max_pages` (type: `integer`):

A safety cap on the number of pages to visit.

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

Use Apify residential proxies (required for Edmunds due to Akamai protection).

## Actor input object example

```json
{
  "startUrl": "https://www.edmunds.com/inventory/srp.html?inventorytype=new",
  "radius": 50,
  "inventoryType": "used",
  "results_wanted": 20,
  "max_pages": 10,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

# 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 = {
    "startUrl": "https://www.edmunds.com/inventory/srp.html?inventorytype=new",
    "results_wanted": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("shahidirfan/edmunds-car-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 = {
    "startUrl": "https://www.edmunds.com/inventory/srp.html?inventorytype=new",
    "results_wanted": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("shahidirfan/edmunds-car-scraper").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 '{
  "startUrl": "https://www.edmunds.com/inventory/srp.html?inventorytype=new",
  "results_wanted": 20
}' |
apify call shahidirfan/edmunds-car-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,shahidirfan/edmunds-car-scraper"
        }
    }
}

```

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/81cJdkG8o7YhtSEAt/builds/hfFTPapW4wUvSWrU7/openapi.json
