Use Amazon Search, Category & Seller Listings Extractor with Python
Get Amazon products from search results, categories, seller storefronts, or ASIN lookups across 20+ marketplaces, with price, rating, badges, deals, and delivery details.
1. Choose the data you need
Review the published README for supported collection modes, examples, and limits. The recipe below uses the current published input definition.
2. Prepare a source-based input
This JSON contains published prefills and required-field defaults. Review every value for your task before running it; it is not a promise of successful collection.
{
"includeSpecifications": false,
"keywords": [
"wireless earbuds"
],
"marketplaceDomain": "amazon.com",
"maxItems": 3,
"maxItemsPerCategory": 3,
"scrapeProductDetails": false
}
Download input.example.json and save your reviewed copy as input.json.
| Field | Type | Required | Description |
|---|---|---|---|
categoryUrls | array | optional | Amazon search, category, seller-profile, or exact product URLs. Search pages (/s?k=), browse nodes (/b?node=), seller profiles (/sp?seller=), and product pages (/dp/) are routed automatically. Combine with any other mode. |
keywords | array | optional | Plain search keywords or phrases. Each keyword builds an Amazon search URL (/s?k={query}). |
productUrls | array | optional | Exact Amazon product URLs. Each URL is normalized to /dp/{ASIN} on its own marketplace and fetched directly (never as a search). |
asins | array | optional | Amazon ASINs to fetch exactly. Each ASIN opens its own product page (/dp/{ASIN}) directly, never a keyword search. |
sellerIds | array | optional | Amazon seller/merchant IDs. Each ID builds that seller's storefront listing (/s?me={sellerId}). |
categoryNodeIds | array | optional | Amazon browse-node IDs. Each node builds a real category listing (/s?rh=n:{node}&fs=true), with a merchandising fallback only when Amazon renders no listing grid. |
marketplaceDomain | string | optional | Amazon marketplace used for keyword, ASIN, seller, and node modes. URLs in categoryUrls/productUrls keep their own marketplace. |
maxItems | integer | optional | Global cap across every source in the run. 0 means no global cap. |
maxItemsPerCategory | integer | optional | Maximum products to return from each keyword, URL, seller, or node source. |
maxPages | integer | optional | Maximum listing pages per source. Amazon keyword search itself stops at page 7; category listings go deeper. |
scrapeProductDetails | boolean | optional | If true, visit each accepted product's own page for specs, gallery images, seller, BSR, variants, and histogram. ASIN/product-URL modes always use detail pages. If false, only listing-card fields are returned. |
includeSpecifications | boolean | optional | If true (and detail pages are scraped), return the specifications object parsed from the overview and technical-detail tables. |
sortBy | string | optional | Sort order applied to search and category listings. |
priceMin | number | optional | Only return products priced at or above this amount (marketplace currency). |
priceMax | number | optional | Only return products priced at or below this amount (marketplace currency). |
minRating | number | optional | Only return products with a star rating at or above this value (0-5). |
includeSponsored | boolean | optional | If true (default), sponsored/ad placements are included. Set false to return organic results only. |
onlyDeals | boolean | optional | If true, only return products with visible deal evidence (coupon, limited-time-deal badge, or genuine strike-through list price). |
primeOnly | boolean | optional | If true, only return products with a visible Amazon Prime badge. Badges are render-dependent in some marketplaces. |
rateLimitDelay | integer | optional | Base pacing delay between live requests. Product-detail requests always add human-like jitter. |
3. Start an Actor run
Set APIFY_TOKEN in your environment. Python 3.10 or newer is sufficient; this recipe uses no third-party packages.
Execution may incur charges. Review current pricing on Apify. The request asks for a 120-second timeout and a charge limit; these settings are subject to Apify’s pricing and do not guarantee an all-inclusive spending cap.
import json
import os
import urllib.request
# Save the schema-derived example as input.json; review and edit it first.
with open("input.json", encoding="utf-8") as stream:
actor_input = json.load(stream)
token = os.environ["APIFY_TOKEN"]
request = urllib.request.Request(
"https://api.apify.com/v2/acts/jLafkpWTCRAFfUa54/runs?timeout=120&maxTotalChargeUsd=0.50",
data=json.dumps(actor_input).encode("utf-8"),
headers={"Authorization": "Bearer " + token, "Content-Type": "application/json"},
method="POST",
)
# This starts a potentially billable run. Do not automatically retry this POST.
with urllib.request.urlopen(request, timeout=40) as response:
run = json.load(response)["data"]
print("Run ID:", run["id"])
print("Status:", run["status"])
# Inspect and download results in Apify Console once the run succeeds.
4. Inspect the actual results
Open the run in Apify Console and wait for a successful completion. Use the published output schema to locate results and the dataset schema to understand declared views. Missing or optional record fields must not be treated as guaranteed values.
Amazon product records from search, category, and seller listings with price, rating, badges, and delivery details.
Questions before you run
Which inputs are required?
No top-level fields are marked required in the published schema. Conditional requirements can still apply; check the README.
What does this guide verify?
The fields, prefills, and schema links are rendered from the published build. This is a usage recipe, not a paid live extraction test. Source availability and collection results can vary.
What if the run request times out?
Check Apify Console before retrying. The first request may already have created a run. Do not automatically repeat a run-creation POST.
Generated from source build aAJedoI4DhBVoe0x1 and its README and schemas. Source changes regenerate this guide; no third-party editorial claims are inferred.