Skip to main content
Thirdwatchthirdwatch
E-commerce & products

Compare Amazon Best Sellers Across 18 Marketplaces 2026

Read one Amazon category's top 100 across the US, UK, Germany, India and Japan to compare chart mix, price bands and review depth before you pick a marketplace.

Jul 28, 2026 · 7 min read · 1,679 words
See the scraper →

Amazon publishes a separate top-100 best sellers chart for every category on each of its 18 storefronts, and those charts do not agree with each other. Reading the same category across the US, UK, Germany, India and Japan in one pass shows you which marketplace rewards which price band, how deep review counts run, and how concentrated the leaders are. The Amazon Best Sellers Scraper returns every marketplace with rank, ASIN, price, currency, rating and review count.

Why compare Amazon best sellers by country

Marketplace selection is usually decided on aggregate numbers — GMV, population, logistics cost — and then falls apart on the specifics of one category. Amazon's own International segment reported $142.9 billion in net sales for fiscal 2024 against $387.5 billion in North America (Amazon SEC filings), but that ratio tells you nothing about whether your $40 kitchen gadget has a shelf in Germany or gets crushed by €12 incumbents.

The best sellers chart answers that directly, because it is the only public ranking Amazon computes from actual order volume rather than from search relevance or ad spend. Read the same category in five countries and three things separate immediately:

  • Price band. The median chart price in a category can differ by 3-4x between a mature market and a price-sensitive one. If your landed cost sits above the local top-100 median, you are entering at a disadvantage nobody will explain to you later.
  • Review depth. A chart where rank 50 already carries 40,000 reviews is a market with entrenched winners. A chart where rank 20 has 300 reviews is a market you can still rank in.
  • Composition. Global brands at the top of the US chart are often absent from the Indian or Japanese one, replaced by local sellers you have never heard of and will be competing against.

None of this requires a product-detail crawl. It requires the same chart, read consistently, in every market you are considering.

How does this compare to the alternatives?

The comparison is really about consistency across countries, not about whether you can fetch one page. Writing your own fetcher for amazon.com is a weekend; keeping it working across 18 domains, each with its own currency formatting, rating string, category slug vocabulary and throttling behaviour, is the part that eats the quarter. Generic HTML-to-JSON APIs solve the fetch but hand you back raw markup, so you still write and maintain 18 parsers — and you still have to discover on your own that ranks 51-100 live on a second page with a different loading protocol.

Approach Pricing model Reliability across 18 domains Setup time Maintenance
DIY Python + requests Free until you hit throttling, then proxy bills Breaks per-domain; ranks 51-100 usually missed 2-5 days per market You own every layout and slug change
Generic scraping API Monthly subscription, credits per page Fetch works, parsing is still yours 1-2 days plus a parser per market You own all parsing
Thirdwatch Amazon Best Sellers Scraper Transparent pay-per-result One schema, 18 marketplaces, ranks read from Amazon's own rank data Minutes Handled for you

How to compare Amazon best sellers by country in 4 steps

How do I pull the same category from five Amazon marketplaces in one run?

Pass one full chart URL per marketplace in the categories array. A full URL overrides both the country and listType settings for that entry, which is exactly what a cross-market comparison needs — five different domains, one run, one dataset.

from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")

run = client.actor("thirdwatch/amazon-bestsellers-scraper").call(run_input={
    "categories": [
        "https://www.amazon.com/gp/bestsellers/kitchen",
        "https://www.amazon.co.uk/gp/bestsellers/kitchen",
        "https://www.amazon.de/gp/bestsellers/kitchen",
        "https://www.amazon.in/gp/bestsellers/kitchen",
        "https://www.amazon.co.jp/gp/bestsellers/kitchen",
    ],
    "listType": "bestSellers",
    "maxResults": 100,
})

rows = list(client.dataset(run["defaultDatasetId"]).iterate_items())
markets = {r["country"] for r in rows}
print(len(rows), "ranked rows across", len(markets), "marketplaces")

