Amazon product research usually starts with a search, then a shortlist. Fetching a detailed card for every listing adds work before you know which products matter.

I built Amazon US Search & Product Scraper at CommerceStack around that workflow: collect listings, select ASINs, then enrich the shortlist. You can also collect a seller's catalog. This article walks through the public Amazon.com release and its limits.

1. Start with a small search

Open the Actor in Apify, choose JSON input, and use:

{ "mode": "search_only", "queries": ["sony headphones"], "maxPagesPerSource": 2, "maxItems": 24, "locations": { "com": {"postalCode": "10001", "currency": "USD", "deliveryCountry": "US"} } } 

Search rows contain the ASIN, title, product URL, cover image, and source-visible price or rating. Source-placement records preserve where a product appeared.

These limits bound the collection. Two pages or 24 products do not mean the entire search has been exhausted. Check the coverage information in MANIFEST before treating a run as a complete snapshot.

2. Enrich the shortlist by ASIN

Use lookup_only when you need identity, gallery images, the featured offer or explicit no-price state, source seller/rating, and delivery context:

{ "mode": "lookup_only", "products": ["B0BS1QCFHX"], "maxItems": 1 } 

Use products for the additional source-visible description, bullets, attributes, categories, and observed variants:

{ "mode": "products", "products": ["B0BS1QCFHX"], "maxItems": 1 } 

The example ASIN is an input example, not a promise of current stock or price. Optional fields depend on what Amazon displays. Observed variant ASINs are references; the Actor does not automatically fetch every variant card.

3. Collect a seller catalog

Pass the Amazon merchant ID, rather than the seller's display name:

{ "mode": "seller_catalog", "sellerIds": ["A294P4X9EWVXLJ"], "maxPagesPerSource": 2, "maxItems": 40, "enrichProducts": false } 

This traverses merchant-filtered listings. Set enrichProducts to true if you also need full cards. That adds source requests and uses the product-detail price. The catalog merchant and a product's featured seller are separate concepts; do not silently treat them as the same seller.

4. Call it from a service

The same JSON works through the Apify API. Keep your own token in an environment variable, not in your source code or a public URL. This example starts a bounded lookup and waits up to 60 seconds:

curl --fail-with-body --request POST \ 'https://api.apify.com/v2/acts/commercestack~amazon-us-search-product-scraper/runs?build=0.0.5&memory=1024&timeout=240&waitForFinish=60&maxTotalChargeUsd=0.024' \ --header "Authorization: Bearer $APIFY_TOKEN" \ --header 'Content-Type: application/json' \ --data '{"mode":"lookup_only","products":["B0BS1QCFHX"],"maxItems":1}' 

The response includes the run ID, status, defaultDatasetId, and defaultKeyValueStoreId. If the run is still active, poll GET /v2/actor-runs/{runId} until it reaches a terminal status. Then retrieve:

GET /v2/datasets/{defaultDatasetId}/items?format=json GET /v2/key-value-stores/{defaultKeyValueStoreId}/records/MANIFEST 

Use the same Authorization header for these requests. Build 0.0.5 is the release used here; pin a build you have tested before connecting a production pipeline. See the Apify API reference for request and pagination details.

5. Read product rows and errors separately

Filter dataset records by recordType == "product". Records with recordType == "occurrence" describe source/page/position links, not extra products.

A successful platform run can still have a partial manifest. Inspect it for limits, unattempted inputs, confirmed missing products, and technical failures. In particular:

  • product_not_found requires a recognized Amazon missing-product response.
  • Timeouts, blocks, an unrecognized 404, or an absent price are not evidence that a product was deleted.
  • fieldAvailability distinguishes present, source_absent, not_requested, and extraction_failed.
  • A cart-only price is reported as priceVisibility: cart_required; no cart action is performed and no price is invented.

That distinction matters for monitoring: a temporary source failure should not become a false “product removed” alert.

Pricing and choosing a workflow

At publication, the Actor prices are:

Result Per 1,000 chargeable products
Search and un-enriched seller listings $0.60
ASIN lookup $2.40
Full product details / enriched seller products $2.40

There is no start fee, and source infrastructure is included. For example, 24 chargeable listings cost $0.0144; 25 chargeable full cards cost $0.06. Actual charges depend on the successfully parsed, chargeable product rows returned.

Source-occurrence rows, duplicate products within one run, confirmed missing products, and failed products are not charged. Optional data absent from the source does not by itself make a product free. Separate runs are separate observations. Normal storage charges after a run may still apply under your Apify plan.

Start with listings, then fetch detail only for the shortlist. Set the Actor's page/item/request/time limits and an Apify maximum charge appropriate to your task.

Scope of this release

This release supports Amazon.com, US delivery ZIP codes, and USD. It defaults to ZIP 10001 and verifies location context in the source response. Keep the same ZIP when comparing runs; prices and availability can vary by location and time.

It does not include other Amazon marketplaces, text reviews, a complete inventory of seller offers, automatic variant-card enrichment, or clone-detection logic. It collects the source data for your own workflow and does not launch third-party Actors.

Try Amazon US Search & Product Scraper on Apify. If a field or workflow is missing, open an issue with the run ID and expected result—never your API token.

Disclosure: I am the developer behind CommerceStack. The launch illustration was AI-generated; it depicts a workflow, not real product results.