# Marktplaats.nl Scraper (`redomic/marktplaats-nl`) Actor

Scrape Marktplaats.nl listings into clean rows: title, price in EUR, condition, seller, location, images. Search, detail and monitor modes (new, changed, removed). For Dutch dealers, resellers and lead generation.

- **URL**: https://apify.com/redomic/marktplaats-nl.md
- **Developed by:** [Redomic](https://apify.com/redomic) (community)
- **Categories:** E-commerce, Lead generation
- **Features:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.96 / 1,000 results

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: Dutch Listings, Prices and Price Drops

Export listings from Marktplaats.nl, the biggest marketplace in the Netherlands, to a spreadsheet or an API. Search any keyword or category (cars, bikes, phones, furniture) and each row gives you the title, price in EUR, price type, condition, seller, location, photos and posting date. Cars also come with year, mileage, fuel and gearbox. Run it on a schedule and you get only the new listings, price changes and removed ads since the last run.

### Who uses it

- **Resellers and car traders** who want new listings in their niche the moment they go up.
- **Shops and brands** checking what their products sell for second-hand in the Netherlands.
- **Analysts** tracking prices and supply across a category over time.

### What you get

The default input (the Auto's category, ads from the last 7 days) on 15 November 2026:

| Listing | Price (EUR) | Price type | Year | Mileage (km) | Fuel | Gearbox |
|---|---|---|---|---|---|---|
| Audi RS6 4.0 445KW Quattro Avant 2014 Zwart | 36,999 | bids from | 2014 | 205,565 | Benzine | Automaat |
| Porsche Taycan Cross Turismo 490pk 2021 Grijs | 47,950 | bids from | 2021 | | Elektrisch | Automaat |
| Volkswagen Golf 2.0 TSI 245pk 7-DSG 2022 Blauw | 28,500 | bids from | 2022 | 75,000 | Benzine | Automaat |
| Volkswagen Caddy Cargo 2.0 TDI 122pk 2024 | 30,750 | fixed | 2024 | 35,459 | Diesel | Automaat |
| Peugeot 307 2.0 16V CC 2005 Blauw | 2,300 | fixed | 2005 | | Benzine | Handgeschakeld |

Each row also has the listing URL and ID, the photos, the seller's name and type (private or business) when Marktplaats shows them, and the category. Auction listings can include bid competition and current or minimum bid amounts when Marktplaats reports them. Values come in Dutch, as Marktplaats shows them. With `scrapeDetails` on you also get the description, body type, doors, seats, engine size and power, and the VIN when the seller lists one.

### Three modes

| Mode | What you get | Good for |
|---|---|---|
| `search` (default) | Listings that match your keywords, category and filters | Price surveys, exports |
| `detail` | Full pages for specific listings or IDs | Checking a shortlist |
| `monitor` | Only listings that are new, changed price, reappeared or disappeared since the last run | Deal alerts, tracking a seller |

### Price

$1.20 per 1,000 listings. There's no start fee. In monitor mode you pay only for new and changed listings, so a quiet hour costs nothing. 100 listings cost $0.12.

### How to run it

Search a keyword, newest first, within 25 km of Utrecht:

```json
{
  "query": "racefiets",
  "postcode": "3511AA",
  "distanceKm": 25,
  "sort": "date_desc",
  "maxItems": 200
}
```

Browse a whole category with filters:

```json
{
  "category": "Auto's",
  "make": "Volkswagen",
  "constructionYearMin": 2018,
  "mileageMax": 150000,
  "priceMax": 20000,
  "maxItems": 500
}
```

You can also paste any search or category URL from marktplaats.nl into `queries` and keep the filters you set on the site.

For alerts, save a search as a task with `"mode": "monitor"` and schedule it hourly or daily. The first run records what's listed now. After that you get only `new` listings, `changed` prices (with the old price and the difference), `reappeared` listings (with when they disappeared and for how long) and `removed` ads. To follow one seller, put their profile URL or ID in `sellerIds`.

### Input

| Field | Default | What it does |
|---|---|---|
| `mode` | `search` | `search`, `detail` or `monitor`. |
| `queries` | the Auto's category | Keywords, or search, category and listing URLs. |
| `category` | none | A Dutch top-level category, for example `Auto's`, `Fietsen` or `Telefoons`. |
| `sellerIds` | none | Seller IDs or profile URLs: returns all their active listings. |
| `listingUrls`, `listingIds` | none | Specific listings for `detail` mode. |
| `priceMin`, `priceMax` | none | Price range in EUR. |
| `condition` | any | `Nieuw` or `Gebruikt`. |
| `advertiserType` | any | `Particulier` (private) or `Zakelijk` (business). |
| `delivery` | any | `Ophalen` (pickup) or `Verzenden` (shipping). |
| `city`, `postcode`, `distanceKm` | anywhere | Search near a place. |
| `make`, `model`, `fuel`, `transmission` | any | Car filters, for example `Diesel` or `Automaat`. |
| `constructionYearMin`, `constructionYearMax`, `mileageMax` | none | Car year and mileage limits. |
| `postedWithinDays` | `7` | Only ads posted in the last N days. |
| `searchInTitleAndDescription` | `false` | Match your keyword in the description too. |
| `hasImages` | `false` | Skip ads without photos. |
| `sort` | `relevance` | `relevance`, `price_asc`, `price_desc`, `date_desc` or `date_asc`. |
| `scrapeDetails` | `false` | Open each listing for the full details. Slower. |
| `maxItems` | `100` | The most listings to return. |

### Output fields

**Every row:** `id`, `url`, `title`, `priceAmount`, `priceCurrency`, `priceType`, `bidCount`, `bidderCount`, `highestBidAmount`, `highestBidCents`, `minimumBidAmount`, `condition`, `categoryName`, `locationCity`, `sellerName` (businesses only, never a private seller's name), `sellerId`, `advertiserType`, `delivery`, `imageUrls`, `postedAt`, `daysOnMarket`, `firstSeenAt`, `scrapedAt` (bid fields appear only when present).

**Cars add:** `make`, `model`, `constructionYear`, `mileage`, `fuel`, `transmission`.

**With details:** `description`, `bodyType`, `doors`, `seats`, `engineDisplacementCc`, `enginePower`, `itemCondition`, `vin`.

**Monitor mode:** `changeType`, `previousPriceAmount`, `priceDelta`, `removedAt`, `daysRemoved` (for reappeared listings).

### FAQ

**What does the price type mean?**
`fixed` is a set price. `min_bid` means bidding starts at that price ("bieden vanaf") and rows include `minimumBidAmount`. `bidding` means the seller takes offers with no fixed price shown; when Marktplaats reports auction activity, rows also include `bidCount`, `bidderCount` and/or `highestBidAmount`.

**Do I get seller phone numbers?**
No. You get the seller's public name and ID only.

**Is there a limit on results?**
Marktplaats shows about 5,000 results for one search. For more, split the search by category, price range or region.

**Something looks wrong in my results.**
Open an issue on the Issues tab with your input and we'll look at it.

### In het Nederlands

Exporteer advertenties van Marktplaats.nl naar een spreadsheet: titel, prijs, prijstype, staat, verkoper, locatie, foto's en plaatsingsdatum. Voor auto's ook bouwjaar, kilometerstand, brandstof en transmissie. In de modus `monitor` krijg je alleen nieuwe advertenties, prijswijzigingen en verwijderde advertenties sinds de vorige run.

### Use it from AI agents (MCP) and Python

**AI agents.** Add this Actor as a tool in Claude, Cursor, VS Code or any MCP client through the Apify MCP server. The agent reads the input schema, so a plain request is enough.

```json
{
  "mcpServers": {
    "marktplaats-nl": {
      "url": "https://mcp.apify.com?tools=redomic/marktplaats-nl",
      "headers": {
        "Authorization": "Bearer <YOUR_APIFY_TOKEN>"
      }
    }
  }
}
```

**Python.** `pip install apify-client`, then:

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("redomic/marktplaats-nl").call(run_input={"query": "fiets"})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)
```

### More from us

- [Allabolag Scraper - Swedish Company Data](https://apify.com/redomic/allabolag-company-scraper): Scrape allabolag.se for Swedish company financials, industry, status and board role titles by search, org number or URL
- [Ashby Jobs Scraper with Salaries](https://apify.com/redomic/ashby-jobs-monitor): Ashby jobs scraper for any startup careers board (OpenAI, Ramp, Notion and thousands more), with salary ranges as numbers: min, max, currency, period, plus equity and bonus flags
- [ATS Jobs Search: Greenhouse, Lever & Ashby Jobs API](https://apify.com/redomic/ats-jobs-search): Search 300,000+ open jobs from 11,000+ companies on Greenhouse, Lever and Ashby in one run
- [Blocket Scraper: Car Monitor](https://apify.com/redomic/blocket-se-scraper): Blocket scraper: each run returns up to 2,500 Blocket Bil and Torget listings as flat rows with price, make, model, year, mileage, VIN, inspections and seller
- [Closed Jobs Tracker: Filled Roles & Time-to-Fill](https://apify.com/redomic/closed-jobs-tracker): Search closed jobs from 11,000+ companies with closedOn, daysOpen and time-to-fill signals
- [Google Jobs Scraper - Job Postings API](https://apify.com/redomic/google-jobs): Google Jobs and job postings scraper: get job title, company, location, posted date, salary, full description and every apply link for any search
- [Google Trends API: Trending Now & Interest Over Time](https://apify.com/redomic/google-trends): Trending-now searches and new-trends alerts/monitoring per country with the news behind them, plus interest over time, interest by region, and related and rising queries for any keyword
- [GovDeals Scraper](https://apify.com/redomic/govdeals-scraper): Search and monitor GovDeals government surplus auctions
- [Greenhouse Jobs Monitor & Scraper](https://apify.com/redomic/greenhouse-jobs-monitor): Monitor Greenhouse jobs from any company careers board (Airbnb, Stripe, Discord and thousands more)
- [Job Postings Dataset: 320k+ Open Jobs, Updated Daily](https://apify.com/redomic/job-postings-dataset): 320,000+ open jobs from 10,000+ company career sites (Greenhouse, Lever, Ashby), updated daily with first-seen and closed dates
- [Lever Jobs Scraper with Salaries](https://apify.com/redomic/lever-jobs-monitor): Lever jobs scraper for any company's careers page (Palantir, Spotify, Zoox, Shield AI and thousands more): flat rows with title, team, location, workplace, commitment, apply link, salary as numbers and the full description merged
- [Otodom Scraper: Poland Property Listings & Price Monitor](https://apify.com/redomic/otodom-scraper): Scrape Otodom.pl property listings in Poland
- [Otomoto.pl Scraper](https://apify.com/redomic/otomoto-scraper): Scrape Otomoto.pl Polish car listings: one run returns used-car rows with price, make, model, year, mileage, fuel, gearbox, seller and URL
- [Personio Jobs Scraper](https://apify.com/redomic/personio-jobs): Scrape open jobs from Personio company career pages (jobs.personio.de/.com XML feeds)
- [Salary Data API: Pay Ranges by Job Title & Level](https://apify.com/redomic/salary-data): Get salary benchmarks (p10-p90, annualised, with n) and pay ranges from 150,000+ employer-posted jobs across 11,000+ companies, updated daily
- [SIRET Company Scraper](https://apify.com/redomic/siret-company-scraper): Search French companies by name, SIREN or SIRET
- [SUUMO Scraper - Japan Property Listings](https://apify.com/redomic/suumo-scraper): Scrape SUUMO Japan property listings from search URLs for rentals and sales
- [Talabat Scraper — Menus, Prices & Delivery Fees](https://apify.com/redomic/talabat-scraper): Talabat menus, prices and delivery fees as flat rows in 8 MENA markets
- [Workday Jobs Scraper](https://apify.com/redomic/workday-jobs): Search and monitor public Workday (myworkdayjobs.com) job postings

# Changelog

This Actor's version history is a separate document: https://apify.com/redomic/marktplaats-nl/changelog.md

# Actor input Schema

## `mode` (type: `string`):

search = listings, detail = single listings, monitor = new/changed/removed since last run.

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

Keywords or search/category/listing URLs to scrape.

## `query` (type: `string`):

Single keyword (used when queries is empty).

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

Marktplaats search, category or listing URLs.

## `listingUrls` (type: `array`):

Specific listing URLs or IDs to scrape in detail.

## `listingIds` (type: `array`):

Marktplaats item IDs (e.g. m1234567890).

## `sellerIds` (type: `array`):

Fetch all active listings from seller IDs (numeric IDs or Marktplaats seller profile URLs).

## `priceMin` (type: `number`):

Keep listings with price >= this value.

## `priceMax` (type: `number`):

Keep listings with price <= this value.

## `condition` (type: `string`):

Filter by condition (e.g. Nieuw, Gebruikt).

## `delivery` (type: `string`):

Filter by delivery method: "Ophalen" (pickup) or "Verzenden" (shipping). Also accepts "Ophalen of Verzenden".

## `advertiserType` (type: `string`):

Particulier or Zakelijk (Bedrijf also accepted). Only rows with a known advertiser type match.

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

Dutch L1 vertical to browse (e.g. "Auto's", "Fietsen", "Telefoons"). Works with or without a keyword; resolved to a Marktplaats category ID.

## `l1CategoryId` (type: `integer`):

Exact Marktplaats top-level category ID (overrides the category name).

## `l2CategoryId` (type: `integer`):

Marktplaats sub-category ID; rows are post-filtered to this category.

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

Filter by city name.

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

Postcode centre for a local radius search (e.g. 1012AB). Use with distanceKm.

## `distanceKm` (type: `number`):

Keep listings within this many kilometres of the postcode. Rows with no distance from the postcode (e.g. nationwide listings) are excluded when set.

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

Sort order for results.

## `scrapeDetails` (type: `boolean`):

Fetch each listing page for full detail fields (slower).

## `searchInTitleAndDescription` (type: `boolean`):

Match the search term in both title and description (broader). When false, only titles are matched.

## `hasImages` (type: `boolean`):

Keep only listings that include at least one image.

## `constructionYearMin` (type: `integer`):

Keep listings with construction year >= this value.

## `constructionYearMax` (type: `integer`):

Keep listings with construction year <= this value.

## `mileageMax` (type: `integer`):

Keep listings with mileage <= this value (km).

## `make` (type: `string`):

Filter by vehicle make (matches make field or title).

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

Filter by vehicle model (matches model field or title).

## `fuel` (type: `string`):

Filter by fuel type (e.g. Benzine, Diesel, Hybride).

## `transmission` (type: `string`):

Filter by transmission (e.g. Automaat, Handgeschakeld).

## `postedWithinDays` (type: `integer`):

Keep listings posted within the last N days (based on postedAt). Rows without a known posted date are excluded.

## `firstSeenWithinDays` (type: `integer`):

Keep listings first seen by this Actor within the last N days (search mode, based on persisted firstSeenAt).

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

Upper limit on rows returned.

## `proxy` (type: `object`):

Proxy settings.

## Actor input object example

```json
{
  "mode": "search",
  "queries": [
    {
      "query": "https://www.marktplaats.nl/l/auto-s/"
    }
  ],
  "sort": "relevance",
  "scrapeDetails": false,
  "searchInTitleAndDescription": false,
  "hasImages": false,
  "postedWithinDays": 7,
  "maxItems": 100,
  "proxy": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

All result rows from the default dataset.

# 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 = {
    "mode": "search",
    "queries": [
        {
            "query": "https://www.marktplaats.nl/l/auto-s/"
        }
    ],
    "sort": "relevance",
    "postedWithinDays": 7,
    "proxy": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("redomic/marktplaats-nl").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 = {
    "mode": "search",
    "queries": [{ "query": "https://www.marktplaats.nl/l/auto-s/" }],
    "sort": "relevance",
    "postedWithinDays": 7,
    "proxy": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("redomic/marktplaats-nl").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 '{
  "mode": "search",
  "queries": [
    {
      "query": "https://www.marktplaats.nl/l/auto-s/"
    }
  ],
  "sort": "relevance",
  "postedWithinDays": 7,
  "proxy": {
    "useApifyProxy": true
  }
}' |
apify call redomic/marktplaats-nl --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,redomic/marktplaats-nl"
        }
    }
}
```

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/MWwYiqQoMVlxAoKFF/builds/qzMdJxg0oDpPl1lhK/openapi.json
