DEV Community

Aurelix Solutions
Aurelix Solutions

Posted on

Track where your products rank on Amazon search, organic and sponsored, for every keyword

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) and bought_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
Enter fullscreen mode Exit fullscreen mode
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))
Enter fullscreen mode Exit fullscreen mode

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: price and list_price of 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 onlyNewProducts with a stateKey and 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); price is 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.

Links

Top comments (0)