# Marktplaats Scraper (`parsebird/marktplaats-scraper`) Actor

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.

- **URL**: https://apify.com/parsebird/marktplaats-scraper.md
- **Developed by:** [ParseBird](https://apify.com/parsebird) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.29 / 1,000 listings

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

Marktplaats Scraper pulls classified listings from [Marktplaats.nl](https://www.marktplaats.nl), the largest second-hand marketplace in the Netherlands, and from its Belgian sister sites [2dehands.be](https://www.2dehands.be) and [2ememain.be](https://www.2ememain.be). You get structured data from your keyword, category, postcode and price filters, with no account and no API key.

<table><tr>
<td style="border-left:4px solid #1C1917;padding:12px 16px;font-weight:600">
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.
</td>
</tr></table>

##### 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](https://www.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](https://docs.apify.com/platform/schedules) to watch for new listings or price drops, call the Actor from the [Apify API](https://apify.com/parsebird/marktplaats-scraper/api), connect it to [Make, Zapier, n8n, Google Sheets or Slack](https://apify.com/integrations), 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

1. Open [Marktplaats Scraper](https://apify.com/parsebird/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](https://docs.apify.com/api/v2/dataset-items-get).

### Input parameters

Every field is optional, but each run needs at least one search query or a category. See the [Input tab](https://apify.com/parsebird/marktplaats-scraper/input-schema) 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:

```json
{
    "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:

```json
{
    "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.

```json
{
    "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](https://console.apify.com/settings/integrations).

**Python**

```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**

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

| 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?](https://blog.apify.com/is-web-scraping-legal/)

### Other marketplace scrapers from ParseBird

| Actor | What it does |
|-------|--------------|
| [Funda.nl Scraper](https://apify.com/parsebird/funda-scraper) | Dutch houses and apartments for sale and rent from Funda |
| [Ebay Kleinanzeigen Scraper](https://apify.com/parsebird/ebay-kleinanzeigen-scraper) | Classified listings from kleinanzeigen.de in Germany |
| [Willhaben.at Scraper](https://apify.com/parsebird/willhaben-scraper) | Marketplace, property, car and job listings from Austria |
| [Vinted Scraper](https://apify.com/parsebird/vinted-scraper) | Second-hand fashion listings from Vinted |
| [Otomoto.pl Scraper with Contacts](https://apify.com/parsebird/otomoto-scraper) | Car listings from Poland |
| [eBay Sold Listings Scraper](https://apify.com/parsebird/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](https://docs.apify.com/platform/schedules), call it from the [API](https://apify.com/parsebird/marktplaats-scraper/api), or connect it to Make, Zapier, n8n, Google Sheets, Slack or a webhook through [integrations](https://apify.com/integrations).

**Something is missing or wrong. What should I do?**
Open an issue in the [Issues tab](https://apify.com/parsebird/marktplaats-scraper/issues). We read every report.

# Changelog

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

# Actor input Schema

## `platform` (type: `string`):

Choose the marketplace. All three sites share the same listing format.

## `searchQueries` (type: `array`):

Enter one or more keywords, the same as typing in the site's search box (e.g. iphone 15, bakfiets, eettafel). Each keyword is a separate search. Leave empty to browse a whole category.

## `categoryId` (type: `string`):

Limit the search to one main category. The IDs are the same on all three sites.

## `subcategoryId` (type: `string`):

Optional. Enter a subcategory ID to narrow the category, e.g. 96 for BMW inside Auto's. Needs a Category. Every result has a categoryId field you can reuse here.

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

Enter a Dutch or Belgian postcode as the centre of the search, e.g. 1012AB (Amsterdam) or 2000 (Antwerpen).

## `distanceKm` (type: `integer`):

Search radius around the postcode in kilometres. Used only with a postcode. 0 = no limit.

## `minPrice` (type: `integer`):

Only listings priced at or above this amount in euros. Listings without a price (bidding only, see description) are left out when a price filter is set.

## `maxPrice` (type: `integer`):

Only listings priced at or below this amount in euros.

## `condition` (type: `array`):

Keep only listings in these conditions. Leave empty for all.

## `offeredSince` (type: `string`):

Keep only recently placed listings.

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

Keep only listings offered for pickup or with shipping.

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

Order of the results.

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

Maximum number of listings to save in total, shared across all search queries. Marktplaats shows about 2,500 results per search. Ask for more and the Actor reads the results in price order to go past that limit.

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

Open each listing page to add the full description, specifications table, posting date, view and favourite counts, bids, seller type, shipping options and all photos. Slower than search data alone.

## `proxyConfiguration` (type: `object`):

Apify Proxy is used by default. When requests get refused, the Actor changes IP and moves to residential proxy on its own.

## Actor input object example

```json
{
  "platform": "marktplaats.nl",
  "searchQueries": [
    "iphone 15"
  ],
  "categoryId": "",
  "distanceKm": 0,
  "offeredSince": "",
  "delivery": "",
  "sort": "relevance",
  "maxItems": 50,
  "scrapeDetails": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

# 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 = {
    "platform": "marktplaats.nl",
    "searchQueries": [
        "iphone 15"
    ],
    "maxItems": 50,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("parsebird/marktplaats-scraper").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 = {
    "platform": "marktplaats.nl",
    "searchQueries": ["iphone 15"],
    "maxItems": 50,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("parsebird/marktplaats-scraper").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 '{
  "platform": "marktplaats.nl",
  "searchQueries": [
    "iphone 15"
  ],
  "maxItems": 50,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call parsebird/marktplaats-scraper --silent --output-dataset

```

## MCP server setup

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

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/CMLndepSP54k0ebnm/builds/CFdW4Q1riy1oGwanf/openapi.json
