# Carwow UK Car Deals Scraper (`parseforge/carwow-scraper`) Actor

Scrape Carwow UK new, used and lease car deals: 79,390 live listings with price, deal score, specs, dealer contact and model level RRP, cash and PCP pricing.

- **URL**: https://apify.com/parseforge/carwow-scraper.md
- **Developed by:** [ParseForge](https://apify.com/parseforge) (community)
- **Categories:** E-commerce
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.45 / 1,000 stock car deals

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

[![ParseForge](https://raw.githubusercontent.com/ParseForge/apify-assets/main/banner.jpg)](https://apify.com/parseforge?fpr=vmoqkp)

### Carwow Scraper: UK Car Deals, Leasing and Used Cars

**Carwow lists 79,390 live cars in the UK right now, 22,867 new and 58,169 used, plus 6,444 leasing offers, and this scraper reads all of them.** Every row carries the price, Carwow's own deal score, the derivative and trim, transmission, fuel, engine size, mileage, registration year and the selling dealer's town and coordinates. No login, no API key, no browser. Exports to CSV, JSON, Excel and XML.

Carwow has no public API and its own site loads every card through a lazy turbo frame, so a normal HTML crawler comes back empty. This actor reads the frame endpoints directly, which is why it returns full rows at 4.4 rows per second on 512 MB of memory instead of driving a headless browser at 4 GB.

| Who uses it | What they scrape Carwow for |
| --- | --- |
| Car dealers | Watch what rival forecourts are asking for the same derivative |
| Leasing brokers | Track monthly rentals by contract length, mileage and initial payment |
| Price comparison sites | Feed a UK new and used car price index |
| Market analysts | Measure discount depth against manufacturer RRP, model by model |
| Fleet buyers | Compare cash, PCP and lease cost for a shortlist before tendering |

### What it does

- 🚗 **Live stock deals.** Every car in Carwow's inventory with price, deal score out of 10, deal rating, condition, derivative, transmission, fuel, engine litres, mileage, registration year, colour and its photo gallery, 41 images on average and up to 123.
- 📍 **Where the car is.** Supplier town plus latitude and longitude on every row, so you can map stock or compute distance yourself.
- 💷 **Model level pricing.** RRP, cash price, PCP finance price, representative APR and finance deposit contribution for every derivative of a model, with the CAP derivative id.
- 🏷️ **Leasing terms.** Contract length, annual mileage allowance, initial payment in months, trim, colour and whether it is a Carwow Leasey deal.
- 🧾 **Dealer and equipment detail.** Optional block adds the selling dealer's name, trading name, town, phone number and rating, the car's full feature list and standard equipment, and the dealer's own notes.
- ⭐ **Model cards.** Carwow's wowscore out of 10, the editorial one line description, average saving, from price and monthly price for each model.
- 🔍 **31 verified filters.** Make, model, new or used, availability, body style, fuel, transmission, doors, colour, must-have features, price range, mileage, engine size, boot space, electric range, 0-62 time, top speed band, Euro NCAP stars, seats, EV grant, lease terms and sort order.

### What you can do with Carwow data

**Track new car discounts over time.** The model deals pages carry both the manufacturer RRP and the Carwow cash price for every derivative. Run the model-deals mode daily and you have a discount curve per trim, which is the number that actually moves in the UK new car market.

**Build a UK leasing price index.** Leasing rows carry the monthly rental together with the exact contract that produced it: 48 months, 5,000 miles a year, 12 months upfront. Without those four numbers a monthly price is not comparable to anything, which is why most lease datasets are useless.

**Find mispriced used stock.** Carwow scores every used car it lists from 0 to 10 and labels it from High price to Amazing deal. Sort by deal score, filter by make and mileage, and you have a buying list that a dealer would otherwise build by hand.

**Map dealer inventory.** Every row carries the supplier's town and coordinates, and the optional detail block adds the dealership name and phone. That turns a price feed into a competitor map for any postcode area.

### Why choose this scraper

| | What you get |
| --- | --- |
| Coverage | All 79,390 live cars, not just the 150 cards on the curated deals page |
| Speed | 1,500 rows in 342 seconds on the platform, verified |
| Cost | $5.04 per 1,000 cars, pay per event, with no platform usage or proxy bill on top |
| Filters | 31 filters, each measured against Carwow's own facet counts before shipping |
| Honesty | Filters that do not actually filter were dropped rather than shipped |
| Depth | Four record types: stock deals, model derivative deals, model cards and makes |

### How it compares

Three other actors target Carwow. `miladamirzadeh/carwow-scraper` is free and has 2 monthly users. `getdataforme/carwow-category-scraper` reads category pages. Our own `parseforge/carwow-new-car-deals-scraper` reads the curated `/new-car-deals` page, which is 150 model cards. All three stop at the pages Carwow renders server side. This actor is the only one that reads the stock frame endpoints, which is where the other 79,000 cars live, and the only one that returns dealer contact details and per derivative RRP against cash and PCP price.

| | This actor | Curated deals page scrapers |
| --- | --- | --- |
| Rows available | 79,390 | about 150 |
| Used stock | Yes, 58,169 cars | No |
| Leasing terms | Contract length, mileage, upfront | No |
| Dealer name and phone | Optional block | No |
| RRP against cash and PCP | Yes | No |
| Deal score | Yes | No |

### What a Carwow deal looks like

One unedited row from the verified platform run:

```json
{
  "recordType": "stock-deal",
  "dealId": "d028013037d5cc2b1bb006ab8bc3d814",
  "url": "https://quotes.carwow.co.uk/deals/d028013037d5cc2b1bb006ab8bc3d814",
  "dealPageUrl": "https://quotes.carwow.co.uk/deals/d028013037d5cc2b1bb006ab8bc3d814",
  "dealType": "cash",
  "title": "Suzuki Swift",
  "makeName": "Suzuki",
  "make": "suzuki",
  "model": "Swift",
  "modelSlug": "Not Disclosed",
  "derivative": "1.2 SZ-L Navigation",
  "trim": "Not Disclosed",
  "engineName": "Not Disclosed",
  "condition": "Used",
  "dealScore": null,
  "dealScoreLabel": "High price",
  "price": 9650,
  "priceCurrency": "GBP",
  "priceBasis": "total",
  "priceText": "£9,650",
  "monthlyPrice": null,
  "transmission": "Manual",
  "fuel": "Petrol",
  "engineLitres": 1.2,
  "colour": "Not Disclosed",
  "registrationYear": 2016,
  "mileage": 16772,
  "contractLengthMonths": null,
  "annualMileage": null,
  "upfrontMonths": null,
  "leaseyDeal": "No",
  "supplierTown": "Nacton",
  "supplierLatitude": 52.0271888,
  "supplierLongitude": 1.2330645,
  "imageUrl": "https://carwow-uk-0.imgix.net/stock-car-custom-images/original/80bc9a6a-361d-62bc-2e59-d7ad444b3346?auto=format&cs=tinysrgb&fit=clip&ixlib=rb-1.1.0&q=60&w=450",
  "scrapedAt": "2026-09-08T14:20:14.532Z",
  "error": null
}
```

Fields that read `Not Disclosed` are the ones Carwow only publishes on leasing offers: model slug, trim, engine name and colour. `dealScore` is null here because Carwow only scores used stock, and this row is a used car it rates as a high price.

### Configure the run

Pick a mode, then narrow it with filters. Leaving a filter empty skips it, and every filter here was measured against Carwow's own counts, so a filter that appears in the schema really does change the result set.

Cheapest electric SUVs on a four year lease:

```json
{
  "scrapeMode": "stock-deals",
  "dealType": "leasing",
  "fuels": ["electric"],
  "bodyStyles": ["suv"],
  "contractLengths": ["48"],
  "sortBy": "offer",
  "maxItems": 500
}
```

Every BMW derivative with its RRP, cash price and PCP price:

```json
{
  "scrapeMode": "model-deals",
  "makeSlug": "bmw",
  "maxItems": 1000
}
```

Used cars under 20,000 miles with heated seats and a dealer phone number:

```json
{
  "scrapeMode": "stock-deals",
  "vehicleState": "used",
  "maxMileage": 20000,
  "features": ["heated-seats"],
  "includeDealDetails": true,
  "maxItems": 2000
}
```

One thing worth knowing: Carwow's listing endpoint stops at 100 pages of 100 rows, so a single filter combination tops out at 10,000 rows. Past that it silently repeats the last page instead of returning empty. To sweep the whole inventory, run one job per make: each make gets its own 10,000 row window and no make is anywhere near it.

### Pricing

Pay per event. You pay for the rows you get, nothing else: no platform usage on top, no proxy bill, no compute surprise.

| Event | Price | Charged |
| --- | --- | --- |
| Stock deal | $0.005 | One live stock car: price, deal score, derivative, specs, mileage, supplier town and coordinates, photo gallery |
| Model derivative deal | $0.005 | One derivative with RRP, cash price, PCP finance price, representative APR and deposit contribution |
| Model card | $0.004 | One model card with wowscore, average saving, from price and monthly price |
| Make | $0.002 | One make in the brand index |
| Search page | $0.004 | One listing page of up to 100 deals. This is what paginating costs, so the price per car stays flat |
| Dealer and equipment detail | $0.003 | Only when `includeDealDetails` is on: dealer name, phone, rating, full feature list, standard equipment and dealer notes |
| Actor start | $0.002 | Once per run. Apify charges one start event per GB of memory; this actor is capped at 1 GB, so it is always exactly one |

**1,000 stock cars cost $5.04**: 1,000 rows plus the 10 search pages that produced them plus the start. With the dealer and equipment block on, $8.04. A 10,000 row sweep of one make is $50.24.

Row prices drop with your Apify plan: Bronze −3.8%, Silver −7.4%, Gold, Platinum and Diamond −11%, so 1,000 cars are $4.49 on Gold. The start event drops to $0.0002 on any paid plan.

Every charge happens after the row is written to the dataset, and the run stops paginating when it reaches the cost limit you set, so a capped run never bills for rows you did not receive.

### Free users

Free plan accounts are capped at 10 rows per run so the actor stays previewable. Paid accounts run up to 1,000,000 rows. Create a free account with $5 of credit at [console.apify.com](https://console.apify.com/sign-up?fpr=vmoqkp).

### Run it

1. Create a free Apify account, which comes with $5 of platform credit.
2. Open the actor, pick a mode and set `maxItems`.
3. Add filters. Start with `makeSlug` and `vehicleState`, then narrow.
4. Run it, then export the dataset as CSV, JSON, Excel or XML.

### Use with AI agents (MCP)

```
claude mcp add apify --transport sse https://mcp.apify.com/sse?actors=parseforge/carwow-scraper
```

Then ask in plain language:

- "Find the ten cheapest electric SUV lease deals on Carwow with a 48 month contract."
- "List every BMW 1 Series derivative with its RRP and its PCP price."
- "Which used Fords under 30,000 miles does Carwow rate as an amazing deal?"

### Troubleshooting

**No results at all.** The most common cause is a `modelSlug` that does not exist. Carwow validates make and model exactly. Run the `makes` mode to get the 50 valid make slugs, then the `model-cards` mode for that make to get its model slugs.

**Fewer rows than I asked for.** Either the filter combination has fewer matches than `maxItems`, or you hit the 10,000 row ceiling on one filter combination. Split the job by make.

**A field is empty.** Model slug, trim, engine name, colour and the lease terms only exist on leasing offers. Deal score and rating only exist on used stock. Mileage and registration year only exist on used cars. These are gaps in what Carwow publishes, not parser bugs.

**The run is slow.** Every row is a separate request to Carwow, because Carwow itself loads each card that way. Measured at 4.4 rows per second without the detail block and 2.5 with it, so roughly 5,000 rows inside the default 1,200 second timeout. Raise the timeout for bigger jobs.

**Dealer details are missing.** `includeDealDetails` is off by default. Turn it on to get dealer name, phone, town, rating, features and standard equipment.

### FAQ

| Question | Answer |
| --- | --- |
| Do I need a Carwow account? | No. Everything this actor reads is public and anonymous. |
| Does it use a proxy? | No. Carwow serves plain HTTP with no block, so the actor pays for no proxy. |
| How many cars can I get? | 79,390 are listed. One filter combination tops out at 10,000, so sweep by make. |
| How fresh is the data? | It reads Carwow live at run time. Every row carries `scrapedAt`. |
| Can I get new cars only? | Yes, set `vehicleState` to `new`. That is 22,867 cars. |
| Can I get lease prices? | Yes, set `dealType` to `leasing`. That is 6,444 offers with full contract terms. |
| Why is `postcode` not a filter? | It was tested and dropped. London and Edinburgh return identical results, so Carwow applies distance in the browser, not on the server. |
| What is a wowscore? | Carwow's editorial rating of the model out of 10. It appears on model card rows. |
| What is a deal score? | Carwow's algorithmic rating of an individual used listing out of 10, from High price to Amazing deal. |
| Can it scrape vans? | Not yet. Carwow serves vans under a separate vehicle type and this actor targets cars. |

### Related actors

- [Auto Trader UK Listings Scraper](https://apify.com/parseforge/auto-trader-uk-scraper?fpr=vmoqkp)
- [PistonHeads UK Car Classifieds Scraper](https://apify.com/parseforge/pistonheads-scraper?fpr=vmoqkp)
- [Gumtree Cars Scraper](https://apify.com/parseforge/gumtree-cars-scraper?fpr=vmoqkp)
- [Carvana Scraper](https://apify.com/parseforge/carvana-scraper?fpr=vmoqkp)
- [Kelley Blue Book Scraper](https://apify.com/parseforge/kelley-blue-book-scraper?fpr=vmoqkp)

Browse the full [ParseForge collection](https://apify.com/parseforge?fpr=vmoqkp) for more scrapers.

Need help? Email parseforge@protonmail.com with your run ID, your input, and what you expected.

Disclaimer: this is an unofficial scraper and is not affiliated with, endorsed by or connected to Carwow Ltd. It reads only data that Carwow publishes anonymously to any visitor, and collects no personal data about consumers. Dealer contact details are business contact information published on Carwow's own listings. Users are responsible for their own compliance with GDPR, CCPA and PIPL when storing or reusing the output.

# Actor input Schema

## `scrapeMode` (type: `string`):

Stock deals reads Carwow's live inventory of 79,390 cars. Model deals reads the RRP, cash and PCP price of every derivative of a model. Model cards reads the wowscore and average saving per model. Makes lists the 50 brands Carwow sells.

## `startUrls` (type: `array`):

Optional carwow.co.uk pages to scrape instead of the search. Accepts /brands/deals, /{make}/deals, /{make}/{model}/deals and the curated /new-car-deals landing pages. Leave empty to use the filters below.

## `maxItems` (type: `integer`):

Free users: limited to 10 items (preview). Paid users: up to 1,000,000.

## `dealType` (type: `string`):

Cash and finance stock (79,390 cars) or leasing offers (6,444). Carwow only splits its inventory these two ways.

## `makeSlug` (type: `string`):

Brand to search. Carwow validates this exactly, so only its 50 published slugs work. Also used as the starting point in the model deals, model cards and makes modes.

## `modelSlug` (type: `string`):

Carwow model slug, as it appears in the URL, for example 1-series, qashqai or model-3. Needs a make to be set as well.

## `vehicleState` (type: `string`):

New (22,867 cars) or used (58,169). Any covers both.

## `availability` (type: `string`):

In stock (76,431 cars) means ready now, factory order (3,863) means built to order.

## `bodyStyles` (type: `array`):

One or more body styles. Leave empty for all.

## `fuels` (type: `array`):

One or more fuel types. Leave empty for all.

## `transmissions` (type: `array`):

One or more transmissions. Leave empty for all.

## `doorCategories` (type: `array`):

Front and rear doors, or front doors only. Leave empty for all.

## `colours` (type: `array`):

One or more paint colours. Leave empty for all.

## `features` (type: `array`):

Only cars carrying all of the selected features. Leave empty for all.

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

Lowest asking price for buying, or lowest monthly payment for leasing.

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

Highest asking price for buying, or highest monthly payment for leasing.

## `maxMileage` (type: `integer`):

Highest odometer reading in miles. Only meaningful on used stock.

## `minEngineLitres` (type: `number`):

Smallest engine badge size, for example 1.5. Decimals are kept.

## `maxEngineLitres` (type: `number`):

Largest engine badge size, for example 2.0. Decimals are kept.

## `minBootSpace` (type: `integer`):

Smallest boot capacity in litres.

## `minElectricRange` (type: `integer`):

Smallest quoted electric range. Only applies to electric and hybrid cars.

## `maxZeroToSixty` (type: `number`):

Slowest acceptable acceleration figure, for example 7.5.

## `topSpeedBand` (type: `string`):

Carwow only exposes top speed as these four bands.

## `minSafetyRating` (type: `string`):

Lowest acceptable Euro NCAP safety rating.

## `minSeats` (type: `string`):

Fewest seats the car must have.

## `maxSeats` (type: `string`):

Most seats the car may have.

## `evGrantOnly` (type: `boolean`):

Only cars eligible for the UK Electric Car Grant. Carwow currently flags very few, so this narrows the search hard.

## `sortBy` (type: `string`):

Buying accepts recommended, price low to high, price high to low, mileage, newest and oldest. Leasing accepts best match, monthly price both ways, best deal score and lowest initial payment. A value the chosen deal type does not support is ignored by Carwow.

## `contractLengths` (type: `array`):

Leasing only. Carwow publishes 24, 36 and 48 month contracts.

## `annualMileages` (type: `array`):

Leasing only. Contract mileage allowance per year.

## `upfrontMonths` (type: `array`):

Leasing only. Initial payment expressed as a multiple of the monthly rental.

## `leaseType` (type: `string`):

Leasing only. Personal contract hire or business contract hire.

## `maintenanceIncluded` (type: `boolean`):

Leasing only. Restrict to contracts that bundle servicing and maintenance.

## `leaseyOnly` (type: `boolean`):

Leasing only. Restrict to Carwow's own Leasey offers rather than broker listings.

## `includeDealDetails` (type: `boolean`):

Adds the selling dealer's name, phone number, town and rating plus the car's full feature and standard equipment list. Costs one extra request per row, so it roughly doubles the run time.

## Actor input object example

```json
{
  "scrapeMode": "stock-deals",
  "startUrls": [],
  "maxItems": 10,
  "dealType": "cash",
  "makeSlug": "",
  "vehicleState": "all",
  "availability": "all",
  "topSpeedBand": "",
  "minSafetyRating": "",
  "minSeats": "",
  "maxSeats": "",
  "evGrantOnly": false,
  "sortBy": "",
  "leaseType": "",
  "maintenanceIncluded": false,
  "leaseyOnly": false,
  "includeDealDetails": false
}
```

# Actor output Schema

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

No description

## `csv` (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 = {
    "startUrls": [],
    "maxItems": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("parseforge/carwow-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 = {
    "startUrls": [],
    "maxItems": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("parseforge/carwow-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 '{
  "startUrls": [],
  "maxItems": 10
}' |
apify call parseforge/carwow-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,parseforge/carwow-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/jdgfZaT5tvrP6gyf6/builds/6d4CnaK6ffXiCcdhm/openapi.json
