Arcadium Data Scrapers
Home / Actors / Amazon Product & Best Sellers Scraper

Amazon Product & Best Sellers Scraper

Track where products rank for a keyword, watch competitors' prices and sponsored slots, or pull Best Sellers for product research. Give it search terms, Best Sellers categories, ASINs or Amazon links and it returns JSON rows from 21 Amazon stores. Search rows carry position, sponsored flag, ASIN, title, price, list price, rating, rating count, badges and "bought in past month" at $0.54 per 1,000. Best Sellers, New Releases and Movers & Shakers rows carry rank, price and rating for all 100 ranks; product rows per ASIN carry the Buy Box price and seller, ships-from, delivery promise, the star split and every other offer. You pay only for the rows you get.

$0.54 per 1,000 search results

Why this actor

Drop-in input

Drop-in input. Input written for apt_marble/amazon-search-results-scraper (keywords, maxResultsPerKeyword, sortBy, excludeSponsored, marketplace: "us"), santamaria-automations/amazon-search-scraper (searchQueries, country, maxResultsPerQuery, maxPages, minStars), khadinakbar/amazon-product-search-scraper (searchQuery, maxResults, maxSearchPages) or junglee/Amazon-crawler (categoryOrProductUrls, maxItemsPerStartUrl) works as it is.

As stated in the actor’s README. The full list of accepted input names is on the Store page.

Switching from another actor

What you get

FieldWhat it holds
rowTypesearchResult, bestseller, product or error.
marketplace, domain, currencyThe store (DE, amazon.de) and the currency of every price on the row (EUR).
asin, url, title, imageUrlThe product, its canonical /dp/ link and main image.
price, priceText, listPrice, listPriceTextPrice as a number and as shown, and the struck-through list or "Was" price.
rating, ratingCountAverage stars and number of ratings.
searchTerm, page, position, organicPosition, sponsoredSearch rows: where the card was, counting ads (position) and without them (organicPosition).
badges, boughtPastMonth, boughtPastMonthText, deliveryTextSearch rows: "Best Seller", "Amazon's Choice", "Limited time deal"; "1K+ bought in past month" as 1000; the delivery line.
listType, category, categoryName, listTitle, rankList rows: which list, which category and the rank.
rankChangePercent, salesRank, salesRankYesterdayMovers & Shakers rows: the 24-hour rank change.
starPercentProduct rows: share of ratings per star, e.g. { "5": 73, "4": 12, "3": 8, "2": 2, "1": 5 }.
hasBuyBox, buyBoxPrice, buyBoxCondition, buyBoxSeller, buyBoxSellerId, buyBoxShipsFrom, buyBoxFulfilledByAmazon, buyBoxDeliveryProduct rows: the featured offer and who sells and ships it.
otherOfferCount, offersProduct rows: every other offer with condition, price, seller name and id, seller rating, ships from and delivery.
scrapedAtWhen the row was read.

A product row:

Sample row (from the README example; long text shortened, lists cut to two items):

{
  "rowType": "searchResult",
  "marketplace": "US",
  "domain": "amazon.com",
  "currency": "USD",
  "searchTerm": "wireless earbuds",
  "page": 1,
  "position": 2,
  "organicPosition": null,
  "asin": "B0C1BTXM9W",
  "sponsored": true,
  "title": "Wireless Earbuds, Bluetooth 5.4 Ear Buds LED Power Display Headphones Bass Stereo ...",
  "url": "https://www.amazon.com/dp/B0C1BTXM9W",
  "imageUrl": "https://m.media-amazon.com/images/I/614gb9uXQuL.jpg",
  "price": 19.99,
  "priceText": "$19.99",
  "listPrice": 28.49,
  "listPriceText": "$28.49",
  "rating": 4.3,
  "ratingCount": 14589,
  "badges": [],
  "boughtPastMonth": 6000,
  "boughtPastMonthText": "6K+ bought in past month",
  "deliveryText": "Join Prime to get FREE delivery Tomorrow, Oct 23",
  "scrapedAt": "2026-10-22T08:00:00.000Z"
}

Price

Live Apify price on 2026-11-01, per 1,000 rows, by Apify plan. You pay only for rows delivered; error and summary rows marked free in the README cost nothing. Plus $0.001 per GB of memory when a run starts.

Per 1,000FreeBronzeSilverGoldPlatinumDiamond
Search result (main)$0.54$0.54$0.54$0.54$0.54$0.54
Best Sellers row$5.31$4.50$3.69$2.88$2.88$2.88
Product row (Buy Box and offers)$2.25$1.80$1.53$1.35$1.35$1.35
Watch check: unchanged search row$0.50$0.50$0.50$0.50$0.50$0.50
Watch check: unchanged Best Sellers row$0.10$0.10$0.10$0.10$0.10$0.10
Watch check: unchanged product row$0.85$0.85$0.85$0.85$0.85$0.85

Use cases

Run it from code or an AI agent

Actor ID arcadium/amazon-products. Set APIFY_TOKEN to your Apify API token. The input below is the actor’s prefilled example; see the guide for every field.

