For an Amazon seller, the search results page is the shop window. Where your product sits for "coffee grinder", whether it is there organically or only because you pay for the ad slot, and who sits above you at what price: that decides most sales. Seller tools show some of it, for a monthly fee.
This post builds a small rank tracker for your own keyword list, then compares the Amazon search scrapers on the Apify Store using the prices their Store pages listed at the time of writing.
Disclosure: I'm Aurelix, and I built the Amazon Product Search Scraper. It's a paid tool (prices below). Check each Store page before you buy: prices change.
What each row tells you
Each product on the results page is one row, in the order a shopper sees it:
-
position: its place on the page counting every card, ads included;organic_position: its place among organic results only;sponsored: whether the card is an ad. -
asin,title,product_url,image_url. -
price,list_price(the struck-through price),currency,rating,reviews_count,prime_eligible. -
badges(Best Seller, Amazon's Choice, Limited time deal) andbought_past_month("10K+ bought in past month").
A product that shows up both as an ad and organically is one row, charged once, with both positions. Searches run on amazon.com or amazon.ca, as keywords or as a pasted Amazon search URL with its filters, up to 20 result pages per search.
A daily rank tracker
pip install apify-client import csv import os from datetime import datetime, timezone from pathlib import Path from apify_client import ApifyClient MY_ASINS = {"B0XXXXXXXX"} KEYWORDS = ["coffee grinder", "electric coffee grinder", "burr coffee grinder"] client = ApifyClient(os.environ["APIFY_TOKEN"]) run = client.actor("aurelix/amazon-product-search").call( run_input={ "searches": KEYWORDS, "marketplace": "com", "maxResultsPerSearch": 100, "includeSponsored": True, } ) rows = list(client.dataset(run["defaultDatasetId"]).iterate_items()) today = datetime.now(timezone.utc).date().isoformat() log = Path("ranks.csv") new = not log.exists() with log.open("a", newline="", encoding="utf-8") as f: w = csv.writer(f) if new: w.writerow(["date", "keyword", "asin", "position", "organic_position", "sponsored", "price", "badges"]) for kw in KEYWORDS: mine = [r for r in rows if r["search_keyword"] == kw and r["asin"] in MY_ASINS] for r in mine: w.writerow([today, kw, r["asin"], r["position"], r["organic_position"], r["sponsored"], r["price"], "; ".join(r["badges"] or [])]) if not mine: w.writerow([today, kw, "", "", "", "", "", "not in the top 100"]) top = [r for r in rows if r["search_keyword"] == kw and not r["sponsored"]][:3] print(f"{kw}: " + " | ".join(f"#{r['organic_position']} {r['title'][:40]} ${r['price']}" for r in top)) Schedule it daily (save the input as a task in the Apify Console and click Schedule) and ranks.csv becomes a history: chart organic_position per keyword and you can see whether a listing change, a price cut or a coupon moved you, and whether a keyword only keeps you visible through the ad slot.
Other questions the same rows answer:
- PPC: which keywords show your product only as
sponsored: true, and which competitors take the ad slots above you. - Pricing:
priceandlist_priceof the products ranked above you, and who runs a "Limited time deal". - Product research: for a niche keyword, how many of the top results have under 100 reviews (
reviews_count), which hints at room for a new listing. - New entrants: turn on
onlyNewProductswith astateKeyand each run returns only products not seen before for those searches, so a new competitor shows up on the first run after it reaches the results.
Rows are a snapshot from a US (or Canadian) visitor's view: search results are personalised by location and change through the day, so compare the trend, not one reading.
Amazon search scrapers on the Apify Store compared
Prices per 1,000 products from each Store page at the time of writing:
| Aurelix Amazon Product Search Scraper | junglee/Amazon-crawler | apt_marble/amazon-search-results-scraper | |
|---|---|---|---|
| Free plan | $0.10 | $5.00 | $1.00 |
| Bronze | $0.08 | $4.00 | $0.60 |
| Gold | $0.08 | $3.00 | $0.50 |
| Start fee per run | $0.005 | none | none |
| Amazon marketplaces | 2 (.com, .ca) | many | 22 |
| Sponsored flag and organic position | yes | sponsored flag | yes |
| Ad and organic copy merged into one row | yes | not stated | not stated |
| Only new products since last run | yes | not stated | not stated |
| Product detail pages, offers, sellers | no | yes | no |
junglee charges extra for offers and sellers, and falls to $0.80 per 1,000 results on Apify's Diamond plan.
Where each wins: junglee is by far the most-used Amazon scraper on the Store and reads full product pages, offers and sellers, which a search-results tool doesn't. apt_marble covers 22 Amazon marketplaces; if you need any marketplace other than the US and Canada, it is the one to use. The Aurelix tool is the cheapest per product on every plan by a wide margin, and fits rank tracking and search research on amazon.com and amazon.ca: organic and sponsored positions on every row, ad and organic copies merged, and an only-new mode for spotting new entrants.
To track a category's Best Sellers list rather than a keyword's search results, see Track Amazon Best Seller rank changes over time with Python, which uses the Amazon Best Sellers Scraper.
Limits
- amazon.com and amazon.ca only. amazon.co.uk and amazon.de refused logged-out search pages from Apify's datacenter proxies in our tests.
- Up to 20 result pages and 1,000 products per search; Amazon shows fewer pages for many keywords.
- Some cards show no price (only other sellers' offers);
priceis then empty, never guessed. Rating counts shown only as "1.4K" stay empty rather than rounded. - Prime and sponsored follow what Amazon served. Some sessions get pages without Prime lines or ads.
- Search results only. No product detail pages, offers, sellers or reviews.
- If Amazon keeps refusing every proxy session, results already read are kept and the run status says "Partial". Residential proxy is an opt-in fallback, charged per request.
Cost
At the time of writing the Store page lists $0.10 per 1,000 products on Apify's free plan and $0.08 per 1,000 on paid plans, plus $0.005 per run. Searches that return nothing are not charged as products. In only-new mode each results page read costs $0.0003 and a search stops at the first page with nothing new. Apify's free plan includes $5 of credit a month, about 50,000 products; the tracker above, 3 keywords at 100 products a day, costs about $1.05 a month.
