# Wallapop Scraper: Listings, Price Alerts & Deals (Spain, Italy) (`euroscrape/wallapop-scraper`) Actor

Wallapop scraper for Spain, Italy and Portugal: listings by keyword, search URL or category, cars (make, model, year, km), radius around a city, price drop alerts, deal score vs market price, views, favorites and seller rating. Fast API, no browser.

- **URL**: https://apify.com/euroscrape/wallapop-scraper.md
- **Developed by:** [EuroScrape](https://apify.com/euroscrape) (community)
- **Categories:** E-commerce, Automation, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.14 / 1,000 listings

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 Scraper: Listings, Price Alerts & Deals (Spain, Italy)

**Get Wallapop listings from Spain, Italy and Portugal as clean data, with the deal score of every price and alerts on new listings and price drops.** Type what you are looking for, paste a Wallapop search URL, or pick a category or a car make: the Actor reads Wallapop's own API, without a browser, in seconds.

- 🔎 **Search your way**: plain text (`"iphone 13"`), a search URL copied from wallapop.com with your filters, a category, or a car make and model.
- 📍 **Around a city or postal code**: `"location": "Valencia", "radiusKm": 20`, with the distance of every listing.
- 💸 **Deal score, free**: each price compared with the most similar listings of the same search (`marketMedianPrice`, `priceVsMarketPct`, `dealScore` 0-100).
- 🔔 **Price drop alerts**: schedule it with a monitor name and get only the new listings and price drops, on Telegram, Discord, Slack or a webhook.
- 🚗 **Cars**: make, model, year, mileage, fuel, gearbox, horsepower, doors and the DGT environmental badge.

### ✨ Why this Actor

| | |
|---|---|
| 🧹 **Only what you searched** | Wallapop also returns related items: "iphone 13" brings batteries, cases and iPhone 12s. The title must match your search (model numbers included), and accessories, broken items and "looking for" ads are flagged, or left out if you ask. Real run, 26 Oct 2026, "iphone 13" around Barcelona: 15 listings kept, 11 off-topic results dropped. |
| 💸 **Deal score on every listing** | Not one median for the whole search: each listing is compared with its closest look-alikes. The free summary gives median and quartile prices and the 5 best deals. |
| 📍 **Distance and radius** | Search around any city or postal code of Spain, Italy or Portugal, filter by radius, and get `distanceKm` on each row. |
| 👀 **Demand signals** | With full details: views, favorites and chats of each listing, condition, brand, model, and the seller's rating, reviews, sales and member-since date. |
| 🔒 **Privacy-friendly** | Never the seller's name or profile link; coordinates rounded to ~1 km; emails and phone numbers hidden in descriptions. |
| ⚡ **Fast and cheap** | Wallapop's API, no browser: 10 car listings in under 2 seconds. From **$0.20 per 1,000 listings**. |

### 🎯 Use cases

- **Resellers and flippers**: alerts on underpriced phones, consoles, bikes or furniture near you, the minute they are listed.
- **Car buyers and dealers**: every Golf, Ibiza or Model 3 under your price and mileage within 100 km, with price drops.
- **Price research**: what a used item really sells for in Spain, Italy or Portugal, city by city.
- **Market studies and AI datasets**: listing volumes, prices and categories over time.

### 🚀 Examples

**iPhone 13 within 30 km of Barcelona** (real run, 26 Oct 2026: 15 listings, median 230 €, best deal 140 € against a market price of 225 €, deal score 88):

```json
{ "searches": ["iphone 13"], "location": "Barcelona", "radiusKm": 30, "maxItemsPerSearch": 50 }
```

**Price drop alerts on Telegram, every hour** (schedule the Actor; the first run is the baseline):

```json
{
  "searches": ["bicicleta electrica"],
  "location": "Valencia",
  "radiusKm": 20,
  "priceMax": 900,
  "monitorName": "ebikes-valencia",
  "alertOnPriceDropPct": 5,
  "telegramBotToken": "123456:ABC…",
  "telegramChatId": "123456789"
}
```

**Volkswagen Golf from 2016, under 120,000 km, within 50 km of Madrid** (real run: 10 listings in 1.4 s, with year, mileage, fuel, gearbox and horsepower):

```json
{ "carMake": "volkswagen", "carModel": "golf", "carMinYear": 2016, "carMaxKm": 120000, "location": "Madrid", "radiusKm": 50 }
```

**A search URL copied from Wallapop, with your filters already set:**

```json
{ "searches": ["https://es.wallapop.com/app/search?keywords=bicicleta%20electrica&min_sale_price=300&max_sale_price=900&latitude=39.47391&longitude=-0.37966&distance=20000"] }
```

**Italy: PlayStation 5 games and consoles around Turin, like new, with shipping, full details:**

```json
{ "searches": ["playstation 5"], "country": "IT", "location": "Torino", "radiusKm": 40, "conditions": ["as_good_as_new"], "onlyShippable": true, "includeDetails": true }
```

**Follow given listings by URL** (a listing that is no longer online comes back as a free row with `"status": "deleted"`):

```json
{ "searches": ["https://es.wallapop.com/item/iphone-13-128gb-negro-1317213452"], "includeDetails": true }
```

### 📦 Output

One row per listing (here with full details, real data of 26 Oct 2026):

```json
{
  "type": "listing",
  "title": "iPhone 13 128GB Negro",
  "price": 140,
  "currency": "EUR",
  "category": "Tecnología y electrónica > Telefonía: móviles y smartwatches > Smartphones",
  "city": "Barcelona",
  "distanceKm": 5,
  "shippingAvailable": true,
  "condition": "as_good_as_new",
  "brand": "Apple",
  "model": "iPhone 13",
  "views": 77,
  "favorites": 8,
  "sellerRating": 4.9,
  "sellerSales": 26,
  "sellerMemberSince": "2015-05-19",
  "marketMedianPrice": 225,
  "priceVsMarketPct": -38,
  "dealScore": 88,
  "marketConfidence": "high",
  "url": "https://es.wallapop.com/item/iphone-13-128gb-negro-1317254793"
}
```

Cars add a `car` object:

```json
{ "title": "SEAT Ibiza 2017", "price": 8990, "city": "Mairena del Aljarafe",
  "car": { "make": "SEAT", "model": "Ibiza", "year": 2017, "version": "1.0 75 Style 5p", "mileageKm": 118200, "fuel": "gasoline", "gearbox": "manual", "horsepower": 75, "doors": 5, "seats": 5, "environmentalBadge": "Etiqueta C" } }
```

And one free `summary` row per search: listings, off-topic results dropped, median, quartiles, min and max price, share with shipping, reserved and promoted, top cities and the 5 best deals.

Dataset views: **Listings**, **Deals**, **Cars** and **With details**. Export as JSON, CSV, Excel or XML.

### 💰 Pricing

| Event | Price |
|---|---|
| Run start | $0.003 |
| Listing | $0.0002 (**$0.20 per 1,000 listings**) |
| Listing with full details and seller rating | $0.0006 ($0.60 per 1,000) |
| Summary rows, deleted listings | free |

A monitoring run that finds nothing new costs only the run start. Apify subscribers get 10 to 30% off.

### ❓ FAQ

**Why does a car cost 297 €?** Dealers sometimes post the monthly payment of a lease or a rent-to-own offer as the price. Those listings get `looksLikeMonthlyPayment: true` and are kept out of the market price, the deal scores and the summary (real run, 27 Oct 2026: two Golf offers at 297 € and 413 € a month near Madrid). Spare parts, empty boxes and repair services ("Cambio pantalla iPhone 13") are flagged as `looksLikeAccessory` the same way. Token prices (1 €, or under a tenth of the search median: "price to discuss") get `looksLikePlaceholderPrice: true` and are left out of the same figures.

**Which countries?** Spain, Italy and Portugal, Wallapop's three markets. Listings from another country that the site mixes in are left out.

**Why are some results missing compared with the website?** With "Only listings whose title matches the search" on (default), related items the site adds (accessories, other models) are dropped and counted in the summary. Turn it off to get everything the site returns.

**How is the deal score computed?** For each listing, the Actor finds the most similar titles in the same search and takes their weighted median price. If the look-alikes are too few or too spread out, no score is given rather than a wrong one. Accessories, broken items and wanted ads are not used as comparables.

**Newest first in Italy and Portugal?** Wallapop's "newest" sort only covers Spain. For Italy and Portugal the Actor reads by relevance and sorts the results by date itself.

**Why is the category in Spanish?** Category names are the site's own, in the language of the market (Spanish, Italian or Portuguese).

**Do you collect the seller's name or phone?** No. Only the seller's numbers (rating, reviews, sales, member since) with full details, and a seller ID. Emails and phone numbers written in descriptions are hidden.

**Is it legal?** The Actor reads public listings at a moderate pace through the same API as the website, and collects no personal data about sellers. You are responsible for how you use the data under the GDPR and Wallapop's terms.

### 🔌 API, AI agents and integrations

- **API**: one call runs the Actor and returns the results, `POST https://api.apify.com/v2/acts/euroscrape~wallapop-scraper/run-sync-get-dataset-items` (see the API tab for Python, JavaScript and cURL).
- **AI agents (MCP)**: add `https://mcp.apify.com?tools=euroscrape/wallapop-scraper` to Claude, Cursor, VS Code or any MCP client, and the Actor becomes a tool your agent can call.
- **No-code automation**: start runs and pass the results on with Apify's integrations for n8n, Make and Zapier, or with a webhook when a run ends.
- **Exports**: every result set downloads as JSON, CSV, Excel or XML, and can be sent to Google Sheets.

### ⭐ Your feedback

If this Actor saves you time, a short review on Apify Store helps other users find it. Missing a filter or a field? Say it in your review: the most requested features are added first.

### 🔗 More from EuroScrape

- [Marktplaats Scraper: Listings, Bids & Price Alerts (+ 2dehands)](https://apify.com/euroscrape/marktplaats-scraper): the Netherlands and Belgium (2dehands / 2ememain), with bids, views, deal scores and alerts.
- [Subito.it Scraper: Listings, Cars, Real Estate & Price Alerts](https://apify.com/euroscrape/subito-scraper): all of Italy, cars and homes with price per m², deal scores and alerts.
- [willhaben Scraper: Marketplace, Cars & Real Estate (Austria)](https://apify.com/euroscrape/willhaben-scraper): Austria's marketplace, cars and flats with price per m², deal scores and alerts.
- [Vinted Scraper: Prices, Brands, Sizes & Price Drop Alerts](https://apify.com/euroscrape/vinted-scraper): Vinted listings from 20+ countries with deal scores, sold tracking and alerts.
- [EU Second-Hand Marketplaces Scraper: Vinted, OLX & More](https://apify.com/euroscrape/eu-marketplace-deals): one search across the top second-hand marketplace of 18 European countries (Kleinanzeigen, Wallapop, Subito, OLX…), resale margins and cheapest country.
- [Kleinanzeigen Scraper: Deal Finder & Price-Drop Alerts](https://apify.com/euroscrape/kleinanzeigen-scraper): German classifieds with view counts, full seller details and instant alerts.
- [AutoScout24 Scraper: Used Cars in 8 Countries, Deals & Alerts](https://apify.com/euroscrape/autoscout24-scraper): used-car listings from 8 European countries with price, mileage, year and seller, a cross-country price comparison and alerts on new listings and price drops.

# Actor input Schema

## `searches` (type: `array`):

What to look for: plain text ("iphone 13", "bicicleta eléctrica"), a Wallapop search URL copied from the site with your filters, or an item URL (es.wallapop.com/item/…) to follow one listing. Leave empty to browse a category or a car make.

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

Wallapop market: Spain, Italy or Portugal.

## `location` (type: `string`):

Optional, e.g. "Valencia", "08001", "Torino". Results are ranked and measured (distanceKm) from here. Without it, the whole country is searched from its main city.

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

Optional, with a location: only listings within this distance.

## `category` (type: `string`):

Optional. Wallapop's top-level categories.

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

You pay per listing delivered. Up to 1,000 per search.

## `order` (type: `string`):

Order of the site's results: it decides which listings are read first.

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

Optional.

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

Optional.

## `conditions` (type: `array`):

Optional, one or more. "New" also covers "in box" and "unopened".

## `onlyShippable` (type: `boolean`):

Keep only listings that can be shipped (Wallapop Envíos), for buyers outside the seller's city.

## `strictMatching` (type: `boolean`):

Wallapop also returns related items ("iphone 13" brings batteries, cases, iPhone 12). On: the title must contain the model numbers and the words of your search.

## `excludeAccessoriesAndBroken` (type: `boolean`):

Off: they are kept and flagged (looksLikeAccessory, looksBroken, isWantedAd). On: they are left out.

## `carMake` (type: `string`):

Cars only, e.g. "volkswagen", "seat", "toyota". Sets the category to Cars.

## `carModel` (type: `string`):

Cars only, e.g. "golf", "ibiza".

## `carMinYear` (type: `integer`):

Cars only.

## `carMaxYear` (type: `integer`):

Cars only.

## `carMaxKm` (type: `integer`):

Cars only.

## `dealAnalysis` (type: `boolean`):

Compares each price with the median of the most similar listings of the same search: marketMedianPrice, priceVsMarketPct and a dealScore from 0 to 100 (100 = far below the market).

## `minDealScore` (type: `integer`):

Optional, e.g. 65 keeps listings priced ~15% or more below their market.

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

Opens each listing: condition, brand, model, color, size or storage, views, favorites, chats, full description, all photos, and the seller's rating, reviews, sales and member-since date (never the seller's name). Billed as "listing with details".

## `includeSummary` (type: `boolean`):

One extra free row per search: median and quartile prices, share of listings with shipping, top cities, best 5 deals.

## `monitorName` (type: `string`):

Name this search and schedule the Actor (e.g. every hour): each run then returns only NEW listings and PRICE DROPS since the previous run, and alerts you. The first run is the baseline.

## `alertOnPriceDropPct` (type: `integer`):

Monitoring: a listing comes back when its price falls by at least this percentage.

## `telegramBotToken` (type: `string`):

Alerts on Telegram: create a bot with @BotFather and paste its token.

## `telegramChatId` (type: `string`):

Your chat ID (send a message to your bot, then open api.telegram.org/bot<token>/getUpdates).

## `discordWebhookUrl` (type: `string`):

Channel settings → Integrations → Webhooks.

## `slackWebhookUrl` (type: `string`):

Incoming webhook URL.

## `webhookUrl` (type: `string`):

Receives one POST per run with the new listings and price drops (Make, Zapier, n8n…).

## `maxNotifications` (type: `integer`):

Extra items are summarized in one message.

## Actor input object example

```json
{
  "searches": [
    "iphone 13",
    "bicicleta electrica"
  ],
  "country": "ES",
  "maxItemsPerSearch": 100,
  "order": "newest",
  "onlyShippable": false,
  "strictMatching": true,
  "excludeAccessoriesAndBroken": false,
  "dealAnalysis": true,
  "includeDetails": false,
  "includeSummary": true,
  "alertOnPriceDropPct": 5,
  "maxNotifications": 30
}
```

# Actor output Schema

## `overview` (type: `string`):

Wallapop listings with price, place, distance, shipping and deal score.

## `deals` (type: `string`):

Listings compared with their market price.

## `cars` (type: `string`):

Car listings with make, model, year, mileage, fuel and gearbox.

## `details` (type: `string`):

Condition, views, favorites and seller rating (with full details).

## `runSummary` (type: `string`):

Counters for this run (items found, output, errors).

# 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 = {
    "searches": [
        "iphone 13",
        "bicicleta electrica"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("euroscrape/wallapop-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 = { "searches": [
        "iphone 13",
        "bicicleta electrica",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("euroscrape/wallapop-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 '{
  "searches": [
    "iphone 13",
    "bicicleta electrica"
  ]
}' |
apify call euroscrape/wallapop-scraper --silent --output-dataset

```

## MCP server setup

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