Marktplaats Price Monitor: Price Drop Alerts, No Login avatar

Marktplaats Price Monitor: Price Drop Alerts, No Login

Pricing

from $2.00 / 1,000 price drop returneds

Go to Apify Store
Marktplaats Price Monitor: Price Drop Alerts, No Login

Marktplaats Price Monitor: Price Drop Alerts, No Login

Marktplaats price monitor: schedule a keyword search and get back only the listings whose price fell since the last run, with the old price, the new price and the drop percentage. Postcode and distance filters, no login. A run with nothing cheaper is free.

Pricing

from $2.00 / 1,000 price drop returneds

Rating

0.0

(0)

Developer

Adrian Voss

Adrian Voss

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Share

This is a price monitor, not a search dump. Give it a Marktplaats keyword search, put it on a schedule, and every run returns only the listings whose price has fallen since the last run — with the old price, the new price and the drop percentage on the row. A run where nothing got cheaper returns one summary row and costs you the start fee alone.

The general-purpose Marktplaats Scraper can do this too, but it ships as a full-search scraper: you have to turn monitoring on, turn new listings off, pick a threshold, and then find the price change in a 39-column row. Here that is the default and the only thing the actor is shaped for. If you want everything a Marktplaats search returns — every current listing, descriptions, raw seller names, sold-signal and sell-through tracking — use the parent actor instead; it is listed under Related actors at the bottom.

Who it's for

  • Deal hunters on a saved search who want to know the moment a seller drops the asking price, not that the item exists (they already know).
  • Resellers watching a category for the markdowns that make a flip work.
  • Automations. One row per price drop, straight into Google Sheets, n8n, Make, Zapier or your own bot. Nothing to deduplicate: the actor has already removed everything that did not change.

What this does that a plain Marktplaats search doesn't

Marktplaats shows you today's asking prices. It cannot tell you that a bike was EUR 340 last week and is EUR 275 now, because the page has no memory. This actor keeps one.

Plain searchThis actor
Rows you get backevery match, every runonly the ones that got cheaper
Old pricenot availablepreviousPrice on the row
Size of the cutyou work it outpriceDropPct, and a minimum you set
Cost of a quiet runyou pay for every row againstart fee only
Deduplicationyours to doalready done

How the price memory works

Each search line becomes a watchlist. The actor remembers every Marktplaats listing ID and its price between runs, in your own account's storage.

  1. First run. Nothing to compare with, so it returns a single summary row with listingCount: 0 and remembers the prices it found. No listings, no charge.
  2. Every run after. A listing comes back only when its price has fallen by at least Smallest price drop worth an alert (5% by default) since it was last seen. The row carries previousPrice, the current price, priceDropPct and changeType: price-drop.
  3. A quiet run. Nothing cheaper, so you get one summary row with listingCount: 0.

Two schedules with different filters keep separate memories, so they never overwrite each other. Give a Watchlist name to pin one memory across a filter change, or to have two schedules share one.

Want new listings as well? Turn on Also return listings that are brand new. They arrive as ordinary rows marked changeType: new.

Price types: what a drop can and cannot be measured on

Marktplaats listings are not all fixed-price. A price drop is only ever reported for a listing with a fixed price or an asking price, where both the old and the new number are set. Bidding, minimum-bid, fast-bid, free, trade, reserved and "see description" listings have no comparable price, so they are never reported as drops — they would be noise, and you would be billed for it.

The cleanest way to run this watchlist is to set Price type to Fixed price, so the pages it reads are the ones it can actually compare.

Location filters

Set Postcode to search near to a Dutch postcode (for example 1011AB) and Distance from postcode in kilometres to keep the watchlist local. Marktplaats' own interface offers 3, 5, 10, 15, 25, 50 and 100 km; any positive number works. Leave the postcode empty to watch the whole of the Netherlands.

What you get

One row per price drop:

  • The drop — previousPrice, price, priceDropPct, priceType.
  • The listing — listingId, title, condition, category, imageUrl, imageCount, url, city, countryName, postedAt, postedText, isPromoted.
  • The seller — sellerType, sellerVerified, and an anonymous sellerHash so you can spot the same reseller across listings. No names, no IDs.
  • The history — changeType, firstSeenAt, lastSeenAt, daysListed.
  • The search — searchQuery, listingCount, priceDropCount, medianPrice, so every row tells you whether the new price is actually below the market for that search.

