# Marktplaats Scraper: Listings, Bids & Price Alerts (+ 2dehands) (`euroscrape/marktplaats-scraper`) Actor

Marktplaats scraper for the Netherlands and 2dehands / 2ememain for Belgium: listings by keyword or search URL, around a postcode, with bids, views, favorites, deal score vs market price and price drop alerts. Fast API, no browser.

- **URL**: https://apify.com/euroscrape/marktplaats-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

## Marktplaats Scraper: Listings, Bids & Price Alerts (+ 2dehands)

**Get Marktplaats listings (Netherlands) and 2dehands / 2ememain listings (Belgium) as clean data, with the bids, views and deal score of every listing, and alerts on new listings and price drops.** Type a search, paste a search URL with your filters, or follow given listings: the Actor reads the sites' own API, without a browser.

- 🔎 **Search your way**: plain text (`"iphone 13"`, `"fiets"`), a `…/q/…` search URL with its filters (price, condition, postcode, sort), or `…/v/…` listing URLs.
- 📍 **Around a postcode**: `"postcode": "1012AB", "radiusKm": 25`, with the distance of every listing.
- 🔨 **Bids, not just asking prices**: most Marktplaats listings are "bids from". With full details you get the number of bids, the highest bid and the time of the last one.
- 💸 **Deal score, free**: each price compared with the most similar listings of the same search.
- 🔔 **Price drop alerts**: schedule it with a monitor name, get only new listings and price drops on Telegram, Discord, Slack or a webhook.

### ✨ Why this Actor

| | |
|---|---|
| 🇳🇱🇧🇪 **Three sites, one Actor** | Marktplaats, 2dehands (Dutch) and 2ememain (French) share one platform: same filters, same fields. Pasted URLs keep their own site. |
| 🔨 **What buyers really offer** | Highest bid, number of bids, minimum next bid, views and favorites of each listing: see what an item really goes for, and which listings are hot. |
| 🧹 **Only what you searched** | Marktplaats also returns cases, chargers and other models. The title must match your search, and accessories, broken items and "gezocht" ads are flagged or left out. Real run, 26 Oct 2026, "iphone 13" within 25 km of Amsterdam: 8 listings kept, 8 off-topic results dropped. |
| 💸 **Deal score on every listing** | Each listing is compared with its closest look-alikes; the free summary gives the total on the site, median and quartile prices, share sold by bids and the 5 best deals. |
| 🔒 **Privacy-friendly** | A private seller's name is never collected (only "private" or "business", and a shop name for businesses); coordinates rounded to ~1 km; emails and phone numbers hidden in descriptions. |
| ⚡ **Fast and cheap** | The sites' API, no browser: 8 listings with full details in 6.5 s. From **$0.20 per 1,000 listings**. |

### 🎯 Use cases

- **Resellers**: underpriced phones, consoles, LEGO or bikes near you, with alerts the minute they are listed or cheaper.
- **Buyers**: what an item really sells for (asking prices and bids), before you bid.
- **Shops and brands**: second-hand prices of your products in the Netherlands and Belgium.
- **Market studies and AI datasets**: volumes, prices, categories and demand (views, favorites, bids) over time.

### 🚀 Examples

**iPhone 13 within 25 km of Amsterdam, with bids and views** (real run, 26 Oct 2026, with 8 listings: 580 results on the site, median 249 €, 5 of the 8 sold by bids):

```json
{ "searches": ["iphone 13"], "postcode": "1012AB", "radiusKm": 25, "maxItemsPerSearch": 50, "includeDetails": true }
```

**E-bikes around Brussels on 2ememain, in French** (real run: 926 results on the site, median 700 €):

```json
{ "searches": ["velo electrique"], "country": "BE_FR", "postcode": "1000", "radiusKm": 15 }
```

**A search URL copied from Marktplaats, filters included** (LEGO Technic, 50 to 200 €, as good as new, cheapest first):

```json
{ "searches": ["https://www.marktplaats.nl/q/lego+technic/#PriceCentsFrom:5000|PriceCentsTo:20000|f:31|sortBy:PRICE|sortOrder:INCREASING"] }
```

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

```json
{
  "searches": ["gazelle e-bike"],
  "postcode": "3511AA",
  "radiusKm": 30,
  "priceMax": 1200,
  "postedWithin": "week",
  "monitorName": "gazelle-utrecht",
  "telegramBotToken": "123456:ABC…",
  "telegramChatId": "123456789"
}
```

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

