# Universal Product Price, Stock & Variant Monitor (`lead.gen.labs/universal-product-monitor`) Actor

Monitor Amazon and Walmart product prices, inventory, variants, sellers, Buy Box ownership, and delivery changes.

- **URL**: https://apify.com/lead.gen.labs/universal-product-monitor.md
- **Developed by:** [LeadGen Labs](https://apify.com/lead.gen.labs) (community)
- **Stats:** 2 total users, 1 monthly users, 80.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $19.00 / 1,000 successful product checks

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

## Amazon & Walmart Product Price and Stock Monitor

Monitor Amazon and Walmart product prices, stock availability, discounts, sellers, Buy Box offers, variants, images, and delivery information. Run the Actor once to collect current product data, or schedule it to detect price drops, restocks, sellouts, and seller changes automatically.

No scraping code is required. Paste product URLs, choose a delivery ZIP code, and click **Start**.

### What does this Actor do?

The Universal Product Price, Stock & Variant Monitor checks known Amazon.com and Walmart.com product pages and returns consistent, structured data from both stores.

It answers questions such as:

- What is the product's current price?
- Is the item in stock for a specific ZIP code?
- Did the price increase or decrease since the previous run?
- Did an unavailable product come back in stock?
- Which seller currently owns the Buy Box or featured offer?
- Are other sellers, sizes, colors, styles, or package options available?
- What delivery information does the store show for the selected location?

### Common use cases

- **Price tracking:** detect price drops and price increases on Amazon and Walmart.
- **Back-in-stock alerts:** find out when sold-out products become available again.
- **Competitor monitoring:** follow competitors' prices, promotions, stock, and sellers.
- **Amazon Buy Box monitoring:** observe featured-offer and marketplace seller changes when Amazon exposes them.
- **Retail inventory monitoring:** keep purchasing, replenishment, or catalog systems updated.
- **Discount discovery:** compare current and original prices to identify promotions.
- **Product research:** collect titles, brands, identifiers, images, variants, offers, and availability.
- **Automated workflows:** send changes to webhooks, Make, Zapier, Google Sheets, Slack, or your own application.

### Quick start

1. Open the Actor's **Input** tab.
2. Paste one or more direct Amazon.com or Walmart.com product URLs into **Product URLs**.
3. Enter the delivery ZIP code you want to check. The default is `10001`.
4. Leave **Save only detected changes** off for the first run.
5. Click **Start**.
6. Open the **Dataset** tab when the run finishes.

The first successful run creates a baseline. Later runs using the same **Monitoring history name** compare new observations with that baseline and produce change alerts.

### Beginner-friendly input guide

#### Product URLs

Paste direct product-page URLs:

```text
https://www.amazon.com/dp/B0D1XD1ZV3
https://www.walmart.com/ip/17835006350
```

Search pages, category pages, and home pages are not supported. Each URL must point to one product.

#### Delivery location

The delivery ZIP code affects local stock, delivery messages, and sometimes pricing. The Actor currently targets the United States storefronts:

- **Delivery ZIP code:** the US location you want to monitor
- **Country:** `US`
- **Store language:** `en-US`

#### Seller offers

Keep **Collect seller offers and Buy Box data** enabled when you need marketplace sellers and featured-offer information. Some products or sessions do not expose seller details, so these fields may be empty.

#### Complete results or changes only

- **Off:** saves a complete `PRODUCT` record for every successful product, plus detected change alerts. Use this on the first run and for regular exports.
- **On:** saves only `CHANGE_EVENT` alerts. Use this for scheduled monitoring when your automation only needs changes.

#### Minimum price change

Set the smallest price movement that should create an alert:

- `0` reports every detected price change.
- `1` ignores changes smaller than 1%.
- `5` reports only changes of 5% or more.

#### Monitoring history name

This name connects repeated runs. Keep the default or choose a stable name such as `weekly-competitor-products`. Runs with the same name share the last valid product state and can detect changes.

Use different names when you need independent baselines, such as `client-a-products` and `client-b-products`.

### Input example

The visual form creates JSON like this:

```json
{
    "products": [
        { "url": "https://www.amazon.com/dp/B0D1XD1ZV3" },
        { "url": "https://www.walmart.com/ip/17835006350", "externalId": "MY-SKU-102" }
    ],
    "deliveryLocation": {
        "postalCode": "10001",
        "country": "US",
        "language": "en-US"
    },
    "includeSellers": true,
    "onlyChanges": false,
    "minimumPriceChangePercent": 1,
    "stateStoreName": "my-product-watchlist"
}
```

`externalId` is optional and mainly useful for API users. Add your SKU or catalog ID, and the Actor returns it with that product's results.

### What data does the Actor return?

The default dataset can contain three record types.

#### Product records

A `PRODUCT` record is the latest normalized product snapshot. Depending on what the store exposes, it can contain:

- Retailer, product ID, external ID, and canonical URL
- Product title, brand, description, and identifiers
- Current price, original price, currency, and discount information
- Stock status and store availability text
- Images and product variants
- Featured seller, Buy Box data, and additional seller offers
- Delivery information for the configured ZIP code
- Observation time and extraction source

#### Change alerts

A `CHANGE_EVENT` tells you what changed between successful runs. Event types include:

- `PRICE_DECREASED`
- `PRICE_INCREASED`
- `BACK_IN_STOCK`
- `OUT_OF_STOCK`
- `OFFERS_CHANGED`
- `VARIANTS_CHANGED`
- `DELIVERY_CHANGED`
- `PRODUCT_DISCOVERED`

Each event includes the product, changed field, previous value, new value, and observation time.

#### Failure records

A `FAILURE` record explains why a product could not be collected after all retries. Typical causes include an invalid or removed product URL, a retailer challenge, an unsupported page, or a response without trustworthy product data.

A failed request does not replace the product's last valid state.

### How to set up automatic price and stock alerts

1. Run the Actor once with **Save only detected changes** turned off.
2. Create an Apify schedule, such as hourly or daily.
3. Reuse the same input and **Monitoring history name** on every scheduled run.
4. Turn on **Save only detected changes** if your workflow should receive alerts only.
5. Add an Apify webhook or integration to forward successful run data.

A webhook can trigger Make or Zapier to send an email, update Google Sheets, or post a message when a product comes back in stock.

### API usage

Start the Actor using the Apify API:

```bash
curl -X POST "https://api.apify.com/v2/acts/lead.gen.labs~universal-product-monitor/runs?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "products": [{"url": "https://www.amazon.com/dp/B0D1XD1ZV3"}],
    "deliveryLocation": {"postalCode": "10001", "country": "US", "language": "en-US"},
    "onlyChanges": false
  }'
```

Do not publish or commit your Apify API token. You can also call the Actor with the Apify JavaScript or Python API client.

### Limitations

- The Actor monitors known product URLs; it does not discover products from search or category pages.
- It currently targets Amazon.com and Walmart.com in the United States.
- Storefront data can vary by ZIP code, session, account state, seller, and retailer experiment.
- Amazon may expose only a subset of seller offers for some products.
- A retailer can still block a request after browser and proxy retries; the Actor reports a failure instead of unreliable data.
- Storefront structures and undocumented endpoints can change over time.
- Use collected data in accordance with applicable laws and retailer terms.

### Frequently asked questions

#### Can I monitor Amazon and Walmart products in the same run?

Yes. Add Amazon.com and Walmart.com product URLs to the same input list. The Actor normalizes results into a shared format.

#### Does the Actor send notifications itself?

The Actor produces structured change events. Connect an Apify webhook, integration, or API workflow to send email, Slack, Telegram, or other notifications.

#### Do I need to run it once before receiving change alerts?

Yes. The first successful run creates the comparison baseline and emits `PRODUCT_DISCOVERED`. Future runs using the same monitoring history name can identify price, stock, seller, variant, and delivery changes.

#### Can I monitor hundreds of products?

Yes, up to the configured safety limit. Start with concurrency `3`, review success and browser-fallback metrics, and scale gradually because runtime and proxy use depend on retailer blocking.

#### Why is a price or seller field empty?

The store may not expose that value for the selected product, ZIP code, seller, or session. The Actor keeps available valid fields and reports coverage in the run summary.

#### Why did a product fail?

The URL may be invalid, the listing may have been removed, or the retailer may have blocked every retry. Check the `FAILURE` record for the exact reason. Previous valid monitoring state is preserved.

#### Does this Actor purchase products?

No. It monitors publicly displayed product information. It does not log in, add products to a cart, place orders, or complete checkout.

#### Is the data returned in a consistent format?

Yes. Amazon and Walmart observations are normalized into the same product, offer, delivery, and change-event structure, although store-specific fields appear only when available.

# Actor input Schema

## `products` (type: `array`):

Add direct product links from Amazon.com or Walmart.com. An optional `externalId` can be included in JSON input to match results with your own catalog.

## `deliveryLocation` (type: `object`):

Choose the customer location used when checking product availability and delivery.

## `includeSellers` (type: `boolean`):

When available, collect marketplace sellers, their prices, and the featured Buy Box offer.

## `onlyChanges` (type: `boolean`):

Off: save complete product records and any alerts. On: save only alerts, such as price drops and restocks. Keep this off for your first run.

## `minimumPriceChangePercent` (type: `number`):

Ignore smaller price movements. Use 0 to report every price change, or 5 to report changes of 5% or more.

## `maxProducts` (type: `integer`):

Stop before processing if the submitted URL count exceeds this safety limit.

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

Higher values may finish faster but can increase blocking. The production-tested default is 3.

## `maxRequestRetries` (type: `integer`):

How many times to retry a product when a store blocks or fails to load it.

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

Keep the same name on future runs so the Actor can compare results and detect changes. Use a different name for a separate monitoring list.

## Actor input object example

```json
{
  "products": [
    {
      "url": "https://www.amazon.com/dp/B0D1XD1ZV3"
    }
  ],
  "deliveryLocation": {
    "country": "US",
    "postalCode": "10001",
    "language": "en-US"
  },
  "includeSellers": true,
  "onlyChanges": false,
  "minimumPriceChangePercent": 0,
  "maxProducts": 100,
  "maxConcurrency": 3,
  "maxRequestRetries": 3,
  "stateStoreName": "universal-product-monitor-state"
}
```

# Actor output Schema

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

No description

## `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 = {
    "products": [
        {
            "url": "https://www.amazon.com/dp/B0D1XD1ZV3"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("lead.gen.labs/universal-product-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 = { "products": [{ "url": "https://www.amazon.com/dp/B0D1XD1ZV3" }] }

# Run the Actor and wait for it to finish
run = client.actor("lead.gen.labs/universal-product-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 '{
  "products": [
    {
      "url": "https://www.amazon.com/dp/B0D1XD1ZV3"
    }
  ]
}' |
apify call lead.gen.labs/universal-product-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,lead.gen.labs/universal-product-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/xsBX6CJTuueipSg3t/builds/lrRpUlX3VerBsdnl5/openapi.json
