Global Price & Stock Intelligence avatar

Global Price & Stock Intelligence

Pricing

from $2.00 / 1,000 product checkeds

Go to Apify Store
Global Price & Stock Intelligence

Global Price & Stock Intelligence

Track price and stock of product pages you are allowed to check. Reads schema.org/JSON-LD first, reports PRICE_UP, PRICE_DOWN, BACK_IN_STOCK, OUT_OF_STOCK with evidence, keeps price history and matches the same product across shops.

Pricing

from $2.00 / 1,000 product checkeds

Rating

0.0

(0)

Developer

PRIVATEX

PRIVATEX

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

5 days ago

Last modified

Security

Limited permissions

Share

Monitor the price and stock of product pages on any shop you are allowed to check. Each run tells you what changed since your previous run: PRICE_UP, PRICE_DOWN, BACK_IN_STOCK, OUT_OF_STOCK, MIXED, UNCHANGED. Every value shows where it came from.

Who needs it

  • E-commerce teams watching competitor prices and stock on a schedule.
  • Agencies running price checks for several clients, one monitor per client.
  • Procurement analysts tracking supplier list prices and availability over time.

What it does

  • Reads structured data first. It reads schema.org JSON-LD first, including @graph, ProductGroup variants, WooCommerce priceSpecification and AggregateOffer. Then it tries microdata, then meta tags. Only when none of these exist does it read the page HTML, at lower confidence.
  • Shows its evidence. Every row has an evidence object per field: the source (json-ld, microdata, meta or html), the path, the raw value and a confidence.
  • Compares with your previous run of the same monitorName and keeps a price history (default: 30 observations), with the lowest and highest price seen.
  • Matches the same product across shops by a valid GTIN, by brand + SKU, or by a productKey you set. Prices are compared per currency only.
  • Parses prices in many formats: 1.234,56 €, $1,234.56, 3.499 TL, 1 299,00 zł, CHF 1'299.50. Currencies are reported as ISO codes and are never converted.

What it does NOT do

  • It never treats a failed check as out of stock. A timeout, block, 404 or missing data gives UNAVAILABLE, and your last good price and stock are kept.
  • It never bypasses blocking. It does not get around anti-bot challenges, CAPTCHAs or logins, and does not use proxies to evade blocks. A site that shows a challenge is skipped for the rest of the run, and the row says so.
  • It does not guess. It never guesses stock counts from an "in stock" badge, invents a currency, or converts between currencies.
  • It only reads pages. No checkout, no cart, no account pages, no POST requests.

Start in 60 seconds

  1. Press Start with the prefilled input. It checks three products on public scraping-practice sites (books.toscrape.com, scrapeme.live, webscraper.io).
  2. Run it again later with the same monitor name. The second run shows UNCHANGED or the changes.
  3. Replace the URLs with product pages you are allowed to monitor.