```json
{ "searches": ["https://www.marktplaats.nl/v/telecommunicatie/mobiele-telefoons-apple-iphone/m2457953580-iphone-13-128gb-77-batterijconditie"] }
```

### 📦 Output

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

```json
{
  "type": "listing",
  "site": "Marktplaats",
  "title": "iPhone 13 - 128GB - 77% batterijconditie",
  "price": 150,
  "priceType": "bids_from",
  "condition": "used",
  "delivery": "pickup_or_shipping",
  "category": "Mobiele telefoons | Apple iPhone",
  "city": "Uitgeest",
  "distanceKm": 21,
  "postedAt": "2026-10-25T13:50:01Z",
  "sellerType": "private",
  "sellerActiveYears": 1,
  "views": 81,
  "favorites": 4,
  "bidsCount": 2,
  "highestBid": 100,
  "cheapestShipping": 4.4,
  "url": "https://www.marktplaats.nl/v/telecommunicatie/mobiele-telefoons-apple-iphone/m2457953580-iphone-13-128gb-77-batterijconditie"
}
```

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

Dataset views: **Listings**, **Deals** and **Bids & interest**. 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 (bids, views, favorites, seller) | $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 on Wallapop near Madrid, same filter). 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.

**Marktplaats, 2dehands or 2ememain?** Pick the site with `country` (`NL`, `BE` for 2dehands in Dutch, `BE_FR` for 2ememain in French). 2dehands and 2ememain are the same listings in two languages.

**What does "bids from" mean?** Most Marktplaats listings start bidding from the shown price. The listing page shows the bids received: `highestBid` is often below the asking price, which tells you what buyers really offer.

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

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

**Do you collect seller names?** No name of a private seller is collected. For business sellers, the shop name is given, as it appears publicly on the listing.

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

### 🔌 API, AI agents and integrations

- **API**: one call runs the Actor and returns the results, `POST https://api.apify.com/v2/acts/euroscrape~marktplaats-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/marktplaats-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

- [Wallapop Scraper: Listings, Price Alerts & Deals (Spain, Italy)](https://apify.com/euroscrape/wallapop-scraper): Wallapop in Spain, Italy and Portugal, cars included, around a town with distance, 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.
- [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, Marktplaats, Wallapop, Subito, OLX…), resale margins and cheapest country.
- [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.
- [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, cross-country price comparison and alerts.

# Actor input Schema

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

What to look for: plain text ("iphone 13", "fiets", "lego"), a search URL copied from Marktplaats or 2dehands (…/q/…, filters after # included), or a listing URL (…/v/…) to follow one listing.

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

Marktplaats (Netherlands), 2dehands (Belgium, Dutch) or 2ememain (Belgium, French). Pasted URLs keep their own site.

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

Optional, e.g. "1012AB" (Amsterdam) or "1000" (Brussels). Gives the distance of every listing.

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

Optional, with a postcode.

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

## `onlyShipping` (type: `boolean`):

Keep only listings the seller ships ("Verzenden").

## `buyNowOnly` (type: `boolean`):

Keep only listings you can buy and pay online ("Direct kopen").

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

Optional: only recent listings.

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

On: the title must contain the model numbers and the words of your search (Marktplaats also returns cases, chargers, other models).

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

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

## `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: current bids and highest bid, views, favorites, exact posting time, cheapest shipping price, buyer protection, seller type and years on the site (never a private seller's name), full description and all photos. Billed as "listing with details".

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

One extra free row per search: total on the site, median and quartile prices, share with shipping and bidding, 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"
  ],
  "country": "NL",
  "maxItemsPerSearch": 100,
  "order": "newest",
  "onlyShipping": false,
  "buyNowOnly": false,
  "strictMatching": true,
  "excludeAccessoriesAndBroken": false,
  "dealAnalysis": true,
  "includeDetails": false,
  "includeSummary": true,
  "alertOnPriceDropPct": 5,
  "maxNotifications": 30
}
```

# Actor output Schema

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

Listings with price, condition, place, distance and deal score.

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

Listings compared with their market price.

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

Bids, views and favorites (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"
    ]
};

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

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

```

## MCP server setup

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