# Amazon Scraper (`harpoon/amazon-scraper`) Actor

Search Amazon by keyword and export every product with its full detail page - title, price, rating, images, variants, seller, and more.

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

## Pricing

from $3.00 / 1,000 detailed 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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

### Amazon Scraper — search by keyword and export every product with its full detail page

Turn a keyword like `charger` into a clean, structured list of products — then download it as JSON, CSV, Excel, or XML. Each product comes back with its title, price, rating, review count, images, bullet points, brand, seller, availability, category, and sales rank. Search several terms at once, or paste product URLs/ASINs to pull specific products.

#### What can Amazon Scraper do?

- Search Amazon with one or more keywords and return the matching products
- Enrich every product with its full detail page: bullets, all images, seller, category, sales rank, and more
- **Go beyond a keyword's search results** by following each product's related items (on by default)
- Scrape specific products by URL or ASIN, without searching
- De-duplicate results and cap each search so a run stays predictable
- Export results to JSON, CSV, Excel, or XML
- Run via the API, schedule runs, and integrate through webhooks or MCP

### What data can I extract?

<table>
<tr><th>What you get</th><th>Features</th></tr>
<tr><td>

- **Products** — `asin`, `url`, `title`, `brand`, `price`, `price_value`, `list_price`, `list_price_value`, `discount_percent`, `currency`, `in_stock`, `rating`, `rating_breakdown`, `reviews_count`, `review_summary`, `availability`, `seller`, `seller_id`, `seller_url`, `ships_from`, `category`, `color`, `size`, `style`, `model_number`, `manufacturer`, `item_weight`, `product_dimensions`, `date_first_available`, `upc`, `variation_attributes`, `attributes`, `image_url`, `images`, `gallery_thumbnails`, `bullets`, `description`, `aplus_images`, `aplus_text`, `best_sellers_rank`, `best_sellers_ranks`, `variants`, `variant_details`, `prime`, `sponsored`, `coupon`, `delivery`, `condition`, `return_policy`, `support`, `is_amazon_choice`, `amazon_choice_text`, `videos_count`, `answered_questions`, `has_reviews`, `reviews_url`, `monthly_purchase_volume`, `location`, `important_information`, `brand_store_url`, `search_query`, `position`, `scraped_at`
- **`attributes`** — the long tail of category-specific specs (e.g. `Wattage`, `Connector Type`, `Material`, `Capacity`) as a key/value object, since they differ from one product type to another.

</td><td>

- Search by keyword, or paste product URLs / ASINs
- Full detail page per product (on by default)
- Related-product discovery to widen the catalog
- Listing-only mode for fast, cheaper runs
- Export to JSON, CSV, Excel, XML
- API access, webhooks, SDKs
- LLM-ready output for MCP, ChatGPT, Claude

</td></tr>
</table>

### How to use Amazon Scraper