To see every status without fetching anything, empty the URL list (Demo mode is ignored whenever product URLs are given). The demo uses fictional shops, is labelled SYNTHETIC_DEMO and charges no product events (only Apify's automatic $0.00005 start event applies to every run).

Example input

{
"products": [
{ "url": "https://scrapeme.live/shop/Bulbasaur/" },
{ "url": "https://shop.example.com/p/kettle", "productKey": "KETTLE-17" }
],
"monitorName": "competitor-kettles",
"perHostDelaySecs": 2
}

Example output row

This row is real: cloud run l7Xm4faI9YaIDvxXP, 2026-10-30, a public scraping-practice site.

{
"status": "FIRST_SEEN",
"url": "https://scrapeme.live/shop/Bulbasaur/",
"title": "Bulbasaur",
"price": 63,
"currency": "GBP",
"availability": "IN_STOCK",
"sku": "4391",
"matchBasis": "URL_ONLY",
"evidence": {
"price": { "source": "json-ld", "path": "offers.price", "raw": "63.00", "confidence": 0.95 },
"currency": { "source": "json-ld", "path": "offers.priceCurrency", "raw": "GBP", "confidence": 0.95 },
"availability": { "source": "json-ld", "path": "offers.availability", "raw": "https://schema.org/InStock", "confidence": 0.95 }
},
"errorCode": null,
"dataOrigin": "LIVE_FETCH"
}

On the second run the same row had "status": "UNCHANGED", "previousPrice": 63 and a price history of 2 observations.

Statuses

StatusMeaning
FIRST_SEENFirst successful check in this monitor; it is stored as the baseline.
UNCHANGEDSame price, currency and stock as the last successful check.
PRICE_UP / PRICE_DOWNThe price changed. See previousPrice, priceChange and priceChangePct.
BACK_IN_STOCK / OUT_OF_STOCKStock changed between in-stock and out-of-stock or discontinued.
CURRENCY_CHANGEDThe currency differs; prices are not compared.
PRICE_MISSINGThe page no longer shows a price. The old price stays in the history.
MIXEDMore than one change at once. changes lists them.
UNAVAILABLEThis check failed (errorCode says why). The previous good data is kept.

Error codes:

CodeMeaning
NOT_FOUNDThe page doesn't exist (404).
ACCESS_DENIEDThe site refused access.
ANTI_BOT_CHALLENGEThe site showed an anti-bot challenge; it is not bypassed.
RATE_LIMITEDThe site asked us to slow down.
HOST_SKIPPED_AFTER_BLOCK / HOST_SKIPPED_AFTER_RATE_LIMITSkipped because the same site blocked or rate-limited an earlier request in this run.
ROBOTS_DISALLOWEDThe site's robots.txt disallows this URL.
ROBOTS_UNREACHABLErobots.txt couldn't be read, so the site is treated as disallowed.
TIMEOUTNo answer in time.
UNSUPPORTED_FORMATNot an HTML page.
PAGE_TOO_LARGEThe page exceeds the size limit.
EXTRACTION_UNCERTAINThe page loaded but no price or availability was found.
INPUT_INVALIDNot a valid public http(s) URL.
RUN_LIMIT_REACHEDThe run's time or charge limit was reached before this URL.

Output

WhereWhat
DatasetOne row per product URL, with every field above plus priceHistory, priceHistoryStats, matchKey, confidence, evidence and diagnostics.
RESULTS_CSVThe main columns as CSV, with a UTF-8 BOM and formula-injection protection.
MATCH_GROUPSProducts found on several shops, with the lowest price per currency.
OUTPUTRun summary: counts by status and error code, duplicates, invalid inputs and billing.

Run statuses (OUTPUT.status):

  • SUCCEEDED: every product was checked.
  • PARTIAL_RESULT: some failed or were skipped.
  • FAILED: nothing could be checked. The run is marked failed and your monitor history is untouched.

Pricing

Pay per event:

EventPriceWhen it is charged
product-checked$0.002Once per product page that loaded and yielded a price or availability.
apify-actor-start$0.00005Once per run, by Apify.

Examples: 100 products cost $0.20 per run; 1,000 products cost $2.00 per run. Platform usage is included.

These are not charged:

  • failed, blocked, robots-disallowed and rate-limited checks;
  • duplicate URLs;
  • invalid inputs;
  • demo runs.

The Actor respects your maximum cost per run. It only fetches as many products as the limit allows; the rest are listed in OUTPUT.counts.skippedForChargeLimit.

Politeness and limits

BehaviourDetail
robots.txtAlways respected (RFC 9309). This cannot be turned off.
Requests to one siteOne at a time, with a delay (default 2 s). The site's Crawl-delay wins if it is longer.
Sites in parallelUp to 3 by default.
429 responsesA Retry-After of 30 s or less is honoured once. Otherwise the site is skipped for the rest of the run.
Page timeout30 s by default.
Page size8 MB maximum.
Products per run1,000 maximum.

Privacy and security

  • Only the public product pages you list are fetched.
  • Private, internal, loopback and cloud-metadata addresses are refused, on the first request and after every redirect and DNS resolution. Oversized and compressed-bomb responses are cut off.
  • Monitor history (prices, stock, timestamps; no page content) is stored in a key-value store named price-stock-intelligence-state in your Apify account.
  • The Actor runs with limited permissions.

Scheduling and API

Create a task with your URLs and a fixed monitorName, then schedule it, for example daily. Use onlyChanges: true to get only changed products. Connect the dataset or OUTPUT to Slack, Sheets, Make, Zapier or your API client, and alert on PRICE_DOWN or BACK_IN_STOCK.

Known limitations

  • Prices that appear only after JavaScript runs are not seen; no browser is used. These rows show EXTRACTION_UNCERTAIN.
  • With several variants on one page, the lowest offer price is reported and priceRange is filled.
  • The HTML fallback takes the first price-styled element after the page title. On pages without structured data this can be wrong; such values have confidence 0.6 or lower and a HTML_FALLBACK_PRICE diagnostic.
  • $, ¥ and kr are ambiguous. They are mapped to USD, JPY or SEK only when the page states no currency, and are flagged CURRENCY_AMBIGUOUS.

Support

Use the Issues tab on this Actor's page.