# Marktplaats.nl Scraper (`lowlanddata/marktplaats-scraper`) Actor

Scrape Marktplaats.nl listings as clean JSON — titles, prices, categories, locations, images and dates. GDPR-clean by design: no seller names, IDs or contact data, ever. Automatic splitting past the 5,000-result cap, with pay-per-result pricing. Built for price monitoring and market research.

- **URL**: https://apify.com/lowlanddata/marktplaats-scraper.md
- **Developed by:** [Lowland Data](https://apify.com/lowlanddata) (community)
- **Categories:** E-commerce, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.59 / 1,000 results

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js/docs.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## Marktplaats.nl Scraper — GDPR-safe listings data

Extract listings from **Marktplaats.nl** — the Netherlands' largest second-hand marketplace — as clean, structured JSON. Prices, descriptions, categories, locations, images and posting dates, ready for price monitoring, market research and data pipelines.

**No seller personal data, ever.** This scraper is built GDPR-first: seller names, IDs, phone numbers and profile links never appear in the output — not as an option you have to remember to switch off, but by design. The only seller information included is whether the listing comes from a business or a private seller.

### Quick start (30 seconds)

1. Put what you'd type in the Marktplaats search box into **searchQuery** — e.g. `gazelle`.
2. Click **Start**. That's the whole minimum setup.
3. When the run finishes, open the dataset's **Overview** tab for a clean table, or **Export** it as CSV/Excel/JSON.

Everything else — price range, category, sorting — is an optional refinement, explained in the Input table below. To make it run by itself, create a **Schedule** in the Apify Console with the same input and add an email or Slack integration on the runs.

### What you can build with it

- **Flip underpriced finds before anyone else.** Sort by date, watch a category like road bikes or PS5 consoles, and get every new listing the minute it posts — with the price and condition already parsed, so your alert fires while the deal is still live.
- **Price a car properly.** Pull every BMW 5-Series within a year range and read `mileage`, `constructionYear`, `fuel`, `transmission` and the options list straight from `attributes` — build the price-vs-mileage curve that tells you what a car is really worth.
- **Track a market week over week.** Snapshot "e-bikes in Utrecht under €800" on a schedule and watch supply, median price and how fast things sell move over time — the raw material for a pricing report or a dashboard.
- **Feed an AI agent clean data.** Every field is structured, predictable and free of personal data, so an assistant or pipeline can consume it directly — no scrubbing, no compliance review before you store it.

### What you get

Each listing is one dataset item:

```json
{
  "listingId": "m2420174899",
  "title": "Gazelle fiets 57 cm met Nexusnaaf",
  "description": "Degelijke gazelle fiets met een framehoogte van 57 cm...",
  "priceCents": 9000,
  "priceType": "MIN_BID",
  "city": "Utrecht",
  "country": "Nederland",
  "latitude": 52.0908,
  "longitude": 5.1222,
  "postedAt": "Vandaag",
  "imageUrls": ["//images.marktplaats.com/api/v1/..."],
  "categoryId": 447,
  "url": "https://www.marktplaats.nl/v/fietsen-en-brommers/...",
  "attributes": { "condition": "Gebruikt", "frameHeight": "57 cm", "color": "Zwart" },
  "reserved": false,
  "sellerType": "private"
}
````

Category-specific attributes come through automatically. A car carries `constructionYear`, `mileage`, `fuel`, `transmission`, `body` and its full `options` list; a house carries `livingArea` and `numberOfRooms`; a phone carries `storage` and `cameraResolution` — whatever the marketplace records for that category, minus anything that identifies a seller.

Field notes, so you know exactly what you are buying:

- `priceCents` is the asking price in euro cents; listings without a price omit it. `priceType` tells you how to read it: `FIXED` (asking price) or `MIN_BID` (minimum bid), plus the marketplace's other kinds (`FAST_BID`, `SEE_DESCRIPTION`, …) when they occur.
- `postedAt` is the posting date exactly as the marketplace displays it — a date like `5 jul 26`, or a relative label like `Vandaag` (today) for recent listings.
- `latitude`/`longitude` are the marketplace's own municipality-level coordinates, not a seller address.
- `description` is the snippet the marketplace search returns, not the full listing page text.
- `imageUrls` are protocol-relative (`//images...`); prepend `https:` to use them.
- `attributes` is the whitelisted, non-personal spec set for the listing's category — `condition` and `delivery` on anything, plus e.g. car specs, property size or phone storage where they apply. Multi-value fields like a car's `options` come through as a list.
- `reserved` tells you whether the marketplace currently marks the listing as reserved.

### How much does it cost to scrape Marktplaats?

$1.99 per 1,000 listings delivered, pay-as-you-go — no subscription, no charge for empty or failed runs. In plain dollars:

- **100 listings ≈ $0.20** — a daily category watch.
- **500 listings ≈ $1.00** — a solid market snapshot.
- **A 5,000-listing crawl ≈ $10** — a full category, deduplicated.

The per-result price is all-inclusive — no separate platform-usage charges, no residential proxy surcharge. Higher Apify plans get automatic unit-price discounts (down to $1.59/1,000 on Gold).

Free-plan runs are limited to a sample of 25 items, enough to evaluate the output format against your real query.

### Not technical? Let your AI assistant set it up

Copy this into ChatGPT, Claude or any AI assistant, fill in the one line, and follow the conversation:

```text
Help me set up the "Marktplaats.nl Scraper" actor on Apify
(https://apify.com/lowlanddata/marktplaats-scraper). Guide me one step at a time.

What I want to watch: [E.G. "electric bikes under 800 EUR, alert me on new listings"]

Guide me to:
1. Propose my input values: searchQuery (what I'd type in the Marktplaats search
   box, Dutch terms work best), optional priceMinEur/priceMaxEur, optional
   postcode + radiusKm if I only want listings near me, optional conditions
   (new/as-new/used/refurbished/not-working), delivery (pickup/shipping),
   sortBy "date" for newest-first monitoring, and maxItems. To re-check specific
   listings I already know, use listingIds with the ids from their URLs instead.
2. If my watch fits one category: run one broad search first, read the categoryId
   from the results I care about, and add it to the input for precise runs.
3. Create a free Apify account (apify.com), open the actor page, paste the values
   into the Input form, and start a run.
4. Set up a daily Schedule in the Apify Console with the same input, plus an email
   or Slack integration so new results reach me automatically.
5. Show me how to export results as CSV/Excel, or read them from the API if I code.
```

### Input

| Field                         | Description                                                                                                                                                          |
| ----------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `searchQuery`                 | Free-text search, e.g. `fiets`. Provide this, a category, or both.                                                                                                   |
| `categoryId`                  | Numeric category ID to scope the crawl. See below for finding IDs.                                                                                                   |
| `listingIds`                  | Fetch these exact listings instead of searching, e.g. `["m2421501285"]` (the id in every listing URL and dataset item). Great for re-checking price or availability. |
| `postcode` / `radiusKm`       | Radius search: Dutch postcode (e.g. `3511AA`) plus a radius in km. Results include the distance in meters.                                                           |
| `conditions`                  | Only these conditions: `new`, `as-new`, `used`, `refurbished`, `not-working`.                                                                                        |
| `delivery`                    | `pickup`, `shipping`, or `any` (default).                                                                                                                            |
| `buyItNowOnly`                | Only listings with the "Direct Kopen" option.                                                                                                                        |
| `priceMinEur` / `priceMaxEur` | Only listings within this price range, in EUR.                                                                                                                       |
| `sortBy`                      | `date` (newest first, default), `price_asc`, `price_desc`, or `relevance`.                                                                                           |
| `maxItems`                    | Stop after this many listings. Default 1,000.                                                                                                                        |

A run needs at least a search query or a category — the marketplace has no "everything" feed, and the actor tells you so up front instead of returning an empty dataset.

#### Finding a category ID

Every result includes its `categoryId`. The quickest way to discover IDs is to run a broad search once and read the category IDs off the results you care about, then use them as input for scoped crawls.

#### A note on Dutch search matching

Marktplaats matches compound words, so a broad term returns more than you might expect: `fiets` (bike) also matches `rolstoelfiets` (wheelchair bike) and `bakfiets` (cargo bike). That is the marketplace's own search behaviour, not a quirk of this scraper — narrow with a `categoryId` or a price band when you need a tighter set. Occasional listings marked `Vandaag` mid-list are paid "bumped" ads, also marketplace behaviour.

### Use it from your code

Run the actor and get items straight back with one HTTP call (fine for scoped runs up to ~5 minutes):

```bash
curl "https://api.apify.com/v2/acts/lowlanddata~marktplaats-scraper/run-sync-get-dataset-items?token=<YOUR_API_TOKEN>" \
  -X POST -H "Content-Type: application/json" \
  -d '{"searchQuery": "fiets", "maxItems": 100}'
```

Node.js:

```js
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: '<YOUR_API_TOKEN>' });
const run = await client.actor('lowlanddata/marktplaats-scraper').call({
  searchQuery: 'fiets',
  maxItems: 100,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
```

Python:

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_API_TOKEN>")
run = client.actor("lowlanddata/marktplaats-scraper").call(
    run_input={"searchQuery": "fiets", "maxItems": 100})
items = client.dataset(run["defaultDatasetId"]).list_items().items
```

For large split crawls, start the run asynchronously and fetch the dataset when the finished-run webhook fires. Schedules (e.g. a daily price snapshot), webhooks and the Make/Zapier/n8n integrations all work out of the box — this is a standard Apify actor.

### Use it with AI agents (MCP)

Claude, Cursor and other MCP-capable agents can run this scraper as a tool through Apify's hosted MCP server: the agent fills in the search itself, starts the run and reads the results — no glue code.

Claude Code:

```bash
claude mcp add apify --transport http "https://mcp.apify.com?actors=lowlanddata/marktplaats-scraper"
```

Cursor or Claude Desktop (add a custom connector / MCP server with this URL):

```text
https://mcp.apify.com?actors=lowlanddata/marktplaats-scraper
```

Sign in with your Apify account when prompted — runs are billed to it. Setup details per client: [Apify MCP docs](https://docs.apify.com/platform/integrations/mcp), or start from this actor's own MCP page: [apify.com/lowlanddata/marktplaats-scraper/api/mcp](https://apify.com/lowlanddata/marktplaats-scraper/api/mcp).

Prompts that work once connected:

- "Find the 20 newest racefiets listings under €800 on Marktplaats and put them in a table by price."
- "Snapshot iPhone 15 listings and tell me the median asking price by storage size."
- "Check Marktplaats for camper vans posted today and flag anything at least 20% under the median."

### Beyond the 5,000-result window

The marketplace API returns at most 5,000 results per query. This scraper automatically splits large queries by category and price band and deduplicates across the shards, so broad crawls are not silently truncated at 5,000 items — a common limitation of similar scrapers. Marktplaats is a large market (a bare `fiets` search returns well over 200,000 listings), so this matters more here than on smaller sites.

### Is it legal to scrape Marktplaats?

Public listing data — prices, descriptions, categories, locations — is public commercial information, and this scraper is built so that the hard part of the question never arises: **no personal data enters your dataset in the first place.** The Dutch data-protection authority (Autoriteit Persoonsgegevens) is strict on personal data; an output that carries none is the point of this actor, not an afterthought.

Seller-identifying fields are removed structurally before anything reaches your dataset — the mapper whitelists fields in, it does not filter fields out, so new marketplace fields can never leak through. The only seller signal kept is business vs private. Requests are rate-limited to keep load on the marketplace negligible, and no anti-bot protections are bypassed.

One honest limit: titles and descriptions are the seller's own words, delivered as-is. If a seller chooses to type contact details into their listing text, that text is not rewritten — the guarantee covers the marketplace's data fields, not the content sellers publish about themselves.

### Troubleshooting

The actor fails fast with the reason in the run's status message:

- **"Provide a search query, a category, or both."** — the input was empty; fill in `searchQuery` and/or `categoryId`.
- **"priceMinEur must not be higher than priceMaxEur."** — inverted price range.
- **Unknown category errors** — the marketplace rejected the `categoryId`; re-check it against a recent result.
- **Fewer items than requested on a free plan** — the 25-item free sample cap; run on a paid Apify plan for full results.

### Is there a Marktplaats API alternative?

Marktplaats publishes no public API for listings. This actor is the practical alternative: the same listings as structured JSON through one HTTP call (`run-sync-get-dataset-items`), on a schedule, or as an MCP tool for AI agents — with the GDPR question already answered in the data itself.

### Does Marktplaats block scrapers?

The marketplace serves search results openly, and this actor stays inside that welcome: paced requests, standard datacenter proxies, load kept negligible. No CAPTCHA fights, no bot-wall cat-and-mouse — which is also why runs are fast and reliable enough for daily schedules.

### How do I monitor Marktplaats prices?

Set `sortBy: "date"` with your query, cap `maxItems` to a page or two, and add a daily (or hourly) Schedule in the Apify Console with an email/Slack integration on the runs — every new listing lands in your inbox with the price already parsed. The AI-assistant prompt above walks a non-technical user through exactly this setup.

### FAQ

**Can I get seller names or phone numbers?** No — by design. That is the product: data you can store, share and process without a GDPR review. The output tells you only whether the seller is a business or a private person.

**How is this different from other Marktplaats scrapers?** Structural GDPR safety (seller identity is unreachable, not just switched off), honest handling of the 5,000-result window, and rich category attributes — car specs, property size, phone storage — without a single personal field.

**How fresh is the data?** Live at run time — every run queries the marketplace directly. For continuous freshness, schedule the actor.

**Can I export to Excel or CSV?** Yes — every dataset exports as CSV, Excel, JSON or XML from the Apify Console or API.

**What happens above 5,000 results?** The marketplace API caps any single query at 5,000; the actor automatically splits by category and price band and deduplicates, so large crawls come through complete (a bare `fiets` search is 200,000+ listings).

**Do I get full listing descriptions?** You get the description snippet the marketplace search returns, not the full listing page text — stated honestly here rather than discovered later.

**Does it work with Make, Zapier or n8n?** Yes — it is a standard Apify actor; all platform integrations, webhooks and schedules apply.

### Related scrapers

Working the Benelux/German second-hand market? The same GDPR-clean guarantee, same output shape:

- [2dehands & 2ememain Scraper](https://apify.com/lowlanddata/tweedehands-scraper) — Belgium's largest second-hand marketplaces (same platform family as Marktplaats).
- [Kleinanzeigen.de Scraper](https://apify.com/lowlanddata/kleinanzeigen-scraper) — Germany's largest classifieds site, with full descriptions and spec tables.

### Support

Found an issue or missing a field you need? Open an issue on the actor's Issues tab — reports get fixed, this actor is actively maintained.

# Actor input Schema

## `searchQuery` (type: `string`):

Free-text search. Provide this, a category, or both.

## `categoryId` (type: `integer`):

Numeric marketplace category ID to scope the crawl. Every result includes its <code>categoryId</code>, so run a broad search first to discover the IDs you need. Optional.

## `listingIds` (type: `array`):

Fetch these exact listings instead of searching, e.g. \["m2421501285"] - the id is in every listing URL and every dataset item. Useful to re-check price or availability of listings you found earlier. When set, all search filters are ignored.

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

Dutch postcode to search around, e.g. "3511AA" (Utrecht). Combine with radiusKm; results include the distance in meters.

## `radiusKm` (type: `integer`):

Only return listings within this many km of the postcode. Requires postcode.

## `conditions` (type: `array`):

Only return listings in these conditions. Empty = all conditions.

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

Only listings offering pickup, or only listings that ship. "any" = no filter.

## `buyItNowOnly` (type: `boolean`):

Only listings with the "Direct Kopen" (buy it now) option.

## `priceMinEur` (type: `integer`):

Only return listings priced at or above this amount. Optional.

## `priceMaxEur` (type: `integer`):

Only return listings priced at or below this amount. Optional.

## `sortBy` (type: `string`):

Order of the results. Newest first is the default and the right choice for monitoring.

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

Stop after this many listings.

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

Proxy settings. Keep Apify proxy enabled.

## Actor input object example

```json
{
  "searchQuery": "fiets",
  "delivery": "any",
  "buyItNowOnly": false,
  "sortBy": "date",
  "maxItems": 1000,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `listings` (type: `string`):

Scraped marketplace listings, one JSON object per listing.

# 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 = {
    "searchQuery": "fiets",
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("lowlanddata/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 = {
    "searchQuery": "fiets",
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("lowlanddata/marktplaats-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "searchQuery": "fiets",
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call lowlanddata/marktplaats-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=lowlanddata/marktplaats-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Marktplaats.nl Scraper",
        "description": "Scrape Marktplaats.nl listings as clean JSON — titles, prices, categories, locations, images and dates. GDPR-clean by design: no seller names, IDs or contact data, ever. Automatic splitting past the 5,000-result cap, with pay-per-result pricing. Built for price monitoring and market research.",
        "version": "0.1",
        "x-build-id": "aKKgFwg5jnYjrVfjI"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/lowlanddata~marktplaats-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-lowlanddata-marktplaats-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/lowlanddata~marktplaats-scraper/runs": {
            "post": {
                "operationId": "runs-sync-lowlanddata-marktplaats-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/lowlanddata~marktplaats-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-lowlanddata-marktplaats-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "searchQuery": {
                        "title": "Search query",
                        "type": "string",
                        "description": "Free-text search. Provide this, a category, or both."
                    },
                    "categoryId": {
                        "title": "Category ID",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Numeric marketplace category ID to scope the crawl. Every result includes its <code>categoryId</code>, so run a broad search first to discover the IDs you need. Optional."
                    },
                    "listingIds": {
                        "title": "Specific listing IDs",
                        "type": "array",
                        "description": "Fetch these exact listings instead of searching, e.g. [\"m2421501285\"] - the id is in every listing URL and every dataset item. Useful to re-check price or availability of listings you found earlier. When set, all search filters are ignored.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "postcode": {
                        "title": "Postcode",
                        "type": "string",
                        "description": "Dutch postcode to search around, e.g. \"3511AA\" (Utrecht). Combine with radiusKm; results include the distance in meters."
                    },
                    "radiusKm": {
                        "title": "Radius (km)",
                        "minimum": 1,
                        "maximum": 300,
                        "type": "integer",
                        "description": "Only return listings within this many km of the postcode. Requires postcode."
                    },
                    "conditions": {
                        "title": "Condition",
                        "type": "array",
                        "description": "Only return listings in these conditions. Empty = all conditions.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "new",
                                "as-new",
                                "used",
                                "refurbished",
                                "not-working"
                            ],
                            "enumTitles": [
                                "New",
                                "As good as new",
                                "Used",
                                "Refurbished",
                                "Not working / parts"
                            ]
                        }
                    },
                    "delivery": {
                        "title": "Delivery",
                        "enum": [
                            "any",
                            "pickup",
                            "shipping"
                        ],
                        "type": "string",
                        "description": "Only listings offering pickup, or only listings that ship. \"any\" = no filter.",
                        "default": "any"
                    },
                    "buyItNowOnly": {
                        "title": "Buy-it-now only",
                        "type": "boolean",
                        "description": "Only listings with the \"Direct Kopen\" (buy it now) option.",
                        "default": false
                    },
                    "priceMinEur": {
                        "title": "Minimum price (EUR)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Only return listings priced at or above this amount. Optional."
                    },
                    "priceMaxEur": {
                        "title": "Maximum price (EUR)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Only return listings priced at or below this amount. Optional."
                    },
                    "sortBy": {
                        "title": "Sort order",
                        "enum": [
                            "date",
                            "price_asc",
                            "price_desc",
                            "relevance"
                        ],
                        "type": "string",
                        "description": "Order of the results. Newest first is the default and the right choice for monitoring.",
                        "default": "date"
                    },
                    "maxItems": {
                        "title": "Max items",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Stop after this many listings.",
                        "default": 1000
                    },
                    "proxyConfiguration": {
                        "title": "Proxy",
                        "type": "object",
                        "description": "Proxy settings. Keep Apify proxy enabled.",
                        "default": {
                            "useApifyProxy": true
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
