Competitor Price Monitor (EU) — idealo, Google, Amazon
Pricing
from $3.20 / 1,000 marketplace lookups
Competitor Price Monitor (EU) — idealo, Google, Amazon
Track competitor prices for your products by EAN on idealo, Google Shopping and Amazon: cheapest competitor, your rank, price gap and change since the last run. Built for scheduled runs.
Pricing
from $3.20 / 1,000 marketplace lookups
Rating
0.0
(0)
Developer
Anyprice
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
Competitor price monitoring for online shops: give it your products by EAN and your selling price, and it finds the cheapest competitor on idealo, Google Shopping and Amazon, your price rank, the price gap, and how the competitor price changed since the last run. On a schedule it works as a price tracker for up to 50 products per run in 8 European countries.
What it does
For each product the Actor checks the selected marketplaces at the same time and works out where you stand:
cheapest_competitor: the lowest competitor offer across all marketplaces, with seller, price, shipping, total and marketplacemy_price,price_gap,price_gap_percent: your price and how far you are above (positive) or below (negative) that competitormy_rank,cheaper_competitors,is_cheapest: your position among all competitor offerscompetitor_price_change: how much the cheapest competitor price moved since the previous run with the same monitor name- per marketplace: product URL, offer count, cheapest competitor there, and your own offer if it was found
Your own offers are kept out of the competitors when you set shopName. Only comparable offers count: new condition (or unknown), with a known price, and not marked by idealo's offer matching as a different product, bundle, multipack or different variant. Offers are compared by total (price + shipping), or by price when the marketplace does not state shipping.
Who it is for
- Online shops that sell the same products as their competitors and want a daily list of products where they are no longer the cheapest.
- Sellers on idealo or Amazon who reprice by hand and need the current lowest competitor price as a starting point.
- Brands and distributors watching how their resellers price a product range across marketplaces.
- Agencies sending clients a weekly price position report per country.
Input
| Field | Type | Default | Notes |
|---|---|---|---|
products | array of objects | (required) | 1 to 50 products as { "ean": "...", "price": 12.99 }. price is optional |
shopName | string | empty | Your shop or seller name as the marketplaces show it |
country | string | de | de, at, fr, it, es, uk, nl or be |
platforms | array of strings | all three | Any of idealo, google_shopping, amazon |
monitorName | string | default | Name for this product list's history: 1 to 40 lowercase letters, digits or hyphens, starting with a letter or digit |
price is your selling price including shipping, in the marketplace's currency. If you leave it out, the Actor uses your cheapest own offer that it finds through shopName. If you give both, price wins.
shopName is matched case-insensitively against the seller name of each offer, and a partial match counts. myshop matches "MyShop GmbH" and "myshop.de". Offers that match are treated as yours and never as competitors. If you leave shopName empty, your own offers are counted as competitors.
Country coverage: idealo covers de, at, fr, it, es and uk. Amazon covers de, fr, it, es, uk, nl and be. Google Shopping covers all eight. Marketplaces that don't cover your country are skipped, shown as unsupported and not charged.
Input example
{"products": [{ "ean": "4006381333931", "price": 2.49 },{ "ean": "4009803341163" }],"shopName": "Example Office","country": "de","platforms": ["idealo", "google_shopping", "amazon"],"monitorName": "office-supplies"}
Output
One row per product, in input order.
| Field | Meaning |
|---|---|
ean, status | Barcode and outcome: found, not_found, error or invalid |
my_price | Your price from the input, or your cheapest own offer found via shopName. null if neither exists |
cheapest_competitor | Cheapest competitor offer across marketplaces (platform, seller, price, shipping, total, currency, url) |
price_gap | my_price minus the cheapest competitor price. Negative means you are cheaper |
price_gap_percent | The gap as a percentage of the competitor price |
my_rank | 1 means nobody is cheaper. A competitor at exactly your price does not push you down |
cheaper_competitors | Number of competitor offers below your price |
is_cheapest | true when no competitor offer is below your price |
previous_check | Time and cheapest competitor price of the last run with the same monitor name, country and marketplaces |
competitor_price_change | Cheapest competitor price now minus at previous_check. Negative means a competitor went down |
platforms.<name> | status, product_url, offers_count, cheapest_competitor and my_offer per marketplace |
Rank and gap need a price for you. Without price and without an own offer found by shopName, the row still shows the cheapest competitor, but my_rank, price_gap and is_cheapest are null.
Rank counts offers, not shops. A competitor listed on idealo and on Google Shopping below your price counts twice.
Example row from a second run (shops and prices are illustrative):
{"query": "4006381333931","ean": "4006381333931","country": "de","status": "found","my_price": 2.49,"cheapest_competitor": { "platform": "idealo", "seller": "Example Bürobedarf", "price": 2.29, "shipping": 0, "total": 2.29, "currency": "EUR", "url": "https://www.example-buerobedarf.de" },"price_gap": 0.2,"price_gap_percent": 8.73,"is_cheapest": false,"my_rank": 2,"cheaper_competitors": 1,"previous_check": { "checked_at": "2026-10-14T06:00:12.000Z", "cheapest_competitor_price": 2.39 },"competitor_price_change": -0.1,"platforms": {"idealo": {"status": "found","product_url": "https://www.idealo.de/preisvergleich/OffersOfProduct/4310112.html","offers_count": 4,"cheapest_competitor": { "platform": "idealo", "seller": "Example Bürobedarf", "price": 2.29, "shipping": 0, "total": 2.29, "currency": "EUR", "url": "https://www.example-buerobedarf.de" },"my_offer": { "platform": "idealo", "seller": "Example Office", "price": 2.49, "shipping": 0, "total": 2.49, "currency": "EUR", "url": "https://www.example-office.de" }},"google_shopping": {"status": "found","product_url": "https://www.google.com/shopping/product/8842115630921457?gl=de","offers_count": 2,"cheapest_competitor": { "platform": "google_shopping", "seller": "Example Papeterie", "price": 2.19, "shipping": 1.95, "total": 4.14, "currency": "EUR", "url": "https://www.example-papeterie.de/stabilo-88" },"my_offer": null},"amazon": {"status": "found","product_url": "https://www.amazon.de/dp/B00EX6TMR4","offers_count": 3,"cheapest_competitor": { "platform": "amazon", "seller": "Example Seller", "price": 2.64, "shipping": 0, "total": 2.64, "currency": "EUR", "url": "https://www.amazon.de/sp?seller=A1EXAMPLESELLER1" },"my_offer": null}}}
You sell at 2.49. The cheapest competitor is on idealo at 2.29, so you are 0.20 (8.73 %) above it, and one competitor offer is cheaper, which puts you at rank 2. At the previous run that competitor price was 2.39, so it dropped by 0.10.
How the history works
After each run the Actor saves the cheapest competitor price per EAN in a named key-value store called competitor-price-monitor in your Apify account. The entry is keyed by monitor name, country and marketplaces, for example office-supplies-de-amazon_google_shopping_idealo. The next run with the same monitorName, country and platforms reads it to fill previous_check and competitor_price_change.
- On the first run
previous_checkandcompetitor_price_changearenull. - Products that come back
errorkeep their previous value, so a failed check does not reset the history. - Use a different
monitorNamefor each product list, otherwise the lists overwrite each other's history. - Named stores are kept until you delete them. Deleting the store resets all monitors.
See the Apify docs on key-value stores for how to view or delete it.
Scheduling
- Save your input as a task.
- Add an Apify schedule, for example once a day.
- Read the newest dataset after each run. Filter on
is_cheapest = falseor a negativecompetitor_price_change.
Keep platforms the same between runs, so the change is measured against the same set of marketplaces. If you run several monitors, start them at different times: your account can have only 50 idealo lookups from this Actor in progress at once, and a full list of 50 products uses all of them. Runs that overlap wait for capacity and may return concurrency_limit_reached.
Billing
Pay per event; see the Pricing tab for current rates.
One platform-lookup event is charged for each marketplace that returns found or not_found for a product. 50 products on three marketplaces are at most 150 events per run. Free of charge:
- invalid EANs (never sent to a marketplace)
- marketplaces marked
unsupportedfor your country - lookups that end in an error or a timeout
Limits and errors
- 50 products per run, one country per run. Duplicate EANs are merged; the first entry wins.
- A product entry without an
ean, or with a negativeprice, stops the whole run with an input error. - All marketplaces share an 890-second budget. Lookups without an answer by then become free errors with
errorCodetimeout. Set the run timeout to at least 960 seconds. - The run always ends as Succeeded. Check
statuson each row.
errorCode | Meaning |
|---|---|
invalid_input | Not a valid EAN: wrong length, wrong check digit, or one digit repeated |
timeout | A marketplace did not answer in time |
blocked | A marketplace blocked the lookup |
free_limit_reached | Your free Apify plan's allowance for that marketplace is used up |
concurrency_limit_reached | Other runs held all lookup capacity for that marketplace |
internal_error | Any other failure. On the row it means no marketplace could be checked |
FAQ
Does it change my prices? No. It only reads marketplace prices and reports your position.
What if two shops have the same price as me?
Ties count in your favour. You keep rank 1 and is_cheapest stays true as long as nobody is strictly cheaper.
How is the Amazon product found?
Amazon is searched for the EAN and the first search result is used. Check platforms.amazon.product_url once for each product to make sure it is the right listing.
Can I track the same products in two countries?
Yes. Run the same monitorName with a different country; each country has its own history.
Questions or higher limits: support@anyprice.dev