# Marktplaats Monitor: New Listing & Price Drop Alerts (`bostomate/marktplaats-monitor`) Actor

Monitor Marktplaats.nl and 2dehands.be searches and get only NEW listings and PRICE DROPS. no duplicates, no ads, no daily-digest lag. Built for resellers and deal hunters.

- **URL**: https://apify.com/bostomate/marktplaats-monitor.md
- **Developed by:** [Tommy Bos](https://apify.com/bostomate) (community)
- **Categories:** E-commerce, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $7.00 / 1,000 new listing alerts

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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.md):

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

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.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/platform/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 Monitor — New Listing & Price Drop Alerts

### What is Marktplaats Monitor?

Marktplaats Monitor watches your searches on **Marktplaats.nl** and **2dehands.be** and returns **only what changed**: brand-new listings and price drops. No duplicates, no ads, no re-scraping the same 30 results every run.

Marktplaats' own saved-search emails arrive **once a day** — by the time you read them, the good deals are gone. Resellers and deal hunters win by being first. Run this monitor on an Apify Schedule every 10–60 minutes and each run delivers just the delta: a listing you haven't seen before, or a seller cutting their price.

Unlike plain Marktplaats scrapers, this is a **stateful monitor**: it remembers what it has seen per query (in a key-value store on your Apify account) and stays quiet when nothing changed. The first run returns the current matching listings (so you see what's out there and start from a known set); from then on you get only what's new or cheaper. Prefer a silent baseline and deltas only? Set `emitOnFirstRun` to false.

### What can you do with it?

- **Be first on underpriced items**: watch "iphone 15 pro", "ps5", "dyson v15" and buy before other flippers see the daily email.
- **Price-drop sniping**: sellers who cut their price want to sell *now* — the monitor flags every drop with the old price and drop percentage.
- **Cross-border arbitrage**: the same engine runs 2dehands.be — monitor both countries in one actor.
- **Feed your own automations**: connect the dataset to Telegram, Slack, e-mail or webhooks with Apify integrations, or poll it from your own code.

### How to use it

1. Enter one or more **queries** (each is monitored independently).
2. Pick **sites** (NL, BE, or both) and optional filters: price band, postcode + distance.
3. Run once — the monitor sets its quiet baseline.
4. Create an **Apify Schedule** (e.g. every 15 minutes) for the actor. Every scheduled run now emits only new listings and price drops.
5. Optionally add an Apify **integration** (webhook/Slack/email) on new dataset items.

Example input:

```json
{
    "queries": ["iphone 15 pro", "dyson v15"],
    "sites": ["marktplaats.nl", "2dehands.be"],
    "priceToEur": 600,
    "postcode": "5611AB",
    "distanceKm": 50
}
````

### Output

One dataset item per alert:

```json
{
    "alertType": "price_drop",
    "site": "marktplaats.nl",
    "query": "iphone 15 pro",
    "itemId": "m2416479155",
    "title": "iPhone 15 Pro 256GB blauw - nieuwstaat",
    "price": 540.0,
    "previousPrice": 615.0,
    "priceDropPercent": 12.2,
    "priceType": "FIXED",
    "city": "Eindhoven",
    "listingUrl": "https://www.marktplaats.nl/v/telefoons/apple-iphone/m2416479155-...",
    "imageUrl": "https://images...",
    "sellerName": "Jan",
    "postedLabel": "Vandaag",
    "firstSeen": "2026-07-05T14:12:03Z"
}
```

`alertType` is `new` or `price_drop`. Ads and paid-boosted listings are filtered out by default (`includeCommercialListings` turns them back on).

### Pricing

You pay **per alert**, not per run or per page: a quiet run with zero changes costs you nothing in events. Monitoring 5 queries every 15 minutes typically produces a handful of alerts per day — cents per week, cheaper than any Marktplaats alert service.

### FAQ

**What does the first run return?** The current matching listings for each query, so you see the market immediately and the monitor has a baseline to compare against. Every run after that returns only new listings and price drops. If you want a silent baseline (alerts only for listings that appear *after* the first run), set `emitOnFirstRun` to false.

**How fast are alerts?** As fast as your Schedule. Every 10–15 minutes is a good balance; the monitor checks the newest listings per query each run.

**Does it get blocked?** The monitor is deliberately polite (5-second spacing between searches, automatic back-off). For heavy watchlists on tight schedules, add a proxy in the input.

**Can I run multiple watchlists?** Yes — give each its own `monitorId`. Each keeps an independent seen-history.

**Is this legal?** The monitor reads only publicly visible listings — no login, no personal data beyond what any visitor sees on the listing page.

**What about Vinted / other marketplaces?** Not in this actor — Marktplaats and 2dehands share one search engine, which is what makes this monitor reliable. Same product for Germany: [Kleinanzeigen Monitor](https://apify.com/bostomate/kleinanzeigen-monitor). For used cars: [AutoScout24 Price Monitor](https://apify.com/bostomate/autoscout-price-monitor). For industrial auctions: [European Auction Scraper](https://apify.com/bostomate/european-auction-scraper).

### Disclaimer

This is an independent tool, not affiliated with or endorsed by Marktplaats, 2dehands, or Adevinta. All trademarks belong to their owners. The actor reads only publicly accessible listing data, respects a polite request rate, and stores no personal data beyond the public listing fields you receive.

# Actor input Schema

## `queries` (type: `array`):

One or more search terms. Each is monitored independently per site — you get an alert only for listings not seen in previous runs.

## `sites` (type: `array`):

Which marketplaces to monitor (same search engine, two countries).

## `maxItemsPerQuery` (type: `integer`):

How many newest listings to check per query per run (the monitor diffs these against what it has already seen). 30 covers a typical query polled every 15-60 minutes; raise it for very busy queries or slow schedules.

## `priceFromEur` (type: `integer`):

Only listings at or above this price.

## `priceToEur` (type: `integer`):

Only listings at or below this price.

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

Center the search on this postcode (use a Dutch postcode for marktplaats.nl, Belgian for 2dehands.be — when monitoring both countries with a distance filter, run two monitors).

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

Only listings within this distance of the postcode. 0 = everywhere.

## `includeCommercialListings` (type: `boolean`):

Admarkt ads and paid-boosted listings are filtered out by default (they flood alerts). Turn on to include them.

## `emitOnFirstRun` (type: `boolean`):

On the first run of a new query, return the current matching listings (so you immediately see what's out there and start monitoring from a known set). Turn this OFF if you want a silent baseline and alerts only for listings that appear AFTER the first run.

## `monitorId` (type: `string`):

Name of this watchlist's memory. Use different IDs to run independent monitors (e.g. one per product) without their seen-histories mixing.

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

Optional. The monitor is polite by design (5s between searches); add a proxy only if your runs get blocked.

## Actor input object example

```json
{
  "queries": [
    "iphone 15 pro"
  ],
  "sites": [
    "marktplaats.nl"
  ],
  "maxItemsPerQuery": 30,
  "distanceKm": 0,
  "includeCommercialListings": false,
  "emitOnFirstRun": true,
  "monitorId": "default"
}
```

# 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 = {
    "queries": [
        "iphone 15 pro"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("bostomate/marktplaats-monitor").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 = { "queries": ["iphone 15 pro"] }

# Run the Actor and wait for it to finish
run = client.actor("bostomate/marktplaats-monitor").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 '{
  "queries": [
    "iphone 15 pro"
  ]
}' |
apify call bostomate/marktplaats-monitor --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Marktplaats Monitor: New Listing & Price Drop Alerts",
        "description": "Monitor Marktplaats.nl and 2dehands.be searches and get only NEW listings and PRICE DROPS. no duplicates, no ads, no daily-digest lag. Built for resellers and deal hunters.",
        "version": "0.1",
        "x-build-id": "aCsaOujVrlA0B1OSZ"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/bostomate~marktplaats-monitor/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-bostomate-marktplaats-monitor",
                "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/bostomate~marktplaats-monitor/runs": {
            "post": {
                "operationId": "runs-sync-bostomate-marktplaats-monitor",
                "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/bostomate~marktplaats-monitor/run-sync": {
            "post": {
                "operationId": "run-sync-bostomate-marktplaats-monitor",
                "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",
                "required": [
                    "queries"
                ],
                "properties": {
                    "queries": {
                        "title": "Search queries to monitor",
                        "type": "array",
                        "description": "One or more search terms. Each is monitored independently per site — you get an alert only for listings not seen in previous runs.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "sites": {
                        "title": "Sites",
                        "type": "array",
                        "description": "Which marketplaces to monitor (same search engine, two countries).",
                        "items": {
                            "type": "string",
                            "enum": [
                                "marktplaats.nl",
                                "2dehands.be"
                            ],
                            "enumTitles": [
                                "Marktplaats.nl (Netherlands)",
                                "2dehands.be (Belgium)"
                            ]
                        },
                        "default": [
                            "marktplaats.nl"
                        ]
                    },
                    "maxItemsPerQuery": {
                        "title": "Listings checked per query",
                        "minimum": 1,
                        "maximum": 100,
                        "type": "integer",
                        "description": "How many newest listings to check per query per run (the monitor diffs these against what it has already seen). 30 covers a typical query polled every 15-60 minutes; raise it for very busy queries or slow schedules.",
                        "default": 30
                    },
                    "priceFromEur": {
                        "title": "Min price (EUR)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Only listings at or above this price."
                    },
                    "priceToEur": {
                        "title": "Max price (EUR)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Only listings at or below this price."
                    },
                    "postcode": {
                        "title": "Postcode (for distance filter)",
                        "type": "string",
                        "description": "Center the search on this postcode (use a Dutch postcode for marktplaats.nl, Belgian for 2dehands.be — when monitoring both countries with a distance filter, run two monitors)."
                    },
                    "distanceKm": {
                        "title": "Distance (km)",
                        "minimum": 0,
                        "maximum": 300,
                        "type": "integer",
                        "description": "Only listings within this distance of the postcode. 0 = everywhere.",
                        "default": 0
                    },
                    "includeCommercialListings": {
                        "title": "Include ads / commercial listings",
                        "type": "boolean",
                        "description": "Admarkt ads and paid-boosted listings are filtered out by default (they flood alerts). Turn on to include them.",
                        "default": false
                    },
                    "emitOnFirstRun": {
                        "title": "Emit results on the first run",
                        "type": "boolean",
                        "description": "On the first run of a new query, return the current matching listings (so you immediately see what's out there and start monitoring from a known set). Turn this OFF if you want a silent baseline and alerts only for listings that appear AFTER the first run.",
                        "default": true
                    },
                    "monitorId": {
                        "title": "Monitor ID",
                        "type": "string",
                        "description": "Name of this watchlist's memory. Use different IDs to run independent monitors (e.g. one per product) without their seen-histories mixing.",
                        "default": "default"
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Optional. The monitor is polite by design (5s between searches); add a proxy only if your runs get blocked."
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
