Supplier Stock & Price Monitor (Public Pages) avatar

Supplier Stock & Price Monitor (Public Pages)

Pricing

$5.00 / 1,000 change detecteds

Go to Apify Store
Supplier Stock & Price Monitor (Public Pages)

Supplier Stock & Price Monitor (Public Pages)

Watches your own suppliers' public product pages and reports price and stock changes between runs. One plain GET per URL, no CAPTCHA bypass, snapshots persisted in key-value store.

Pricing

$5.00 / 1,000 change detecteds

Rating

0.0

(0)

Developer

Tom

Tom

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

5 days ago

Last modified

Security

Limited permissions

Share

Watches a small list of your own suppliers' public product pages and reports price and stock/availability changes between runs. Built for dropshippers and small retailers whose suppliers have no API - the people currently hand-writing scraper scripts or catching supplier price rises days late. This is operational continuity ("did MY supplier's SKU go out of stock / did MY cost change"), not competitor price intelligence.

What it does

  • One plain HTTP GET per watched URL per run. No crawling, no retries, no JavaScript rendering, no CAPTCHA or bot-check bypass.
  • Fetch order: (1) Shopify storefronts - the public /products/<handle>.js endpoint (verified live 2026-10-31 on a public Shopify store: returns per-variant sku, available, and integer-cent price); (2) any other site - schema.org Product/Offer JSON-LD (price, priceCurrency, availability) embedded in the HTML (https://schema.org/Product, https://schema.org/Offer).
  • Diffs against the previous run's snapshot and emits deterministic events: product_added, variant_added, variant_removed, price_changed (from/to in minor units + currency), out_of_stock, back_in_stock, status_changed.
  • Blocked pages (401/403/429/503) are reported as status: "blocked" - never worked around. Verified live: repeated polling of one storefront within minutes returns HTTP 429, so schedule conservatively (hourly at most per URL; less for small watchlists) and expect some sites (e.g. gymshark.com) to refuse plain fetchers entirely.

Safety guards (v2, after review)

  • SSRF protection: only http/https, no credentials in URLs, ports 80/443 only, and every hostname (including redirect targets, validated at redirect time) must resolve to public IPs - loopback/private/link-local/multicast/ reserved are refused before any request leaves the box. Residual limit: stdlib-only cannot pin DNS against rebinding between check and connect; documented, not hidden.
  • Body cap: responses over 5MB are rejected.
  • Baseline preservation: a failed run (429, timeout, parse failure) never overwrites the last-known-good snapshot for that URL, so transient failures cannot manufacture false change events on recovery (tested).
  • Unknown stays unknown: a missing available field is unknown and fires no stock event - it is never treated as out-of-stock (tested).
  • Currency precision: minor units per currency (JPY 0, BHD-type 3, else 2); prices with more precision than the currency supports are rejected, never rounded (tested).

Honest limits

  • Availability is only what the page publicly exposes (usually a per-variant boolean). Stock quantities are typically not public and are not invented.
  • Shopify .js prices carry no currency field; currency comes from the watchlist entry's optional currency hint, else null.
  • Sites without Shopify .js or JSON-LD return parse_failed.
  • No login-walled supplier portals. Public pages only.

Input

JSON watchlist on stdin / input field: [{"url": "https://supplier.example/products/some-item", "currency": "USD"}, ...]

CLI: python3 supplier_monitor.py --snapshot snap.json < watchlist.json (snapshot optional; without it every URL reports product_added). For the Apify wrapper: input schema {watchlist: [...]}; persist the snapshot in the Actor's default key-value store (STATE/snapshot.json), push results + events to the dataset, log counts only (never full URLs with customer context or variant detail).

Fixtures and tests

  • fixtures/shopify_product.js - synthetic, modeled on the verified live Shopify .js shape (integer-cent prices)
  • fixtures/product_page.html - synthetic JSON-LD page incl. a malformed block (skipped) and InStock/OutOfStock variants
  • test_supplier_monitor.py - 38 deterministic tests, all passing (python3 test_supplier_monitor.py), incl. a two-pass run with snapshot proving price-change and restock events fire exactly once

No third-party dependencies. No code or data copied from external sources.

Demand evidence (gathered 2026-10-31)

Competition and pricing (ESTIMATE ONLY, Tom decides)

  • On-store: https://apify.com/zentrafoundry/supplier-stock-price-monitor - fetched 2026-10-31: "2 total users, 1 monthly users, no ratings", priced $43.00 per 1,000 change alerts, scoped to "approved public supplier product URLs". Same wedge, verified near-zero traction.
  • Suggested event pricing: per change-detected event at ~$0.002-0.005 (i.e. $2-5 per 1,000 alerts vs competitor's $43), plus free first-run baseline (product_added events uncharged). Run cost is one GET per URL ($0.001 for a small watchlist), so margin is ample. Charge only real change events; status_changed to blocked stays free.

Privacy

Watchlists are user-provided public URLs. Runs process public page data only. When deployed on Apify, run inputs/datasets/logs persist on the platform by default - do not claim otherwise; log counts, not payloads.