# Universal Price & Stock Monitor (`dazalabs/universal-price-stock-monitor`) Actor

Monitor product pages for price and availability changes. Extract structured data and compare each run with the previous state.

- **URL**: https://apify.com/dazalabs/universal-price-stock-monitor.md
- **Developed by:** [Diego Daza](https://apify.com/dazalabs) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 results

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/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

## Universal Price & Stock Monitor

![Illustrated Daza Labs price and stock monitoring workflow](https://api.apify.com/v2/key-value-stores/7xgG5g1cldPJ46hYH/records/banner_saas_de_monitoreo_universal.png?signature=9p9KJLoeGrybjMiTktm6)

*Illustrative product walkthrough. The actual Actor runs in Apify and monitors one product URL per run.*

#### by DAZA LABS · Automated product intelligence

**Monitor prices, check availability, and detect changes from public product pages.**

Turn a product URL into structured data that can power competitor research, pricing reports, and scheduled product checks.

**Pricing starts at $2 per 1,000 results**, plus an Actor-start event fee.

***

### How it works

| Step | What you do | What you get |
| --- | --- | --- |
| **1. Add a product URL** | Enter a publicly accessible product-page URL. | A targeted product check. |
| **2. Run the Actor** | Start a run manually or with an Apify Schedule. | Price and stock information extracted from the page's HTML. |
| **3. Review the result** | Open the Apify dataset or use its API. | Structured product data and any detected changes. |

> **One product URL per run.** To monitor periodically, configure an Apify Schedule. The Actor does not send email, SMS, or app notifications by itself.

### What you can track

- **Product name:** title extracted from available page metadata.
- **Price:** current product price when identifiable.
- **Currency:** when it can be reliably identified.
- **Availability:** `in_stock`, `out_of_stock`, `preorder`, or `unknown`.
- **Changes between checks:** previous and current price, price difference and percentage, and availability changes.
- **Technical details:** checked URL after redirects, HTTP status, extraction method, and timestamp.

The Actor uses JSON-LD, meta tags, itemprop markup, and HTML/DOM fallbacks. Field availability varies by website.

### Quick start

Enter a single product URL:

```json
{
  "url": "https://example.com/product"
}
```

Then click **Start**. Open the run's dataset to review the extracted product data.

#### Example output

The following sample demonstrates a **change detected on a subsequent run**. Values are illustrative, not a live product:

```json
{
  "title": "Example Product",
  "price": 49.99,
  "currency": "EUR",
  "availability": "in_stock",
  "firstRun": false,
  "changed": true,
  "change": {
    "priceChanged": true,
    "previousPrice": 59.99,
    "currentPrice": 49.99,
    "priceChange": -10,
    "priceChangePercent": -16.67
  }
}
```

#### Observed test result

On October 13, 2026, a test run returned one product result for *A Light in the Attic* from Books to Scrape, reporting **GBP 51.77** and **in stock**. This is a past example, not a guarantee of current stock or price.

### Common use cases

- **Competitor price checks:** compare known public product listings over time.
- **Price-drop research:** identify differences between consecutive checks.
- **Back-in-stock checks:** identify changes in reported availability.
- **E-commerce reporting:** collect structured observations for dashboards and analysis.
- **Scheduled monitoring:** use Apify Schedules to run repeated checks.

### Monitoring and change detection

The Actor maintains a previous observation for a monitored URL and compares it with the current observation on subsequent runs. Results indicate whether the price or availability changed.

A run is a **point-in-time check**, not continuous, second-by-second monitoring. Schedules, API usage, and additional notifications require their own configuration.

### Important limitations

**This is a lightweight HTML extractor; it does not render JavaScript.** Some e-commerce pages load prices dynamically, require login, use anti-bot protection, or block automated requests. Extraction accuracy and supported fields depend on the target page's HTML and access policies.

The Actor checks only the URL provided for that run. Test a public URL before scaling your workflow, and comply with the relevant website's terms and applicable laws.

### Support

If extraction fails for a public product page, contact us using the Actor's issue/support channel. Include the URL, run ID, expected result, and actual result. Never share account passwords or other secrets.

***

https://console.apify.com/actors/1SbUacMtaxReRoNvo/publication
https://console.apify.com/actors/1SbUacMtaxReRoNvo/publication

# Actor input Schema

## `url` (type: `string`):

Paste the full URL of the product page you want to monitor.

## Actor input object example

```json
{
  "url": "https://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.html"
}
```

# Actor output Schema

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

No description

## `latestResult` (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 = {
    "url": "https://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.html"
};

// Run the Actor and wait for it to finish
const run = await client.actor("dazalabs/universal-price-stock-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 = { "url": "https://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.html" }

# Run the Actor and wait for it to finish
run = client.actor("dazalabs/universal-price-stock-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 '{
  "url": "https://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.html"
}' |
apify call dazalabs/universal-price-stock-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,dazalabs/universal-price-stock-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/1SbUacMtaxReRoNvo/builds/rRtD3KDVkQzs9qGGw/openapi.json