curl
curl -X POST "https://api.apify.com/v2/acts/arcadium~amazon-products/run-sync-get-dataset-items" \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"searches":["wireless earbuds"],"categories":[],"asins":[],"urls":[],"marketplace":"US","maxResultsPerSearch":20,"includeSponsored":true}'
JavaScript
// npm install apify-client
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('arcadium/amazon-products').call({
  "searches": [
    "wireless earbuds"
  ],
  "categories": [],
  "asins": [],
  "urls": [],
  "marketplace": "US",
  "maxResultsPerSearch": 20,
  "includeSponsored": true
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
Python
# pip install apify-client
import os
from apify_client import ApifyClient

client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("arcadium/amazon-products").call(run_input={
    "searches": ["wireless earbuds"],
    "categories": [],
    "asins": [],
    "urls": [],
    "marketplace": "US",
    "maxResultsPerSearch": 20,
    "includeSponsored": True,
})
items = client.dataset(run.default_dataset_id).list_items().items  # apify-client 3.x returns a Run object
print(items)
MCP
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com/?tools=arcadium/amazon-products",
      "headers": {
        "Authorization": "Bearer <APIFY_TOKEN>"
      }
    }
  }
}
LangChain
# pip install langchain-apify   (reads APIFY_API_TOKEN from the environment)
from langchain_apify import ApifyActorsTool

tool = ApifyActorsTool("arcadium/amazon-products")
rows = tool.invoke({"run_input": {
    "searches": ["wireless earbuds"],
    "categories": [],
    "asins": [],
    "urls": [],
    "marketplace": "US",
    "maxResultsPerSearch": 20,
    "includeSponsored": True,
}})
# or give `tool` to an agent: create_react_agent(llm, [tool])
LlamaIndex
# pip install llama-index-readers-apify
import os
from llama_index.core import Document, VectorStoreIndex
from llama_index.readers.apify import ApifyActor

reader = ApifyActor(os.environ["APIFY_TOKEN"])
documents = reader.load_data(
    actor_id="arcadium/amazon-products",
    run_input={
        "searches": ["wireless earbuds"],
        "categories": [],
        "asins": [],
        "urls": [],
        "marketplace": "US",
        "maxResultsPerSearch": 20,
        "includeSponsored": True,
    },
    dataset_mapping_function=lambda item: Document(text=str(item.get("title") or ""), metadata={"url": item.get("url")}),
)
index = VectorStoreIndex.from_documents(documents)
CrewAI
# pip install crewai crewai-tools langchain-apify   (reads APIFY_API_TOKEN from the environment)
from crewai import Agent
from crewai_tools import ApifyActorsTool

tool = ApifyActorsTool(actor_name="arcadium/amazon-products")
researcher = Agent(
    role="Research analyst",
    goal="Answer with data collected by the tool",
    backstory="Uses public web data.",
    tools=[tool],
)
n8n
{
  "nodes": [
    {
      "name": "Run arcadium/amazon-products",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4,
      "position": [
        0,
        0
      ],
      "parameters": {
        "method": "POST",
        "url": "https://api.apify.com/v2/acts/arcadium~amazon-products/run-sync-get-dataset-items",
        "authentication": "genericCredentialType",
        "genericAuthType": "httpHeaderAuth",
        "sendBody": true,
        "specifyBody": "json",
        "jsonBody": "{\"searches\":[\"wireless earbuds\"],\"categories\":[],\"asins\":[],\"urls\":[],\"marketplace\":\"US\",\"maxResultsPerSearch\":20,\"includeSponsored\":true}",
        "options": {
          "timeout": 300000
        }
      }
    }
  ],
  "connections": {}
}
Google Sheets
// Extensions > Apps Script. Store your token once: Project Settings > Script properties > APIFY_TOKEN.
function importLastRun() {
  const token = PropertiesService.getScriptProperties().getProperty('APIFY_TOKEN');
  const url = 'https://api.apify.com/v2/acts/arcadium~amazon-products/runs/last/dataset/items?status=SUCCEEDED&clean=true&format=json';
  const res = UrlFetchApp.fetch(url, { headers: { Authorization: 'Bearer ' + token } });
  const rows = JSON.parse(res.getContentText());
  if (!rows.length) return;
  const keys = Object.keys(rows[0]);
  const values = rows.map((r) => keys.map((k) => (typeof r[k] === 'object' ? JSON.stringify(r[k]) : r[k])));
  const sheet = SpreadsheetApp.getActiveSheet();
  sheet.clearContents();
  sheet.getRange(1, 1, 1, keys.length).setValues([keys]);
  sheet.getRange(2, 1, values.length, keys.length).setValues(values);
}

Tutorials

Limitations

FAQ

Why do non-US stores cost the same but run a little slower? They are read from an IP in their own country, so prices, sellers and delivery are the local ones (a US IP sees export prices). Those IPs are slower than our datacenter IPs.

A category returned nothing. Why? Look at its error row: not_found means the category path does not exist on that store (paths differ per store, e.g. ce-de on amazon.de); no_match means Amazon shows the list as empty right now (Movers & Shakers is often empty, at times in every category of a store); unavailable means the page could not be read. These rows are free.

How fast is it? Search: about 50 results per second. Ranked lists: 50 ranks in about two seconds. Product rows: about two per second.

Something looks wrong in the output. Who do I tell? Open an issue on the actor page with the run link. We read them all.

Related actors

1688 Products Scraper

1688.com wholesale products scraper, $1.80 per 1,000 search rows and $4.49 with details: price tiers, MOQ, units sold, factory and supplier scores.

$1.80 per 1,000 product (search result)s on the Free plan, down to $1.35 on higher plans

Etsy Scraper

Etsy product research: full listings for keywords or URLs, $7.20 per 1,000, 10% under the most used Etsy scraper's $8, whose input works as is.

$7.20 per 1,000 listings on the Free plan, down to $5.40 on higher plans