# Automotive Keyword Scraper (`e-commerce/automotive-keyword-scraper`) Actor

Search 31 car marketplaces worldwide by make, model or keyword and get every result as a schema.org Car record: VIN, mileage, price, fuel, transmission and seller location. No URL building needed. Export data, run via API, schedule and monitor runs, or integrate with other tools.

- **URL**: https://apify.com/e-commerce/automotive-keyword-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, 0.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 Keyword Scraper

Search **31 car marketplaces** by make, model or free-text keyword and get every result 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 and coordinates. No URL building: give a make, a model and a place, and each site is searched in its own catalogue, currency and unit.

### What does the Automotive Keyword Scraper do?

- **Searches by make and model, not by URL.** Both are matched against each site's own catalogue, so you needn't know how it spells a trim.
- **Runs 31 sites in one job.** One dataset, with a `source` column naming each record's marketplace.
- **Converts filters into each market's terms.** A $30,000 ceiling goes to Goo-net in yen and CarDekho in rupees; a 100,000-mile limit goes to Europe in kilometres, rounded up so it never tightens.
- **Filters at the source.** Year, price, mileage, transmission, fuel, condition, title status and seller type are applied by the marketplace itself.
- **Returns everything the listing exposes.** Nothing de-duplicated or relevance-filtered.

### Which sites does it search?

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

Craigslist is searched one region at a time: all **707 areas** are selectable, and the 544 that returned vehicles in a full sweep are listed first.

### Why search car marketplaces by keyword?

- **Sweep a model across countries at once.** One search hits US, UK, European and Asian sites in a single run.
- **Track what a model sells for.** The same search on a schedule, diffed day over day.
- **Source inventory.** Filter to dealer or private, clean or salvage title, with seller location where published.
- **Build a pricing dataset.** VIN, year, odometer and price across thousands of listings, already in one shape.

### Quick start

1. Enter a **Make** and **Model** — Toyota and Camry — or a **Keyword** like `ford f-150 diesel`.
2. Pick your **Sites to search**. Default: CarMax, CarGurus, cars.com.
3. Add a **Location** in the site's own form: `94086`, `SW1A 1AA`, `M5V 3L9`, `warszawa`, `서울`.
4. Add filters — year, price, mileage, transmission, fuel, condition.
5. Click **Start** and export to JSON, CSV, Excel or XML.

### Input parameters

| Field | Type | Description |
| --- | --- | --- |
| `make` / `model` | string | Vehicle make and model, matched against each site's own catalogue. Example: `Toyota` / `Camry`. |
| `keywords` | array | Free-text search, e.g. `toyota camry` or `ford f-150 diesel`. Use instead of, or with, make and model. |
| `sources` | array | Which of the 31 marketplaces to search. Default: `carmax`, `cargurus`, `cars-com`. |
| `zipCodes` | array | Where to search, in the site's own format: `94086`, `SW1A 1AA`, `M5V 3L9`, `mazowieckie`. A US ZIP is never sent to a UK site. |
| `distanceMiles` | integer | Radius in miles from each location. Empty searches as wide as the site allows. |
| `craigslistRegions` | array | Required when Craigslist is selected — one or more of its 707 regions, e.g. `sfbay`. |
| `yearFrom` / `yearTo` | integer | Model year range, e.g. `2015` to `2020`. |
| `priceMin` / `priceMax` / `priceCurrency` | integer / string | Price range in `USD`, `EUR`, `GBP`, `SEK`, `NOK`, `PLN`, `CAD`, `AUD`, `JPY`, `KRW`, `SGD`, `INR`, `CHF`, `BRL` or `MXN`. Default `USD`, converted per site. |
| `mileageMax` / `mileageUnit` | integer / string | Odometer ceiling in `mi` or `km`. Default `mi`, converted per site and rounded up. |
| `transmission` / `fuelType` | string | `automatic`, `manual` / `gas`, `hybrid`, `diesel`, `electric`. |
| `condition` / `titleStatus` / `sellerType` | string | `new`, `used`, `certified` / `clean`, `salvage`, `rebuilt` / `dealer`, `owner`. Not every site publishes title status, and most are dealer-only. |
| `detail` | string | `full` opens each vehicle's own page for VIN, engine and seller address. `fast` stays on the results page. Default `full`. |
| `maxResultsPerUrl` / `maxResults` | integer | Cap per keyword-and-site pair (default `100`), and for the whole run (optional). |

### 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": "CarGurus",
    "@type": "Car",
    "name": "2015 Toyota Camry LE 4dr Sedan",
    "url": "https://www.cargurus.com/details/453768925",
    "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" },
    "bodyType": "Sedan",
    "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-keyword-scraper/runs?token=YOUR_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{"make":"Toyota","model":"Camry","sources":["carmax","cargurus"],"zipCodes":["94086"],"yearFrom":2015}'
