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
- About half the price per search row. $0.54 per 1,000 against $1 at apt_marble and santamaria-automations, the two most used Amazon search actors, and $2 at khadinakbar (free plan, Apify Store, 2026-10-31). 51 of our 51 runs since 2026-10-22 succeeded (scheduled and test runs, Apify run history).
- 21 stores, Best Sellers and Buy Box in one actor. Search, Best Sellers / New Releases / Movers & Shakers ranks and Buy Box + offers per ASIN, with local prices and sellers: non-US stores are read from an IP in their own country (US, DE and JP are checked every day).
- No login, no Amazon account, no customer reviews or reviewer names. Unknown ASINs, bad URLs and temporary blocks come back as free error rows with a
code.
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
- From Amazon Search Results Scraper apt_marble/amazon-search-results-scraper, 8 input fields work as they are
What you get
| Field | What it holds |
|---|---|
rowType | searchResult, bestseller, product or error. |
marketplace, domain, currency | The store (DE, amazon.de) and the currency of every price on the row (EUR). |
asin, url, title, imageUrl | The product, its canonical /dp/ link and main image. |
price, priceText, listPrice, listPriceText | Price as a number and as shown, and the struck-through list or "Was" price. |
rating, ratingCount | Average stars and number of ratings. |
searchTerm, page, position, organicPosition, sponsored | Search rows: where the card was, counting ads (position) and without them (organicPosition). |
badges, boughtPastMonth, boughtPastMonthText, deliveryText | Search rows: "Best Seller", "Amazon's Choice", "Limited time deal"; "1K+ bought in past month" as 1000; the delivery line. |
listType, category, categoryName, listTitle, rank | List rows: which list, which category and the rank. |
rankChangePercent, salesRank, salesRankYesterday | Movers & Shakers rows: the 24-hour rank change. |
starPercent | Product 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, buyBoxDelivery | Product rows: the featured offer and who sells and ships it. |
otherOfferCount, offers | Product rows: every other offer with condition, price, seller name and id, seller rating, ships from and delivery. |
scrapedAt | When 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,000 | Free | Bronze | Silver | Gold | Platinum | Diamond |
|---|---|---|---|---|---|---|
| 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
- Price and Buy Box monitoring: who holds the Buy Box for your ASINs, at what price, and which sellers undercut it, on a daily schedule.
- Keyword and shelf research: where your product and your rivals rank for a search, organic and sponsored, with "bought in past month".
- Category trends: Best Sellers, New Releases and Movers & Shakers per category and store, all 100 ranks.
- Cross-border pricing: the same ASIN on amazon.com, .co.uk, .de and .co.jp in local currency.
- Agents: "find the top-rated products for X under $50 and tell me who sells them".
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
- Search, ranked lists and the light product row only. The full product page (bullets, brand, BSR, variations, dimensions) is not part of this actor.
- Customer reviews are not collected: Amazon shows them only to signed-in visitors, and we never sign in.
- Delivery and prices are those of a shopper in the store's country without a postcode; a specific postcode needs a sign-in, so it is not supported.
- Search results follow Amazon's own ranking and personalisation for a logged-out visitor; ads and positions move during the day.
- Amazon answers some requests with a captcha or a "Something went wrong" page. The actor retries those on a new IP; inputs that still fail come back as free
blockedorunavailablerows.
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