# Wallapop Scraper - Spain, Italy & Portugal Listings, Cheap (`fabrikit/wallapop-scraper`) Actor

Wallapop scraper for Spain, Italy and Portugal: search second-hand listings by keyword, category, city, price, condition and date. Prices, photos, location, shipping, dates. No login. From US$0.50 per 1,000 listings.

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

## Pricing

from $0.50 / 1,000 listing scrapeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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 from Spain, Italy and Portugal

Search **Wallapop**, Spain's biggest second-hand marketplace, and download clean listing data: title, description, price, photos, category, city, province, postal code, shipping flag, reserved flag and publication dates. No login, no browser, no API key.

### What you can do

- Price monitoring and resale arbitrage (find under-priced items by category and city).
- Market research on used-goods demand and prices per city or category.
- Lead lists of listings in a category (bikes, electronics, cars accessories, furniture...).
- Feed alerts or dashboards: run it on a schedule with `postedWithin: today` and `sortBy: newest`.

### Input

| Field | Meaning |
|---|---|
| `searchQueries` | Keywords, one search each. Empty = browse category / location only. |
| `categoryIds` | Top-level categories (Cars, Technology, Bikes, Home, Fashion...). |
| `country`, `locations` | Spain / Italy / Portugal; city names or `lat,lon`. |
| `distanceKm` | Radius around each location. |
| `minPrice`, `maxPrice`, `conditions`, `shippableOnly`, `postedWithin`, `sortBy` | Filters. |
| `maxItems` | Total cap (default 50). |
| `proxyConfiguration` | Datacenter by default, residential fallback when blocked. |

Example:

```json
{ "searchQueries": ["iphone 13"], "locations": ["Barcelona"], "maxPrice": 400, "conditions": ["as_good_as_new"], "sortBy": "newest", "maxItems": 200 }
```

### Output

One item per listing: `id, url, title, description, price, currency, category, subcategory, imageUrls, city, region, postalCode, countryCode, latitude, longitude, shippingAvailable, reserved, isRefurbished, hasWarranty, isPromoted, createdAt, modifiedAt, searchQuery, searchLocation, scrapedAt`.

### Privacy

Listings from private individuals are public, but this actor never outputs seller ids or names, and rounds coordinates to about 1 km. Use the data in line with GDPR and Wallapop's terms.

### Pricing

Pay per result: **US$0.50 per 1,000 listings** (plus the platform start fee). Duplicate listings across searches are only charged once.

### Limits

One query can return several thousand listings; to get more, add cities, categories or price bands. Only data visible on the public search is returned.

### En español

Scraper de Wallapop (España, Italia, Portugal): busca por palabra clave, categoría, ciudad, precio, estado y fecha. Devuelve precio, fotos, ubicación (redondeada a ~1 km), envío y fechas. Sin datos personales de vendedores. US$0,50 por 1.000 anuncios.

# Actor input Schema

## `searchQueries` (type: `array`):

What to look for, one search per entry (for example: iphone 13, bicicleta, sofa). Leave empty to browse by category or location only.

## `categoryIds` (type: `array`):

Only listings in these top-level categories. Leave empty for all categories.

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

Wallapop market to search. Sets the default location (capital city) and the listing links.

## `locations` (type: `array`):

Cities to search around, one search per entry. Use a city name (Madrid, Barcelona, Valencia, Sevilla, Zaragoza, Malaga, Bilbao, Alicante, Murcia, Palma, Las Palmas, Valladolid, Granada, Vigo, A Coruna, Roma, Milano, Napoli, Torino, Lisboa, Porto) or coordinates as latitude,longitude (for example 41.65,-0.89). Leave empty to use the capital of the selected country.

## `distanceKm` (type: `integer`):

Only listings within this distance of each location. Leave empty for the widest default search area.

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

Lowest price in the local currency (EUR).

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

Highest price in the local currency (EUR).

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

Only items in these conditions. Leave empty for any condition.

## `shippableOnly` (type: `boolean`):

Only listings whose seller allows shipping.

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

Only listings published in this period.

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

Order of the results.

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

Maximum number of listings to save in total (across all searches). The run also stops at your maximum charged results.

## `proxyConfiguration` (type: `object`):

Datacenter proxy by default; the actor switches to a residential proxy automatically if Wallapop blocks requests.

## Actor input object example

```json
{
  "searchQueries": [
    "bicicleta"
  ],
  "country": "ES",
  "locations": [
    "Madrid"
  ],
  "shippableOnly": false,
  "postedWithin": "any",
  "sortBy": "relevance",
  "maxItems": 50,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `listings` (type: `string`):

All listings collected during the run

# 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 = {
    "searchQueries": [
        "bicicleta"
    ],
    "locations": [
        "Madrid"
    ],
    "maxItems": 50,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("fabrikit/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 = {
    "searchQueries": ["bicicleta"],
    "locations": ["Madrid"],
    "maxItems": 50,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("fabrikit/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 '{
  "searchQueries": [
    "bicicleta"
  ],
  "locations": [
    "Madrid"
  ],
  "maxItems": 50,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call fabrikit/wallapop-scraper --silent --output-dataset

```

## MCP server setup

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