Marketplace Seller Watch — Third-Party Reseller Monitor
Under maintenancePricing
from $20.00 / 1,000 seller-change alerts
Marketplace Seller Watch — Third-Party Reseller Monitor
Under maintenanceMeta-scraper that tracks which third-party sellers offer a brand's products across European marketplaces (Kaufland.de, Kaufland.pl, Bol.com) and emits new_seller and seller_gone change events run over run — a deduped alert feed, not a full re-export.
Pricing
from $20.00 / 1,000 seller-change alerts
Rating
0.0
(0)
Developer
Studio Amba
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
Marketplace Seller Watch
Track which third-party sellers offer a brand's products across European marketplaces, and get alerted the moment a new reseller appears or a known one disappears. One unified schema, deduplicated run over run, so every run returns only what changed.
Why use this actor?
Brand owners, distributors and channel managers all fight the same problem: unauthorized or unexpected resellers show up on marketplaces, undercut the agreed price, or a grey-market seller appears overnight. Checking each marketplace by hand is slow, and re-exporting every listing every day just to spot the difference is wasteful. This actor does the diffing for you. Point it at a brand (e.g. Philips), run it on a schedule, and each run only returns the sellers that are new since the last run, plus the ones that dropped out.
It is a meta-actor: under the hood it fans out to our own marketplace scrapers, collects the seller behind every matching listing, and diffs that set against a persistent, named key-value store that remembers what it has already seen across separate scheduled runs (not just within one run).
How to monitor marketplace sellers in Europe
- Enter the brand or product line you want to watch in
brandQuery(for examplePhilips, or a specific model likePhilips 5400 Series). - Pick the marketplaces, or leave the field empty for the healthy defaults (Kaufland.de, Kaufland.pl, Bol.com).
- Run it once. The first run has nothing to compare against, so it seeds its memory and reports every current seller as a
new_sellerevent — that run is your baseline. In a live seed run againstPhilips, this returned 17 sellers (12 distinct third-party merchants on Kaufland.pl such asNetworkTechnologies,Morelenet,SuperTechPL; plus sellers on Bol.com). - Schedule it (see below). Every subsequent run returns only changes: a
new_sellerevent when a reseller you hadn't seen starts offering the brand, and aseller_goneevent when a previously-seen seller no longer appears in the tracked listings. - Wire the output into an integration (Zapier, Make, a webhook, Slack) so a new reseller lands in front of your channel team the same day it appears.
What counts as a "seller"
Each marketplace listing carries the merchant selling it. On true marketplaces like Kaufland, that is an independent third-party merchant (NewHits, Xenudo, Glowcart, evomag, …), which is exactly the signal a brand wants. On Bol.com, the platform's own retail listings report the seller as bol, while genuine third-party "Verkoop door <merchant>" listings report the real merchant — so a shift on Bol.com from bol to a named reseller, or a new reseller appearing, is a meaningful event.
Scheduling
This actor is built to run on a schedule, not as a one-off. In the Apify Console:
- Open the actor, go to Schedules → Create new schedule.
- Daily (e.g.
0 6 * * *, 6am UTC) is a sensible cadence — marketplace assortments shift day to day, and a daily run keeps the delta small and readable. Weekly works if you only need coarse coverage. - Keep the same
brandQueryon every scheduled run. The seen-set is namespaced per brand, so trackingPhilipsandSonyin two schedules keeps their histories separate. - Do not turn on
resetStateon a scheduled run — that flag wipes the seen-set for the brand and would make every run look like a first run, defeating the point.
Input
| Field | Type | Required | Description |
|---|---|---|---|
brandQuery | String | No | Brand or product line to track. Empty defaults to Philips. |
marketplaces | Array | No | Which marketplaces to watch: kaufland-de, kaufland-pl, bol, allegro. Empty = the healthy defaults (kaufland-de, kaufland-pl, bol). |
productName | String | No | Narrow tracking to one product. Only listings similar enough to this name are counted (see matchThreshold). Empty = every listing the brand query returns. |
matchThreshold | Number | No | Minimum name-similarity (0–1) when productName is set (default 0.35). |
maxProductsPerMarketplace | Integer | No | Listings to pull per marketplace per run (default 20). More listings find more sellers but cost more. |
emitSellerGone | Boolean | No | Emit seller_gone when a known seller drops out of the tracked listings (default true). |
timeoutPerSourceSecs | Integer | No | Max wait per marketplace scraper before it's marked failed and skipped (default 240). |
proxyConfiguration | Object | No | Passed through to marketplaces that need one (Bol.com; Allegro when opted in). Kaufland drives Bright Data internally and ignores this. |
resetState | Boolean | No | Testing only — wipes the brand's seen-set before the run. Never use on a real schedule. |
Output
One row per change event, plus a single status row on a legitimate zero-delta run (sources healthy, nothing changed).
| Field | Type | Example |
|---|---|---|
eventType | String | "new_seller" |
marketplace | String | "kaufland-pl" |
sellerName | String | "NetworkTechnologies" |
productName | String | "Philips 800 series EP0824/00" |
ean | String | "8720389016479" |
price | Number | 1216.35 |
currency | String | "PLN" |
country | String | "PL" |
detectedAt | String | "2026-07-21T13:18:02.801Z" |
sellerUrl | String | "https://www.kaufland.de/product/448814482/" |
matchType | String | "ean" |
matchScore | Number | null |
Example rows
{ "eventType": "new_seller", "marketplace": "kaufland-pl", "sellerName": "BRaUN_Elektro","productName": "Philips 5000 series Airfryer HD9255/30", "ean": "8720389022166","price": 389.64, "currency": "PLN", "country": "PL","detectedAt": "2026-07-21T13:31:00.000Z", "matchType": "ean", "matchScore": null }{ "eventType": "seller_gone", "marketplace": "kaufland-pl", "sellerName": "Agmi","productName": "", "ean": "", "price": null, "currency": "PLN", "country": "PL","detectedAt": "2026-07-21T13:31:00.000Z", "matchType": null, "matchScore": null }
Marketplaces covered
| Marketplace | Country | Currency | Seller data | Notes |
|---|---|---|---|---|
| Kaufland.de | DE | EUR | Yes — distinct third-party merchants + EAN | Best source: a true open marketplace. |
| Kaufland.pl | PL | EUR/PLN | Yes — distinct third-party merchants + EAN | Same engine, Polish market. |
| Bol.com | NL/BE | EUR | Yes — bol for first-party, named merchant for third-party + EAN | Needs a residential proxy (default). |
| Allegro.pl | PL | PLN | Opt-in only | Allegro exposes the seller only on product detail pages; the listing scraper returns no seller today, so this marketplace is not in the defaults. |
How pricing works
Pay-per-event: a small charge when the actor starts, then a charge per change-event row (new_seller / seller_gone). A quiet run that finds no changes emits a single status row, so you are never billed for a full re-export you didn't need — you pay for signal, not noise.
Limitations (read these)
seller_goneis judged against the tracked window. A run pulls up tomaxProductsPerMarketplacelistings. If a seller drops out of that top-N window (because live marketplace ranking shifted, not because they actually left), it is reportedseller_gone. RaisemaxProductsPerMarketplacefor a wider, steadier window if you see churn. Readseller_goneas "no longer appears in the tracked listings," which is the honest claim.- No seller-profile URL. None of the underlying scrapers expose a seller's marketplace profile URL, so
sellerUrlpoints to the product listing where the seller was found — that is where you verify the seller by hand. - A failed marketplace is skipped, not faked. If a marketplace scraper times out or errors (Kaufland runs Bright Data, which can be slow), that marketplace contributes nothing to that run rather than producing false
seller_goneevents. Only a run where every marketplace fails is treated as an error. - First run is the baseline. The very first run for a brand/marketplace reports every current seller as
new_seller. That is intended — it seeds the memory. The value is in every run after it. - eMAG (RO) and Otto (DE) are not included. Their scrapers expose no per-listing seller field, so they cannot support a seller-watch product. Kaufland and Bol do.
Related actors
- Product Distribution Checker — where a brand's SKUs are (and aren't) listed across EU price-comparison engines.
- EU Fresh Company Radar — new company registrations across EU registries, deduped run over run.
- Kaufland.de Scraper — the underlying German marketplace scraper.
- Bol.com Scraper — the underlying Dutch/Belgian marketplace scraper.
- Allegro Scraper — the underlying Polish marketplace scraper.
How to scrape Marketplace Seller Watch data
- Go to this actor's page on the Apify Store.
- Click Try for free to open it in Apify Console.
- Configure your search query or URL, set the maximum number of results, and adjust proxy settings if needed.
- Click Start and wait for the run to finish.
- Download your data in JSON, CSV, Excel, or connect it to your workflow via API.
You can also schedule regular runs, set up webhooks for real-time notifications, or integrate the results directly into your application using the Apify API.