# Amazon Listings Scraper 2026 (`devcake/amazon-listings-scraper`) Actor

Amazon product data scraper for keyword search. Get ASIN, title, price, currency, rating, Prime and badge per result.

- **URL**: https://apify.com/devcake/amazon-listings-scraper.md
- **Developed by:** [devcake](https://apify.com/devcake) (community)
- **Categories:** E-commerce
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## 🛒 Amazon Product Scraper · Amazon Listings Scraper

> **Extract Amazon products and listings by keyword across 12 marketplaces.** Fast, accurate, and ready to run — no setup needed.

***

### ✨ At a glance

| | |
|---|---|
| 🌍 **Marketplaces** | 12 — US, UK, DE, FR, IT, ES, CA, MX, BR, IN, JP, AU |
| ⚡ **Speed** | Results in under a minute for most runs |
| 📦 **Output** | One clean row per Amazon product — ASIN, price, rating, reviews, Prime, sponsored flag, and more |
| 🚀 **Scale** | Up to 10,000 unique products per keyword, 1,000 keywords per run |

***

### 📑 Table of contents

- [🛒 What does it do?](#-what-does-amazon-product-scraper-do)
- [👥 Who it's for](#-who-its-for)
- [💡 Use cases](#-use-cases)
- [🚀 How to use it](#-how-to-use-amazon-product-scraper)
- [⚙️ Input](#️-input)
- [📦 Output](#-output)
- [📊 Data table](#-data-table)
- [💡 Tips](#-tips)
- [❓ FAQ, disclaimers, and support](#-faq-disclaimers-and-support)

***

### 🛒 What does Amazon Product Scraper do?

This **Amazon listings scraper** pulls **product listings from Amazon search pages** for one or more keywords across all 12 major Amazon marketplaces. For each keyword it goes through Amazon's search pages and returns one row per product — a clean **Amazon product dataset** with ASIN, title, price, rating, review count, Prime badge, sponsored flag, thumbnail, brand, and 20+ more fields.

It's built to bypass Amazon's bot detection automatically, so you don't have to wrestle with proxies, captchas, or browser setup. Just paste your keywords, hit start, and get your data.

Try it with three sample keywords (`"wireless earbuds"`, `"bluetooth headphones"`, `"noise cancelling earbuds"`) in the **Input** tab — you'll see a clean Amazon product dataset within a minute.

***

### 👥 Who it's for

> Built for anyone who works with Amazon listings and product data.

- 🛒 **Amazon FBA sellers** — track your ASIN's organic position, watch competitor pricing, and spot listing-rank changes week over week.
- 🏪 **E-commerce resellers & dropshippers** — find winning products, compare supplier pricing, and monitor availability across marketplaces.
- 📊 **Market & product researchers** — generate bulk product datasets for trend analysis, category sizing, and assortment comparison.
- 💼 **Procurement & sourcing teams** — discover candidate products, evaluate review velocity, and shortlist private-label opportunities.
- 📈 **Price monitoring services** — batch thousands of keywords into one run and feed structured price + discount data into your tracking pipeline.
- 🎯 **Amazon agencies & consultants** — produce client-ready reports on keyword ranking, sponsored share, and competitor moves.

***

### 💡 Use cases

> Seven battle-tested workflows for sellers, analysts, and operators.

#### 📦 Scrape Amazon listings at scale

Pull hundreds of product cards per keyword and up to 10,000 unique ASINs per keyword in a single run.

#### 🔎 Bulk product discovery

Build seed product lists for catalog enrichment, review scraping, variant extraction, or supplier sourcing.

#### 🏷️ Keyword research for Amazon listings

See exactly which products rank for your target keyword, their pricing tiers, and review velocity.

#### 🆚 Competitor analysis

Track competing ASINs across price, rating, review count, and "bought in past month" signals.

#### 💹 Price monitoring at scale

Batch hundreds of keywords into one run and pull structured prices and discount percentages in a single dataset.

#### 🌐 Multi-marketplace expansion

Compare product assortments, pricing, and ratings across Amazon.com, Amazon.de, Amazon.co.jp, and 9 more storefronts.

#### 🎯 Sponsored vs. organic analysis

`isSponsored` and `organicRank` fields let you separate paid placements from real organic winners.

***

### 🚀 How to use Amazon Product Scraper

> Five steps from input to downloadable dataset.

1. **📝 Open the Input tab** and paste one or more keywords into the **Search keywords** field (1–1,000 keywords per run).
2. **🌍 Pick an Amazon domain** — `amazon.com` (US) is the default. Switch to `co.uk`, `de`, `jp`, etc. for other storefronts.
3. **🎯 Set Maximum products per keyword** (default 100) — the scraper stops each keyword once that many unique products are collected.
4. **▶️ Click Start** and wait. A 100-product run finishes in under a minute.
5. **⬇️ Download results** from the **Output** tab — CSV, JSON, Excel, or HTML. Use the **Products** table for a quick scan, **Full data** for everything.

> 🤖 **Want to automate it?** Use the **API** tab to trigger runs from your own scripts, or schedule hourly/daily keyword-tracking jobs from the **Schedules** tab.

***

### ⚙️ Input

> Three fields. That's it. Everything else is handled for you.

| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| 📝 `keywords` | array of strings | ✅ **Yes** | — | One or more keywords to search on Amazon (1–1,000 per run). |
| 🌍 `domain` | enum | ❌ No | `com` | Which Amazon storefront: `com`, `co.uk`, `de`, `fr`, `it`, `es`, `ca`, `com.mx`, `com.br`, `in`, `jp`, `com.au`. |
| 🎯 `maxResults` | integer | ❌ No | `100` | Stop each keyword once this many unique products (by ASIN) are collected. |

> 💡 **The Amazon region is auto-selected from `domain`.** amazon.com → US · amazon.de → DE · amazon.co.jp → JP, and so on — so you always get a real local view of that storefront.

#### 📝 Example input

```json
{
  "keywords": ["wireless earbuds", "bluetooth headphones", "noise cancelling earbuds"],
  "domain": "com",
  "maxResults": 100
}
```

***

### 📦 Output

> Every product is pushed as one row to the default dataset. Fields follow the **Apify Amazon-search market standard** — they line up with the leading Amazon scrapers on the platform, so existing pipelines keep working.

#### 📄 Example row

```json
{
  "asin": "B0BSHF7WHW",
  "title": "Apple AirPods Pro (2nd Gen)",
  "url": "https://www.amazon.com/dp/B0BSHF7WHW",
  "thumbnail": "https://m.media-amazon.com/images/I/71zny78BxWL._AC_UX200_.jpg",
  "price": 199.99,
  "priceText": "$199.99",
  "listPrice": 249.0,
  "listPriceText": "$249.00",
  "discountPercent": 20,
  "currency": "USD",
  "rating": 4.6,
  "ratingText": "4.6 out of 5 stars",
  "reviewCount": 89412,
  "reviewCountText": "89,412",
  "isPrime": true,
  "isSponsored": false,
  "badgeText": "Amazon's Choice",
  "boughtInPastMonth": "10K+ bought in past month",
  "boughtInPastMonthValue": 10000,
  "deliveryText": "Get it by Tomorrow, July 26",
  "couponText": null,
  "availabilityText": "In Stock",
  "brand": "Apple",
  "marketplace": "com",
  "searchQuery": "wireless earbuds",
  "searchUrl": "https://www.amazon.com/s?k=wireless+earbuds&page=1",
  "sourceType": "keyword",
  "page": 1,
  "positionOnPage": 3,
  "organicRank": 2,
  "globalPosition": 3,
  "scrapedAt": "2026-07-25T10:30:00.000Z"
}
```

> ⬇️ **You can download the dataset in JSON, CSV, Excel, or HTML** from the Output tab. For large runs, use the **API** tab to fetch paginated items programmatically.

***

### 📊 Data table

> Every field the scraper emits, grouped by purpose so you can scan what you need.

#### 🆔 Identity

| Field | Type | Description |
|---|---|---|
| `asin` | string | Amazon Standard Identification Number (10 alphanumeric chars). **Unique key.** |
| `title` | string | Product title as displayed in the search result card. |
| `url` | string | Canonical Amazon product URL (`/dp/<ASIN>`). |
| `thumbnail` | string | Product thumbnail image URL. |
| `brand` | string | Brand name extracted from the card when Amazon shows it. |
| `marketplace` | string | Amazon domain code (`com`, `co.uk`, `de`, `jp`, …). |

#### 💰 Price

| Field | Type | Description |
|---|---|---|
| `price` | number | Numeric current price in `currency`. Raw locale string preserved as `priceText`. |
| `listPrice` | number | Strike-through "was" price. Empty when Amazon doesn't show a discount. |
| `discountPercent` | number | Calculated as `round((1 - price / listPrice) × 100)`. Empty if either is missing. |
| `currency` | string | Currency code (USD, GBP, EUR, JPY, INR, …). |
| `couponText` | string | Visible coupon / savings text. Empty when no coupon is shown. |

#### ⭐ Reviews & rating

| Field | Type | Description |
|---|---|---|
| `rating` | number | Numeric rating 0.0–5.0. Raw text preserved as `ratingText`. |
| `reviewCount` | integer | Parsed integer review count. Raw text preserved as `reviewCountText`. |
| `boughtInPastMonthValue` | integer | Parsed threshold from "10K+ bought in past month" → 10000. Empty when absent. |

#### 🏷️ Listing signals

| Field | Type | Description |
|---|---|---|
| `isPrime` | boolean | Whether the listing shows the Prime badge. |
| `isSponsored` | boolean | Whether the card is a sponsored (paid) placement. |
| `badgeText` | string | SERP badge label (e.g. "Best Seller", "Amazon's Choice", "Climate Pledge Friendly"). |
| `deliveryText` | string | Delivery promise string ("Get it by Tomorrow, July 26"). |
| `availabilityText` | string | Stock / availability string ("In Stock", "Only 3 left", …). |

#### 🔍 Provenance & ranking

| Field | Type | Description |
|---|---|---|
| `searchQuery` | string | The keyword that produced this row. |
| `searchUrl` | string | The exact Amazon SERP URL the row was scraped from. |
| `sourceType` | string | How the row was sourced. Always `"keyword"` for this scraper. |
| `page` | integer | Result page number (1-based). |
| `positionOnPage` | integer | 1-based position on this page, counting sponsored + organic. |
| `organicRank` | integer | Position among organic (non-sponsored) ASINs across all pages. Empty for sponsored cards. |
| `globalPosition` | integer | 1-based position across all unique ASINs for this keyword across all pages. |
| `scrapedAt` | string | ISO 8601 UTC timestamp of when the keyword was scraped. |

***

### 💡 Tips

> Workflow patterns from production users.

- 📦 **Batch your keywords.** One run with 50 keywords is much faster than 50 separate runs — and you get all the results in a single dataset.
- 🎯 **Track a specific ASIN.** Even though the input is keywords, you can pull a single product's current search-page context by searching its exact brand + model — `globalPosition` makes it easy to see ranking drift over time.
- 🎯 **Separate organic vs. paid winners.** Filter the dataset on `isSponsored=false` to see real organic ranking for a keyword, then sort by `organicRank` to identify the top organic winners vs. paid placements.
- 💸 **Use `discountPercent` for deal hunting.** A keyword where most top results show `discountPercent >= 30` is a competitive, high-velocity niche — useful for sourcing or private-label research.
- 🌐 **Compare marketplaces.** Run the same keyword against `domain=com` and `domain=de` to see how pricing, assortment, and review counts differ.
- ⏰ **Schedule hourly tracking.** Combine with the **Schedules** tab to monitor a fixed keyword list daily — each row carries `scrapedAt`, so you can chart ranking and price drift over time.

***

### ❓ FAQ, disclaimers, and support

> Tap a question to read the answer.

#### ⚖️ Is this legal?

Scraping publicly visible Amazon search results is a common, lawful practice used by sellers, analysts, and researchers. **You are responsible for complying with Amazon's Terms of Service and any applicable laws in your jurisdiction.** Don't republish raw Amazon content at scale; use the data for analysis, internal tools, and product research.

#### 🌍 Which Amazon marketplaces are supported?

> All 12 — the region auto-matches the domain.

`amazon.com` (US) · `amazon.co.uk` (UK) · `amazon.de` (DE) · `amazon.fr` (FR) · `amazon.it` (IT) · `amazon.es` (ES) · `amazon.ca` (CA) · `amazon.com.mx` (MX) · `amazon.com.br` (BR) · `amazon.in` (IN) · `amazon.co.jp` (JP) · `amazon.com.au` (AU)

#### 🎯 What's the difference between `positionOnPage`, `organicRank`, and `globalPosition`?

| Field | Meaning |
|---|---|
| `positionOnPage` | 1-based position on this specific search results page, counting sponsored + organic. |
| `organicRank` | Position among non-sponsored ASINs across all paginated rows. Empty for sponsored cards. |
| `globalPosition` | 1-based position across all unique ASINs across all pages for this keyword. |

#### 🔁 Why do I see duplicate ASINs in the raw output?

You shouldn't — the scraper de-duplicates by ASIN across all pages for a given keyword. If you see duplicates, you've likely joined two keywords' datasets downstream; **`searchQuery` is the join key.** A summary record reports the within-keyword duplicates the scraper filtered out.

#### 🚫 Can I get more than 10,000 products per keyword?

No — `maxResults` is capped at 10,000. For bulk catalog scraping (millions of ASINs per category), use a dedicated category-browser scraper instead.

#### 🧩 What's the `keyword` legacy field?

It's an alias for `searchQuery`. The scraper emits both for backward compatibility with older pipelines; **new code should use `searchQuery`**.

#### 💬 Custom solutions or integration help?

> 📬 Open an issue on the [Apify console Issues tab](https://console.apify.com) for this scraper, or contact Apify support through the platform. The scraper is actively maintained and field-aligned with the leading Amazon search scrapers on the marketplace.

# Actor input Schema

## `keywords` (type: `array`):

One or more keywords to search on Amazon. URL-encoded automatically. Each keyword is scraped independently up to maxResults; all rows flow into the same dataset and carry the originating keyword in the `keyword` field.

## `domain` (type: `string`):

Which Amazon storefront to scrape. Determines the URL host, the residential proxy country, and the locale-specific price formatting.

## `maxResults` (type: `integer`):

Stop each keyword once this many unique products have been collected. De-duplicated by ASIN. The billable unit is the total number of dataset rows pushed across all keywords.

## Actor input object example

```json
{
  "keywords": [
    "wireless earbuds"
  ],
  "domain": "com",
  "maxResults": 50
}
```

# Actor output Schema

## `dataset` (type: `string`):

One row per scraped product. De-duplicated by ASIN across pages.

## `summary` (type: `string`):

Counts (products, pages, duplicates, wire/decoded bytes) plus the run's stop\_reason.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "keywords": [
        "wireless earbuds"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("devcake/amazon-listings-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "keywords": ["wireless earbuds"] }

# Run the Actor and wait for it to finish
run = client.actor("devcake/amazon-listings-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "keywords": [
    "wireless earbuds"
  ]
}' |
apify call devcake/amazon-listings-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=devcake/amazon-listings-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/jv8yf2TT8HfGttiuk/builds/cLqlzRxhwTFMKEVFE/openapi.json
