Amazon Product Watch - Price, Availability, Reviews
Track price drops, stock state, and review counts on any Amazon listing without building a scraping stack or relying on extension-based tools.
The scenario
You buy expensive hobby gear from Amazon and want to be told the moment a watched ASIN drops below your target price. Or you sell on Amazon and want to spot the exact minute the Buy Box flips to a third-party seller. Or you're researching a product and want to know when the review count crosses a milestone that suggests it's reached scale.
Camelcamelcamel, Keepa, and Honey cover this space but each has gaps - public-only data, browser-extension lock-in, opaque alert latency.
The problem
Amazon is the hardest mainstream retailer to scrape reliably. The page is heavily JavaScript-driven, the markup changes routinely, and the same URL renders differently for different regions and account states. Building this yourself means standing up a headless browser farm and a proxy pool, which is a real engineering effort just to watch a few SKUs.
How Verid solves it
Verid handles the rendering with fetch_mode: 'browser' - pages load in a real headless browser before extraction runs, so the CSS selectors see the same DOM you would. You target price, availability, and review-count selectors as named fields, set a predicate per field, and you're done.
For a single ASIN you might run hourly. For a watchlist of fifty, hourly across all of them is still well within the cost of a coffee.
Build the monitor
Extraction config
{
"method": "css",
"fields": {
"price": "#corePriceDisplay_desktop_feature_div .a-price .a-offscreen",
"availability": "#availability span",
"review_count": "#acrCustomerReviewText",
"buy_box_seller": "#sellerProfileTriggerId"
}
}
Predicate
To fire only on a price drop of any size:
{ "type": "field_changes", "field": "price" }
To fire on a price drop of at least 10% (only works if you strip currency in your downstream consumer - see Caveats):
{ "type": "field_decreases_by_percent", "field": "price", "threshold": 10 }
To fire on any meaningful change - Buy Box flipping, stock returning, or price moving:
{
"type": "composite",
"operator": "OR",
"conditions": [
{ "type": "field_changes", "field": "price" },
{ "type": "field_changes", "field": "availability" },
{ "type": "field_changes", "field": "buy_box_seller" }
]
}
Create the monitor
Note the fetch_mode: 'browser' flag - required for Amazon.
curl:
curl -X POST https://api.verid.dev/v1/monitors \
-H "Authorization: Bearer vrd_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"name": "Amazon - B08N5WRWNW",
"url": "https://www.amazon.com/dp/B08N5WRWNW",
"schedule_interval_seconds": 3600,
"fetch_mode": "browser",
"extract_config": {
"method": "css",
"fields": {
"price": "#corePriceDisplay_desktop_feature_div .a-price .a-offscreen",
"availability": "#availability span",
"review_count": "#acrCustomerReviewText",
"buy_box_seller": "#sellerProfileTriggerId"
}
},
"diff_predicate": { "type": "field_changes", "field": "price" },
"deliveries": [
{ "type": "email", "to": "you@example.com" }
]
}'
SDK:
import { VeridClient } from '@verid.dev/sdk';
const client = new VeridClient({ apiKey: 'vrd_your_api_key' });
await client.monitors.create({
name: 'Amazon - B08N5WRWNW',
url: 'https://www.amazon.com/dp/B08N5WRWNW',
schedule_interval_seconds: 3600,
fetch_mode: 'browser',
extract_config: {
method: 'css',
fields: {
price: '#corePriceDisplay_desktop_feature_div .a-price .a-offscreen',
availability: '#availability span',
review_count: '#acrCustomerReviewText',
buy_box_seller: '#sellerProfileTriggerId',
},
},
diff_predicate: { type: 'field_changes', field: 'price' },
deliveries: [{ type: 'email', to: 'you@example.com' }],
});
What the webhook delivers
{
"id": "del_01H...",
"fired_at": "2026-05-08T12:00:00Z",
"diff": {
"fields_changed": ["price"],
"before": { "price": "$249.99", "availability": "In Stock", "review_count": "12,438 ratings", "buy_box_seller": "Amazon.com" },
"after": { "price": "$199.99", "availability": "In Stock", "review_count": "12,438 ratings", "buy_box_seller": "Amazon.com" }
}
}
Caveats & tips
- Browser mode is required. Amazon's price selectors return empty in
auto(HTTP) mode. Always setfetch_mode: 'browser'for ASIN pages. - Percent predicates need numeric input.
"$199.99"parses toNaNinside Verid's diff predicate evaluator, sofield_decreases_by_percentalways returns false against a raw price string. The reliable pattern is to usefield_changesand apply the threshold in your webhook consumer. - Regional URLs matter.
amazon.comandamazon.co.ukrender different layouts and different selectors. Build separate monitors per region. - Use canonical product URLs. Prefer
/dp/<ASIN>over deep-linked search-result URLs - they're stable across review rewrites.
Related use cases
For non-Amazon competitor pricing, see competitor price tracking. For Shopify stores, see Shopify product stock & price. For pure in-stock notifications, see restock alerts.
Related use cases
Ship this monitor today
5 monitors free, no credit card. Set up takes about a minute.
Get started free