# Competitor Price, Stock, and Changelog Monitor (`mambalabs/competitor-price-stock-changelog-monitor`) Actor

Watch competitor stores and SaaS sites and get only what changed since your last run: price, sale price, and stock changes per product, new and removed products, plan price changes on a pricing page, and new changelog entries. Shopify, WooCommerce, and any pricing page. Clay ready.

- **URL**: https://apify.com/mambalabs/competitor-price-stock-changelog-monitor.md
- **Developed by:** [Mamba Labs](https://apify.com/mambalabs) (community)
- **Categories:** E-commerce, Automation, SEO tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.13 / 1,000 change rows

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Competitor Price, Stock, and Changelog Monitor

Watch a list of competitor stores and SaaS sites and get back only what changed since your last run. For a store you get price, sale price (compare at price), and stock changes per product variant, plus new and removed products. For a SaaS site you get plan and price changes on its pricing page and new entries on its changelog. The first run of a site records a baseline; every later run with the same state key compares against it. Rows are flat, so they export to CSV or drop into a Clay table.

### Features

- **Only the changes.** Each run compares every site with the state saved by the last run. You get one site row per site, with the number of changes found, and one row per change. A site where nothing moved returns a free `no_change` row.
- **Stores without a scraper per site.** Shopify stores are read from their public product feed (`/products.json`) and WooCommerce stores from their public Store API, so every variant's price, compare at price, and stock comes from the store's own data. Other stores work from product page URLs you list, read from the schema.org Product data on the page.
- **SaaS pricing pages.** Plan names and their prices are read from the pricing page the site links to. A plan added, removed, or repriced is one row with the old and new text. When prices move and no plan name can be read, one `pricing_page_change` row lists the old and new prices on the page.
- **Changelogs.** The changelog page the site links to is read, through its RSS or Atom feed when it declares one. Every entry not seen before is one row with its title, date, and link.
- **Filters.** Choose what to watch (prices, stock, products, plans, changelog), set a minimum price change in percent, and cap change rows per site.
- **Schedules.** Save the input as a task with a `state_key`, schedule it daily or weekly, and each run returns only the new changes.

### How it reads sites

Pages and feeds are fetched directly, the way a browser would, and robots.txt is read for every host and checked before every request; a page robots.txt disallows is never requested. A host that refuses a direct request is retried through the Apify proxy. No login, no API key, and no other developer's actor. The saved state lives in a key-value store in your own Apify account.

### Input

| Field | Type | Default | What it does |
|---|---|---|---|
| `sites` | array | | Domains or URLs, up to 200. A URL with a path is read as that page: pricing, changelog, or product |
| `site_type` | string | `auto` | `auto`, `shopify`, `woocommerce`, or `saas` |
| `watch` | array | all five | Any of `prices`, `stock`, `products`, `plans`, `changelog` |
| `product_urls` | array | | Product pages on a store that is not Shopify or WooCommerce |
| `pricing_urls` | array | | Pricing pages, when the homepage does not link to one |
| `changelog_urls` | array | | Changelog pages, when the homepage does not link to one |
| `max_products` | string | `250` | Products read per store, up to 5000 |
| `min_price_change_pct` | string | `0` | Report a price change only at or above this percent |
| `max_changes_per_site` | string | `200` | Change rows per site per run, up to 1000 |
| `include_snapshot` | string | `false` | `true` to also return every current variant, plan, and changelog entry on a site's first check |
| `state_key` | string | | Names the saved state; one key per schedule |
| `reset_state` | string | `false` | `true` to record a new baseline for every site |
| `max_charge_usd` | string | | Stop before a row would pass this amount |
| `proxy_mode` | string | `auto` | `auto` (direct, then the Apify proxy for a host that refuses), `direct`, or `residential`. A reliability choice |

Every field accepts text, as Clay sends it: `"true"`, `"250"`, a comma separated list, or a JSON array.

### Output

One row layout for every row type, so no column is lost between them. Key fields:

| Field | Rows | Example |
|---|---|---|
| `row_type` | all | `site_baseline`, `site_check`, `change`, `snapshot`, `site_error` |
| `site`, `site_type` | all | `deathwishcoffee.com`, `shopify` |
| `change_type` | change | `price_change`, `compare_at_price_change`, `out_of_stock`, `back_in_stock`, `new_product`, `removed_product`, `plan_added`, `plan_removed`, `plan_price_change`, `pricing_page_change`, `changelog_entry` |
| `product_title`, `variant_title`, `sku`, `item_id`, `page_url` | store changes | `Death Wish Ground Coffee`, `16 oz` |
| `old_value`, `new_value`, `old_price`, `new_price`, `price_change_pct`, `in_stock` | changes | `19.99`, `17.99`, `-10.01`, `true` |
| `plan_name` | plan changes | `Business` |
| `changelog_title`, `changelog_date` | changelog entries | `Stacked pull requests`, `2026-10-07` |
| `products_tracked`, `variants_tracked`, `plans_tracked`, `changelog_entries_tracked` | site rows | `148`, `424`, `4`, `30` |
| `previous_check_at`, `changes_found` | site check, changes | |
| `row_status`, `error_reason`, `billable_events_json` | all | `ok`, `null`, `{"change-row":1}` |

The run summary (key-value store record `RUN_SUMMARY`) lists baselines, changes by type, unreadable sites, requests, and the hosts that were moved to the proxy.

### Pricing

Pay per event. You pay only these events; the Apify platform and proxy costs of your run are paid by Mamba Labs.

| Event | Free plan | Bronze | Silver | Gold |
|---|---|---|---|---|
| Change row (`change-row`), one change since the last run | $0.0025 | $0.002375 | $0.00225 | $0.002125 |
| Site check (`site-check`), the first check of a site and any later check that finds a change | $0.003 | $0.00285 | $0.0027 | $0.00255 |
| Snapshot row (`snapshot-row`), only with `include_snapshot` on | $0.001 | $0.00095 | $0.0009 | $0.00085 |
| Actor start (`apify-actor-start`), once per run | $0.0005 | $0.0005 | $0.0005 | $0.0005 |

Free rows: `no_change` rows for a site where nothing moved since the last run, and `site_error` rows for a site that could not be read. On the Apify free plan the actor stops at 1.50 USD of evaluation a month (about 600 change rows); any paid Apify plan removes that cap.

Example: a daily run over 20 competitor sites where 4 sites changed, with 15 changes in all, costs 4 site checks ($0.012) plus 15 change rows ($0.0375), $0.0500 with the actor start. The 16 unchanged sites are free.

### Usage examples

#### Apify Console or API

```json
{ "sites": ["deathwishcoffee.com", "linear.app"], "state_key": "competitors-weekly" }
```

```json
{ "sites": ["allbirds.com"], "watch": ["prices", "stock"], "min_price_change_pct": "5", "max_products": "1000", "state_key": "allbirds-daily" }
```

```json
{ "sites": ["https://www.notion.com/pricing", "https://linear.app/changelog"], "watch": ["plans", "changelog"] }
```

#### Clay

Add an HTTP API or Apify column that sends a competitor domain in `sites` with a `state_key` per row, and read `change_type`, `old_value`, `new_value`, and `price_change_pct` from the change rows.

#### Scheduled monitoring

Save the input as an Apify task with a `state_key` and schedule it. Each run returns one row per site and only what changed since the run before; the first run of each new site returns its baseline row.

#### MCP

The MCP server `@mambalabsdev/mcp-competitor-price-stock-changelog-monitor` exposes this actor as a tool for Claude and other MCP clients.

### Error handling

| Situation | What you get |
|---|---|
| A site refuses every route, or robots.txt disallows the pages | One free `site_error` row with `row_status` `blocked` and the reason |
| No catalog, pricing page, or changelog found | One free `site_error` row with `row_status` `error` |
| One page of a site cannot be read this run | The other parts are compared; the row says `partial`, and the unread part keeps its saved state for the next run |
| A store has more products than `max_products` | The products read are compared; removed products are not reported for that store |
| The state store cannot be opened | Every site reads as a first check, and the run summary says so |
| Max charge reached | The run stops before the next billable row; the site's state is not saved, so its changes come back on the next run |

### Limitations

- A change is only seen if it is still there when the actor runs. A price that moves and moves back between two runs is not reported.
- The Shopify product feed carries no currency, so Shopify rows leave `currency` empty and use the store's display currency.
- Pricing pages that draw their prices with scripts after the page loads, or put prices in images, give no plan rows. Such a page reads `partial` with a note.
- Plan names are read from the page headings; a page that renames a plan reads as one plan removed and one added.
- Changelog entries are matched by title. An entry whose title is edited reads as a new entry.
- You are responsible for how you use the data and for the terms of the sites you watch.

### More from Mamba Labs

| Actor | Actor ID |
|---|---|
| [Account Hiring Watch](https://apify.com/mambalabs/account-hiring-watch?fpr=mamba) | `gRAZA5WBi1r6L0gy7` |
| [Agent Accessibility Auditor](https://apify.com/mambalabs/agent-accessibility-auditor?fpr=mamba) | `anxbRv0lKrpQ1pnua` |
| [Agent to Brokerage Resolver](https://apify.com/mambalabs/agent-brokerage-resolver?fpr=mamba) | `ePRRGLxOGyaVHO4dI` |
| [AI Tooling Detector](https://apify.com/mambalabs/ai-tooling-detector?fpr=mamba) | `EwkHhmqiuJgRoVEbE` |
| [B2B Reddit Conversation Monitor](https://apify.com/mambalabs/b2b-reddit-conversation-monitor?fpr=mamba) | `SoDryzzsjmY3SsiyG` |
| [Bluesky Brand Presence Mapper](https://apify.com/mambalabs/bluesky-brand-presence-mapper?fpr=mamba) | `eLpxzP4IuXznlFVND` |
| [Career Change Signal Engine](https://apify.com/mambalabs/career-change-signal-engine?fpr=mamba) | `vX2Yga1a6wGaXaP14` |
| [Company Change Event Feed](https://apify.com/mambalabs/company-change-event-feed?fpr=mamba) | `oX44rS0fkEJ3rXLWe` |
| [Company Contact Details Extractor](https://apify.com/mambalabs/company-contact-details-extractor?fpr=mamba) | `4mMncKaJykiq94grz` |
| [Company Discovery List Builder](https://apify.com/mambalabs/company-discovery-list-builder?fpr=mamba) | `jch0HdaZnpbMqlcGS` |
| [Company Firmographic Enricher](https://apify.com/mambalabs/company-firmographic-enricher?fpr=mamba) | `YlUtLWjfPpqykmB8g` |
| [Company Funding Record](https://apify.com/mambalabs/funding-investor-record?fpr=mamba) | `OFS4Mt1gyYNtGfUbE` |
| [Company Identity Resolver](https://apify.com/mambalabs/company-identity-resolver?fpr=mamba) | `lr8fTRAmZCBZmuwwh` |
| [Company Social Presence Mapper](https://apify.com/mambalabs/company-social-presence-mapper?fpr=mamba) | `4k6CCemkgBDz18m2h` |
| [Contact Classifier](https://apify.com/mambalabs/contact-classifier?fpr=mamba) | `0lGSeYJmniXhGANnO` |
| [Cookie Consent Audit](https://apify.com/mambalabs/cookie-consent-audit?fpr=mamba) | `TrKyOS0KBoGC35nbr` |
| [Domain Deliverability Checker](https://apify.com/mambalabs/domain-deliverability-checker?fpr=mamba) | `0tVgxI7A6o9jMlxmc` |
| [Domain to LinkedIn URL Resolver](https://apify.com/mambalabs/domain-to-linkedin-url-resolver?fpr=mamba) | `3HtnSaqPHOg1Qg5gx` |
| [Ecommerce Platform Profiler](https://apify.com/mambalabs/ecommerce-platform-profiler?fpr=mamba) | `5G2NeYjBbQTjaTn9L` |
| [Event Presence Index](https://apify.com/mambalabs/event-presence-index?fpr=mamba) | `WLhMy8fMDgsxdYxv5` |
| [Expert Witness Directory](https://apify.com/mambalabs/expert-witness-directory?fpr=mamba) | `LIpwlgfE3LaQBaXd4` |
| [Funding and Press Signal Scanner](https://apify.com/mambalabs/funding-press-signal-scanner?fpr=mamba) | `FS13X6dhQVgX3XOM6` |
| [GitHub Organization Signal Scanner](https://apify.com/mambalabs/github-organization-signal-scanner?fpr=mamba) | `ahF8RRpv5mzPao5CN` |
| [Google Ads Transparency Monitor](https://apify.com/mambalabs/google-ads-transparency-monitor?fpr=mamba) | `1eOwxhBVxzvOXAm4s` |
| [Government Contract Award Monitor](https://apify.com/mambalabs/public-award-monitor?fpr=mamba) | `zhEtllASykOcx9hJ8` |
| [GTM Hiring Signal Scraper](https://apify.com/mambalabs/gtm-hiring-signal-scraper?fpr=mamba) | `D7O1SA2EqwHGsGr1P` |
| [GTM Signals Aggregator](https://apify.com/mambalabs/b2b-buying-signals-hiring-tech-stack-intent-for-clay?fpr=mamba) | `xKdRfnfFNkdMpFuNs` |
| [ICP Fit Scorer](https://apify.com/mambalabs/icp-account-lead-scoring-fit-scorer-0-100-for-clay?fpr=mamba) | `W161DT8W4kW55dMFh` |
| [Influencer Change Monitor](https://apify.com/mambalabs/creator-change-monitor?fpr=mamba) | `d2VVgahNL6UmcLkhg` |
| [Influencer Finder](https://apify.com/mambalabs/creator-finder?fpr=mamba) | `tpkedmloIIWtXx6sg` |
| [Influencer Lead List Builder](https://apify.com/mambalabs/creator-lead-list-all-in-one?fpr=mamba) | `KnmByszcv135yM30G` |
| [Influencer Profile Scraper](https://apify.com/mambalabs/creator-profile-reader?fpr=mamba) | `EqEnklDVMIcB1V499` |
| [Influencer Talent Agency Lookup](https://apify.com/mambalabs/talent-agency-lookup?fpr=mamba) | `zCuX4Mgyg6JvXgGzd` |
| [Instagram Facebook Brand Presence Mapper](https://apify.com/mambalabs/meta-brand-presence-mapper?fpr=mamba) | `HXh65I0JBjPsunbY8` |
| [Integration and Marketplace Presence Mapper](https://apify.com/mambalabs/integration-marketplace-presence-mapper?fpr=mamba) | `V0guNuvM85Q61f2gj` |
| [Job Board Keyword Signal Scanner](https://apify.com/mambalabs/job-board-keyword-signal-scanner?fpr=mamba) | `4DvqpvhMR74NLcDDY` |
| [Job Change Tracker](https://apify.com/mambalabs/job-change-tracker?fpr=mamba) | `L8UbEmMJC1XYPSZOb` |
| [Job Posting Monitor](https://apify.com/mambalabs/gtm-job-discovery?fpr=mamba) | `QCfICD9kOPiOdj5iI` |
| [Legal Entity Resolver](https://apify.com/mambalabs/legal-entity-resolver?fpr=mamba) | `KHFyPCDIx7CyqULYm` |
| [Link in Bio Scraper and Newsletter Detector](https://apify.com/mambalabs/link-in-bio-newsletter-checker?fpr=mamba) | `OorucdheTIgu7RFzK` |
| [LinkedIn Company Page Mapper](https://apify.com/mambalabs/linkedin-company-presence-mapper?fpr=mamba) | `zOPm6A9JEhUGcIdFW` |
| [LinkedIn Post Tracker](https://apify.com/mambalabs/linkedin-post-engager-capture?fpr=mamba) | `oiGLNPuaf5BRaz9K5` |
| [Meta Ad Library Monitor](https://apify.com/mambalabs/meta-ad-library-monitor?fpr=mamba) | `J1GWlSXfSGU3u8Wng` |
| [Mobile Phone Waterfall](https://apify.com/mambalabs/mobile-phone-waterfall-orchestrator?fpr=mamba) | `6OOgPktf7RIa5XCOP` |
| [New Hire Finder](https://apify.com/mambalabs/new-hire-finder?fpr=mamba) | `cKuc38p4nYHNF3IW8` |
| [Outbound Stack Detector](https://apify.com/mambalabs/outbound-infrastructure-fingerprint?fpr=mamba) | `v43UJC8r7qW7cBSTG` |
| [Page Finder and Extractor](https://apify.com/mambalabs/page-finder-extractor?fpr=mamba) | `TpurgcOZbVnknlaiC` |
| [People Finder & Email Verifier](https://apify.com/mambalabs/people-finder?fpr=mamba) | `LEgloG7tWgQl4o6TD` |
| [Person Social Footprint Mapper](https://apify.com/mambalabs/person-social-footprint-mapper?fpr=mamba) | `jfQXa2zW9FHCJot9K` |
| [Pinterest Brand Presence Mapper](https://apify.com/mambalabs/pinterest-brand-presence-mapper?fpr=mamba) | `d1HvjZfKhgvWsoEwn` |
| [Prospect Engine](https://apify.com/mambalabs/b2b-prospect-engine?fpr=mamba) | `q9rT6v64nUJdPexOQ` |
| [Publishing Frequency Tracker](https://apify.com/mambalabs/blog-publishing-frequency?fpr=mamba) | `TbLwaUUATdYb6wp4N` |
| [Reddit Brand Presence Mapper](https://apify.com/mambalabs/reddit-brand-presence-mapper?fpr=mamba) | `pKQZmDaT70SEb54bZ` |
| [Reporting Window Finder](https://apify.com/mambalabs/public-company-reporting-window-finder?fpr=mamba) | `uINxR7a1IW8qUTRUX` |
| [Sequencer Lead Push](https://apify.com/mambalabs/clay-to-instantly-smartlead-push?fpr=mamba) | `0Jv27VeWM5tSZQs9x` |
| [Team Page People Extractor](https://apify.com/mambalabs/team-page-people-extractor?fpr=mamba) | `j8a9zX0k4mNbvDbWK` |
| [Tech Stack Signal Detector](https://apify.com/mambalabs/gtm-tech-stack-signal-scraper?fpr=mamba) | `qyd7nNyqFPelQViBx` |
| [TikTok Brand Presence Mapper](https://apify.com/mambalabs/tiktok-brand-presence-mapper?fpr=mamba) | `fco8FvoJcSafbeyd1` |
| [Trustpilot Reputation Enricher](https://apify.com/mambalabs/review-platform-reputation-enricher?fpr=mamba) | `3lIqfCt61j4hqE1xz` |
| [WCAG Accessibility Audit](https://apify.com/mambalabs/wcag-accessibility-audit?fpr=mamba) | `P3jBj3FRghKEhX52z` |
| [Website Traffic Rank Estimator](https://apify.com/mambalabs/website-traffic-rank-estimator?fpr=mamba) | `GnOFUzlNVIoXgeJjH` |
| [Work Email Waterfall](https://apify.com/mambalabs/email-waterfall-orchestrator?fpr=mamba) | `OT6xqTFThC0Rjf7Zj` |
| [Workplace Program Detector](https://apify.com/mambalabs/workplace-program-detector?fpr=mamba) | `Li6pPDhqbdzFz3h7G` |
| [X Brand Presence Mapper](https://apify.com/mambalabs/x-brand-presence-mapper?fpr=mamba) | `oLOgadhHUkNAyDA3w` |
| [YouTube Channel Stats Extractor](https://apify.com/mambalabs/youtube-channel-transcript-extractor?fpr=mamba) | `6hSpD3kd2s2IQ4VSs` |

Built by [Mamba Labs](https://apify.com/mambalabs?fpr=mamba).

# Actor input Schema

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

Competitor sites to watch, one per line: a domain (deathwishcoffee.com, linear.app) or a URL. A URL with a path is read as that page: a pricing page, a changelog page, or a product page. Up to 200 sites per run.

## `site_type` (type: `string`):

auto (default) reads the public Shopify product feed or the WooCommerce Store API when the site has one, and otherwise reads the pricing and changelog pages it links to.

## `watch` (type: `array`):

Any of: prices, stock, products, plans, changelog. prices covers price and compare at price per variant; stock covers in stock and out of stock; products covers new and removed products; plans covers plan names and prices on a pricing page; changelog covers new changelog entries. Empty means all five.

## `product_urls` (type: `array`):

Product pages on a store that is not Shopify or WooCommerce. Each page is read for its schema.org Product price and availability.

## `pricing_urls` (type: `array`):

Pricing pages to read, when the site does not link to its pricing page from the homepage.

## `changelog_urls` (type: `array`):

Changelog or release notes pages to read, when the site does not link to one from the homepage. An RSS or Atom feed the page declares is read first.

## `max_products` (type: `string`):

Products read from a store catalog per run, up to 5000. A store with more products than this is compared on the products read, and removed products are not reported for it.

## `min_price_change_pct` (type: `string`):

Report a price change only when it is at least this many percent. 0 reports every change.

## `max_changes_per_site` (type: `string`):

Change rows returned per site per run, up to 1000. The rest are counted in changes_found.

## `include_snapshot` (type: `string`):

true to also return one snapshot row per product variant, plan, and changelog entry on the first check of a site. Each snapshot row is billed as a snapshot row.

## `state_key` (type: `string`):

Names the saved state, so separate schedules keep separate baselines. Runs with the same state key and site compare against each other.

## `reset_state` (type: `string`):

true to ignore the saved state and record a new baseline for every site.

## `max_charge_usd` (type: `string`):

Optional. The run stops before it would charge more than this.

## `proxy_mode` (type: `string`):

auto (default) sends requests directly and moves a host to the Apify proxy default pool only when that host refuses. A reliability setting: proxy use adds nothing to your price.

## `source_tag` (type: `string`):

Internal attribution tag. Leave empty.

## Actor input object example

```json
{
  "sites": [
    "deathwishcoffee.com",
    "linear.app"
  ],
  "site_type": "auto",
  "watch": [
    "prices",
    "stock",
    "products",
    "plans",
    "changelog"
  ],
  "max_products": "250",
  "min_price_change_pct": "0",
  "max_changes_per_site": "200",
  "include_snapshot": "false",
  "reset_state": "false",
  "proxy_mode": "auto"
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `run_summary` (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 = {
    "sites": [
        "deathwishcoffee.com",
        "linear.app"
    ],
    "watch": [
        "prices",
        "stock",
        "products",
        "plans",
        "changelog"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("mambalabs/competitor-price-stock-changelog-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 = {
    "sites": [
        "deathwishcoffee.com",
        "linear.app",
    ],
    "watch": [
        "prices",
        "stock",
        "products",
        "plans",
        "changelog",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("mambalabs/competitor-price-stock-changelog-monitor").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "sites": [
    "deathwishcoffee.com",
    "linear.app"
  ],
  "watch": [
    "prices",
    "stock",
    "products",
    "plans",
    "changelog"
  ]
}' |
apify call mambalabs/competitor-price-stock-changelog-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,mambalabs/competitor-price-stock-changelog-monitor"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

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