Marktplaats Scraper avatar

Marktplaats Scraper

Pricing

from $1.29 / 1,000 listings

Go to Apify Store
Marktplaats Scraper

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

ParseBird

Maintained by Community

Actor 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?

FieldDescription
listingId, url, platformMarktplaats listing ID (for example m2457362657), link to the listing and the site it came from
title, descriptionListing title and description. Search results give a short excerpt; with listing details it's the full text (fullDescription: true)
price, priceType, currencyPrice in euros as a number, the site's price type, and EUR
condition, conditionNormalizedCondition 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, pickupAvailableDelivery option as shown (Ophalen, Verzenden, Ophalen of Verzenden) and whether shipping or pickup is offered
categoryId, category, parentCategoryId, parentCategorySubcategory and main category, with IDs
attributesCategory attributes from the search results, such as type, color, mileage, constructionYear, fuel
specificationsThe listing page's specifications table (details only), for example Kilometerstand, Bouwjaar, Opslagcapaciteit
sellerId, sellerName, sellerVerifiedSeller ID, display name and verified flag
sellerType, sellerProfileUrl, sellerActiveYears, sellerWebsite, sellerPhoneprivate 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, distanceKmLocation, coordinates, and distance from your postcode
dateLabel, dateDate shown in the search results (Vandaag, 6 jul 26) and the same date as YYYY-MM-DD
listedAt, viewCount, favoritedCountWhen the listing was placed, its views and how many people saved it (details only)
bidCount, highestBidNumber of bids and highest bid in euros on listings that accept bids (details only)
images, imageCountPhoto URLs in large size. Search results give the first photo; listing details give all of them
isReserved, isAdmarkt, promotionReserved 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

priceTypeShown on the site asprice
FIXEDA price, for example € 349,00The price
MIN_BIDA price, with bidding openThe seller's price
FAST_BIDBieden (bids only, no price)null
FREEGratis (free)0
SEE_DESCRIPTIONZie omschrijving (price in the description)null
RESERVEDReserved for a buyerPrice if one is set

How to scrape Marktplaats

  1. Open Marktplaats Scraper on Apify Store and click Try for free.
  2. Choose the Site: Marktplaats.nl, 2dehands.be or 2ememain.be.
  3. Type one or more keywords in Search queries, or leave it empty and pick a Category.
  4. Optionally add a Postcode and Distance (km), a Min price and Max price, a Condition, Listed since, Delivery and Sort by.
  5. Set Max listings for the whole run. Turn on Scrape listing details if you need full descriptions, specifications, posting dates, views or bids.
  6. 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.

ParameterTypeRequiredDefaultDescription
platformstringNomarktplaats.nlmarktplaats.nl, 2dehands.be or 2ememain.be
searchQueriesarrayNo—Keywords, one search each
categoryIdstringNoAll categoriesMain category ID (see the table below)
subcategoryIdstringNo—Subcategory ID inside the chosen category, for example 96 (BMW in Auto's)
postcodestringNo—Dutch or Belgian postcode, for example 1012AB or 2000
distanceKmintegerNo0Radius around the postcode in km. 0 = no limit
minPriceintegerNo—Minimum price in euros
maxPriceintegerNo—Maximum price in euros
conditionarrayNoAllnew, like_new, used, refurbished, not_working
offeredSincestringNoAny timetoday, yesterday or week
deliverystringNoAnypickup or shipping
sortstringNorelevancerelevance, newest, oldest, price_asc, price_desc
maxItemsintegerNo100Maximum listings saved in total, shared across all queries
scrapeDetailsbooleanNofalseOpen each listing page for the full description, specifications and stats
proxyConfigurationobjectNoApify ProxyProxy 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.

IDCategoryIDCategory
1Antiek en Kunst1098Diensten en Vakmensen
31Audio, Tv en Foto1099Hobby en Vrije tijd
91Auto's1032Huizen en Kamers
2600Auto-onderdelen504Huis en Inrichting
48Auto diversen565Kinderen en Baby's
201Boeken621Kleding | Dames
289Caravans en Kamperen1776Kleding | Heren
1744Cd's en Dvd's678Motoren
322Computers en Software728Muziek en Instrumenten
378Contacten en Berichten1784Postzegels en Munten
395Dieren en Toebehoren1826Sieraden, Tassen en Uiterlijk
239Doe-het-zelf en Verbouw356Spelcomputers en Games
445Fietsen en Brommers784Sport en Fitness
820Telecommunicatie1984Tickets en Kaartjes
1847Tuin en Terras167Vacatures
856Vakantie895Verzamelen
976Watersport en Boten537Witgoed en Apparatuur
1085Zakelijke goederen428Diversen

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 ApifyClient
client = 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

  1. The Actor builds a search from your site, keyword, category, location, price and filter settings.
  2. It reads the search results 100 listings at a time until it reaches Max listings or the end of the results.
  3. 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.
  4. 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.
  5. 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.

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

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

ActorWhat it does
Funda.nl ScraperDutch houses and apartments for sale and rent from Funda
Ebay Kleinanzeigen ScraperClassified listings from kleinanzeigen.de in Germany
Willhaben.at ScraperMarketplace, property, car and job listings from Austria
Vinted ScraperSecond-hand fashion listings from Vinted
Otomoto.pl Scraper with ContactsCar listings from Poland
eBay Sold Listings ScraperSold 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.