Marktplaats Scraper — Monitor Listings & Deep Details
Pricing
from $3.00 / 1,000 scraped listings
Marktplaats Scraper — Monitor Listings & Deep Details
Fast and lightweight python scraper for marktplaats.nl using curl_cffi. Extracts titles, prices, descriptions, high-res images, location coordinates, dynamic attributes, and detailed seller metrics. Supports real-time monitoring and Telegram/Discord alerts.
Pricing
from $3.00 / 1,000 scraped listings
Rating
0.0
(0)
Developer
Andrej Kiva
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
5 days ago
Last modified
Categories
Share
Marktplaats Scraper — Netherlands Classified Ads, Prices & Listing Monitor
Disclaimer: This is an unofficial integration developed independently. It is not affiliated with, sponsored by, or endorsed by Marktplaats.nl or any of its subsidiaries.
Marktplaats and related names are trademarks of Marktplaats B.V. Data is read from publicly accessible search results and listing pages. No Marktplaats account login is required.
This Actor is provided for informational, research, and price monitoring purposes only. You are solely responsible for complying with applicable laws, Marktplaats's terms of use, and your organization's policies.
Extract structured classified ads data from the Netherlands' largest marketplace — marktplaats.nl. Search by keyword, Dutch postal code (Postcode) + radius, price range, or paste a pre-filtered browser URL. Parses full listing descriptions, dynamic attributes (brand, model, storage, condition, etc.), high-resolution images, seller profile metrics (account type, active years, verification status), location data, view counts, shipping options, and bid histories.
Includes monitoring mode with delta tracking and native Telegram & Discord webhooks for real-time alerts when new listings appear or prices change.
Best for: Marktplaats price research, Dutch classifieds monitoring, resale arbitrage alerts, local deal hunting by postcode, and bulk JSON/CSV export via Apify integrations.
When to use this Actor
- Marktplaats price tracking — Collect listing prices, attributes, and locations for market averages and trend analysis across phones, cars, furniture, and more.
- Real-time deal hunting & arbitrage — Run in monitor mode every 1–5 minutes and get instant Telegram or Discord alerts for newly listed underpriced items.
- Local inventory matching — Search by Postcode + radius (e.g. iPhone 15 Pro within 25 km of Amsterdam) to find pickup-friendly deals.
- Category & filter scraping — Copy any filtered search URL from your browser (category, brand, price, condition) into Start URLs for exact replication.
- Seller trust signals — Parse verification status, seller type (consumer vs trader), and active-since metrics alongside each listing.
When not to use this Actor
- Private messages or seller contact — This Actor reads public listing pages only; it does not access Marktplaats messaging or in-app chat.
- Account-authenticated actions — No login, favorites, or saved-search API; use Start URLs for pre-built filter combinations instead.
- Heavy JavaScript SPAs outside Marktplaats — Built specifically for
marktplaats.nlsearch and detail pages, not generic web scraping.
Key Features
- Lightweight & fast — Runs on 128–512 MB RAM with efficient HTTP requests — no heavy headless browser required.
- Full image extraction — All available high-resolution listing images, not just search-result thumbnails.
- Postcode + radius search — Dutch postal code geolocation with configurable km radius (3–150 km).
- Detail-page enrichment — View counts, favorites, shipping options, bid lists, and full attribute tables when
scrapeDetailsis enabled. - Seller profile parsing — Account type, active years, and verification status from public listing data.
- Telegram & Discord alerts — Native webhook support in input config: images, prices, location, and description snippets on new listings.
- Smart monitoring — Key-Value store tracks seen listing IDs and prices; stops pagination early when consecutive known ads are found.
- Parallel detail fetching — Configurable concurrency for faster bulk runs on large result sets.
Input Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
startUrls | Array | [] | Direct URLs to search results, categories, or individual listings. Filters from the URL are preserved. |
searchQuery | String | — | Search term (e.g. iphone 15 pro). Ignored when Start URLs are provided. |
postalCode | String | — | Dutch postal code (Postcode) to restrict search to a region. |
radius | String | "0" | Radius in km around Postcode: 3, 5, 10, 15, 25, 50, 75, 100, 150. |
minPrice / maxPrice | Number | — | Filter listings by price range (€). |
maxItems | Integer | 100 | Maximum number of listings to collect. |
scrapeDetails | Boolean | true | Visit detail pages for full gallery, stats, bids, and shipping. If false, collects cards from search results only. |
maxConcurrency | Integer | 5 | Parallel detail-page fetches (1–15). Higher = faster; lower = more stable on large batches. |
monitorMode | Boolean | false | Delta tracking: only new/updated listings in output; early stop on known ads. |
telegramToken | String | — | Telegram Bot token for alert notifications. |
telegramChatId | String | — | Telegram chat ID to receive alerts. |
discordWebhook | String | — | Discord webhook URL for rich listing embed cards. |
proxyConfiguration | Object | — | Apify Proxy settings. Netherlands (NL) residential proxy recommended for high volume. |
Input Example
{"searchQuery": "iphone 15 pro","postalCode": "1012","radius": "25000","minPrice": 400,"maxPrice": 900,"maxItems": 500,"scrapeDetails": true,"maxConcurrency": 5,"monitorMode": false,"proxyConfiguration": {"useApifyProxy": true,"apifyProxyGroups": ["RESIDENTIAL"],"apifyProxyCountry": "NL"}}
Output Format
Each dataset row = one parsed Marktplaats listing.
| Field | Type | Description |
|---|---|---|
adId | String | Unique Marktplaats listing ID. |
url | String | Canonical listing URL. |
title | String | Ad headline. |
price | Number | Numeric price in EUR when fixed; null for auction-only listings. |
priceType | String | e.g. FIXED, MIN_BID, FAST_BID, SEE_DESCRIPTION. |
description | String | Full listing description text. |
location | Object | City, postcode, country, latitude, longitude when available. |
shipping | Object | Shipping options and carrier labels from detail page. |
attributes | Object | Dynamic key/value pairs (condition, storage, model, etc.). |
images | Array | High-resolution image URLs. |
seller.id | Number | Seller account ID. |
seller.name | String | Public seller display name. |
seller.type | String | e.g. CONSUMER, TRADER. |
seller.active_since | String | How long the seller has been active on Marktplaats. |
seller.isVerified | Boolean | Verification badge status. |
stats.viewCount | Number | Listing view count (detail scrape). |
stats.favoritedCount | Number | Times saved to favorites (detail scrape). |
stats.since | String | Exact publish timestamp (ISO 8601). |
bids | Array | Current bids with value, date, and bidder nickname (when bidding enabled). |
publishedDate | String | Listing publish date/time. |
scrapedAt | String | Extraction timestamp (UTC ISO 8601). |
Output Example
{"adId": "m2416596985","url": "https://www.marktplaats.nl/v/telecommunicatie/mobiele-telefoons-apple-iphone/m2416596985-iphone-13-pro","title": "iPhone 13 pro","price": 275.0,"priceType": "MIN_BID","description": "Selling my wife's iPhone 13 pro 128GB. Very good condition, battery health 76%. Pick up in Amstelveen.","location": {"city": "Amstelveen","postcode": "1181","country": "Nederland","latitude": 52.290225,"longitude": 4.841126},"shipping": {"augmentedLabels": [{"carrierId": "dhl-nl","labels": [{"label": "Afhaalpunt via DHL voor","price": "€ 2,89","carrierName": "DHL","deliveryMethod": "PICK_UP"}]}]},"attributes": {"Conditie": "Zo goed als nieuw","Opslagcapaciteit": "128 GB","Abonnement": "Zonder abonnement","Simlock": "Zonder simlock"},"images": ["https://images.marktplaats.com/api/v1/hz-mp-pro-listing/images/a37247a3-38a9-4f66-8e8a-e5de7be6ff0e?rule=ecg_mp_eps$_85.jpg"],"seller": {"id": 22317049,"name": "Mihai Filer","type": "CONSUMER","active_since": "11 jaar","isVerified": true},"stats": {"viewCount": 78,"favoritedCount": 1,"since": "2026-07-03T12:46:35Z"},"bids": [{"id": 1548714969,"value": 27500,"date": "2026-07-03T16:04:18Z","user": { "id": 52047226, "nickname": "JB" }}],"publishedDate": "2026-07-03T12:46:35Z","scrapedAt": "2026-07-03T18:55:10.397Z"}
Use Cases
| Use Case | What you get |
|---|---|
| Resale arbitrage | New-listing alerts with price, photos, and location for flip opportunities |
| Market pricing | Structured price + attribute datasets per keyword or category |
| Local deal hunting | Postcode + radius filters for pickup-friendly Dutch classifieds |
| Automotive & spec-heavy sourcing | Full attribute tables for cars, phones, and electronics |
| Data pipelines | JSON/CSV export or webhook integrations to Sheets, databases, and BI tools |
FAQ
How is this different from a generic web scraper?
This Actor is built specifically for marktplaats.nl: search pagination, Dutch attribute parsing, seller metrics, bid history, monitor-mode delta tracking, and Telegram/Discord alerts — out of the box.
Do I need proxies?
For high-volume runs (500–1000+ listings), aggressive monitoring (every 1 minute), or detail scraping at scale, use Apify Residential Proxies with Netherlands (NL) country targeting for best reliability.
Can I scrape specific categories or advanced filters?
Yes. Open marktplaats.nl in your browser, apply all filters (category, brand, price, condition, sort), copy the URL from the address bar, and paste it into Start URLs (startUrls). This is the most reliable way to replicate complex filter combinations.
How does Monitoring Mode work?
With monitorMode: true, listing IDs and prices are stored in the default Key-Value Store. On each run the Actor scans from the top of search results. New or price-changed listings are written to the dataset and sent to Telegram/Discord. After 5 consecutive already-known unchanged ads, pagination stops to save compute.
Can I scrape 1000+ listings in one run?
Yes. Set maxItems to your target (e.g. 1000) and tune maxConcurrency (default 5). Use Netherlands residential proxies for large batches with scrapeDetails: true. Pagination walks search result pages automatically until the limit is reached or results are exhausted.
Does it export to JSON / CSV / API?
Yes. Results are written to the Apify dataset. Download JSON, CSV, or Excel from the run, or connect webhooks and integrations (Google Sheets, BigQuery, custom API endpoints, etc.).