# Automotive Search URL Scraper (`e-commerce/automotive-scraper`) Actor

Paste any vehicle marketplace search URL and get every listing as a schema.org Car record: VIN, mileage, price, fuel, transmission and dealer location. 31 marketplaces worldwide, the page's own filters kept. Export data, run via API, schedule and monitor runs, or integrate with other tools.

- **URL**: https://apify.com/e-commerce/automotive-scraper.md
- **Developed by:** [E Commerce](https://apify.com/e-commerce) (Apify)
- **Categories:** E-commerce, Lead generation, Automation
- **Stats:** 1 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.10 / 1,000 vehicle scrapeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#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

## Automotive Search URL Scraper

Paste a vehicle marketplace search URL and get every listing on that page as a [schema.org Car](https://schema.org/Car) record — VIN, mileage with its unit, price with its currency, fuel, transmission, drivetrain, engine, body type, colour, condition, trim, seller type, posting date and a location with coordinates. **31 car marketplaces**, from Craigslist and CarMax to AutoScout24, Otomoto, Encar and CarDekho, mixable in one run.

### What does the Automotive Search URL Scraper do?

- **Keeps the filters you already built.** Set year, price, mileage, transmission, fuel, title status, body type or colour on the site itself, copy the URL, and each filter is honoured exactly as the site applies it.
- **Normalises 31 sites into one shape.** A Craigslist ad, a CarMax listing and an Otomoto advert land in the same columns.
- **Keeps each market's own units.** Prices carry the site's ISO 4217 currency (USD, GBP, EUR, PLN, KRW, JPY, SGD, INR, AUD, CAD, NOK, SEK); odometers carry `SMI` miles or `KMT` kilometres. Never silently converted.
- **Returns everything the page exposes.** Nothing is de-duplicated or relevance-filtered, so your matching rules stay yours. A `source` column says which site each record came from.

### Which sites does it cover?

| Region | Marketplaces |
| --- | --- |
| United States | Craigslist, CarMax, CarGurus, AutoTrader, cars.com, TrueCar, Carvana, Bring a Trailer, Hemmings |
| United Kingdom | AutoTrader UK, Motors UK, Cinch |
| Europe | AutoScout24, Leboncoin, La Centrale, Coches.net, Subito, Marktplaats, Otomoto, Standvirtual, Blocket, Finn.no, Mobile.bg |
| Asia-Pacific | Carsales, CarsGuide, Encar, Goo-net, SgCarMart, CarDekho |
| Americas | AutoTrader Canada, MercadoLibre |

### Why scrape vehicle marketplaces?

- **Price a car before you buy or list one.** Every comparable within a radius, so you see the real spread instead of one site's estimate.
- **Track dealer inventory.** Run the same search URL on a schedule and diff the results: what arrived, what sold, what was repriced.
- **Build a valuation model.** VIN, model year, odometer and price across tens of thousands of listings is the training set.
- **Find cross-border arbitrage.** The same model in EUR on AutoScout24 and in GBP on AutoTrader UK, in one dataset.
- **Feed a lead pipeline.** Dealer name, address, postcode and coordinates, where the site publishes them.

### Quick start

1. Build the search on the marketplace itself, using its own filters.
2. Copy the URL from the address bar.
3. Paste it into **Search page URLs** — as many URLs, from as many sites, as you like.
4. Set **Maximum vehicles per search URL** (default 100) and, optionally, a total cap.
5. Click **Start**, then export the dataset to JSON, CSV, Excel or XML.

### Input parameters

| Field | Type | Description |
| --- | --- | --- |
| `searchUrls` | array | Marketplace search or listing URLs, filters included. Paste them, upload a file, or point at a Google Sheet. |
| `maxResultsPerUrl` | integer | Stop each URL after this many vehicles. Default `100`. |
| `maxResults` | integer | Stop the whole run after this many vehicles. Optional. |

Example search URLs:

```
https://sfbay.craigslist.org/search/cta?auto_make_model=toyota%20camry&min_auto_year=2015
https://www.carmax.com/cars/toyota?zip=94086&radius=radius-50
https://www.autoscout24.de/lst/volkswagen/golf
```

### What data do you get?

One record per vehicle, 22 fields, in schema.org `Car` shape:

| Field | Meaning |
| --- | --- |
| `source` | Which marketplace the record came from |
| `name`, `url`, `description` | Listing title, direct link, seller's own text |
| `brand`, `model`, `vehicleModelDate` | Make, model, model year (first-registration year in Europe) |
| `vehicleIdentificationNumber` | VIN, where the site publishes one |
| `mileageFromOdometer` | Value plus `unitCode` — `SMI` miles or `KMT` kilometres |
| `offers` | Price plus its ISO 4217 `priceCurrency` |
| `fuelType`, `vehicleTransmission`, `driveWheelConfiguration`, `vehicleEngine` | Powertrain as the site states it |
| `bodyType`, `color`, `itemCondition`, `vehicleConfiguration` | Body style, colour, condition, trim |
| `image`, `datePosted`, `sellerType` | First gallery image, publication date, dealer or private |
| `itemLocation` | schema.org Place with postal address and coordinates |

```json
{
    "source": "CarMax",
    "@type": "Car",
    "name": "2015 Toyota Camry LE 4dr Sedan",
    "url": "https://www.carmax.com/car/70002037",
    "brand": { "@type": "Brand", "name": "Toyota" },
    "model": "Camry",
    "vehicleModelDate": "2015",
    "vehicleIdentificationNumber": "4T1BF1FK0FU931195",
    "mileageFromOdometer": { "@type": "QuantitativeValue", "value": 145400, "unitCode": "SMI" },
    "offers": { "@type": "Offer", "price": 9995, "priceCurrency": "USD" },
    "fuelType": "Gasoline",
    "vehicleTransmission": "Automatic",
    "sellerType": "dealer",
    "itemLocation": {
        "@type": "Place",
        "geo": { "@type": "GeoCoordinates", "latitude": 37.3492, "longitude": -121.9 }
    }
}
```

### How do you run it from your own code?

Start a run and read the dataset with the Apify API:

```bash
curl -X POST "https://api.apify.com/v2/acts/e-commerce~automotive-scraper/runs?token=YOUR_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{"searchUrls":[{"url":"https://www.carmax.com/cars/toyota?zip=94086"}],"maxResultsPerUrl":50}'
```

Swap `runs` for `run-sync-get-dataset-items` to start the run and get the rows back in the same call.

Schedule a run daily, send new rows to a webhook, or push them straight into Google Sheets, Airtable, Slack or S3 with the platform's integrations.

### How much will it cost?

Pay per event, charged once for each vehicle returned to the dataset:

| Plan | Per vehicle | Per 1,000 vehicles |
| --- | --- | --- |
| Free | $0.0020 | $2.00 |
| Bronze | $0.0017 | $1.70 |
| Silver | $0.0014 | $1.40 |
| Gold | $0.0011 | $1.10 |
| Platinum | $0.0008 | $0.80 |
| Diamond | $0.0005 | $0.50 |

No compute charge on top: a run that returns nothing costs only the start event.

### Troubleshooting

| Issue | Solution |
| --- | --- |
| A search URL returns 0 vehicles | Open it in a browser. If the site itself shows nothing, the filters are too narrow — widen year, price or radius. |
| Fewer vehicles than the page claims | The site caps its own result set. Split one broad search into narrower ones, by year or price band. |
| One site in a multi-site run is empty | Check the run log — each skipped site logs why, by name. |
| `vehicleIdentificationNumber` is null | Not every site publishes a VIN. AutoScout24 and AutoTrader UK do not; CarMax, CarGurus, cars.com, TrueCar and Carvana do. |
| Price looks wrong by a factor of 100 | Check `priceCurrency`. The value is the site's own figure in its own currency and is never converted. |
| Mileage looks wrong | Check `unitCode` — `SMI` is miles, `KMT` is kilometres. European and Asian sites publish kilometres. |
| Run stopped early | `maxResults` caps the whole run, not each URL. Raise it above `URLs x maxResultsPerUrl` for full coverage. |

### Is it legal to scrape car listings?

Scraping publicly available listing data is legal in most jurisdictions, and this Actor only reads pages any visitor can open. It collects no personal data beyond what a seller published in a public advert. How you use the data, including under GDPR and CCPA, is your responsibility.

### FAQ

**Can I search without building a URL?** Yes — use the **Automotive Keyword Scraper**, which takes a make, a model or a keyword and a location, and searches every site for you.

**Can I scrape one specific car?** Use the **Automotive Vehicle Scraper** and paste the listing URLs.

**Can I mix marketplaces in one run?** Yes — paste URLs from any of the 31 sites; the `source` column tells them apart.

**Does it work with agents and MCP?** Yes. It runs over the standard Apify API, so any MCP client or agent framework with Apify support can call it and read the dataset.

**Can I export to CSV or Excel?** The dataset exports to JSON, CSV, Excel, XML and HTML, or streams over the API.

### Changelog

- **1.1** — 31 marketplaces; per-market currency and odometer units.
- **1.0** — Search URL scraping with schema.org Car output, pay-per-event pricing.

### Feedback

Found a marketplace worth covering, or a field empty where the page shows it? Open an issue on the Issues tab with the URL you used.

# Actor input Schema

## `searchUrls` (type: `array`):

Build the search on the site itself, with its own filters, then paste the resulting URL here. Those filters are honoured exactly as you built them, and every vehicle in the results is returned.

Works on Craigslist, CarMax, CarGurus, AutoTrader, cars.com, TrueCar, Carvana, Bring a Trailer and Hemmings in the United States; AutoTrader UK, Motors UK and Cinch in the United Kingdom; AutoScout24 across Europe; Leboncoin and La Centrale in France; Coches.net in Spain; Subito in Italy; Marktplaats in the Netherlands; Otomoto in Poland; Standvirtual in Portugal; Blocket in Sweden; Finn.no in Norway; Mobile.bg in Bulgaria; AutoTrader in Canada; Carsales and CarsGuide in Australia; Encar in South Korea; Goo-net in Japan; SgCarMart in Singapore; CarDekho in India; and MercadoLibre across Latin America. You can mix sites in one run. Paste URLs, add them in bulk, upload a file, or point at a Google Sheet.

If you would rather not build URLs by hand, use the Automotive Keyword Scraper instead — it takes a make, a model and filters, and searches every site for you.

## `maxResultsPerUrl` (type: `integer`):

Stop each search URL after this many vehicles.

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

Stop the whole run after this many vehicles. Leave empty for no overall limit.

## Actor input object example

```json
{
  "searchUrls": [
    {
      "url": "https://sfbay.craigslist.org/search/cta?auto_make_model=toyota%20camry&min_auto_year=2015"
    },
    {
      "url": "https://www.carmax.com/cars/toyota?zip=94086&radius=radius-50"
    },
    {
      "url": "https://www.autoscout24.de/lst/volkswagen/golf"
    }
  ],
  "maxResultsPerUrl": 100
}
```

# Actor output Schema

## `vehicles` (type: `string`):

Every vehicle found, as schema.org Car records.

# 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 = {
    "searchUrls": [
        {
            "url": "https://sfbay.craigslist.org/search/cta?auto_make_model=toyota%20camry&min_auto_year=2015"
        },
        {
            "url": "https://www.carmax.com/cars/toyota?zip=94086&radius=radius-50"
        },
        {
            "url": "https://www.autoscout24.de/lst/volkswagen/golf"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("e-commerce/automotive-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 = { "searchUrls": [
        { "url": "https://sfbay.craigslist.org/search/cta?auto_make_model=toyota%20camry&min_auto_year=2015" },
        { "url": "https://www.carmax.com/cars/toyota?zip=94086&radius=radius-50" },
        { "url": "https://www.autoscout24.de/lst/volkswagen/golf" },
    ] }

# Run the Actor and wait for it to finish
run = client.actor("e-commerce/automotive-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 '{
  "searchUrls": [
    {
      "url": "https://sfbay.craigslist.org/search/cta?auto_make_model=toyota%20camry&min_auto_year=2015"
    },
    {
      "url": "https://www.carmax.com/cars/toyota?zip=94086&radius=radius-50"
    },
    {
      "url": "https://www.autoscout24.de/lst/volkswagen/golf"
    }
  ]
}' |
apify call e-commerce/automotive-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,e-commerce/automotive-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/HqZudyEggO98WZvlN/builds/HpTMPIFsikPdqBTBm/openapi.json
