# Automotive Vehicle Scraper (`e-commerce/automotive-vehicle-scraper`) Actor

Paste vehicle listing URLs from 31 car marketplaces and get each one as a schema.org Car record with the full attribute set: VIN, mileage, price, fuel, transmission, body type, colour and dealer location. Export data, run via API, schedule and monitor runs, or integrate with other tools.

- **URL**: https://apify.com/e-commerce/automotive-vehicle-scraper.md
- **Developed by:** [E Commerce](https://apify.com/e-commerce) (Apify)
- **Categories:** E-commerce, Lead generation, Automation
- **Stats:** 2 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 Vehicle Scraper

Paste vehicle listing URLs from **31 car marketplaces** and get each car back as a [schema.org Car](https://schema.org/Car) record with the full attribute set — 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. Mix sites freely in one run: a CarMax link, an Otomoto advert and an Encar listing all land in the same columns.

### What does the Automotive Vehicle Scraper do?

- **Reads the vehicle's own page**, which is where VIN, engine, equipment, seller address and the full photo set live — deeper than any results page.
- **Takes URLs from 31 marketplaces** and normalises every one into a single schema.org `Car` shape, with a `source` column naming the site.
- **Keeps each market's own units.** Prices carry the site's ISO 4217 currency; odometers carry `SMI` for miles or `KMT` for kilometres. Nothing is silently converted.
- **Falls back gracefully.** Paste a search or category page by mistake and it is read as a listing, returning the vehicles on it rather than an error.
- **Returns everything the page exposes.** Nothing is de-duplicated or relevance-filtered, so your own matching rules stay yours.

### Which sites does it support?

**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 individual vehicle listings?

- **Enrich a shortlist.** You already have the URLs from a search, a spreadsheet or a colleague — this turns them into structured rows with VIN and full specs.
- **Watch specific cars.** Run the same URLs on a schedule and see price drops, status changes and removals.
- **Verify a VIN before buying.** Pull the seller's own stated mileage, condition, title status and equipment straight from the advert.
- **Build a comparison set.** Ten links from six countries, one dataset, each priced in its own currency.

### Quick start

1. Copy the address of any vehicle page from a supported marketplace.
2. Paste it into **Vehicle page URLs**. Add as many as you like, from as many sites as you like — or upload a file, or point at a Google Sheet.
3. Optionally set **Maximum vehicles**, which caps the run.
4. Click **Start** and export the dataset to JSON, CSV, Excel or XML.

### Input parameters

| Field | Type | Description |
| --- | --- | --- |
| `vehicleUrls` | array | Vehicle listing page URLs — one record per URL. Paste them, add them in bulk, upload a file, or point at a Google Sheet. Example: `https://www.carmax.com/car/70002037`. |
| `maxResultsPerUrl` | integer | Only applies when a URL turns out to be a model or search page rather than one vehicle, capping how many vehicles are taken from it. Default `100`. |
| `maxResults` | integer | Stop after this many vehicles. Optional — leave empty to scrape every URL you provided. |

Example vehicle URLs:

```
https://www.carmax.com/car/70002037
https://www.cargurus.com/details/453768925
https://www.otomoto.pl/osobowe/oferta/skoda-octavia-ID6I5urQ.html
```

### What data do you get?

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

| Field | Meaning |
| --- | --- |
| `source`, `name`, `url`, `description` | Marketplace, listing title, direct link, seller's text |
| `brand`, `model`, `vehicleModelDate` | Make, model, model year (first registration 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 stated |
| `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", "itemCondition": "excellent" },
    "vehicleTransmission": "Automatic",
    "sellerType": "dealer",
    "itemLocation": { "@type": "Place", "geo": { "latitude": 37.3492, "longitude": -121.9 } }
}
```

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

```bash
curl -X POST "https://api.apify.com/v2/acts/e-commerce~automotive-vehicle-scraper/runs?token=YOUR_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{"vehicleUrls":[{"url":"https://www.carmax.com/car/70002037"}]}'
```

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 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 URL returned nothing | Open it in a browser. Sold or withdrawn listings are removed by the marketplace, and there is nothing left on the page to read. |
| One URL returned many rows | That URL was a model or search page, not a single vehicle. It is read as a listing; `maxResultsPerUrl` caps how many come back. |
| `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, never converted. |
| Mileage looks wrong | Check `unitCode`: `SMI` is miles, `KMT` is kilometres. European and Asian sites publish kilometres. |
| `sellerType` is null | Not every marketplace distinguishes dealer from private seller. |
| The run stopped early | `maxResults` caps the whole run. Raise it, or leave it empty to scrape every URL. |
| A shortened or redirect link failed | Paste the final listing URL, not a share or tracking link. |

### Is it legal to scrape car listings?

Scraping publicly available listing data is legal in most jurisdictions, and this Actor reads only 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

**I don't have URLs yet.** Use the **Automotive Keyword Scraper** to search by make, model and location, or the **Automotive Search URL Scraper** to scrape a search page you already built.

**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.

**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, search-page fallback.
- **1.0** — Vehicle URL scraping, 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

## `vehicleUrls` (type: `array`):

Paste the address of any vehicle page and get that vehicle as one record.

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.

A search or category page is read as a listing instead, so pasting one returns the vehicles on it rather than nothing.

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

Only applies when a URL turns out to be a model or search page rather than a single vehicle, in which case this caps how many vehicles are taken from it.

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

Stop after this many vehicles. Leave empty to scrape every URL you provided.

## Actor input object example

```json
{
  "vehicleUrls": [
    {
      "url": "https://www.carmax.com/car/70002037"
    },
    {
      "url": "https://www.cargurus.com/details/453768925"
    },
    {
      "url": "https://www.otomoto.pl/osobowe/oferta/skoda-octavia-ID6I5urQ.html"
    }
  ],
  "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 = {
    "vehicleUrls": [
        {
            "url": "https://www.carmax.com/car/70002037"
        },
        {
            "url": "https://www.cargurus.com/details/453768925"
        },
        {
            "url": "https://www.otomoto.pl/osobowe/oferta/skoda-octavia-ID6I5urQ.html"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("e-commerce/automotive-vehicle-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 = { "vehicleUrls": [
        { "url": "https://www.carmax.com/car/70002037" },
        { "url": "https://www.cargurus.com/details/453768925" },
        { "url": "https://www.otomoto.pl/osobowe/oferta/skoda-octavia-ID6I5urQ.html" },
    ] }

# Run the Actor and wait for it to finish
run = client.actor("e-commerce/automotive-vehicle-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 '{
  "vehicleUrls": [
    {
      "url": "https://www.carmax.com/car/70002037"
    },
    {
      "url": "https://www.cargurus.com/details/453768925"
    },
    {
      "url": "https://www.otomoto.pl/osobowe/oferta/skoda-octavia-ID6I5urQ.html"
    }
  ]
}' |
apify call e-commerce/automotive-vehicle-scraper --silent --output-dataset

```

## MCP server setup

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