logo

Best Sellers

View as Markdown

Scrape Amazon's Best Sellers and New Releases charts with ranks, prices, and ratings

The Best Sellers endpoint returns Amazon's ranked chart for a category — the Best Sellers list, or the New Releases list with type=new-releases. Each entry carries its rank, ASIN, product detail page URL, and, for positions with full cards, price and rating data.

Amazon publishes a Top 100 as two pages of 50. Each page renders full product cards for the first 30 positions and lists the remaining 20 by rank and ASIN only, so the response carries two arrays: ranking is the complete ordered chart for the page, and products is the subset with full product detail. Join them on asin.


Endpoint

GET https://api.scrape.do/plugin/amazon/bestsellers

Input Parameters

ParameterTypeRequiredDescription
tokenstring*Your Scrape.do API authentication token
categorystring*Amazon category slug (e.g., electronics). Slugs are marketplace-specific — electronics is the Electronics chart on amazon.com and amazon.co.uk, while on amazon.de the same chart is ce-de. An unknown slug returns 400 invalid_category.
geocodestring*Amazon marketplace country code (e.g., us, gb, de, jp). amazon_domain (e.g., amazon.de) is accepted as an alternative.
typestringChart type: bestsellers (default) or new-releases
nodestringCategory node id, narrowing the chart to a sub-category of the slug
pageinteger1 (positions 1-50) or 2 (positions 51-100). Higher values return 400 page_out_of_range.
zipcodestringPostal code formatted according to country requirements to localize prices. Use either zipcode or countryName, not both.
countryNamestringCountry-level location for marketplaces without ZIP-level delivery.
superbooleanEnable residential/mobile proxies for higher success rates. Costs 10x credits (default: false)
languagestringLanguage code in ISO 639-1 format (e.g., EN, DE)
include_htmlbooleanWhen true, the response includes the full raw HTML of the page after the structured JSON output (default: false)

The device parameter is not supported for this endpoint: Amazon's mobile chart page does not render product data server-side, so device=mobile returns 400.


Response Parameters

FieldTypeDescription
categorystringEcho of the requested category slug
nodestringEcho of the node parameter, when supplied
typestringbestsellers or new-releases
pagenumberEcho of the requested page
rankingarrayComplete ordered chart for the page — one entry per position, including positions without a product card. Serialized as [] when the chart is empty.
productsarrayThe subset of ranking Amazon rendered full detail for, in chart order. Serialized as [] when the chart is empty.
ranking_countnumberLength of ranking
products_countnumberLength of products. Normally 30 on a full chart — this is how many cards Amazon renders, not the chart size.
paginationobject{current_page, has_next}. Also false on page 2 (the last servable page) or when the chart is shorter than a full page.
htmlstringFull raw HTML of the Amazon page (only present when include_html=true)

Ranking Entry Fields

FieldTypeDescription
ranknumberAbsolute position in the chart: 1-50 on page 1, 51-100 on page 2
asinstringProduct ASIN number
urlstringProduct detail page URL

Product Object Fields

FieldTypeDescription
ranknumberSame rank as the matching ranking entry
asinstringProduct ASIN number
titlestringThe product name exactly as Amazon renders it on the chart card
urlstringProduct detail page URL
imageUrlstringProduct thumbnail image URL
priceobjectCurrent price with currencyCode and amount. Absent when Amazon shows no price.
ratingobjectvalue is the score out of 5 and count is the review tally as a number, with the marketplace's own magnitude word resolved — (23,1 tn) on se becomes 23100
reviewCountstringLocalized rating count as displayed

Example Usage

Step 1: Pick a Category

Category slugs are per marketplace. Check the category page URL on the Amazon storefront you target (e.g., amazon.com/gp/bestsellers/electronicselectronics).

Step 2: Send the API Request

curl --location --request GET 'https://api.scrape.do/plugin/amazon/bestsellers?token=<SDO-token>&category=electronics&geocode=US'
import requests
import json

token = "<SDO-token>"
category = "electronics"
geocode = "US"

url = f"https://api.scrape.do/plugin/amazon/bestsellers?token={token}&category={category}&geocode={geocode}"

response = requests.request("GET", url)

print(json.dumps(response.json(), indent=2))
const axios = require('axios');

const token = "<SDO-token>";
const category = "electronics";
const geocode = "US";

const url = `https://api.scrape.do/plugin/amazon/bestsellers?token=${token}&category=${category}&geocode=${geocode}`;

