Price Availability Change Monitor avatar

Price Availability Change Monitor

Pricing

from $11.50 / 1,000 product target checkeds

Go to Apify Store
Price Availability Change Monitor

Price Availability Change Monitor

Monitor product pages or supplied snapshots for price, sale, stock, variant availability, shipping, coupon, and page-status changes

Pricing

from $11.50 / 1,000 product target checkeds

Rating

0.0

(0)

Developer

junipr

junipr

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Share

Compare current public product evidence with supplied baseline snapshots and identify exact changes in price, availability, sale badges, coupons, static variants, and page status.

It is designed for retailers, ecommerce teams, competitive pricing analysts, marketplaces, and agencies. Runs are deterministic for supplied HTML, bounded for explicit URL inputs, and produce schema-valid dataset objects plus downloadable report artifacts.

What you get

  • Product URL and name
  • Current and baseline numeric prices
  • Exact price delta and currency
  • Current and baseline normalized availability
  • Sale badge, coupon, and static variant-change signals
  • Tri-state changeDetected: true, false, or null when no baseline exists

Every row includes source URL/type, page title, record type/name, issue code, severity, an optional bounded evidence snippet, a recommendation, canonical URL, HTTP status, and scan timestamp. Missing evidence remains null or an explicit diagnostic state; it is not replaced with invented values.

How it works

  1. Accept current HTML in htmlInputs, or fetch only explicit public productUrls when fetchCurrent is true.
  2. Pair each current page with a baselineSnapshots record by canonical/source URL, then by position as a documented fallback.
  3. Extract numeric price, currency, normalized availability, sale/coupon text, and a static option signature from each side.
  4. Compute price delta and field-level change signals only when baseline evidence exists.
  5. Return changeDetected: null when a baseline is absent; the Actor never fabricates an initial change.

The Actor prefers user-supplied HTML because it is deterministic and inexpensive. Live HTTP retrieval is bounded by page limits, timeouts, delays, and an optional domain allowlist. Loopback and private IPv4 targets are rejected. Broad link discovery is disabled.

Inputs

FieldPurpose
baselineSnapshotsPrior records with sourceUrl and html/currentHtml.
htmlInputsCurrent captured product pages.
productUrlsExplicit current public URLs.
fetchCurrentOpt-in switch for public URL hydration.
priceSelectors / availabilitySelectorsDocumented selector hints retained with the run.
maxProducts / maxSnapshots / maxComparisons / maxChangesBound targets and emitted changes.
allowedDomainsOptional fetch hostname allowlist.
includeEvidenceSet false to omit evidence snippets from dataset rows.
includeRawSnapshotsOpt in to bounded raw HTML records in the key-value store.
timeoutMs / requestDelayMsBound each public request and pacing.
maxChargeUsdStops before a paid event would exceed the run budget.
includeReportControls paid report generation and key-value-store artifacts.

startUrls remains available for task compatibility. Actor-specific URL fields are clearer for new integrations. sitemapUrls is accepted as workflow metadata but does not start a broad sitemap crawl.

Input example

{"baselineSnapshots":[{"sourceUrl":"https://shop.example/products/northstar-drive","html":"<html>...previous product HTML...</html>"}],"htmlInputs":[{"sourceUrl":"https://shop.example/products/northstar-drive","html":"<html>...current product HTML...</html>","httpStatus":200}],"fetchCurrent":false,"maxProducts":25,"maxComparisons":100,"maxChanges":100,"maxChargeUsd":35}

For repeatable automation, store baseline or captured HTML outside the Actor and send only the bounded records needed for the current comparison. Avoid embedding credentials, session cookies, private customer data, or authenticated page captures.

Dataset contract

The dataset schema is defined in .actor/dataset_schema.json. Each paid output is pushed as an individual object. Arrays are never submitted as a single dataset item. This makes API pagination, CSV export, and downstream validation predictable.

Common diagnostic conventions:

  • *_ok: observable fields passed the implemented checks.
  • *_required or *_no_*: required source evidence was absent.
  • *_source_unavailable: the supplied/fetched source was blocked or unavailable.
  • Actor-specific issue codes identify the exact mismatch, change, merchandising issue, review condition, or variant defect.
  • HTTP status 0 means the public request failed before a response; null means no request was attempted.