Price

  • Price drop returned: $4 per 1,000 listings

Plus a $0.00005 start fee per run. Each event above is billed independently, only when it actually returns data — misses (found:false) are never charged.

  • Price drops: $4 per 1,000 rows returned, plus a $0.00005 start fee per run.
  • A quiet run costs the start fee only. Nothing cheaper means no rows, and no rows means no charge — even though the actor still fetched and compared every page.
  • A search that returns nothing, or a request Marktplaats refuses, is never billed.

Worked example. One watchlist checked hourly on a search where about 4 listings a day get cheaper: 4 × 30 = 120 rows a month, about $0.48 plus 720 start fees ($0.04) — roughly $0.52 a month. The cost of a watchlist is driven by how often prices actually move, not by how often you check.

How to use

  1. In the Apify Console. Open the actor page and click Start — the searches field is already pre-filled with a working example. Results land in the run's dataset as soon as each item is found.
  2. Via the API. Call it directly with a POST request — no Console needed once you have an API token:
    curl "https://api.apify.com/v2/acts/accountable_eel~marktplaats-price-monitor/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \
    -X POST \
    -H "Content-Type: application/json" \
    -d '{"searches":["iphone"]}'
  3. On a schedule. Save this actor as an Apify Task with the input you want, then add a Schedule (hourly, daily, weekly) so it runs on its own — no server of your own required.

Tips:

  • Check often, it is nearly free. A run that finds nothing costs $0.00005. Hourly is a reasonable cadence; every 15 minutes is fine on a hot search.
  • Set Price type to Fixed price. Drops can only be measured on fixed and asking prices, so this removes pages that can never produce a row.
  • Raise the threshold on noisy searches. Sellers nudge prices by a euro to resurface a listing; 10 or 15% keeps those out.
  • Use minPrice / maxPrice to bound the watchlist, not the keyword — both are applied before billing, so a listing outside your range never costs you a row.
  • includeKeywords and excludeKeywords also match before billing: "defect" or "onderdelen" in excludeKeywords keeps broken items out for free.

How to filter

Every filter below is optional and off by default — leave it out and you get the exact same price drops as before. minPrice/maxPrice/priceType already existed; this section adds conditions, cities, includeKeywords/excludeKeywords and sortBy. There is no availability filter on this actor: it is a price-drop monitor, and Marktplaats' own feed already excludes sold listings.

1. Like-new price drops only:

{
"searches": ["iphone"],
"conditions": ["like_new", "new"]
}

conditions matches Marktplaats' own Dutch labels (Nieuw, Zo goed als nieuw, Gebruikt, Niet werkend, Refurbished) — there is no "with tags" grade, so new_with_tags never matches.

2. One city, a word excluded:

{
"searches": ["fiets"],
"cities": ["amsterdam"],
"excludeKeywords": ["kapot"]
}

3. Biggest price drops, sorted:

{
"searches": ["laptop"],
"minPriceDropPct": 15,
"sortBy": "price_desc"
}

sortBy sorts the price drops this run found, after filtering — Marktplaats' own feed is already newest-first, so leaving it empty (or "Newest") keeps that order unchanged.

Input

{
"searches": [
"iphone"
]
}

