Marktplaats Scraper - Dutch Classifieds, Prices & Sellers
Pricing
from $0.50 / 1,000 run start fees
Marktplaats Scraper - Dutch Classifieds, Prices & Sellers
Search Marktplaats or paste a category URL and get classified ads as rows: title, price and what that price means (fixed, minimum bid, auction, swap, on request), city with coordinates, seller id, name and verification, condition, delivery and promotion flags.
Pricing
from $0.50 / 1,000 run start fees
Rating
0.0
(0)
Developer
SR
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
1
Monthly active users
20 days ago
Last modified
Categories
Share
Marktplaats Scraper
This Marktplaats scraper collects classified listings from Dutch search results and category pages. It returns titles, listing URLs, price amounts and price types, seller information, condition, delivery, images and location coordinates in a dataset. You can start with a search term or paste a Marktplaats category URL. A listing URL takes precedence when both are supplied.
What the Marktplaats scraper returns
Each dataset row represents one advertisement with a stable item_id. Results are deduplicated across pages and numbered using position. Sponsored placements can occur on several pages, so a request for 60 ads can legitimately return 59 unique ads. Search results also change as sellers add, reserve or remove listings. The actor reports the search's totalResultCount separately from the number of listings returned.
Price types matter when comparing secondhand goods. A fixed asking price, a minimum bid and an auction amount are numeric prices, while a swap or price-on-request listing has no comparable amount. The actor keeps these distinctions instead of replacing missing prices with zero. You can group a seller's listings using seller_id, inspect verification using seller_verified, and use the original attributes to analyse category-specific details such as condition or delivery options.
Input
Provide either query or url. Dutch search terms usually match the site's vocabulary most closely. The search box example is fiets; that example is a suggested starting input, not an automatic query default. Runs without either input return an empty result with an input error message.
| Field | Type | Default | Meaning |
|---|---|---|---|
query | string | none | Search term; optional when a URL is supplied |
url | string | none | Marktplaats search or category URL, or a relative category path |
sort | string | relevance | relevance, date, price_asc, or price_desc |
price_min | integer | none | Minimum price in euros; zero disables the filter |
price_max | integer | none | Maximum price in euros; zero disables the filter |
limit | integer | 60 | Maximum unique listings, from 1 to 900 |
retries | integer | 3 | Attempts per page, from 1 to 6 |
cursor | string | none | Optional continuation value from an earlier response |
The following input was used in an actual run:
{"query": "fiets","limit": 60,"retries": 3}
When a pasted URL contains browser price filters, those filters are preserved unless you explicitly replace them with price_min or price_max. Set sort explicitly when using a sorted browser URL: Apify supplies the default relevance value even for API runs. Search and category URLs must belong to marktplaats.nl or www.marktplaats.nl.
Output
The default dataset contains the ads. The key-value store contains a summary record and, when a page fails, an errors record. The summary includes total source matches, the site's allowed page ceiling, planned pages, returned listings, listings with a price and elapsed collection time. A partial result retains the successfully collected listings and explains which pages failed.
This complete row came from the actual run above:
{"item_id": "m2075535999","url": "https://www.marktplaats.nl/v/fietsen-en-brommers/fietsen-dames-damesfietsen/m2075535999-dames-fietsen-heren-fietsen-oma-fietsen-transportfietsen","title": "Dames fietsen heren fietsen oma fietsen transportfietsen","description": "Wij van 030 fietsen hebben een totale leeg verkoop actie. 300 Rijklare fietsen in de uitverkoop. Wij hebben rijklare fietsen nu in de winkel staan vanaf €75,- wat hebben wij zoal staan? Cortina b","price": 75,"price_cents": 7500,"price_type": "fixed price","price_type_code": "FIXED","currency": "EUR","city": "Utrecht","country": "NL","latitude": 52.093055771437,"longitude": 5.1234611252344,"posted_label": "Vandaag","seller_id": 39689712,"seller_name": "030 fietsen","seller_verified": false,"is_business_seller": false,"category_id": 447,"condition": null,"delivery": "Ophalen of Verzenden","attributes": {"delivery": "Ophalen of Verzenden"},"is_promoted": true,"promotion_type": "DAGTOPPER","is_reserved": false,"image": "https://images.marktplaats.com/api/v1/hz-mp-pro-listing/images/1a/1a02ea2a-3068-43a7-a1f5-a5a9e4378738?rule=ecg_mp_eps$_82.jpg","images_count": 1,"query": "fiets","position": 1,"source": "marktplaats-scraper","fetched_at": "2026-10-05T17:24:49.669Z","listing_id": "m2075535999","image_url": "https://images.marktplaats.com/api/v1/hz-mp-pro-listing/images/1a/1a02ea2a-3068-43a7-a1f5-a5a9e4378738?rule=ecg_mp_eps$_82.jpg","has_location": true}
The original 29 listing fields are retained. Additional fields include source, fetched_at, listing_id, image_url and has_location. The same collection timestamp is used for every row, including continuation responses. listing_id repeats the stable advertisement id, and image_url repeats the primary image URL.
price is expressed in euros and price_cents holds the corresponding integer amount. They are populated for fixed prices, minimum bids and auction amounts. Other price states have null amounts and are described by price_type and price_type_code. description is the excerpt visible in the search listing; the actor does not open every advertisement to collect its full text.
Coordinates are supplied by the listing and can be approximate. Ads that only specify a country may contain 0,0 coordinates and an empty country abbreviation. These original values are retained; use has_location to identify useful coordinates. images_count is null when no images are supplied. The promotion flag is false for the site's ordinary NONE promotion type and true for an actual promotion.
Use cases for a Marktplaats scraper
- Secondhand price research. Collect every listing for a product such as an e-bike, a phone model or a sofa, filter on
price_type_codeFIXEDand compare asking prices by condition and region. - Following new listings. Run the same search sorted by
dateon a schedule and keep theitem_idvalues you have not seen before. This gives you a feed of new advertisements for a saved search, without checking the site by hand. - Resellers and dealers. Group listings by
seller_idto see who offers what, how many ads a seller runs and which ones are promoted with a paid placement. - Market and category analysis. Paste a category URL to measure supply in that category, the share of business sellers, delivery options and where in the Netherlands the ads are located.
- Lead lists for services around classifieds. Seller names, verification and website indicators help to find active sellers in a niche.
Marktplaats scraper compared with other options
Marktplaats has an official API, but it is meant for professional advertisers who publish and manage their own ads. It does not give you the public search results of other sellers. Copying results by hand or with a browser extension works for one page, but breaks down when you need hundreds of ads, repeat runs or a clean price field. Open-source scripts exist, but you have to host, maintain and repair them yourself whenever the site changes.
This actor returns the public search results as structured rows, removes duplicate sponsored placements, separates real numeric prices from swaps and bids, and runs on Apify's scheduler and integrations. You can export the dataset as JSON, CSV or Excel, or read it through the Apify API from your own code.
Pricing
The existing pay-per-event pricing is unchanged: run_start costs $0.0005 per run, including a run that finds no listings. The listing event costs $0.00035 per delivered advertisement, or $0.35 per 1,000 listings, plus the start fee. Listing charges follow dataset delivery and count only the rows actually delivered. No listing event is charged for an empty search.
Users without a paid Apify plan receive at most ten listings per run. Only those delivered listings are charged. Paid users retain the requested limit, up to 900. The actor handles continuation automatically when a collection needs to continue, while retaining deduplication and a single run-start event.
Limits and interpretation
Results are limited to 30 source pages and 900 unique advertisements. The site may impose a lower page ceiling, and duplicate sponsored ads can reduce the final count. pagesFetched retains the original meaning of planned pages, including a page that fails. An empty search is a successful empty run; a blocked or unavailable source also produces a recoverable empty result with an English explanation.
The is_business_seller field reflects whether the seller shows a website link. It is a useful source indicator, not an independently verified company classification. Likewise, seller_verified reports Marktplaats's own flag. For comparable pricing research, distinguish fixed prices from bids and group listings by condition rather than treating every numeric amount as a final sale price.
FAQ
Can I collect an entire category?
Yes. Supply a Marktplaats category URL using url. The actor applies the same sorting, price filtering, deduplication and row limit as it does for a search term.
Why did I receive fewer listings than my limit?
The search may have fewer matches, the site may limit accessible pages, or promoted advertisements may repeat across pages. A page failure can also reduce delivery; the run's errors explain that case. The limit is a maximum, not a guaranteed result count.
Why is a listing's price null?
Some sellers request contact, offer a swap, give an item away or describe the price in text. Those states are preserved explicitly and have no comparable numeric asking price. Check price_type before calculating price statistics.
Are full advertisement descriptions and every image included?
The actor returns the search-listing description excerpt, the primary image and the number of images reported by the source. It does not fetch each advertisement's detail page.
How do I recognise an advertisement across repeated runs?
Use item_id or its equivalent listing_id. Titles, prices, seller labels and result positions can change over time; the advertisement id is the appropriate join key.
Is there an official Marktplaats API for search results?
The official Marktplaats API is for professional advertisers to place and manage their own advertisements. It does not return public search results from other sellers. This Marktplaats scraper fills that gap: it gives you the public listings for a search term or category as a dataset.
How do I scrape Marktplaats for new listings only?
Set sort to date, schedule the actor in Apify and store the item_id values from each run. Every id you have not seen before is a new advertisement for that search.