Every row carries country, marketplace (the actual Amazon domain), category_url and source_query, so the five charts stay separable no matter how you sort the dataset afterwards.

Which category slug should I use on amazon.de or amazon.co.jp?

Slugs are marketplace-specific, and this is the single most common reason a cross-market run comes back short. amazon.de uses computers where amazon.com uses electronics. Japanese and Brazilian storefronts diverge again. An unknown slug produces a warning and zero rows for that entry rather than failing the run — which means a silent hole in your comparison if you are not counting rows per market.

Two safe habits: open the chart in a browser and paste the URL, or keep an explicit per-market slug map and loop the country enum.

SLUGS = {          # verify each one by opening the chart in a browser first
    "us": "electronics",
    "uk": "electronics",
    "de": "computers",     # amazon.de does not use "electronics"
    "in": "electronics",
    "jp": "electronics",
}

by_market = {}
for market, slug in SLUGS.items():
    run = client.actor("thirdwatch/amazon-bestsellers-scraper").call(run_input={
        "categories": [slug],
        "listType": "bestSellers",
        "country": market,
        "maxResults": 100,
    })
    items = list(client.dataset(run["defaultDatasetId"]).iterate_items())
    by_market[market] = items
    if len(items) < 100:
        print(f"WARNING {market}: only {len(items)} ranks — check the slug '{slug}'")

Run the row-count check every time. A market that returns 0 rows is a slug problem, not a market signal.

How do I compare price bands and review depth across marketplaces?

Load the dataset into pandas and aggregate per country. Prices come back as numbers in local currency with an ISO currency code alongside, so apply your own FX rates at analysis time — you control the rate and the date it was taken. Rows where the chart showed no price carry price: null; drop them from the price stats but keep them in the row count.

import pandas as pd

df = pd.DataFrame(rows)

price_bands = (
    df[df["price"].notna()]
    .groupby(["country", "currency"])["price"]
    .describe(percentiles=[0.25, 0.5, 0.75])[["count", "25%", "50%", "75%"]]
)

depth = df.groupby("country").agg(
    ranks=("rank", "count"),
    rating_coverage=("rating", lambda s: round(s.notna().mean(), 2)),
    median_reviews=("reviews_count", "median"),
    top10_reviews=("reviews_count", lambda s: s.head(10).median()),
)

print(price_bands)
print(depth)

rating_coverage is the honest tell for how mature a chart is, and median_reviews against top10_reviews shows whether the leaders are far ahead of the field or the whole chart is bunched together.

How do I turn one chart read into a repeatable market-entry snapshot?

Schedule the run and keep every snapshot. Each row carries scraped_at as an ISO 8601 UTC timestamp, so a daily run at a fixed hour gives you a comparable time series per market instead of a single reading you cannot sanity-check. Export straight to CSV for the deck.

curl -X POST "https://api.apify.com/v2/acts/thirdwatch~amazon-bestsellers-scraper/runs?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"categories":["electronics"],"country":"de","listType":"bestSellers","maxResults":100}'

# then export the finished run's dataset
curl "https://api.apify.com/v2/datasets/$DATASET_ID/items?format=csv&fields=country,rank,asin,title,price,currency,rating,reviews_count" \
  -o de-electronics-$(date +%F).csv

Schedules, retries and dataset retention are all standard Apify platform features — see the Apify scheduling docs for the cron setup.

Sample output

