Marktplaats Scraper
Pricing
from $1.29 / 1,000 listings
Marktplaats Scraper
Scrape Marktplaats.nl, 2dehands.be and 2ememain.be listings by keyword, category, postcode and price. Get prices, condition, seller, location, photos, attributes and full descriptions. Export JSON, CSV or Excel.
Pricing
from $1.29 / 1,000 listings
Rating
0.0
(0)
Developer
ParseBird
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
4 days ago
Last modified
Categories
Share
Marktplaats Scraper
Marktplaats Scraper pulls classified listings from Marktplaats.nl, the largest second-hand marketplace in the Netherlands, and from its Belgian sister sites 2dehands.be and 2ememain.be. You get structured data from your keyword, category, postcode and price filters, with no account and no API key.
| Search by keyword, category, subcategory, postcode radius, price range, condition, delivery and listing age. Get price and price type, condition, seller, city with coordinates, category, attributes and photos. Turn on listing details to add the full description, specifications, posting date, views, favourites and bids. |
Copy to your AI assistant
Copy this block into ChatGPT, Claude, Cursor or any other LLM to start using this Actor.
Use the Apify Actor "parsebird/marktplaats-scraper" (Marktplaats Scraper) to get classified listings from marktplaats.nl, 2dehands.be or 2ememain.be. Call it with the apify-client package: Python `ApifyClient("<APIFY_TOKEN>").actor("parsebird/marktplaats-scraper").call(run_input={...})`, or JavaScript `new ApifyClient({ token }).actor('parsebird/marktplaats-scraper').call({...})`, then read items from the run's default dataset. Inputs (all optional, but give searchQueries or categoryId): platform ("marktplaats.nl" default, "2dehands.be", "2ememain.be"), searchQueries (array of keywords, e.g. ["iphone 15"]), categoryId (string main category ID, e.g. "91" Auto's, "445" Fietsen en Brommers, "504" Huis en Inrichting, "820" Telecommunicatie), subcategoryId (string, needs categoryId, e.g. "96" BMW), postcode (e.g. "1012AB" or "2000"), distanceKm (int, radius around postcode), minPrice and maxPrice (int euros), condition (array of "new","like_new","used","refurbished","not_working"), offeredSince ("today","yesterday","week"), delivery ("pickup","shipping"), sort ("relevance" default, "newest","oldest","price_asc","price_desc"), maxItems (int, default 100, total across queries; searches over 2,500 results are read in price order to go past the site limit), scrapeDetails (bool, default false, opens each listing page), proxyConfiguration (object, default Apify Proxy). Each item has listingId, platform, url, title, description, fullDescription, price (EUR number), priceType (FIXED, MIN_BID, FAST_BID, FREE, SEE_DESCRIPTION, RESERVED), currency, condition, conditionNormalized, delivery, shippingAvailable, pickupAvailable, categoryId, category, parentCategoryId, parentCategory, attributes (object), sellerId, sellerName, sellerType, sellerVerified, city, country, latitude, longitude, distanceKm, dateLabel, date (YYYY-MM-DD), images (array), imageCount, isReserved, isAdmarkt, promotion, searchQuery, searchCategoryId, scrapedAt; with scrapeDetails also specifications (object), listedAt, viewCount, favoritedCount, bidCount, highestBid, sellerProfileUrl, sellerActiveYears, sellerWebsite, sellerPhone (businesses that show it). Pricing: pay per listing saved. API docs: https://apify.com/parsebird/marktplaats-scraper/api. Get a token at https://console.apify.com/settings/integrations.
What is Marktplaats Scraper?
Marktplaats Scraper turns Marktplaats.nl search results into clean JSON, CSV or Excel. Enter a keyword such as iphone 15, bakfiets or eettafel, or pick a category such as Auto's or Fietsen en Brommers. The Actor returns every matching listing with its price, price type, condition, seller, city, category, attributes and photos.
It works as a Marktplaats API alternative. Marktplaats doesn't offer a public API for search results, so this Actor collects the same data the website shows and gives it to you as a dataset. The same Actor also scrapes 2dehands.be (Belgium, Dutch) and 2ememain.be (Belgium, French). These sites run on the same platform and use the same category IDs.
To try it, open the Input tab and click Start. The prefilled search returns 50 iPhone 15 listings from Marktplaats.nl.
What can Marktplaats Scraper do?
- 🔎 Search by keyword: add one or more search queries. Each one runs as its own search, and listings that show up in more than one are saved only once.
- 🗂️ Browse categories: choose one of the 36 main categories and optionally a subcategory ID, with or without a keyword.
- 📍 Search around a postcode: set a Dutch or Belgian postcode and a radius in kilometres. Each listing gets its distance from that postcode.
- 💶 Filter by price, condition, delivery and age: price range in euros, condition (new, as good as new, used, refurbished, not working), pickup or shipping, and listings placed today, since yesterday or in the last week.
- ↕️ Sort: by relevance, newest, oldest, or price low to high or high to low.
- 📈 Go past the 2,500-result limit: Marktplaats stops showing results after about 2,500 per search. When you ask for more, the Actor reads the results in price order and continues from the last price it saw, so large searches don't stop at 2,500.
- 📄 Listing details: turn on Scrape listing details to add the full description, the specifications table (for example a car's mileage, fuel and year), the posting date, view and favourite counts, bids, whether the seller is private or a business, and every photo.
- 🇧🇪 Three sites, one format: switch between marktplaats.nl, 2dehands.be and 2ememain.be with the Site field.
- ⚙️ Built for automation: schedule runs to watch for new listings or price drops, call the Actor from the Apify API, connect it to Make, Zapier, n8n, Google Sheets or Slack, and export as JSON, CSV, Excel or HTML.
What data can you extract from Marktplaats?
| Field | Description |
|---|---|
listingId, url, platform | Marktplaats listing ID (for example m2457362657), link to the listing and the site it came from |
title, description | Listing title and description. Search results give a short excerpt; with listing details it's the full text (fullDescription: true) |
price, priceType, currency | Price in euros as a number, the site's price type, and EUR |
condition, conditionNormalized | Condition as shown on the site (Gebruikt, Zo goed als nieuw, Comme neuf…) and a normalised value: new, like_new, used, refurbished or not_working |
delivery, shippingAvailable, pickupAvailable | Delivery option as shown (Ophalen, Verzenden, Ophalen of Verzenden) and whether shipping or pickup is offered |
categoryId, category, parentCategoryId, parentCategory | Subcategory and main category, with IDs |
attributes | Category attributes from the search results, such as type, color, mileage, constructionYear, fuel |
specifications | The listing page's specifications table (details only), for example Kilometerstand, Bouwjaar, Opslagcapaciteit |
sellerId, sellerName, sellerVerified | Seller ID, display name and verified flag |
sellerType, sellerProfileUrl, sellerActiveYears, sellerWebsite, sellerPhone | private or business, profile link, years on the site, and the website and phone number that businesses show on their listings (details only) |
city, country, latitude, longitude, distanceKm | Location, coordinates, and distance from your postcode |
dateLabel, date | Date shown in the search results (Vandaag, 6 jul 26) and the same date as YYYY-MM-DD |
listedAt, viewCount, favoritedCount | When the listing was placed, its views and how many people saved it (details only) |
bidCount, highestBid | Number of bids and highest bid in euros on listings that accept bids (details only) |
images, imageCount | Photo URLs in large size. Search results give the first photo; listing details give all of them |
isReserved, isAdmarkt, promotion | Reserved flag, whether it's an Admarkt (business) ad, and paid placement such as DAGTOPPER |
Fields a listing doesn't have come back as null. For example, cars and houses have no delivery option, and distanceKm is only filled when you set a postcode.
Price types
priceType | Shown on the site as | price |
|---|---|---|
FIXED | A price, for example € 349,00 | The price |
MIN_BID | A price, with bidding open | The seller's price |
FAST_BID | Bieden (bids only, no price) | null |
FREE | Gratis (free) | 0 |
SEE_DESCRIPTION | Zie omschrijving (price in the description) | null |
RESERVED | Reserved for a buyer | Price if one is set |
How to scrape Marktplaats
- Open Marktplaats Scraper on Apify Store and click Try for free.
- Choose the Site: Marktplaats.nl, 2dehands.be or 2ememain.be.
- Type one or more keywords in Search queries, or leave it empty and pick a Category.
- Optionally add a Postcode and Distance (km), a Min price and Max price, a Condition, Listed since, Delivery and Sort by.
- Set Max listings for the whole run. Turn on Scrape listing details if you need full descriptions, specifications, posting dates, views or bids.
- Click Start. When the run finishes, download the dataset as JSON, CSV, Excel or HTML, or read it from the dataset API.
Input parameters
Every field is optional, but each run needs at least one search query or a category. See the Input tab for details.
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
platform | string | No | marktplaats.nl | marktplaats.nl, 2dehands.be or 2ememain.be |
searchQueries | array | No | — | Keywords, one search each |
categoryId | string | No | All categories | Main category ID (see the table below) |
subcategoryId | string | No | — | Subcategory ID inside the chosen category, for example 96 (BMW in Auto's) |
postcode | string | No | — | Dutch or Belgian postcode, for example 1012AB or 2000 |
distanceKm | integer | No | 0 | Radius around the postcode in km. 0 = no limit |
minPrice | integer | No | — | Minimum price in euros |
maxPrice | integer | No | — | Maximum price in euros |
condition | array | No | All | new, like_new, used, refurbished, not_working |
offeredSince | string | No | Any time | today, yesterday or week |
delivery | string | No | Any | pickup or shipping |
sort | string | No | relevance | relevance, newest, oldest, price_asc, price_desc |
maxItems | integer | No | 100 | Maximum listings saved in total, shared across all queries |
scrapeDetails | boolean | No | false | Open each listing page for the full description, specifications and stats |
proxyConfiguration | object | No | Apify Proxy | Proxy settings |
Main category IDs
The IDs are the same on all three sites. To find a subcategory ID, run a search in the main category and look at the categoryId field of the results. For example, 1953 is Mobiele telefoons | Apple iPhone under Telecommunicatie.
| ID | Category | ID | Category |
|---|---|---|---|
| 1 | Antiek en Kunst | 1098 | Diensten en Vakmensen |
| 31 | Audio, Tv en Foto | 1099 | Hobby en Vrije tijd |
| 91 | Auto's | 1032 | Huizen en Kamers |
| 2600 | Auto-onderdelen | 504 | Huis en Inrichting |
| 48 | Auto diversen | 565 | Kinderen en Baby's |
| 201 | Boeken | 621 | Kleding | Dames |
| 289 | Caravans en Kamperen | 1776 | Kleding | Heren |
| 1744 | Cd's en Dvd's | 678 | Motoren |
| 322 | Computers en Software | 728 | Muziek en Instrumenten |
| 378 | Contacten en Berichten | 1784 | Postzegels en Munten |
| 395 | Dieren en Toebehoren | 1826 | Sieraden, Tassen en Uiterlijk |
| 239 | Doe-het-zelf en Verbouw | 356 | Spelcomputers en Games |
| 445 | Fietsen en Brommers | 784 | Sport en Fitness |
| 820 | Telecommunicatie | 1984 | Tickets en Kaartjes |
| 1847 | Tuin en Terras | 167 | Vacatures |
| 856 | Vakantie | 895 | Verzamelen |
| 976 | Watersport en Boten | 537 | Witgoed en Apparatuur |
| 1085 | Zakelijke goederen | 428 | Diversen |
Example inputs
Used bikes between €100 and €500 within 10 km of Antwerpen on 2dehands.be:
{"platform": "2dehands.be","searchQueries": ["fiets"],"categoryId": "445","postcode": "2000","distanceKm": 10,"minPrice": 100,"maxPrice": 500,"condition": ["used"],"maxItems": 200}
The newest BMW listings on Marktplaats.nl with full details:
{"categoryId": "91","subcategoryId": "96","sort": "newest","scrapeDetails": true,"maxItems": 100}
Output example
Each listing is one item. This is a real record from a run with Scrape listing details turned on (description, specifications, attributes and photos shortened). The Console shows a Listings table and a Details table.
{"listingId": "m2457362657","platform": "marktplaats.nl","url": "https://www.marktplaats.nl/v/auto-s/bmw/m2457362657-bmw-x5-xdrive50e-high-executive-m-sport-pro-m-seats-soft","title": "BMW X5 XDrive50e High Executive M-SPORT PRO / M-SEATS / SOFT","description": "Algemene informatie\nAantal deuren: 5\nKleur: Zwart metallic\n\nTechnische informatie\nVermogen: 360 kW (489 PK)...","fullDescription": true,"price": 89945.0,"priceType": "FIXED","currency": "EUR","condition": "Gebruikt","conditionNormalized": "used","delivery": null,"shippingAvailable": null,"pickupAvailable": null,"categoryId": 96,"category": "BMW","parentCategoryId": 91,"parentCategory": "Auto's","attributes": {"constructionYear": "2024","mileage": "45159","energyLabel": "A","fuel": "Hybride Elektrisch/Benzine","transmission": "Automaat","body": "SUV of Terreinwagen","model": "X5"},"specifications": {"Bouwjaar": "2024","Kilometerstand": "45.159 km","Brandstof": "Hybride Elektrisch/Benzine","Transmissie": "Automaat 8 versnellingen","Vermogen": "489 pk","Type hybride": "Plug-in hybride","Merk & Model": "BMW X5","Carrosserie": "SUV of Terreinwagen"},"sellerId": "15767181","sellerName": "Jan Blonk Auto's","sellerType": "business","sellerVerified": false,"sellerProfileUrl": "https://www.marktplaats.nl/smb-profile/profile/15767181/","sellerActiveYears": 15,"sellerWebsite": "www.janblonkautos.nl/","sellerPhone": "0634039699","city": "Alphen aan den Rijn","country": "Nederland","countryCode": null,"latitude": 52.116023238019,"longitude": 4.6887976695324,"distanceKm": null,"dateLabel": "Vandaag","date": "2026-10-25","listedAt": "2026-10-24T13:13:25Z","viewCount": 641,"favoritedCount": 13,"bidCount": null,"highestBid": null,"images": ["https://images.marktplaats.com/api/v1/hz-mp-pro-listing/images/50e9a15b-51af-4214-ae22-5fdb328fc35f?rule=ecg_mp_eps$_85.jpg","https://images.marktplaats.com/api/v1/hz-mp-pro-listing/images/b7ff3ccb-ab18-44dd-b0b6-c9f0a7892407?rule=ecg_mp_eps$_85.jpg"],"imageCount": 64,"isReserved": false,"isAdmarkt": false,"promotion": "DAGTOPPER","searchQuery": null,"searchCategoryId": 91,"scrapedAt": "2026-10-25T10:23:38Z"}
Without listing details, specifications, listedAt, viewCount, favoritedCount, bidCount, highestBid and the seller profile fields are null. sellerType is then only filled for Admarkt ads, which are always placed by businesses.
Use Marktplaats Scraper from Python or JavaScript
Install the client with pip install apify-client or npm install apify-client, and get your API token from Apify Console.
Python
from apify_client import ApifyClientclient = ApifyClient("<APIFY_TOKEN>")run = client.actor("parsebird/marktplaats-scraper").call(run_input={"platform": "marktplaats.nl","searchQueries": ["iphone 15"],"maxPrice": 600,"sort": "price_asc","maxItems": 200,})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item["price"], item["title"], item["city"], item["url"])
JavaScript
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<APIFY_TOKEN>' });const run = await client.actor('parsebird/marktplaats-scraper').call({platform: '2ememain.be',searchQueries: ['velo electrique'],scrapeDetails: true,maxItems: 100,});const { items } = await client.dataset(run.defaultDatasetId).listItems();items.forEach((l) => console.log(l.price, l.title, l.listedAt, l.viewCount));
Use cases
- Price research: see what an item really sells for in the Netherlands or Belgium before you buy, sell or set a trade-in price.
- Deal alerts: schedule a search sorted by newest and get new listings under your price as soon as they appear.
- Used car and bike market analysis: collect mileage, year, fuel and price for a brand or model and compare regions.
- Reseller sourcing: find underpriced items, free items (
priceType: FREE) or listings close to your postcode. - Dealer and competitor monitoring: track the stock, prices and views of business sellers.
- Market data for apps and research: feed listing data into dashboards, spreadsheets or machine-learning models.
How it works
- The Actor builds a search from your site, keyword, category, location, price and filter settings.
- It reads the search results 100 listings at a time until it reaches Max listings or the end of the results.
- If you ask for more than the site shows for one search (about 2,500), it switches to price order and continues from the last price it reached until it has enough listings.
- With Scrape listing details on, it opens each listing page and adds the full description, specifications, posting date, stats, bids, seller details and all photos.
- Listings are de-duplicated across queries and saved to the dataset as they are collected.
How much does it cost to scrape Marktplaats?
Marktplaats Scraper uses pay-per-event pricing. You pay for each listing saved to the dataset. Platform usage (compute and proxy) is included in the event price, so it isn't billed separately.
| Event | Free | Bronze | Silver | Gold |
|---|---|---|---|---|
| Listing scraped | $2.49 / 1,000 | $2.19 / 1,000 | $1.79 / 1,000 | $1.29 / 1,000 |
One saved listing is one charge, with or without listing details. At Free plan prices, 100 listings cost about $0.25 and 1,000 listings cost $2.49. To control spending, use Max listings. The run also stops when it reaches the maximum cost per run you set in Apify Console.
Is it legal to scrape Marktplaats?
Marktplaats Scraper only collects listing information that Marktplaats, 2dehands and 2ememain show publicly to visitors who aren't logged in. It doesn't log in and doesn't access messages or private account data. Listings can contain personal data, such as a private seller's display name. If you store or process that data you're responsible for complying with the GDPR and the sites' terms of service. Consult a lawyer if you're unsure. For more background, read Apify's article Is web scraping legal?
Other marketplace scrapers from ParseBird
| Actor | What it does |
|---|---|
| Funda.nl Scraper | Dutch houses and apartments for sale and rent from Funda |
| Ebay Kleinanzeigen Scraper | Classified listings from kleinanzeigen.de in Germany |
| Willhaben.at Scraper | Marketplace, property, car and job listings from Austria |
| Vinted Scraper | Second-hand fashion listings from Vinted |
| Otomoto.pl Scraper with Contacts | Car listings from Poland |
| eBay Sold Listings Scraper | Sold prices from eBay |
FAQ
Do I need a Marktplaats account or API key? No. The Actor reads the same public listings the website shows to logged-out visitors.
Can I get more than 2,500 listings from one search? Yes. Marktplaats only shows about 2,500 results per search. When Max listings is higher than that, the Actor reads the results in price order and continues from the last price it reached. Results then come in price order instead of your chosen sort. Listings without a price (Zie omschrijving) can only be reached through the first 2,500 results of the search, so for very large searches add a category or postcode to narrow them down.
Does it work for Belgium? Yes. Choose 2dehands.be for the Dutch-language Belgian site or 2ememain.be for the French-language site. Category IDs and filters work the same way, and texts such as condition and category names come back in the site's language.
What's the difference between date and listedAt?
date is the date shown in the search results. For promoted listings (for example with a Dagtopper) it can be much more recent than the day the listing was placed. listedAt comes from the listing page and is the date the listing was placed. It's filled when Scrape listing details is on.
Why are some prices null?
The listing has no price: it's bids only (FAST_BID) or the price is in the description (SEE_DESCRIPTION). Free items have price 0.
Why is my postcode ignored?
If the site doesn't recognise the postcode, it searches the whole country and the run log shows a warning. Use the format the site uses: four digits and two letters in the Netherlands (1012AB) and four digits in Belgium (2000).
Do I need a proxy? The Actor uses Apify Proxy by default. Marktplaats limits how many searches one IP address can make, so the Actor changes IP and moves to residential proxy by itself if requests are refused. Proxy costs are included in the price per listing.
Can I run it on a schedule or connect it to other tools? Yes. Use Apify schedules, call it from the API, or connect it to Make, Zapier, n8n, Google Sheets, Slack or a webhook through integrations.
Something is missing or wrong. What should I do? Open an issue in the Issues tab. We read every report.