# Competitor Product Price & Stock Watchlist (`feeng/competitor-product-price-watchlist`) Actor

💸 Monitor selected competitor product URLs for price changes, sales, stock moves, and pricing gaps. Get history, alerts, and a visual report without another Actor or API key.

- **URL**: https://apify.com/feeng/competitor-product-price-watchlist.md
- **Developed by:** [Daniel S.](https://apify.com/feeng) (community)
- **Categories:** E-commerce, Automation, Business
- **Stats:** 2 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 successful product snapshots

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 web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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

## Competitor Product Price & Stock Watchlist

Monitor selected competitor product URLs for price changes, discounts, stock moves, and pricing gaps. 💸 Group equivalent products together, add your own price, and receive a clear recommendation instead of a raw page scrape.

This self-contained Actor does not call another Actor and does not require a third-party API key. It combines Shopify product endpoints, JSON-LD, product metadata, optional CSS selectors, and a browser fallback to extract public product information reliably.

### Why e-commerce teams use it ✨

- **💰 Price tracking:** detect increases, drops, sale starts, and sale endings.
- **📦 Stock monitoring:** see out-of-stock and back-in-stock movements.
- **⚖️ Direct comparison:** compare your price with the cheapest and average monitored competitor.
- **📈 Price history:** keep up to 365 snapshots per URL and view inline trend charts.
- **🚨 Actionable alerts:** ignore tiny movements with a configurable percentage threshold.
- **🔎 Confidence signals:** every result explains how the price was extracted and whether JavaScript rendering was needed.

### Best use cases 🎯

- Competitor price monitoring for DTC and retail teams
- MAP and reseller price compliance
- Promotion and discount tracking
- Supplier price and stock monitoring
- Bedding, fashion, electronics, beauty, home goods, and niche e-commerce comparisons
- Daily price intelligence delivered through Apify schedules, webhooks, Make, n8n, or Zapier

### Input

Add one row per URL. Rows sharing the same `group` are treated as equivalent products.

```json
{
  "watchlist": [
    {
      "group": "Cotton bedding 140x200",
      "role": "own",
      "label": "My store",
      "url": "https://my-store.example/products/cotton-bedding",
      "referencePrice": 89.9,
      "expectedCurrency": "EUR"
    },
    {
      "group": "Cotton bedding 140x200",
      "role": "competitor",
      "label": "Competitor A",
      "url": "https://competitor.example/product/cotton-bedding"
    }
  ],
  "compareWithPrevious": true,
  "saveHistory": true,
  "alertThresholdPercent": 2,
  "browserFallback": true
}
```

For unusual websites, add `priceSelector` or `stockSelector` to the affected row. Keep the same `monitorId` and `stateStoreName` across scheduled runs so history remains connected.

### Output 📊

Each successful URL produces one dataset row with flat alert and market-comparison columns plus complete nested evidence. Use the `overview`, `alerts`, `marketComparison`, `history`, and `allData` views.

- current and original price
- detected currency and stock state
- extraction method and confidence
- previous snapshot and price difference
- change type and alert decision
- retained price history
- cheapest competitor, average competitor price, price gap, and recommended action for the group

The run also saves `OUTPUT.json`, `OUTPUT.csv`, `RUN_SUMMARY.json`, `ERRORS.json`, and a self-contained `REPORT.html` with price sparklines.

### Change types

`baseline`, `unchanged`, `price-drop`, `price-increase`, `sale-started`, `sale-ended`, `out-of-stock`, and `back-in-stock`.

### Schedule automatic monitoring 🔁

1. Run once to establish the baseline.
2. Save the input as an Apify Task.
3. Schedule it daily or hourly with the same monitor ID.
4. Connect run-success or dataset webhooks to email, Slack, Make, Zapier, n8n, or your own system.

### Pricing 💵

Store model: Pay per event at **$0.001 per run plus $0.005 per successful product snapshot**. Failed URLs are written to `ERRORS.json` and are not placed in the paid dataset. This remains accessible for small watchlists while covering lightweight extraction, occasional browser rendering, storage, and proxy risk.

Examples:

- 10 products checked daily: about $1.53/month
- 25 products checked daily: about $3.78/month
- 100 products checked daily: about $15.03/month

Optional residential proxy transfer is more expensive, so direct extraction remains the default and the browser starts only when needed.

### SEO positioning 🚀

**Store title:** Competitor Product Price & Stock Watchlist

**SEO title:** Competitor Price Tracker & Product Stock Monitor

**SEO description:** Monitor competitor product prices, discounts, and stock across Shopify, WooCommerce, and public e-commerce pages. Get history, price-change alerts, and comparison reports.

**Keywords:** competitor price tracker, price monitoring, product price scraper, stock monitor, price drop alert, ecommerce price intelligence, Shopify price tracker, WooCommerce price monitor, MAP monitoring, competitor pricing tool.

### Reliability and limitations

- Product pages must be public and accessible without login.
- Currency comparisons are only calculated when currencies match or an expected currency is supplied.
- Personalized, member-only, cart-only, or location-dependent prices may differ from the public page.
- Protected marketplaces may require an Apify residential proxy; proxy cost is separate platform usage.
- Use collected data responsibly and comply with applicable terms and laws.

This Actor is an independent tool and is not affiliated with any monitored store, Shopify, WooCommerce, or marketplace.

# Actor input Schema

## `watchlist` (type: `array`):

One row per product page. Use the same group for equivalent products. Add one own row with role=own and competitor rows with role=competitor.

## `compareWithPrevious` (type: `boolean`):

Detect price, sale, and stock changes against the saved baseline.

## `saveHistory` (type: `boolean`):

Persist snapshots for scheduled monitoring and visual price history.

## `historyPoints` (type: `integer`):

Maximum number of chronological price and stock snapshots retained for each URL.

## `alertThresholdPercent` (type: `number`):

Price changes smaller than this remain in history but are not marked as alerts.

## `browserFallback` (type: `boolean`):

Render JavaScript pages only when lightweight structured extraction cannot find a reliable price.

## `includeHtmlReport` (type: `boolean`):

Save a self-contained HTML report with group comparisons and price sparklines.

## `requestTimeoutSecs` (type: `integer`):

Maximum duration of one HTTP or browser page request.

## `retryCount` (type: `integer`):

Number of retries for transient HTTP failures.

## `maxConcurrency` (type: `integer`):

Maximum product URLs processed at the same time.

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

Stable identifier that keeps separate watchlists from sharing history.

## `stateStoreName` (type: `string`):

Named Apify key-value store that retains baselines between scheduled runs.

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

Optional Apify Proxy. Direct extraction is the low-cost default; enable proxy for protected stores.

## Actor input object example

```json
{
  "watchlist": [
    {
      "group": "A Light in the Attic",
      "role": "own",
      "label": "My store",
      "url": "https://books.toscrape.com/catalogue/tipping-the-velvet_999/index.html",
      "referencePrice": 55,
      "expectedCurrency": "GBP"
    },
    {
      "group": "A Light in the Attic",
      "role": "competitor",
      "label": "Competitor",
      "url": "https://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.html",
      "expectedCurrency": "GBP",
      "priceSelector": ".price_color"
    }
  ],
  "compareWithPrevious": true,
  "saveHistory": true,
  "historyPoints": 90,
  "alertThresholdPercent": 1,
  "browserFallback": true,
  "includeHtmlReport": true,
  "requestTimeoutSecs": 30,
  "retryCount": 2,
  "maxConcurrency": 3,
  "monitorId": "default",
  "stateStoreName": "competitor-product-price-history",
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `watchlist` (type: `string`):

No description

## `alerts` (type: `string`):

No description

## `marketComparison` (type: `string`):

No description

## `history` (type: `string`):

No description

## `allData` (type: `string`):

No description

## `htmlReport` (type: `string`):

No description

## `csvExport` (type: `string`):

No description

## `jsonExport` (type: `string`):

No description

## `runSummary` (type: `string`):

No description

## `errors` (type: `string`):

No description

# 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 = {
    "watchlist": [
        {
            "group": "A Light in the Attic",
            "role": "own",
            "label": "My store",
            "url": "https://books.toscrape.com/catalogue/tipping-the-velvet_999/index.html",
            "referencePrice": 55,
            "expectedCurrency": "GBP"
        },
        {
            "group": "A Light in the Attic",
            "role": "competitor",
            "label": "Competitor",
            "url": "https://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.html",
            "expectedCurrency": "GBP",
            "priceSelector": ".price_color"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("feeng/competitor-product-price-watchlist").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 = { "watchlist": [
        {
            "group": "A Light in the Attic",
            "role": "own",
            "label": "My store",
            "url": "https://books.toscrape.com/catalogue/tipping-the-velvet_999/index.html",
            "referencePrice": 55,
            "expectedCurrency": "GBP",
        },
        {
            "group": "A Light in the Attic",
            "role": "competitor",
            "label": "Competitor",
            "url": "https://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.html",
            "expectedCurrency": "GBP",
            "priceSelector": ".price_color",
        },
    ] }

# Run the Actor and wait for it to finish
run = client.actor("feeng/competitor-product-price-watchlist").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 '{
  "watchlist": [
    {
      "group": "A Light in the Attic",
      "role": "own",
      "label": "My store",
      "url": "https://books.toscrape.com/catalogue/tipping-the-velvet_999/index.html",
      "referencePrice": 55,
      "expectedCurrency": "GBP"
    },
    {
      "group": "A Light in the Attic",
      "role": "competitor",
      "label": "Competitor",
      "url": "https://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.html",
      "expectedCurrency": "GBP",
      "priceSelector": ".price_color"
    }
  ]
}' |
apify call feeng/competitor-product-price-watchlist --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=feeng/competitor-product-price-watchlist",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/MtlPb7Rj2ird4QJqy/builds/gvcdAB8EOcLbl3DbP/openapi.json
