# Amazon Search Scraper (`yasmany.casanova/amazon-search-scraper`) Actor

Search any keyword on Amazon in 7 countries and get every product in shopper order: ASIN, title, price, discount, rating, exact review count, purchases last month, Best Seller and Amazon's Choice badges, sponsored flag and organic rank for keyword tracking.

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

## Pricing

from $3.50 / 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.

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 Search Scraper

Search **any keyword on Amazon** in 7 countries and get every product in the results, **in the order a shopper sees them**: ASIN, title, price, discount, rating, the **exact review count**, purchases in the past month, Best Seller and Amazon's Choice badges, and whether each placement is **sponsored**.

[![Apify Actor](https://img.shields.io/badge/Apify-Actor-blue?logo=apify)](https://apify.com)
[![Markets](https://img.shields.io/badge/Markets-7%20Countries-green)](https://www.amazon.com)

***

> ℹ️ **Zero configuration**
> Type a keyword, pick a country, and run it: results are ready in seconds.

***

### Quick Start

```json
{
  "query": "fone de ouvido bluetooth",
  "country": "br",
  "maxResults": 50
}
```

> **Tip**: Every product carries `position` (its place on the page, ads included) and `organic_rank` (its place among the organic results only), so you can track where a product ranks for a keyword over time.

#### More examples

<details>
<summary>Organic results only, in the US</summary>

```json
{
  "query": "wireless earbuds",
  "country": "us",
  "maxResults": 100,
  "includeSponsored": false
}
```

</details>

<details>
<summary>The first 200 results in Germany</summary>

```json
{
  "query": "kopfhörer",
  "country": "de",
  "maxResults": 200
}
```

</details>

***

### Supported Countries

Pick one: the domain, language, currency, and delivery region are set automatically.

| Country | `country` | Domain | Currency | Products per page |
|---------|-----------|--------|----------|-------------------|
| Brazil (default) | `br` | amazon.com.br | BRL | about 60 |
| United States | `us` | amazon.com | USD | about 20 |
| United Kingdom | `uk` | amazon.co.uk | GBP | about 60 |
| Germany | `de` | amazon.de | EUR | about 20 |
| France | `fr` | amazon.fr | EUR | about 60 |
| Spain | `es` | amazon.es | EUR | about 60 |
| Italy | `it` | amazon.it | EUR | about 60 |

***

### Features

| Feature | Description |
|---------|-------------|
| **Shopper Order** | Products come in the order Amazon shows them, across as many pages as you ask for |
| **Organic Rank** | Every organic result is numbered among the organic results only, ready for keyword rank tracking |
| **Sponsored Flag** | Ads placed among the results are kept and flagged, or left out with one switch |
| **Exact Review Count** | The full count, even where Amazon shows "8 mil" or "16.8K" on the results page |
| **Purchases Last Month** | "Mais de 4 mil compras", "5K+ bought" or "5000+ Mal gekauft" become one number you can sort by |
| **Clean Links** | Every product links to its own page, without ad or tracking redirects |

***

### Use Cases

- **Keyword Rank Tracking**: See where your products, and your competitors', rank for the keywords that matter
- **Market Research**: Size a category by price, rating, reviews and sales signals in one run
- **Competitor Monitoring**: Track which brands buy the ads on your keywords and how they price
- **Product Discovery**: Find best sellers and fast movers before you source or list
- **Price Intelligence**: Compare prices and discounts for the same search across 7 countries

***

### Input Parameters

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `query` | string | none | What a shopper would type in the Amazon search box (**required**) |
| `country` | string | `br` | Country to search (`br`, `us`, `uk`, `de`, `fr`, `es`, `it`) |
| `maxResults` | integer | `50` | Products to return (1 to 500). One request per results page |
| `includeSponsored` | boolean | `true` | Keep the sponsored products among the results. `false` returns organic results only |

***

### Output Example

Each product is a row, followed by a summary row with the totals:

```json
[
  {
    "record_type": "product",
    "query": "fone de ouvido bluetooth",
    "country": "br",
    "page": 1,
    "position": 5,
    "organic_rank": 1,
    "is_sponsored": false,
    "asin": "B0DVMQVVDY",
    "title": "PHILIPS, Fone de Ouvido Sem Fio TWS, TAT1109BK/00, Bluetooth, Com Microfone, Até 24 horas de bateria, Preto",
    "url": "https://www.amazon.com.br/dp/B0DVMQVVDY",
    "image_url": "https://m.media-amazon.com/images/I/519bjoeFBTL._AC_UL320_.jpg",
    "price": 109.9,
    "original_price": 144,
    "discount_percentage": 24,
    "currency": "BRL",
    "rating": 4.6,
    "review_count": 8085,
    "bought_last_month": 4000,
    "bought_last_month_text": "Mais de 4 mil compras no mês passado",
    "is_best_seller": false,
    "is_amazons_choice": true,
    "delivery": "Entrega GRÁTIS: Amanhã, 22 de out. no seu primeiro pedido",
    "scraped_at": "2026-10-22T01:51:35.306673+00:00"
  },
  {
    "record_type": "summary",
    "query": "fone de ouvido bluetooth",
    "country": "br",
    "include_sponsored": true,
    "pages_fetched": 1,
    "products_found": 60,
    "products_returned": 50,
    "sponsored_returned": 8,
    "complete": true,
    "reference_url": "https://www.amazon.com.br/s?k=fone+de+ouvido+bluetooth&page=1&language=pt_BR",
    "scraped_at": "2026-10-22T01:51:35.306673+00:00"
  }
]
```

***

### Data Fields

| Field | Type | Description |
|-------|------|-------------|
| `record_type` | string | `product` for a product, `summary` for the totals. The summary row carries no product columns, so sorting by `price` needs no filtering |
| `query` | string | The search query |
| `country` | string | Country the results were collected from |
| `page` | number | Results page the product came from |
| `position` | number | Place in the results as a shopper sees them, across pages, every slot counted (ads and repeated placements included) |
| `organic_rank` | number | Place among the organic results only. `null` for a sponsored placement |
| `is_sponsored` | boolean | `true` when the placement is an ad |
| `asin` | string | Amazon product ID |
| `title` | string | Product title |
| `url` | string | Link to the product page |
| `image_url` | string | Product image shown in the results |
| `price` | number | Current price in the country's currency. `null` when Amazon shows no price |
| `original_price` | number | Price before discount, when Amazon shows one |
| `discount_percentage` | number | Discount from `original_price` to `price`, in percent |
| `currency` | string | ISO currency (BRL, USD, GBP, EUR) |
| `rating` | number | Average rating (1.0 to 5.0) |
| `review_count` | number | Number of ratings. `null` when the product has none yet. See the FAQ on how exact it is |
| `bought_last_month` | number | Purchases in the past month as Amazon states it, a lower bound ("5K+" is 5000) |
| `bought_last_month_text` | string | The same, exactly as Amazon shows it in the country's language |
| `is_best_seller` | boolean | Carries the Best Seller badge |
| `is_amazons_choice` | boolean | Carries the Amazon's Choice badge |
| `delivery` | string | Delivery promise as Amazon shows it for the country's main city |
| `include_sponsored` | boolean | Whether sponsored products were kept. Summary row |
| `pages_fetched` | number | Results pages the run requested. Summary row |
| `products_found` | number | Products found across the pages fetched, after removing repeats. Summary row |
| `products_returned` | number | Product rows pushed (limited by `maxResults`). Summary row |
| `sponsored_returned` | number | How many of the returned products are sponsored. Summary row |
| `complete` | boolean | `false` when the run stopped before the end of the results with fewer products than asked for: a later results page could not be read, or the 25-page limit was reached. The products already collected are kept. Summary row |
| `reference_url` | string | Amazon URL of the search. Summary row |
| `scraped_at` | string | ISO 8601 timestamp (UTC) |

***

### Integrations

Use the **API** tab on the Actor page to get ready-to-use code examples in **Python**, **JavaScript**, and **cURL**, generated with the correct parameters for immediate integration.

***

### Example Searches

| Country | `query` |
|---------|---------|
| Brazil | `fone de ouvido bluetooth` |
| United States | `wireless earbuds` |
| Germany | `kopfhörer` |
| Spain | `auriculares bluetooth` |

***

### FAQ

<details>
<summary><strong>What is the difference between position and organic_rank?</strong></summary>

`position` counts every slot a shopper scrolls past, ads included, so it tells you how far down the page a product sits. `organic_rank` counts only the organic results, which is the number to track when you want to know how Amazon ranks a product for a keyword. A product Amazon shows again on a later page, usually an ad, is listed once, but its later slot still counts, so the numbers stay true to the page. Both are numbered the same way whether or not you keep the sponsored products, so switching `includeSponsored` off changes no number.

</details>

<details>
<summary><strong>Which sponsored products are included?</strong></summary>

The sponsored products Amazon places among the results, each with `is_sponsored: true`. Brand ad banners and carousels above or between the results are not search results and are left out. A product can appear twice: once as an ad and once organically, since both are real placements. Set `includeSponsored` to `false` to get organic results only.

</details>

<details>
<summary><strong>Why did I get fewer products than maxResults?</strong></summary>

The search ran out of results. Past the last page, Amazon keeps filling the page with ads only, so the run stops at the first page with no new organic product instead of paying for pages of ads. A product repeated across pages is kept once. A very specific search can have only a few dozen results. In the US and Germany Amazon itself stops at about 20 pages: a broad search such as "wireless earbuds" in the US ends with 287 products. If the summary row says `complete: false`, the run stopped early instead: see that field.

</details>

<details>
<summary><strong>How many requests does a run make?</strong></summary>

One per results page. Amazon shows about 60 products per page in Brazil, the UK, France, Spain and Italy, and about 20 in the US and Germany, so 100 products are 2 pages in Brazil and about 6 in the US. The summary row says how many pages were fetched.

</details>

<details>
<summary><strong>How is bought_last_month read?</strong></summary>

Amazon shows a purchase count on popular products in the country's language: "Mais de 4 mil compras no mês passado", "5K+ bought in past month", "2 mil+ comprados el mes pasado", "5000+ Mal im letzten Monat gekauft". The Actor turns it into the number Amazon states, which is a lower bound. Products without it, or with a different badge in that place (such as "New on Amazon"), have `null`.

</details>

<details>
<summary><strong>Is review_count exact?</strong></summary>

Yes. On the results page Amazon abbreviates the count ("8 mil", "16.8K"), and the Actor reads the full figure Amazon keeps for each result instead. In the rare case it cannot be read for a product, the US, UK, France, Germany and Italy fall back to the abbreviated figure (16.8K becomes 16,800), and Brazil and Spain leave the count empty rather than publish a wrong number.

</details>

<details>
<summary><strong>Can I sort the results by price or rating?</strong></summary>

The results come in Amazon's own order, the one a shopper sees for the keyword. Sort the dataset by `price`, `rating`, `review_count` or `bought_last_month` after the run.

</details>

<details>
<summary><strong>Why is there no Prime column?</strong></summary>

Amazon shows the Prime badge on search results only to signed-in Prime members. The delivery promise every shopper sees is in `delivery`.

</details>

<details>
<summary><strong>Do the results match what I see in my browser?</strong></summary>

Closely, but not always exactly. Amazon personalizes results by account, history and location, and the ads rotate from one visit to the next. The run searches as an anonymous shopper in the country's main city.

</details>

***

### Support

1. **Check the FAQ** above for common questions
2. **Test with the prefilled example** to confirm expected output
3. **Contact support** through [Apify](https://apify.com) for additional assistance

# Actor input Schema

## `query` (type: `string`):

What a shopper would type in the Amazon search box: a product, a brand or a model.

## `country` (type: `string`):

Amazon country to search. The domain, language, currency and delivery region are set automatically for the selected country.

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

Products to return (1-500). Every results page is one request, and Amazon shows about 60 products per page in most countries and about 20 in the US and Germany. The run stops early when Amazon has no more results for the query.

## `includeSponsored` (type: `boolean`):

Keep the sponsored products Amazon places among the results, flagged with is_sponsored. Turn off to get organic results only.

## Actor input object example

```json
{
  "query": "fone de ouvido bluetooth",
  "country": "br",
  "maxResults": 50,
  "includeSponsored": true
}
```

# Actor output Schema

## `products` (type: `string`):

One row per product in the search results, in the order a shopper sees them, with price, rating, reviews, purchases in the past month and whether it is sponsored. One summary row carries the totals and holds no product columns, so sorting or counting the products needs no filtering.

# 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 = {
    "query": "fone de ouvido bluetooth",
    "country": "br"
};

// Run the Actor and wait for it to finish
const run = await client.actor("yasmany.casanova/amazon-search-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 = {
    "query": "fone de ouvido bluetooth",
    "country": "br",
}

# Run the Actor and wait for it to finish
run = client.actor("yasmany.casanova/amazon-search-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 '{
  "query": "fone de ouvido bluetooth",
  "country": "br"
}' |
apify call yasmany.casanova/amazon-search-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,yasmany.casanova/amazon-search-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/7m3J4oH6tCVx53Ee9/builds/zPHZ3UlB6fS5aSSAb/openapi.json