One search per line: keywords like "iphone", or paste a marktplaats.nl search URL (its filter fragment after # is not read; use the Postcode / Distance / Price type fields below instead). Each line becomes a watchlist: the first run remembers the prices it finds, and every run after it returns only the listings that got cheaper. Accepted formats: iphone, racefiets, https://www.marktplaats.nl/q/iphone/.

Sample output

queryfoundstatussearchQuerylistingCountpriceDropCountmedianPricelistingslistingIdurltitlepricecurrencypreviousPricepriceDropPctpriceTypecitycountryNamepostedAtpostedTextimageUrlimageCountconditionconditionRawconditionBucketcategorysellerHashsellerVerifiedsellerTypeisPromotedchangeTypefirstSeenAtlastSeenAtdaysListedscrapedAt
iphonetrueOK<median price this run (eur)><all price drops found (full list)> <price (eur)><currency (always eur — marktplaats.nl is single-currency)><previous price (eur)><price drop %><posted (date)><posted (as marktplaats words it)><condition (raw, same as condition — marketplace-filters standard column)><condition (standard grade)><seller (anonymous hash)>1970-01-01T00:00:00.000Z

A real row from the live smoke test (iphone, 5 listings checked, 2026-09-26). This is what run one looks like: the prices are now remembered, and the drops start next run.

{
"query": "iphone",
"found": true,
"status": "OK",
"searchQuery": "iphone",
"listingCount": 0,
"priceDropCount": 0,
"medianPrice": 470,
"scrapedAt": "2026-09-26T00:08:32.318Z"
}

Use it from Clay, n8n, Make, or an AI agent

This actor runs synchronously over plain HTTP — call it directly from a script, a workflow tool, or an AI agent, no Apify Console needed once you have an API token.

curl "https://api.apify.com/v2/acts/accountable_eel~marktplaats-price-monitor/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \
-X POST \
-H "Content-Type: application/json" \
-d '{"searches":["iphone"]}'

n8n. Add an HTTP Request node: Method POST, URL https://api.apify.com/v2/acts/accountable_eel~marktplaats-price-monitor/run-sync-get-dataset-items?token=<YOUR_TOKEN>, Body Content Type JSON, JSON Body {"searches":["iphone"]} (swap in an expression from an earlier node for a real value).

Clay. Add an "HTTP API" column: Method POST, URL https://api.apify.com/v2/acts/accountable_eel~marktplaats-price-monitor/run-sync-get-dataset-items?token=<YOUR_TOKEN>, Body {"searches":["{{search}}"]}, mapping the row's search into the searches array.

MCP. In Claude, Cursor, or any MCP client with the Apify MCP server, ask for "Marktplaats Price Monitor: Price Drop Alert by Keyword" — the agent will find and run this actor.

For a channel or a sheet, add an integration on the Task: trigger on "Apify: run succeeded" in n8n, Make or Zapier and read the run's dataset. A quiet run leaves one summary row with listingCount: 0 — filter on listingCount > 0 to skip it.

vs. alternatives

  • A Marktplaats saved search with email alerts. Free, but it tells you about new listings only. Marktplaats does not email you when the price on a listing you already saw comes down, which is the change most worth catching.
  • A general Marktplaats scraper. Returns every match every run. You pay for the same unchanged listings again and again, and you diff them yourself.
  • The parent actor, Marktplaats Scraper. Same engine, everything switched on: every current listing on a search, full descriptions, raw seller ID and name on request, the sold signal (changeType: gone, gonePresumedSold, last known price) with a watchlist sell-through rate, and up to 1,000 listings per search. Use it when you want the whole search; use this one when you want the drops.

Data & privacy

  • No login, no cookies, no account. There is no input field that could take a Marktplaats session, and none is needed: everything here comes from Marktplaats' public search results.
  • No seller names or IDs. This variant does not offer the parent's raw-seller-info switch, so sellerId and sellerName are not returned at all. You get sellerType, sellerVerified and an anonymous hash.
  • The price memory holds listing IDs and prices only, in your own account's storage, and only for the watchlists you run.

FAQ

Nothing came back on the first run. Is it broken? No. The first run has no earlier price to compare with, so it stores what it finds and returns one summary row with listingCount: 0. Drops start from the second run.

How small a drop will it catch? Whatever you set. The default is 5%.

Why did a bidding listing never produce a drop? Because a bid is not a comparable price. Drops are reported for fixed-price and asking-price listings only; see "Price types" above.

Can I get new listings too? Yes — turn on Also return listings that are brand new. They come back marked changeType: new and are billed like any other row.

Does it tell me when something sold? No. Disappeared-listing detection and gonePresumedSold live in the parent actor; this one is about price changes on live listings. See Related actors.

Can I keep it to my own region? Yes — set a Dutch postcode and a distance in kilometres.

  • Marktplaats Scraper: New Listing & Price Alerts — the parent, and the full-capability version: every current listing on a search, descriptions, raw seller ID and name on request, the sold signal with gonePresumedSold and days listed, watchlist sell-through rate, and up to 1,000 listings per search.
  • Vinted Price Monitor — the same price-drop idea on Vinted, with Discord, Slack and Telegram delivery.
  • OLX New Listing Alert — new ads only, on OLX classifieds.