# Marktplaats & 2dehands Scraper — NL/BE Classifieds (`hipersoft/marktplaats-scraper`) Actor

Scrape classified ads from Marktplaats.nl, 2dehands.be and 2ememain.be by keyword, category, postcode radius and price. Title, price, bid type, condition, delivery, category, city, coordinates, photos, post date, business seller. Export CSV/JSON.

- **URL**: https://apify.com/hipersoft/marktplaats-scraper.md
- **Developed by:** [hiper soft](https://apify.com/hipersoft) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.001 / listing

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

## Marktplaats & 2dehands Scraper: Dutch and Belgian Classified Ads

**Marktplaats & 2dehands Scraper** extracts second-hand and new classified ads from **Marktplaats.nl**, the **largest classifieds marketplace in the Netherlands**, and its Belgian sister sites **2dehands.be** (Dutch) and **2ememain.be** (French). Search by **keyword, category, postcode radius and price range** and get for every ad the **title, description, link, price, price type (fixed, bidding, minimum bid, free, see description), condition, delivery option (pick-up or shipping), category path, attributes, city, country, coordinates, distance, seller type (private or business), business name, top-ad flag, reserved flag, photos, post date** and more. Export to **CSV, Excel or JSON**. Perfect for **resellers, price monitoring, market research, deal hunting, lead generation for dealers and e-commerce pricing in the Netherlands and Belgium**.

### What does Marktplaats & 2dehands Scraper do?

- 🇳🇱 **Marktplaats.nl** — the Netherlands' #1 classifieds site.
- 🇧🇪 **2dehands.be** and **2ememain.be** — Belgium's leading classifieds sites (Dutch and French).
- 🔎 **Keywords, categories, postcode + radius, min/max price** and six sort orders.
- 💶 **Price and price type**: fixed price, bidding, minimum bid, free, exchange.
- 📦 **Condition and delivery** (pick-up / shipping).
- 📍 **City, coordinates and distance** from your postcode.
- 🏪 **Private vs business sellers**, with business names.
- 🖼️ **Photos** and **post date** (normalized to ISO dates).

### What data can you scrape from Marktplaats?

| Field | Description |
|---|---|
| Ad | Site, item ID, link, title, description |
| Price | Price in €, price type |
| Item | Category ID and path, condition, delivery, attributes |
| Location | City, country, latitude, longitude, distance |
| Seller | Seller type, seller ID, business name |
| Flags | Top ad, reserved, video, traits |
| Media & dates | Photos, main photo, post date |

### Use cases for Marktplaats and 2dehands data

- **Resellers and flippers**: find under-priced items and track new ads around your postcode.
- **Price monitoring**: follow second-hand prices of phones, bikes, furniture, consoles and cars.
- **Market research**: measure supply, pricing and demand across Dutch and Belgian regions.
- **Dealers and businesses**: monitor competing business sellers and their offers.
- **Deal alerts**: schedule the actor and get notified about fresh ads.

### How to scrape Marktplaats

1. Click **Try for free** to open the actor in Apify Console.
2. Choose the **sites** (Marktplaats, 2dehands, 2ememain).
3. Enter **search terms**, and optionally a **category**, **postcode + distance** and **price range**.
4. Click **Start** and download your ads as **CSV, Excel or JSON**.

### Input

#### Example input

```json
{
  "sites": ["marktplaats", "2dehands"],
  "queries": ["fiets", "iphone 15"],
  "postcode": "1012AB",
  "distanceKm": "25",
  "minPrice": 100,
  "maxPrice": 800,
  "sort": "newest",
  "maxItems": 500
}
```

| Field | Description |
|---|---|
| **Sites** | marktplaats, 2dehands, 2ememain. |
| **Search terms** | One or more keywords. |
| **Category ID** | Optional top-level category number. |
| **Postcode / Distance** | Search radius around a postcode. |
| **Min / max price** | Price range in euro. |
| **Sort by** | Newest, relevance, oldest, price, distance. |
| **Max listings** | 0 = no limit. |

### Output

#### Ad example

```json
{
  "site": "marktplaats",
  "itemId": "m2450850046",
  "url": "https://www.marktplaats.nl/v/fietsen-en-brommers/fietsen-vouwfietsen/m2450850046-popal-vouwfiets-20-nieuwstaat-6-shimano-versn",
  "title": "Popal vouwfiets 20\" nieuwstaat 6 Shimano versnellingen",
  "price": 280,
  "currency": "EUR",
  "priceType": "MIN_BID",
  "categoryPath": "fietsen-en-brommers/fietsen-vouwfietsen",
  "condition": "Zo goed als nieuw",
  "delivery": "Ophalen",
  "city": "Amsterdam",
  "country": "NL",
  "distanceKm": 10,
  "sellerType": "private",
  "isTopAd": true,
  "imageUrl": "https://images.marktplaats.com/...jpg",
  "postedDate": "2026-10-08"
}
```

#### Output schema

| Field | Type | Description |
|---|---|---|
| `site`, `itemId`, `url`, `title`, `description` | string | Ad. |
| `price`, `currency`, `priceType` | mixed | Price. |
| `categoryId`, `categoryPath`, `condition`, `delivery`, `attributes` | mixed | Item details. |
| `city`, `country`, `latitude`, `longitude`, `distanceKm` | mixed | Location. |
| `sellerType`, `sellerId`, `businessName` | mixed | Seller (business names only). |
| `isTopAd`, `isReserved`, `hasVideo`, `traits` | mixed | Flags. |
| `imageCount`, `imageUrl`, `images`, `dateText`, `postedDate` | mixed | Media and dates. |

Names of private sellers are not collected.

### How much does it cost?

The scraper uses **pay-per-listing** pricing: a small fixed price per ad, with automatic discounts on higher Apify plans. See the **Pricing** tab for the exact price.

### More classifieds and marketplace data

- [Kleinanzeigen Scraper](https://apify.com/hipersoft/kleinanzeigen-scraper): German classifieds.
- [Blocket Scraper](https://apify.com/hipersoft/blocket-scraper): Swedish classifieds.
- [DBA Scraper](https://apify.com/hipersoft/dba-scraper): Danish classifieds.
- [Bazos Scraper](https://apify.com/hipersoft/bazos-scraper): Czech, Slovak, Polish and Austrian classifieds.

### FAQ

**How many ads can one search return?**
Each search returns up to about 2,900 ads. Add more search terms, narrow the price range or use a postcode radius to collect more.

**Where do I find a category ID?**
Open a category on the site; the number is shown in the filter links. For example 445 = Fietsen en Brommers and 820 = Telecommunicatie on Marktplaats.

**What formats can I export?**
CSV, Excel, JSON, XML, HTML and RSS, or read the results through the Apify API.

**Can I integrate it with other apps?**
Yes. The actor can be connected with almost any cloud service or web app thanks to [integrations on the Apify platform](https://apify.com/integrations). It works with [Make](https://apify.com/integrations/make), [Zapier](https://apify.com/integrations/zapier), [Slack](https://docs.apify.com/platform/integrations/slack), [Airbyte](https://docs.apify.com/platform/integrations/airbyte), [GitHub](https://docs.apify.com/platform/integrations/github), [Google Drive](https://docs.apify.com/platform/integrations/drive) and [many more](https://apify.com/integrations), plus the [Apify API](https://docs.apify.com/api/v2), JS/Python clients and MCP. Or use [webhooks](https://docs.apify.com/platform/integrations/webhooks) to trigger an action whenever a run finishes.

**Is it legal to scrape Marktplaats?**
The scraper only collects publicly visible ad information and no private seller names or contact data. You are responsible for using the data in line with the sites' terms and GDPR.

### Related Actors

- [Kleinanzeigen Scraper](https://apify.com/hipersoft/kleinanzeigen-scraper)
- [Blocket Scraper](https://apify.com/hipersoft/blocket-scraper)
- [Otodom Scraper](https://apify.com/hipersoft/otodom-scraper)

### Notes

Original clean-room implementation. Returns only public data. Not affiliated with Marktplaats, 2dehands, 2ememain or Adevinta.

# Actor input Schema

## `sites` (type: `array`):

Which marketplaces to search: Marktplaats (Netherlands), 2dehands (Belgium, Dutch) or 2ememain (Belgium, French).

## `queries` (type: `array`):

Keywords to search, e.g. fiets, iphone 15, bank, lego. Leave empty to list the newest ads (combine with a category).

## `categoryId` (type: `string`):

Top-level category number from the site, e.g. 820 = Telecommunicatie, 445 = Fietsen en Brommers, 91 = Auto's (Marktplaats). Leave empty for all categories.

## `postcode` (type: `string`):

Search around this postcode (e.g. 1012AB or 9000).

## `distanceKm` (type: `string`):

Radius around the postcode.

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

Minimum asking price in euro.

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

Maximum asking price in euro.

## `sort` (type: `string`):

Result order.

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

Stop after this many listings in total (0 = no limit; each search returns up to ~2,900 ads).

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

Not needed in most cases.

## Actor input object example

```json
{
  "sites": [
    "marktplaats"
  ],
  "queries": [
    "fiets"
  ],
  "sort": "newest",
  "maxItems": 200,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

The results as dataset items.

# 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 = {
    "queries": [
        "fiets"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("hipersoft/marktplaats-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 = { "queries": ["fiets"] }

# Run the Actor and wait for it to finish
run = client.actor("hipersoft/marktplaats-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 '{
  "queries": [
    "fiets"
  ]
}' |
apify call hipersoft/marktplaats-scraper --silent --output-dataset

```

## MCP server setup

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