Supplier Stock & Price Monitor (Public Pages)
Pricing
$5.00 / 1,000 change detecteds
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
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
5 days ago
Last modified
Categories
Security
Limited permissionsShare
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>.jsendpoint (verified live 2026-10-31 on a public Shopify store: returns per-variantsku,available, and integer-centprice); (2) any other site - schema.orgProduct/OfferJSON-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
availablefield 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
.jsprices carry no currency field; currency comes from the watchlist entry's optionalcurrencyhint, else null. - Sites without Shopify
.jsor JSON-LD returnparse_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.jsshape (integer-cent prices)fixtures/product_page.html- synthetic JSON-LD page incl. a malformed block (skipped) and InStock/OutOfStock variantstest_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)
- r/dropshipping "How do you track supplier stock and price changes?" (Jun 2026): users hand-write scraper scripts; "price increases can slip through for days... margin damage is already done." https://www.reddit.com/r/dropshipping/comments/1u9gt9c/
- r/dropshipping: "I lost two sales this week because an item was out of stock and I didn't catch it in time." https://www.reddit.com/r/dropshipping/comments/1my2wr4/
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-detectedevent at ~$0.002-0.005 (i.e.$2-5 per 1,000 alerts vs competitor's $43), plus free first-run baseline ($0.001 for a small watchlist), so margin is ample. Charge only real change events;product_addedevents uncharged). Run cost is one GET per URL (status_changedto 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.