axios.get(url)
  .then(response => {
    console.log(JSON.stringify(response.data, null, 2));
  })
  .catch(error => {
    console.error(error);
  });
package main

import (
    "fmt"
    "io/ioutil"
    "net/http"
)

func main() {
    token := "<SDO-token>"
    category := "electronics"
    geocode := "US"

    apiUrl := fmt.Sprintf(
        "https://api.scrape.do/plugin/amazon/bestsellers?token=%s&category=%s&geocode=%s",
        token, category, geocode,
    )

    resp, err := http.Get(apiUrl)
    if err != nil {
        panic(err)
    }
    defer resp.Body.Close()

    body, _ := ioutil.ReadAll(resp.Body)
    fmt.Println(string(body))
}
require 'net/http'
require 'json'
require 'uri'

token = "<SDO-token>"
category = "electronics"
geocode = "US"

url = URI("https://api.scrape.do/plugin/amazon/bestsellers?token=#{token}&category=#{category}&geocode=#{geocode}")

response = Net::HTTP.get(url)

puts JSON.pretty_generate(JSON.parse(response))
import java.net.HttpURLConnection;
import java.net.URL;
import java.io.BufferedReader;
import java.io.InputStreamReader;

public class AmazonBestsellers {
    public static void main(String[] args) throws Exception {
        String token = "<SDO-token>";
        String category = "electronics";
        String geocode = "US";

        String url = String.format(
            "https://api.scrape.do/plugin/amazon/bestsellers?token=%s&category=%s&geocode=%s",
            token, category, geocode
        );

        HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection();
        conn.setRequestMethod("GET");

        BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
        String line;
        StringBuilder response = new StringBuilder();
        while ((line = reader.readLine()) != null) {
            response.append(line);
        }
        reader.close();

        System.out.println(response.toString());
    }
}
using System;
using System.Net.Http;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        string token = "<SDO-token>";
        string category = "electronics";
        string geocode = "US";

        string url = $"https://api.scrape.do/plugin/amazon/bestsellers?token={token}&category={category}&geocode={geocode}";

        using HttpClient client = new HttpClient();
        string response = await client.GetStringAsync(url);

        Console.WriteLine(response);
    }
}
<?php
$token = "<SDO-token>";
$category = "electronics";
$geocode = "US";

$url = "https://api.scrape.do/plugin/amazon/bestsellers?token={$token}&category={$category}&geocode={$geocode}";

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$response = curl_exec($ch);
curl_close($ch);

echo json_encode(json_decode($response), JSON_PRETTY_PRINT);
?>

Step 3: Receive the Ranked Chart

The API returns the ranked chart plus full detail for the positions Amazon renders cards for:

{
  "category": "electronics",
  "type": "bestsellers",
  "page": 1,
  "ranking": [
    { "rank": 1, "asin": "B08JHCVHTY", "url": "https://www.amazon.com/dp/B08JHCVHTY" },
    { "rank": 2, "asin": "B0GJTFXNRX", "url": "https://www.amazon.com/dp/B0GJTFXNRX" }
  ],
  "products": [
    {
      "rank": 1,
      "asin": "B08JHCVHTY",
      "title": "blink plus plan with monthly auto-renewal",
      "url": "https://www.amazon.com/dp/B08JHCVHTY",
      "imageUrl": "https://images-na.ssl-images-amazon.com/images/I/31YHGbJsldL._AC_UL300_SR300,200_.png",
      "price": {
        "currencyCode": "USD",
        "amount": 11.99
      },
      "rating": {
        "value": 4.4,
        "count": 279563,
        "stars": 4
      },
      "reviewCount": "(279.5K)"
    }
  ],
  "ranking_count": 50,
  "products_count": 30,
  "pagination": {
    "current_page": 1,
    "has_next": true
  }
}

Getting the Full Top 100

Amazon's Top 100 is two pages of 50. Request page 2 for positions 51-100:

/plugin/amazon/bestsellers?token=...&category=electronics&geocode=us&page=2

Or get the New Releases chart instead:

/plugin/amazon/bestsellers?token=...&category=electronics&geocode=us&type=new-releases

has_next is false whenever the chart is shorter than a full page, so a narrow category does not advertise a page 2 that does not exist.

A category with no chart returns an empty ranking rather than an error — that is a successful response with ranking_count: 0. Chart membership changes hourly; two requests minutes apart can legitimately differ.

Failed requests (upstream failures, unreadable pages) are not charged.

On this page