Scraped Price & Stock Changes — Safe Snapshot Diff
Pricing
$50.00 / 1,000 completed price and stock comparisons
Scraped Price & Stock Changes — Safe Snapshot Diff
Compare product scraper datasets for price drops and stock changes. Partial scrapes never imply product deletion. Select two datasets or JSON arrays; raw values omitted. $0.05/report, usage included.
Pricing
$50.00 / 1,000 completed price and stock comparisons
Rating
0.0
(0)
Developer
black cow
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
Already scraping product prices? Compare two completed runs and find price drops, stock transitions and products missing from the newer snapshot. Start from the datasets you already have; no new scraper, proxy, store login or external AI service.
$0.05 per completed comparison report, platform usage included. Reviews, unchanged snapshots and capped-source reports are completed reports and bill once. Synthetic demo and rejected input have no custom report event. Source scraper costs and your own build/run/storage costs remain subject to your Apify plan. A new run is a new report; retrieve existing output instead of rerunning it.
Try the result first
Run {"mode":"demo"}. The built-in product changes from 30 to 3 and from in stock to out of stock. Another product is absent from the partial new scrape. Expect PRICE_DECREASE: 1, OUT_OF_STOCK: 1, NOT_OBSERVED_UNVERIFIED: 1 and PARTIAL_SNAPSHOT: 1. This is synthetic output, not a check of your data. Do not attach real inputs to demo mode.
Connect existing Apify scraper results
- Choose Compare snapshots and select Previous product dataset and Current product dataset. Only READ permission to these two explicitly selected datasets is requested. Sources must be from finished runs and remain unchanged during the comparison.
- Choose E-commerce Scraping Tool: offers object for
url,offers.price,offers.priceCurrencyandoffers.availability. This preset ignores the manual field settings. Choose Price only when stock is absent; the report explicitly marks stock as unchecked. Otherwise map the four fields manually: stableidorurl, numeric price, currency, stock. Dot paths are supported; arrays, wildcard selectors and guessed mappings are not. If your scraper returnsoffers[], transform it into one row per product/variant and select its price and currency first. - Leave both completeness switches off for samples, incomplete crawls or changed filters. Switch them on only when both snapshots cover the intended same product scope. Even a complete missing row is not proof of a deletion from the website.
- Review Price and stock review, then Changes by source row. Rows are one-based positions in the supplied arrays or dataset order. Look up the original values in your source dataset.
The standard Apify dataset picker grants scoped READ access, not access to the rest of your account. No customer token field, new Secret, account-wide permission or outbound webhook is needed. A missing source permission rejects the run without a custom report event. Sources are never modified or deleted.
For an Actor-to-Actor integration, configure mode=compare, a fixed previous dataset, and the new current_dataset_id from the source run's resource.defaultDatasetId. Configure the two dataset picker fields explicitly so READ permissions can be granted. Optional integration payload is ignored. This version compares the two supplied snapshots; it does not advance a saved baseline automatically or send messages. A comparison itself may incur its stated fee each time it is triggered.
JSON, n8n and AI workflows
E-commerce Scraping Tool price monitoring
The official scraper's documented JSON output includes a single offers object and can omit stock. Use input_layout=ecommerce_offers and comparison_scope=price_only with your two completed datasets. No field-by-field remapping or new scraping run is needed. This supports that documented shape, not every site-specific output or offers array.
Free synthetic preview: {"mode":"demo","input_layout":"ecommerce_offers","comparison_scope":"price_only"}. It reports the price drop and partial-snapshot uncertainty, with coverage.stock_checked=false. A missing currency or unrecognized price still requires review. Price-only mode does not authorize price edits or treat unavailable stock as available.
For a paid comparison of inline public product rows:
{"mode": "compare","input_layout": "ecommerce_offers","comparison_scope": "price_only","previous_items": [{"url":"https://example.com/products/sample-a","offers":{"price":30,"priceCurrency":"USD"}}],"current_items": [{"url":"https://example.com/products/sample-a","offers":{"price":3,"priceCurrency":"USD"}}],"previous_complete": true,"current_complete": true}
Declare complete only for the same fully collected scope. In n8n's Apify integration, supply these options with your existing two snapshots, then read this run's result. Route workflow.needs_review to manual review before acting on workflow.has_alerts; retrieve the existing result instead of rerunning and paying again. There is no preinstalled n8n workflow or automatic baseline advancement.
For a workflow that already has the records, pass arrays instead of granting access to datasets:
{"mode": "compare","previous_items": [{"id":"sample-a","price":30,"currency":"USD","inStock":true}],"current_items": [{"id":"sample-a","price":3,"currency":"USD","inStock":false}],"previous_complete": true,"current_complete": true,"price_change_percent": 5,"delete_input_after_read": true}
This request generates a paid comparison. It returns CHANGES_FOUND, PRICE_DECREASE at -90% and OUT_OF_STOCK. In n8n or Make, map the two dataset JSON arrays into these fields, call the Actor using your own authorized Apify connection, and read the report from the existing run. No preconfigured customer credentials or automatic notification subscriptions are included.
AI agents can find the Actor in Apify Store or connect the specific MCP tool. Read the schema and the customer's spending limit before running. A callable tool is not evidence of a sale.
| Result | Next step |
|---|---|
REJECTED, complete=false | No completed report. Correct the fixed input/permission error. |
REVIEW | Inspect partial coverage, unavailable prices/stock, currency or ambiguous keys. Do not treat unknown values as confirmed events. |
CHANGES_FOUND | Inspect identified source rows. Approve any downstream action separately. |
NO_ALERTS | No threshold-level alert under the implemented checks. Smaller price changes may still be counted in changed_matched. |
workflow.needs_review and workflow.has_alerts are separate: a report can contain real matched price changes and incomplete overall coverage. automatic_action_authorized is always false. No price edits, product deletions or notification messages are performed.
Rules and limits
- At most 5,000 rows per side and 8 MiB combined. Remote datasets request only the selected fields (three in price-only mode), in pages of at most 100 rows. Reads capped by size are rejected; a row cap or metadata change marks coverage incomplete and prevents confident missing/addition labels for that side.
- Field names use bounded dot notation. Keys must be nonblank strings or integers; string
1and number1are distinct. URLs are matched exactly, never fetched or normalized. Duplicate identities are skipped rather than arbitrarily paired. - Prices accept nonnegative plain decimals up to 18 integer and 8 fractional digits. Currency fields must have matching three-letter codes; no currency conversion or validation of a code against a current exchange table. Currency symbols, localized separators, scientific notation, negative and missing prices are not guessed.
- Stock accepts booleans and
in_stock,in stock,instock,out_of_stock,out of stock,outofstock,true,falsestrings. Quantities, preorder states and Schema.org URLs need a prior explicit transformation. - Up to 500 detailed findings; counts cover all inspected rows.
complete=truemeans the bounded report completed, not that source coverage or website truth is complete. Checkcoverageseparately. - This product compares stable identities within one source scope. It does not match different stores' equivalent products, verify source scraper accuracy, check live websites or prove product deletion. Reordering source datasets during reads is unsupported; metadata checks reduce but cannot eliminate concurrent-write ambiguity.
Privacy and offline use
Send public product data only. Do not submit personal, customer, payment, credential or confidential data. Recognized private-field mappings are rejected, but this is not a universal personal-data detector.
The Actor reads only selected Apify datasets or supplied arrays. It does not access your computer, private files, local environment files, browser sessions or external websites. It uses only Apify's scoped runtime authentication for selected source reads and its own output storage/charging.
Input-record deletion defaults on and happens before processing. It covers only this run's input record, not source datasets, saved task inputs, backups or other copies. Output includes counts, source row numbers, percentages and a snapshot hash; raw keys, URLs, prices, stock values and product titles are omitted. Hashes are not anonymization; protect reports and their access links.
The package also supports local processing with Python 3.12 and no third-party dependencies: python -m scrape_change input.json, where the file has previous_items and current_items. The local CLI makes no network requests. Hosted platform internals, backup retention and the full container OS are outside the source audit.
For Shopify CSV edits before import, use CSV ChangeGuard. This Actor compares scraper observations after collection. It is independently developed and is not endorsed by Apify or Shopify.