Each dataset item is one ranked product on one chart on one marketplace. The fields that matter for a cross-country comparison are country and marketplace (which storefront), rank (read from Amazon's own rank metadata, not from render order), price plus currency and currency_symbol (numeric price with an explicit unit), rating and reviews_count (chart maturity), and category_slug plus category_url (which chart this row actually came from, which is how you prove the German rows came from the right department).

[
  {
    "rank": 3,
    "asin": "B08N5WRWNW",
    "title": "Stainless Steel Electric Kettle, 1.7L Rapid Boil",
    "price": 39.99,
    "price_text": "$39.99",
    "price_type": "list",
    "currency": "USD",
    "currency_symbol": "$",
    "rating": 4.6,
    "reviews_count": 61284,
    "product_url": "https://www.amazon.com/dp/B08N5WRWNW",
    "list_type": "bestSellers",
    "category_slug": "kitchen",
    "category_url": "https://www.amazon.com/gp/bestsellers/kitchen",
    "page": 1,
    "marketplace": "www.amazon.com",
    "country": "us",
    "scraped_at": "2026-07-27T06:15:02+00:00"
  },
  {
    "rank": 3,
    "asin": "B09XKQ2M4T",
    "title": "Wasserkocher Edelstahl 1,7 L, Schnellkochfunktion",
    "price": 24.99,
    "price_text": "24,99 €",
    "price_type": "list",
    "currency": "EUR",
    "currency_symbol": "€",
    "rating": 4.5,
    "reviews_count": 8931,
    "product_url": "https://www.amazon.de/dp/B09XKQ2M4T",
    "list_type": "bestSellers",
    "category_slug": "kitchen",
    "category_url": "https://www.amazon.de/gp/bestsellers/kitchen",
    "page": 1,
    "marketplace": "www.amazon.de",
    "country": "de",
    "scraped_at": "2026-07-27T06:15:44+00:00"
  }
]

Same rank, same product type, a 38% lower price point and roughly a seventh of the review depth. That is the whole comparison in two rows.

Common pitfalls

The 100-rank ceiling is Amazon's, not ours. Every chart stops at 100 positions; maxResults is capped there. If a category is too broad to be informative, drill into subcategory browse nodes — each node has its own independent top 100.

Slug drift silently shrinks your sample. As above: an unrecognised slug yields a warning and zero rows for that entry. Always check rows-per-market before you compare markets.

New Releases charts have thin ratings. Best Sellers charts carry ratings on roughly 98-100% of rows. New Releases charts are full of products days old — a live UK New Releases chart returned ratings on 56% of rows. That is real chart data, not a parsing gap, so do not compare rating coverage between a Best Sellers chart and a New Releases one.

Charts are point-in-time. Amazon recomputes Best Sellers roughly hourly. Snapshot at a fixed hour per day if you want a trend.

Chart data is not product detail. Rows carry rank, ASIN, title, one price, rating, review count and image — no descriptions, variants, seller names or stock levels. Pair with a product-detail scraper if you need those. Also note by_line and product_format populate on Books, Music and Video charts only.

The Actor handles the parts you would otherwise own: per-marketplace currency and rating formats, the second-page protocol for ranks 51-100, proxy rotation, retries on throttled or truncated responses, and partial-result recovery so one bad category never costs you the other four.

Related use cases

Once you have the cross-market view, the follow-on questions are usually about one market in depth:

Frequently asked questions

Which Amazon marketplaces can I compare in one run?

Eighteen: the US, UK, Canada, India, Germany, France, Italy, Spain, Netherlands, Sweden, Poland, Japan, Australia, Singapore, UAE, Saudi Arabia, Mexico and Brazil. Set one with the country field, or mix several in a single run by passing full chart URLs.

Do Amazon category slugs mean the same thing in every country?

No. Slugs are marketplace-specific. amazon.de uses computers where amazon.com uses electronics, and Japanese slugs differ again. An unknown slug produces a warning and zero rows for that entry, not a failed run. Paste the full chart URL when unsure.

Are prices converted to a single currency?

No. Each row carries price as a number in the marketplace's own currency, plus currency as an ISO code and currency_symbol. Apply your own FX rates at analysis time so you control the rate and the date it was taken.

How deep does each chart go?

Amazon publishes at most 100 ranked positions per chart, so maxResults is capped at 100 per category. To go deeper in one market, pass subcategory browse nodes — each node has its own independent top 100.

How often do the charts change?

Amazon recomputes Best Sellers roughly hourly, so two runs minutes apart can legitimately differ. For a market-entry study, take one snapshot per market per day at a fixed hour and compare like with like.

Related

Try it yourself

100 free credits, no credit card.

About 30 real searches. Add the MCP to Claude or Cursor in two minutes.