← All use cases
E-commerce & PricingCSS

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.

Verid Use Cases·4 min read

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 set fetch_mode: 'browser' for ASIN pages.
  • Percent predicates need numeric input. "$199.99" parses to NaN inside Verid's diff predicate evaluator, so field_decreases_by_percent always returns false against a raw price string. The reliable pattern is to use field_changes and apply the threshold in your webhook consumer.
  • Regional URLs matter. amazon.com and amazon.co.uk render 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.

Ship this monitor today

5 monitors free, no credit card. Set up takes about a minute.

Get started free