Evidence snippets are bounded and can be disabled. Raw snapshots are off by default and, when enabled, are capped before storage.

Reports

When includeReport is true and its charge is accepted, the Actor writes:

  • a Markdown executive summary;
  • a CSV containing the schema-aligned records;
  • a JSON issue list;
  • bounded evidence excerpts;
  • run metadata with counts, issue codes, pricing mode, and consumed input fields.

The billing-status record reports accepted spend, configured maximum, and the number of rows pushed. If a charge is rejected, partially accepted, or reaches an Apify event limit, the Actor stops before the corresponding paid output.

Pay-per-event pricing

EventPriceWhen charged
actor-start$0.03500Once after initialization.
product-target-checked$0.01150Once per distinct current product target.
price-availability-snapshot-compared$0.01150When a baseline/current pair is compared.
price-availability-change-detected$0.02250When observable monitored fields changed.
digest-generated$0.09000When the run digest is requested.
executive-report-generated$0.18000When report output is requested.

Apify platform-usage pass-through is off. The configured event prices reserve the applicable platform and discount margin. maxChargeUsd is enforced before every event, including actor start and report output. A value of zero therefore produces no paid dataset output.

Billing sequence:

  1. Initialize the Actor.
  2. Accept the actor-start event.
  3. Accept the distinct source/record event.
  4. Accept any actor-specific comparison, extraction, theme, issue, or change event.
  5. Push one validated dataset object.
  6. Accept report events before storing paid report artifacts.
  7. Write billing status and exit.

The Actor exits in a finally path. Dataset push failures are recorded as dataset-push-failed before the error is rethrown, which keeps failures observable and prevents a hanging run.

Limits and interpretation

  • The Actor compares supplied states; it is not a scheduler or notification service.
  • Price delta is emitted only when both sides expose numeric prices.
  • Static option controls contribute a deterministic variant signature. Interactive browser-only combinations are outside this Actor's scope.
  • Sale and coupon checks use observable page text, so legal validity, checkout eligibility, and geographic eligibility are not asserted.

Additional safeguards:

  • Only http: and https: URLs are eligible for fetching.
  • Localhost, loopback, link-local, and common private IPv4 ranges are rejected.
  • allowedDomains can restrict retrieval to exact hosts and their subdomains.
  • Response HTML is truncated before analysis.
  • Pagination, where supported, stays on the same hostname and within configured depth/page limits.
  • No credentials or private API access are requested.
  • Results describe observable source evidence at scan time; they are not legal, financial, inventory, or compliance guarantees.

Running on Apify

Use the input editor, API, task, webhook, schedule, or integration of your choice. Keep automated runs small at first, inspect the dataset and billing-status record, then increase caps deliberately.

A successful default run uses embedded public-page-shaped HTML, performs no network request, finishes quickly, and writes a non-empty dataset. For production monitoring, replace that input with your own public URLs or snapshots and preserve prior snapshots externally where comparisons require them.

Running from source

npm install
npm test
npm run build
npm run smoke

The smoke command clears package-local storage, executes the real entrypoint with examples/input.tiny.json, writes one object per dataset file, and creates every configured report artifact. The test suite also checks schema types, Store defaults, caps, SSRF guards, pricing events, charge limits, real entrypoint behavior, and actor-specific extraction cases.

Troubleshooting

The run returns a required-input diagnostic

Confirm that the actor-specific source field is populated and that the HTML record contains sourceUrl, html or currentHtml, and an appropriate HTTP status. Comparison Actors also need a usable baseline.

The source is unavailable

Check the URL, public accessibility, domain allowlist, timeout, and robots/site policies. Prefer a captured public HTML snapshot when stable automation matters.

The dataset stops before the configured cap

Inspect the billing-status record. maxChargeUsd, an Apify event limit, or a partial charge can stop output before a row is pushed.

Expected fields are null

The field was not observable in the supplied source or was disabled by input. Review the evidence snippet and source HTML. Do not treat null as a negative factual claim.

Interactive content is missing

Supply server-rendered HTML or an authorized captured snapshot. This package intentionally analyzes static, observable evidence and does not claim browser-only interactions it did not perform.