# Wallapop Cars Scraper: Used Cars & Dealer Leads (ES, IT, PT) (`epicscrapers/wallapop-cars-scraper`) Actor

Scrape Wallapop used-car listings with car filters: brand, model, year, km, engine, gearbox, horsepower, price and seller type. Get dealer contacts (phone, website, rating) for lead generation in Spain, Italy and Portugal. From $0.35 per 1,000 cars.

- **URL**: https://apify.com/epicscrapers/wallapop-cars-scraper.md
- **Developed by:** [Epic Scrapers](https://apify.com/epicscrapers) (community)
- **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 $0.35 / 1,000 car listing saveds

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?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

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

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Wallapop Cars Scraper

Scrape **used-car listings from Wallapop** in Spain, Italy and Portugal, with real car filters and
dealer contacts, including each dealer's legal name, email and business registration number.

This Actor talks to Wallapop's app JSON API directly, so results come as clean structured data:
brand, model, version, year, mileage, engine, gearbox, horsepower, price, location and seller.

### What you get

- **Car-specific columns**: `brand`, `model`, `version`, `year`, `km`, `engine`, `gearbox`,
  `horsepower` on every row, straight from the search results.
- **Verified car filters**: brand, model, year range, kilometre range, engine (diesel, gasoline,
  hybrid, plug-in hybrid, electric, LPG, CNG), gearbox (manual, automatic, semi-automatic),
  horsepower range, body type, colour, doors, seats, warranty and seller type. Filters are sent to
  Wallapop itself, so pagination stays consistent.
- **Dealer leads**: with *seller info* enabled, professional sellers come with name, business type,
  rating, review count, phone, website, address and the trader disclosure (legal name, email,
  registration number).
- **Details and seller info**: views, favorites, body type, doors, seats, eco label and warranty
  months can be added per listing.
- **Three markets**: Spain (es.wallapop.com), Italy (it.) and Portugal (pt.).

| Use case                         | How                                                                  |
| -------------------------------- | -------------------------------------------------------------------- |
| Price research by model and year | Filter by brand + model + year range, sort by price                  |
| Dealer lead generation           | `sellerType: professional` + seller info on → phone, website, rating |
| Market monitoring for buying     | Keywords like `golf gti` + max km, sorted by newest, scheduled daily |
| Listing freshness                | `postedWithin` + `newest` sort on a schedule                         |

### Quick start

1. Add one or more **keywords** (e.g. `golf gti`), or leave them empty to browse the whole Cars
   category with your filters.
2. Set **car filters** (brand, model, year, km, engine, gearbox, price…).
3. Pick a **country** (Spain, Italy or Portugal) or narrow it to a city.
4. Turn on **Include seller info** for dealer leads, and **Include listing details** for the full
   car spec.
5. Run and export the dataset to CSV, Excel or JSON.

You can also paste Wallapop URLs into **startUrls**: car search URLs from your browser (their
filters are kept) and single listing URLs.

### Input

| Field                            | Type         | Description                                                                                         |
| -------------------------------- | ------------ | --------------------------------------------------------------------------------------------------- |
| `keywords`                       | list         | One search per keyword, e.g. `golf gti`, `bmw 320d`. Empty = whole Cars category.                   |
| `startUrls`                      | list         | Wallapop search or listing URLs (`es.`, `it.`, `pt.wallapop.com`).                                  |
| `maxItemsPerSearch`              | integer      | Cars saved per search. Default `100`, `0` = no limit.                                               |
| `country`                        | select       | `ES` (default), `IT`, `PT`.                                                                         |
| `city`                           | select       | Search around a city instead of the whole country.                                                  |
| `radiusKm`                       | integer      | Distance limit around the city or your coordinates.                                                 |
| `latitude`, `longitude`          | string       | Custom search point (overrides the city).                                                           |
| `brand`                          | string       | e.g. `Volkswagen`, `Fiat`, `BMW`.                                                                   |
| `model`                          | string       | e.g. `Golf`, `Panda`. Best with a brand.                                                            |
| `minYear`, `maxYear`             | integer      | First registration year range.                                                                      |
| `minKm`, `maxKm`                 | integer      | Mileage range.                                                                                      |
| `minPrice`, `maxPrice`           | integer      | Price range in EUR.                                                                                 |
| `engine`                         | multi-select | `Diesel`, `Gasoline`, `Hybrid`, `Hybrid plug-in`, `Electric`, `LPG`, `CNG`, `Others`.               |
| `gearbox`                        | select       | `Manual`, `Automatic`, `Semi-automatic`, or empty.                                                  |
| `sellerType`                     | select       | `Private`, `Professional` (dealers), or empty.                                                      |
| `bodyType`                       | select       | Compact, Coupe/Cabrio, Sedan, Estate, Minivan, SUV/4X4, Van, Convertible, Pickup, Others, or empty. |
| `color`                          | select       | Colour filter (`black`, `white`, `red`, …), or empty.                                               |
| `hasWarranty`                    | boolean      | Only cars with a warranty of at least 1 year.                                                       |
| `minHorsepower`, `maxHorsepower` | integer      | Engine power range in HP.                                                                           |
| `minSeats`, `maxSeats`           | integer      | Seat count range.                                                                                   |
| `minDoors`, `maxDoors`           | integer      | Door count range.                                                                                   |
| `postedWithin`                   | select       | Wallapop's own date filter (uses the last-modified date).                                           |
| `sortBy`                         | select       | Relevance, Newest, Closest, Price low→high, Price high→low.                                         |
| `includeDetails`                 | boolean      | One extra request per car: views, body type, doors, seats, eco label, warranty.                     |
| `includeSellerInfo`              | boolean      | One extra request per car: seller profile, rating and dealer contacts.                              |

### Output example

```json
{
    "id": "4z48xlkkmvjy",
    "url": "https://es.wallapop.com/item/volkswagen-golf-5p-last-edition-1297257810",
    "title": "Volkswagen Golf 5p Last Edition 1.5 TSI EVO BM 96 kW",
    "price": 13990,
    "currency": "EUR",
    "brand": "Volkswagen",
    "model": "Golf",
    "version": "5p Last Edition 1.5 TSI EVO BM 96 kW",
    "year": 2020,
    "km": 189538,
    "engine": "Gasoline",
    "gearbox": "Manual",
    "horsepower": 130,
    "bodyType": "Sedan",
    "doors": 5,
    "seats": 5,
    "ecoLabel": "C Badge",
    "warrantyMonths": 12,
    "attributes": { "brand": "Volkswagen", "km": "189538 km", "engine": "Gasoline" },
    "city": "Madrid",
    "region": "Comunidad de Madrid",
    "countryCode": "ES",
    "distanceKm": 12.4,
    "isReserved": false,
    "createdAt": "2026-06-01T10:20:30.000Z",
    "sellerId": "7v6g4op80l6e",
    "sellerName": "Autos del Sur",
    "sellerIsPro": true,
    "sellerBusinessType": "Shop",
    "sellerPhone": "600 123 456",
    "sellerWebsite": "https://autosdelsur.example.com",
    "sellerAddress": "C/ Ejemplo 1, Madrid",
    "sellerLegalName": "Autos del Sur SL",
    "sellerRating": 4.8,
    "sellerResponseRate": 95,
    "searchKeyword": "golf gti"
}
```

`bodyType`, `doors`, `seats`, `ecoLabel` and `warrantyMonths` come from the listing details (they
are only on the detail endpoint); `sellerName`/`sellerPhone`/… only when seller info is enabled.

### Notes on values

- Filter values are sent to Wallapop's API exactly as the app sends them. Only values verified
  against the API are offered; unknown values would be silently ignored or rejected with 400.
- `brand` and `model` are free text and case-insensitive; a brand Wallapop doesn't know simply
  returns no results.
- With `includeDetails`, `warrantyMonths` is the warranty advertised by the seller (when present).

### Italy and Portugal

Without a radius, `newest` and price sorts ignore the search point and return mostly Spanish
listings. Italy and Portugal searches therefore get a radius around the country centre, and
results are additionally filtered to the requested country. A whole-country search can take a few
minutes; a city search is much faster. Use `city` (e.g. `milano`, `lisboa`) when you can.

### Scheduling

Wallapop searches return the most relevant results first — use `sortBy: newest` with a daily
schedule to catch every new listing without re-scraping old ones. `maxItemsPerSearch: 0` removes
the limit if a market moves fast.

### Pricing

This Actor uses pay-per-event pricing. You are charged per saved car (`listing`), and per
successfully added detail (`listing-detail`) or seller info (`seller-info`) when those options are
on. A small one-time charge applies at the start of each run. See the pricing table on the Actor
page for exact amounts.

### FAQ

**Does it work outside Spain?** Yes — Italy (`it.wallapop.com`) and Portugal (`pt.wallapop.com`)
are supported via the `country` input or `it.`/`pt.` URLs.

**Can I scrape only dealer cars?** Yes, set `sellerType: professional` and turn on seller info;
dealers expose phone, website and address.

**Can I follow my own saved searches?** Yes, paste the search URL from your browser into
`startUrls` — every filter in the URL is reused.

**Why do some rows lack body type or doors?** Those fields only exist on the listing detail
endpoint; enable *Include listing details* to fill them.

### Related Actors

- [Wallapop Scraper](https://apify.com/epicscrapers/wallapop-scraper) — any category, keyword
  searches and listings across all three markets.
- [Wallapop Seller Scraper](https://apify.com/epicscrapers/wallapop-seller-scraper) — full seller
  inventories, profiles and reviews.

# Actor input Schema

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

What to search for, one search per keyword (for example `golf gti` or `bmw 320d`). Leave empty to browse the whole Cars category with the filters below.

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

Paste search URLs from your browser (all filters in the URL are kept) or listing URLs (`wallapop.com/item/...`). Works with es., it. and pt.wallapop.com.

## `maxItemsPerSearch` (type: `integer`):

Cars saved per keyword or search URL. `0` means no limit.

## `country` (type: `string`):

Wallapop market to search. Results are limited to this country unless you set your own latitude and longitude.

## `city` (type: `string`):

Search around a city instead of the whole country. The city sets the country. Radius defaults to 30 km.

## `radiusKm` (type: `integer`):

Only cars within this distance of the city or your coordinates. Leave empty for the default (whole country, or 30 km around a city).

## `latitude` (type: `string`):

Custom search point, for example `40.4168`. Overrides the city. Set longitude too.

## `longitude` (type: `string`):

Custom search point, for example `-3.7038`.

## `brand` (type: `string`):

Car make, for example `Volkswagen`, `Fiat` or `BMW`. Case does not matter.

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

Model name, for example `Golf` or `Panda`. Best used together with the brand.

## `minYear` (type: `integer`):

First registration year, for example `2018`.

## `maxYear` (type: `integer`):

Last registration year.

## `minKm` (type: `integer`):

Minimum mileage.

## `maxKm` (type: `integer`):

Maximum mileage, for example `120000`.

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

In the country's currency (EUR).

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

In the country's currency (EUR).

## `engine` (type: `array`):

Only cars with these fuel types. Leave empty for all.

## `gearbox` (type: `string`):

Only cars with this gearbox. Leave empty for all.

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

Only cars sold by private sellers or by professional dealers. Leave empty for all.

## `bodyType` (type: `string`):

Only cars with this body type. Leave empty for all.

## `color` (type: `string`):

Only cars in this colour. Leave empty for all.

## `hasWarranty` (type: `boolean`):

Only cars that include a warranty of at least 1 year.

## `minHorsepower` (type: `integer`):

Minimum engine power in HP.

## `maxHorsepower` (type: `integer`):

Maximum engine power in HP.

## `minSeats` (type: `integer`):

Minimum number of seats.

## `maxSeats` (type: `integer`):

Maximum number of seats.

## `minDoors` (type: `integer`):

Minimum number of doors.

## `maxDoors` (type: `integer`):

Maximum number of doors.

## `postedWithin` (type: `string`):

Wallapop's own date filter. It uses the last-modified date, so older listings that were recently edited are included.

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

Order of results. Use `Newest` to catch new listings first.

## `includeDetails` (type: `boolean`):

Adds views, favorites, body type, doors, seats, eco label, warranty months and all attributes. One extra request per car, charged per car.

## `includeSellerInfo` (type: `boolean`):

Adds seller name, profile URL, rating, review count, items sold and professional status, plus phone, website and address for dealers. Good for dealer lead generation. Charged per car.

## Actor input object example

```json
{
  "keywords": [
    "golf gti"
  ],
  "maxItemsPerSearch": 100,
  "country": "ES",
  "city": "",
  "hasWarranty": false,
  "postedWithin": "",
  "sortBy": "most_relevance",
  "includeDetails": false,
  "includeSellerInfo": false
}
```

# Actor output Schema

## `results` (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 = {
    "keywords": [
        "golf gti"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("epicscrapers/wallapop-cars-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 = { "keywords": ["golf gti"] }

# Run the Actor and wait for it to finish
run = client.actor("epicscrapers/wallapop-cars-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 '{
  "keywords": [
    "golf gti"
  ]
}' |
apify call epicscrapers/wallapop-cars-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,epicscrapers/wallapop-cars-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/UST6K3M5KiPElGmbz/builds/C9DjmnWEQnCWS3PA7/openapi.json