```

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 |
| --- | --- |
| Craigslist returned nothing | It searches one region at a time. Pick at least one **Craigslist region** — a location alone is not enough. |
| AutoTrader UK or Motors UK was skipped | Both refuse to search without a UK postcode. Add one, e.g. `SW1A 1AA`. |
| One site is empty, others returned data | Check the run log — every skipped site says why by name. |
| Total lower than expected across many sites | `maxResults` caps the whole run and the earlier sites take it first. Set it above `sites x maxResultsPerUrl`, or leave it empty. |
| VIN, engine or seller address missing | Set **Detail level** to `full`. `fast` reads only the results page. |
| `vehicleIdentificationNumber` is still null | Not every site publishes a VIN. AutoScout24 and AutoTrader UK do not; CarMax, CarGurus, cars.com and Carvana do. |
| Price or mileage off by orders of magnitude | Check `priceCurrency` and `unitCode` — output values are the site's own, never converted. |

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

**Already built a search on the site?** Use the **Automotive Search URL Scraper**, which keeps the page's own filters. To scrape cars you already found, use the **Automotive Vehicle Scraper**.

**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, 707 Craigslist regions, per-market currency and mileage conversion.
- **1.0** — Keyword search, 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 input you used.

# Actor input Schema

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

Vehicle make, for example Toyota. Each site matches this against its own make list.

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

Vehicle model, for example Camry. Needs a make to be useful.

## `keywords` (type: `array`):

Optional free-text search, for example "toyota camry" or "ford f-150 diesel". Leave it empty and use the filters below instead, or combine the two. Each vehicle found comes back as a schema.org Car record with everything the listing exposes.

## `sources` (type: `array`):

Pick one or more sites. Each is searched separately and the results land in one dataset, with a "source" column saying where each vehicle came from. Prices come back in each site's own currency, and distances in its own unit.

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

Where to search, in whatever form the site uses: a United States or Australian postcode (94086, 2000), a United Kingdom or Canadian postcode (SW1A 1AA, M5V 3L9), a Polish city or region (warszawa, mazowieckie) or a Korean region (서울). Add several to search several places, and a site only gets the ones its own market uses — a United States postcode is not sent to a United Kingdom site, which would return nothing, so that site is searched nationwide instead. AutoTrader United Kingdom and Motors United Kingdom need a United Kingdom postcode to search at all. Leave it empty to search as widely as each site allows. Craigslist ignores this and uses its own region sites, below.

## `distanceMiles` (type: `integer`):

Miles from each postcode above. Leave empty to search as wide as the site allows. Craigslist needs a postcode for this to apply.

## `craigslistRegions` (type: `array`):

Only used when Craigslist is one of the sites above, and required for it, because Craigslist searches one regional site at a time. Pick as many regions as you like.

The list is Craigslist's own, from its published area reference, so every entry is a real Craigslist site. All 707 were swept on 31 July 2026: 544 returned vehicles and 163 returned none, and the empty ones are marked "no vehicles found" and sorted to the bottom. They are kept selectable because inventory comes and goes — a region with nothing today may have listings next month. Coverage is strongest in the United States (all 413 regions returned vehicles), Canada (52 of 55) and the United Kingdom (24 of 27); it is thin across much of Asia, Europe and South America, where Craigslist keeps sites running with almost no cars on them.

## `yearFrom` (type: `integer`):

Oldest model year to include.

## `yearTo` (type: `integer`):

Newest model year to include.

## `priceMin` (type: `integer`):

In dollars.

## `priceMax` (type: `integer`):

In dollars.

## `priceCurrency` (type: `string`):

The currency your minimum and maximum price are in. Each site is searched in its own currency — a limit of 30,000 US dollars is sent to Goo-net as yen and to CarDekho as rupees, converted at the European Central Bank daily rate and rounded outward so the limit never tightens. The run log states the converted figure per site.

## `mileageMax` (type: `integer`):

In miles.

## `mileageUnit` (type: `string`):

The unit your maximum mileage is in. Sites are searched in their own unit — miles in the United States and United Kingdom, kilometres elsewhere — converted and rounded up so the limit never tightens.

## `transmission` (type: `string`):

Leave empty for any.

## `fuelType` (type: `string`):

Leave empty for any.

## `condition` (type: `string`):

Leave empty for any.

## `titleStatus` (type: `string`):

Leave empty for any. Not every site publishes this.

## `sellerType` (type: `string`):

Leave empty for any. Craigslist splits owner and dealer; most sites are dealer-only.

## `detail` (type: `string`):

Full detail opens each vehicle's own page, which is where VIN, engine, equipment, seller address and the full photo set live — one request per vehicle, so thousands of cars take a while. Fast takes whole pages of search results instead: tens of requests rather than thousands, with the fields the search page carries. Use fast for a broad sweep or a demo, full when the detail matters.

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

Stop each keyword-and-site combination 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
{
  "make": "Toyota",
  "model": "Camry",
  "keywords": [
    "toyota camry"
  ],
  "sources": [
    "carmax",
    "cargurus",
    "cars-com"
  ],
  "zipCodes": [
    "94086",
    "60601"
  ],
  "craigslistRegions": [
    "sfbay.craigslist.org",
    "london.craigslist.org"
  ],
  "yearFrom": 2015,
  "priceMax": 30000,
  "priceCurrency": "USD",
  "mileageMax": 100000,
  "mileageUnit": "mi",
  "detail": "full",
  "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 = {
    "make": "Toyota",
    "model": "Camry",
    "keywords": [
        "toyota camry"
    ],
    "zipCodes": [
        "94086"
    ],
    "craigslistRegions": [
        "sfbay"
    ],
    "yearFrom": 2015,
    "priceMax": 30000,
    "mileageMax": 100000
};

// Run the Actor and wait for it to finish
const run = await client.actor("e-commerce/automotive-keyword-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 = {
    "make": "Toyota",
    "model": "Camry",
    "keywords": ["toyota camry"],
    "zipCodes": ["94086"],
    "craigslistRegions": ["sfbay"],
    "yearFrom": 2015,
    "priceMax": 30000,
    "mileageMax": 100000,
}

# Run the Actor and wait for it to finish
run = client.actor("e-commerce/automotive-keyword-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 '{
  "make": "Toyota",
  "model": "Camry",
  "keywords": [
    "toyota camry"
  ],
  "zipCodes": [
    "94086"
  ],
  "craigslistRegions": [
    "sfbay"
  ],
  "yearFrom": 2015,
  "priceMax": 30000,
  "mileageMax": 100000
}' |
apify call e-commerce/automotive-keyword-scraper --silent --output-dataset

```

## MCP server setup

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