1. [Create](https://console.apify.com/sign-up) a free Apify account.
2. Open **Amazon Scraper** in Apify Console.
3. Enter one or more **Search queries** (the form is prefilled with `charger`).
4. Set **Max results per search**; leave **Fetch full product details** and **Discover related products** on.
5. Click **Save & Start**.
6. Download results in JSON, CSV, Excel, or XML.

To pull specific products instead, open the **Paste product URLs instead**\* section and add product URLs or ASINs.

### Input

One run does one of two things. By default it **searches** the terms you give it. If you paste anything into **Paste product URLs instead**\*, the run switches to those exact products and ignores the search queries — the two modes cannot be combined.

**Getting more products.** Amazon only exposes a limited number of result pages per keyword, so a single search term returns a finite set of products. There are two ways to get more:

1. **Discover related products** (on by default) — the Actor follows the related items shown on each product page, so a run keeps finding new products past the search results. Search results always come first; related products are only used once the search pages are exhausted, or once they stop returning new products.
2. **Add more search queries** — several specific terms (e.g. `65w gan charger`, `usb c charger cable`, `car charger`) each surface a different set, which is the most reliable way to reach a larger catalog.

Both work together; the whole run is still capped by **Max results per search**.

- `search_queries` — the keywords to search, one per line.
- `max_results` — cap on products returned per search term (default 50).
- `fetch_details` — fetch each product's full detail page (default on). Turn off for a fast listing-only run.
- `discover_related` — follow related items to find products beyond the search pages (default on; requires `fetch_details`).
- `product_urls` — product URLs or ASINs to scrape directly; wins over `search_queries` when filled.
- `language` — request locale (default English).

**Example input**

```json
{
  "search_queries": ["charger"],
  "max_results": 50,
  "fetch_details": true,
  "discover_related": true
}
```

See the **Input** tab above for every parameter.

### Output

Results land in a dataset under the **Storage** tab. View them in the **Overview** table, download in JSON, CSV, Excel, or XML, or pull them via the API.

```json
{
  "asin": "B0FQN62VY2",
  "url": "https://www.amazon.com/dp/B0FQN62VY2",
  "title": "Ergonomic Office Chair Desk Chair with Adjustable Lumbar Support",
  "brand": "Nexthro",
  "price": "$94.99",
  "price_value": 94.99,
  "list_price": "$119.99",
  "list_price_value": 119.99,
  "discount_percent": 21,
  "currency": "USD",
  "in_stock": true,
  "rating": 4.5,
  "rating_breakdown": { "1": 5, "2": 2, "3": 6, "4": 8, "5": 79 },
  "reviews_count": 190,
  "review_summary": "Customers find this office chair to be a great choice for home use, appreciating its adjustable lumbar support and easy-to-adjust armrests.",
  "prime": false,
  "sponsored": true,
  "coupon": "",
  "availability": "In Stock",
  "seller": "",
  "ships_from": "Amazon",
  "category": "Home & Kitchen > Furniture > Home Office Furniture > Home Office Chairs > Home Office Desk Chairs",
  "color": "Black",
  "size": "",
  "style": "",
  "model_number": "23-1L",
  "manufacturer": "Nexthro",
  "item_weight": "",
  "product_dimensions": "",
  "date_first_available": "",
  "upc": "",
  "variation_attributes": { "color": "Black" },
  "attributes": {
    "Brand Name": "Nexthro",
    "Additional Features": "Adjustable Height",
    "Age Range Description": "Adult",
    "Assembly Instructions Description": "Yes, assembly is required"
  },
  "image_url": "https://m.media-amazon.com/images/I/81ErKg+7tEL._AC_SL1500_.jpg",
  "images": [
    "https://m.media-amazon.com/images/I/81ErKg+7tEL._AC_SL1500_.jpg",
    "https://m.media-amazon.com/images/I/81Qa4nC0CvL._AC_SL1500_.jpg",
    "https://m.media-amazon.com/images/I/81IQlKwGybL._AC_SL1500_.jpg"
  ],
  "bullets": [
    "【Ergonomic Office Chair】The Nexthro ergonomic office chair is designed to alleviate back pain, offering a comfortable seating experience with adjustable lumbar support.",
    "【Adjustable Lumbar Support】Our computer chair's lumbar support system adjusts 1\" forward and backward and 3.15\" up and down, conforming to the natural curve of the lower back."
  ],
  "description": "",
  "best_sellers_rank": "#6,963 in Home & Kitchen ( See Top 100 in Home & Kitchen ) #16 in Home Office Desk Chairs",
  "variants": ["B0F6XNPWYY", "B0FQMWXP4L", "B0FQMXYFMC"],
  "search_query": "office chair",
  "position": 3,
  "scraped_at": "2026-09-20T16:48:45Z"
}
```

Field names are lowercase snake\_case, and the input keys match them. Switch dataset views — **Overview**, **Pricing**, **Details**, **Media & bullets**, **Attributes & reviews** — to focus the columns. The `images`, `bullets`, and `variants` arrays and the `attributes` / `variation_attributes` / `rating_breakdown` objects each render as a single column in those views.

### What can you do with the data?

Each recipe names the exact input and fields to use.

#### 1. Price and rating comparison across a category

1. Add several **Search queries** (e.g. `65w charger`, `gan charger`, `usb c charger`).
2. Set **Max results per search** to 100 and keep **Fetch full product details** on.
3. Sort the dataset by `price` and `rating`, and filter on `reviews_count` to drop untested listings.
4. Track `best_sellers_rank` to see which products lead their category.

#### 2. Product catalog and enrichment

1. Paste your product list into **Paste product URLs instead\*** (URLs or ASINs).
2. Run with defaults to get one full row per product.
3. Use `bullets`, `images`, and `category` to populate a catalog or feed a model.

### How much does Amazon Scraper cost?

Pricing uses two pay-per-event events, so you only pay for what a run actually produces:

- **`basic-result`** — charged once for every product returned, with the listing fields (title, price, rating, reviews, image). **$3 per 1,000 products** ($0.003 each).
- **`detailed-result`** — charged in addition for every product whose full detail page was fetched (bullet points, description, images, seller, category, sales rank).

A run with **Fetch full product details** on charges both events per product; a listing-only run charges only `basic-result`. You pay only for products saved to the dataset, so a smaller `max_results` costs less, and new Apify accounts get free monthly usage. See the **Pricing** tab for current rates and plan discounts.

### FAQ

**Do I need an account, cookies, or an API key?**
No. The Actor reads publicly available product pages, so you can run it straight away.

**Can I scrape private or restricted content?**
No. It returns only what is publicly visible to a signed-out visitor.

**How many results can I get?**
Set **Max results per search** per keyword. Amazon only exposes a limited set of result pages per term, so to reach a larger catalog either keep **Discover related products** on (it follows related items past the search results) or add several narrower keywords. Pasting product URLs/ASINs has no such limit.

**Is it legal to scrape Amazon?**
The Actor collects publicly available data only. Check Apify's guidance on legal and ethical scraping and your own obligations before use.

**Can I use it with the API / SDKs / MCP?**
Yes — see the **API** tab above, or connect through the Apify MCP server.

**Something isn't working.**
Individual products that fail are skipped and logged; the run keeps going. Check the run log for `skipped <ASIN>: ...` lines, then open an issue if a problem persists.

### Notes and limitations

- **`attributes` is intentionally not fixed** — Amazon specs differ per category (a coffee maker has `Wattage`/`Voltage`, a chair has `Seat Material`/`Frame Material Type`, a cable has `Connector Type`/`Data Transfer Rate`). Everything that is not a near-universal field goes into the `attributes` object, so the keys vary from product to product.
- **Price and availability can be empty** for products with no direct buy box (only third-party offers) or with region restrictions. `list_price` is only set when it is a genuine discount above the current price.
- **`rating_breakdown` is only present** when the page shows the per-star percentage breakdown.
- **`description` is often empty** on modern product pages, where the description is shown as images instead; `bullets` and `attributes` cover that content.
- **`rating`/`reviews_count` are `0`** for new products with no reviews yet, and `review_summary` is only present when a short review summary exists.
- **Search is finite per keyword** — Amazon returns a capped number of results per term; deeper pages mostly repeat. Two ways around it: **Discover related products** (default on) follows related items past the search results, and adding more specific keywords each surfaces a different set.
- **Fields vary by category and locale**; not every product exposes `seller`, `ships_from`, `color`/`size`, or variants.
- **Detail runs are slower** than listing-only runs because each product is fetched individually.

### Run locally

```
go run ./cmd/actor
```

Input is read from the Apify key-value store; see `INPUT_SCHEMA.json`.

### Support

Found a bug or have feedback? Open an issue in the **Issues** tab.

# Actor input Schema

## `search_queries` (type: `array`):

One or more product search terms, one per line, e.g. <code>charger</code> or <code>wireless charger</code>. Each term is searched separately and its results are capped by <b>Max results</b>. Amazon returns only a limited set of pages per term, so <b>adding more specific terms is the most reliable way to reach a larger catalog</b>. Add one per line, or paste a list with <b>Bulk edit</b>. Duplicates are removed automatically.

## `max_results` (type: `integer`):

How many products to return for each search term. Higher values take longer and increase cost, because each product also fetches its detail page. Note that a single keyword only exposes a limited set of products, so a very high value may return fewer than requested - use more keywords or keep <b>Discover related products</b> on to go further.

## `fetch_details` (type: `boolean`):

When on (default), every product also returns its full detail page: bullet points, description, all images, seller, shipping origin, sales rank, and variations. Turn it off for a faster, cheaper listing-only run with the search-card fields (title, price, rating, reviews, image).

## `discover_related` (type: `boolean`):

Amazon limits how many result pages a single keyword returns, so paging through search results eventually stops finding new products. When on (default), the Actor also follows the <b>related items</b> shown on each product page, so a run keeps discovering products beyond the search results. Turn it off for a strict, search-results-only run. Requires <b>Fetch full product details</b>; to reach the widest catalog, combine it with several specific search queries.

## `product_urls` (type: `array`):

Alternative to searching: paste Amazon product URLs or bare ASINs, one per line, e.g. <code>https://www.amazon.com/dp/B097BL622M</code> or <code>B097BL622M</code>. When provided, these products take priority over <b>Search queries</b> and cannot be combined with them. Full details are always fetched in this mode.

## `language` (type: `string`):

Locale used when requesting the pages. Results are returned in this language where Amazon supports it.

## Actor input object example

```json
{
  "search_queries": [
    "usb c charger",
    "wireless charger"
  ],
  "max_results": 50,
  "fetch_details": true,
  "discover_related": true,
  "product_urls": [
    "https://www.amazon.com/dp/B097BL622M",
    "B0BZVLX6JJ"
  ],
  "language": "en"
}
```

# Actor output Schema

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

One row per product, with its detail-page fields when full details are enabled.

# 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 = {
    "search_queries": [
        "charger"
    ],
    "max_results": 50,
    "fetch_details": true,
    "discover_related": true,
    "language": "en"
};

// Run the Actor and wait for it to finish
const run = await client.actor("harpoon/amazon-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 = {
    "search_queries": ["charger"],
    "max_results": 50,
    "fetch_details": True,
    "discover_related": True,
    "language": "en",
}

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

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

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

```

## CLI example

```bash
echo '{
  "search_queries": [
    "charger"
  ],
  "max_results": 50,
  "fetch_details": true,
  "discover_related": true,
  "language": "en"
}' |
apify call harpoon/amazon-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,harpoon/amazon-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/8nE9v6rFP1ggtUozw/builds/Ej9XP8HoQSquXiTg9/openapi.json
