# Amazon Multi-Country Scraper — Anti-Block, 7 Regions (`viralanalyzer/amazon-multi-country`) Actor

Scrape Amazon products across 7 marketplaces: US, UK, Germany, France, Italy, Spain, Canada. Country-aware locale, currency (USD/GBP/EUR/CAD), Accept-Language, and Prime filter. Smart proxy routing per region.

- **URL**: https://apify.com/viralanalyzer/amazon-multi-country.md
- **Developed by:** [viralanalyzer](https://apify.com/viralanalyzer) (community)
- **Categories:** E-commerce, Marketing
- **Stats:** 4 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $5.00 / 1,000 product scrapeds

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
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?

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 Multi-Country Scraper — US / UK / DE / FR / IT / ES / CA

> 🔗 [View on Apify Store](https://apify.com/viralanalyzer/amazon-multi-country) | 🇺🇸 English | [🇧🇷 Português](#português)

Scrape **Amazon products across 7 marketplaces** (US, UK, DE, FR, IT, ES, CA) from a single actor. Country-aware TLD, locale, currency, Accept-Language, and Prime filter ID. Handles US/UK/CA period-decimal prices AND DE/FR/IT/ES comma-decimal prices automatically.

### ✨ Features

- **7 marketplaces in one actor** — `amazon.com`, `co.uk`, `.de`, `.fr`, `.it`, `.es`, `.ca`
- **Country-aware Prime filter** — each marketplace has its own `primeFilterRh` browse node verified against Amazon's category URLs
- **Locale-correct price parsing** — auto-detects whether `.` or `,` is the decimal separator (US `$1,299.90` vs DE `1.299,90 €`)
- **Search OR direct URLs** — pass a keyword OR pass an array of full product URLs matching the chosen country
- **Sort modes** — relevance / price-asc / price-desc / rating / newest
- **Price range filter** — `minPrice` / `maxPrice` in local currency
- **Prime-only toggle** — appends the country-specific `rh=p_85%3A<id>` filter to the search URL automatically
- **Optional review extraction** — rating, verified-purchase and helpful-votes, read from at most 5 review pages per ASIN
- **CheerioCrawler** — fast HTTP-only, no Playwright overhead — runs on Apify RESIDENTIAL proxy, picked automatically for the chosen country
- **NEVER 0 ITEMS guard** — actor fails loudly with HTML byte-count and selector trace instead of silently succeeding

### 📥 Input

| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| `country` | enum | No | `US` | Marketplace: `US` / `UK` / `DE` / `FR` / `IT` / `ES` / `CA` |
| `searchQuery` | string | Yes\* | `iphone 15` | Keyword search (required if no `productUrls`) |
| `productUrls` | string\[] | Yes\* | `[]` | Direct Amazon URLs (alternative to search; must match chosen country TLD) |
| `maxProducts` | integer | No | `10` | Ceiling on products (1-500). Search paging stops at 10 pages, so high values often return fewer |
| `sortBy` | enum | No | `relevance` | `relevance` / `price-asc` / `price-desc` / `rating` / `newest` |
| `minPrice` | number | No | `0` | Minimum price filter in local currency |
| `maxPrice` | number | No | `0` | Maximum price filter (0 = no limit) |
| `primeOnly` | boolean | No | `false` | Only return products eligible for Prime delivery |
| `includeReviews` | boolean | No | `false` | Extract customer reviews (slower) |
| `maxReviewsPerProduct` | integer | No | `10` | Ceiling on reviews per product (1-100). Review paging stops at 5 pages per ASIN, so 100 usually returns fewer |
| `proxyConfiguration` | object | No | RESIDENTIAL + country | Left untouched, the run uses RESIDENTIAL with the IP country matched to `country`. To get datacenter you must set a proxy country explicitly — see Capabilities & Limits |

\*Either `searchQuery` OR `productUrls` is required.

#### Input example (JSON)

```json
{
  "country": "DE",
  "searchQuery": "kaffeevollautomat",
  "maxProducts": 20,
  "sortBy": "rating",
  "minPrice": 200,
  "maxPrice": 800,
  "primeOnly": true
}
```

### 📤 Output

Each record carries country-specific currency and locale. Example DE output:

```json
{
  "asin": "B08FBN5BTC",
  "title": "De'Longhi Magnifica S ECAM 22.110.B Kaffeevollautomat",
  "url": "https://www.amazon.de/dp/B08FBN5BTC",
  "price": 349.0,
  "originalPrice": 449.99,
  "discount": 22,
  "currency": "EUR",
  "rating": 4.5,
  "reviewCount": 31412,
  "mainImage": "https://m.media-amazon.com/images/I/61gn8E2y8FL.jpg",
  "isPrime": true,
  "brand": "De'Longhi",
  "seller": "Amazon",
  "categories": ["Küche, Haushalt & Wohnen", "Kaffee & Espresso"],
  "features": ["13 Mahlgrade", "Cappuccino-System", "..."],
  "bestSellerRank": 7,
  "isSponsored": false,
  "isAvailable": true,
  "scrapedAt": "2026-05-15T14:23:00Z"
}
```

### ✅ Capabilities & Limits

Stated up front, so you do not pay a run to find out.

**Built here:** search pagination is hard-capped at 10 pages per run, independent of `maxProducts` (schema maximum 500), and review pagination at 5 pages per ASIN, independent of `maxReviewsPerProduct` (schema maximum 100). Amazon decides how many cards each page carries, so the product total is whatever those 10 pages contain — asking for 500 will not paginate further. Feed ASINs or URLs through `productUrls` to bypass the search crawl and go past that ceiling. Both ceilings are printed in the run log before the crawl starts.

| Input / feature | Supported | Notes |
|---|---|---|
| `country` | ✅ | Amazon marketplace target. Each country uses its own TLD + locale + currency. |
| `searchQuery` | ✅ | Product search term (e.g., 'iPhone 15', 'bluetooth headphones', 'laptop') |
| `productUrls` | ✅ | Direct Amazon product URLs (alternative to search). Use full URLs matching the chosen country. |
| Result volume (`maxProducts`) | ⚠️ | Ceiling, not a guarantee — the crawl delivers what 10 search pages yield |
| `includeReviews` | ✅ | Scrape customer reviews per product (slower, more data) |
| Result volume (`maxReviewsPerProduct`) | ⚠️ | Ceiling, not a guarantee — the crawl delivers what 5 review pages per ASIN yield |
| `sortBy` | ✅ | How to sort search results |
| `minPrice` | ✅ | Filter products above this price (in local currency) |
| Result volume (`maxPrice`) | ⚠️ | Filter products below this price (0 = no limit, in local currency) |
| `primeOnly` | ✅ | Only return products with Amazon Prime delivery |
| Proxy | ⚠️ | Default is RESIDENTIAL with the IP country matched to `country`, for every marketplace including amazon.com. Datacenter IPs return 200 OK with 0 products on Amazon US (measured 2026-06-02, run `A5ZbjmQ62Ii2xsA2F`) and are geo-blocked on amazon.de/uk/fr |
| Cheap datacenter proxy by default | ❌ | No marketplace defaults to datacenter. Datacenter is only used as an automatic fallback when RESIDENTIAL cannot be allocated |
| Selecting datacenter without a country | ❌ | A proxy config of just `{"useApifyProxy": true}` does not override the automatic routing. To force datacenter, set a proxy country (e.g. `apifyProxyCountry: "US"`) with no residential group |
| Search pages beyond 10 | ❌ | Pagination halts at the 10th result page even when `maxProducts` is still unmet |
| Review pages beyond 5 | ❌ | Review pagination halts at the 5th page per ASIN even when `maxReviewsPerProduct` is still unmet |

### 💰 Pricing

**$0.008 per product extracted** (`product-scraped`), plus the Apify platform usage of the run, billed to you at Apify's standard rates and
shown on the run page.

Pay-per-event (`product-scraped`): you are only charged once per product successfully extracted. CAPTCHA / 0-item runs do **not** charge (NEVER 0 ITEMS guard).

### 🚀 Use cases

- **Multi-market price comparison** — same ASIN/equivalent product in US vs UK vs DE for arbitrage research
- **Currency-aware competitor monitoring** — track regional pricing in EUR/GBP/USD/CAD with correct decimal parsing
- **Affiliate catalog seeding** — bulk-import 500 products per country into a comparison shopping site
- **Prime-eligible inventory scout** — filter to fast-delivery SKUs per region
- **Localized SEO research** — extract `features` + `categories` in DE/FR/IT/ES for non-English keyword mining

### ⚠️ Common errors

| Error | Cause | Fix |
|---|---|---|
| `[FAIL] Zero products extracted` | Aggressive anti-bot in target country (typically DE/UK on hot keywords) | Switch `proxyConfiguration.apifyProxyGroups: ["RESIDENTIAL"]` + matching `countryCode` |
| `Price parsed as 1.299` for `1.299,90 €` | Old version (<1.0) used BR-only parser | Locale parser is automatic from v1.0; upgrade |
| `productUrls did not match country` | URL points to `.com` while `country: "UK"` | URLs must match the chosen marketplace TLD |
| `CAPTCHA page detected` | Datacenter IP fingerprinted | Retry with RESIDENTIAL proxy in the same country |

### 🔒 Privacy

No credentials stored. Apify proxy traffic only — no third-party proxy vendors. Datasets stay inside your Apify account.

### 📚 Related actors

- [Amazon US Intelligence](https://apify.com/viralanalyzer/amazon-us-intelligence) — dedicated US-only with deeper review extraction
- [Amazon Brazil Intelligence](https://apify.com/viralanalyzer/amazon-brazil-intelligence) — Amazon.com.br canonical (BR-only)
- [Mercado Livre Scraper](https://apify.com/viralanalyzer/mercadolivre-scraper) — LATAM equivalent
- [Etsy Product Intelligence](https://apify.com/viralanalyzer/etsy-product-intelligence) — handmade/vintage marketplace (BYOC)

### 🆕 Changelog

- **v1.1** (2026-08-28): documentation corrected against the code. The proxy default is RESIDENTIAL with a matching country for every marketplace — the previous datacenter-by-default wording contradicted the routing block in `src/main.mjs`. The 10-search-page and 5-review-page ceilings are now named in the code, printed in the run log and stated in the input schema.
- **v1.0** (2026-05-14): Initial release. 7 marketplaces, country-aware Prime filter, locale-correct price parser, CheerioCrawler, NEVER 0 ITEMS guard.

***

### Português

## 🌍 Amazon Multi-País Scraper — US / UK / DE / FR / IT / ES / CA

> 🔗 [Ver na Apify Store](https://apify.com/viralanalyzer/amazon-multi-country)

Scrape **produtos Amazon em 7 marketplaces** (US, UK, DE, FR, IT, ES, CA) com um único actor. TLD, locale, moeda, Accept-Language e ID do filtro Prime corretos por país. Lida tanto com preço decimal por ponto (US/UK/CA) quanto por vírgula (DE/FR/IT/ES) automaticamente.

#### ✨ Recursos

- **7 marketplaces num actor só** — `amazon.com`, `.co.uk`, `.de`, `.fr`, `.it`, `.es`, `.ca`
- **Filtro Prime por país** — cada marketplace tem seu próprio `primeFilterRh` (browse node) validado
- **Parser de preço por locale** — detecta automaticamente se decimal é `.` ou `,`
- **Busca OU URLs diretas** — palavra-chave OU lista de URLs que casem com o país escolhido
- **Ordenação** — relevância / preço asc/desc / rating / mais novos
- **Faixa de preço** — `minPrice` / `maxPrice` em moeda local
- **Apenas Prime** — adiciona à URL de busca o `rh=p_85%3A<id>` específico da região
- **Reviews opcionais** — lidas de no máximo 5 páginas de review por ASIN
- **CheerioCrawler** — leve, sem overhead Playwright, roda em proxy RESIDENTIAL escolhido automaticamente para o país
- **NUNCA 0 ITENS** — actor falha alto com diagnóstico (tamanho HTML, selectors testados, proxy ativo)

#### 📥 Input

| Parâmetro | Tipo | Obrigatório | Default | Descrição |
|---|---|---|---|---|
| `country` | enum | Não | `US` | Marketplace alvo |
| `searchQuery` | string | Sim\* | `iphone 15` | Termo de busca |
| `productUrls` | string\[] | Sim\* | `[]` | URLs diretas (alternativa à busca) |
| `maxProducts` | integer | Não | `10` | Teto de produtos (1-500). A paginação de busca para na 10ª página, então valores altos costumam render menos |
| `sortBy` | enum | Não | `relevance` | Ordenação |
| `minPrice` / `maxPrice` | number | Não | `0` | Faixa de preço em moeda local |
| `primeOnly` | boolean | Não | `false` | Só produtos elegíveis ao Prime |
| `includeReviews` | boolean | Não | `false` | Extrair reviews |
| `maxReviewsPerProduct` | integer | Não | `10` | Teto de reviews por produto (1-100). A paginação de review para na 5ª página por ASIN |
| `proxyConfiguration` | object | Não | RESIDENTIAL + país | Sem mexer, a execução usa RESIDENTIAL com IP do país escolhido em `country`. Para usar datacenter é preciso definir um país de proxy explicitamente |

#### 💰 Cobrança

Pay-per-event `product-scraped`: você só paga por produto extraído com sucesso. Runs com CAPTCHA ou 0 itens **não cobram**.

#### 🚀 Casos de uso

- Comparação de preço entre mercados (US vs UK vs DE) para arbitragem
- Monitoramento de concorrência regional em EUR/GBP/USD/CAD
- População de catálogo afiliado multi-país
- Inventário Prime-elegível por região
- SEO multi-idioma a partir de `features` e `categories`

#### ⚠️ Erros comuns

- `[FAIL] Zero products extracted`: anti-bot agressivo — trocar para `RESIDENTIAL` no mesmo `countryCode`
- `CAPTCHA page detected`: IP datacenter sinalizado — retry com residential
- `productUrls did not match country`: as URLs precisam casar o TLD do `country` escolhido

#### 🔒 Privacidade

Sem credenciais armazenadas. Tráfego só via Apify Proxy. Datasets ficam na sua conta Apify.

#### 📚 Actors relacionados

- [Amazon US Intelligence](https://apify.com/viralanalyzer/amazon-us-intelligence)
- [Amazon Brazil Intelligence](https://apify.com/viralanalyzer/amazon-brazil-intelligence)
- [Mercado Livre Scraper](https://apify.com/viralanalyzer/mercadolivre-scraper)
- [Etsy Product Intelligence](https://apify.com/viralanalyzer/etsy-product-intelligence)

#### 🆕 Changelog

- **v1.0** (2026-05-14): release inicial com 7 marketplaces, Prime filter por país, parser locale-aware.

# Actor input Schema

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

Amazon marketplace target. Each country uses its own TLD + locale + currency.

## `searchQuery` (type: `string`):

Product search term (e.g., 'iPhone 15', 'bluetooth headphones', 'laptop')

## `productUrls` (type: `array`):

Direct Amazon product URLs (alternative to search). Use full URLs matching the chosen country.

## `maxProducts` (type: `integer`):

Ceiling on products scraped, NOT a guarantee. Search pagination stops after 10 result pages, so values needing an 11th page are unreachable. Direct productUrls are not affected by this limit.

## `includeReviews` (type: `boolean`):

Scrape customer reviews per product (slower, more data)

## `maxReviewsPerProduct` (type: `integer`):

Ceiling on reviews per product, NOT a guarantee. Review pagination stops after 5 pages per ASIN, so asking for 100 typically returns fewer.

## `sortBy` (type: `string`):

How to sort search results

## `minPrice` (type: `number`):

Filter products above this price (in local currency)

## `maxPrice` (type: `number`):

Filter products below this price (0 = no limit, in local currency)

## `primeOnly` (type: `boolean`):

Only return products with Amazon Prime delivery

## `proxyConfiguration` (type: `object`):

Proxy settings. Left as-is, every marketplace runs on RESIDENTIAL with the IP country matched to your country choice — datacenter IPs return 200 OK with zero products on Amazon US and are geo-blocked on amazon.de/uk/fr. Datacenter is only an automatic fallback when RESIDENTIAL cannot be allocated. To force datacenter you must set a proxy country explicitly and leave the residential group unset.

## Actor input object example

```json
{
  "country": "DE",
  "searchQuery": "wireless mouse",
  "productUrls": [],
  "maxProducts": 3,
  "includeReviews": false,
  "maxReviewsPerProduct": 10,
  "sortBy": "relevance",
  "minPrice": 0,
  "maxPrice": 0,
  "primeOnly": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (type: `string`):

Dataset containing all scraped results. Each item follows the dataset schema.

# 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 = {
    "country": "DE",
    "searchQuery": "wireless mouse",
    "maxProducts": 3
};

// Run the Actor and wait for it to finish
const run = await client.actor("viralanalyzer/amazon-multi-country").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 = {
    "country": "DE",
    "searchQuery": "wireless mouse",
    "maxProducts": 3,
}

# Run the Actor and wait for it to finish
run = client.actor("viralanalyzer/amazon-multi-country").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 '{
  "country": "DE",
  "searchQuery": "wireless mouse",
  "maxProducts": 3
}' |
apify call viralanalyzer/amazon-multi-country --silent --output-dataset

```

## MCP server setup

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

```

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/890HC83xjDCm5fSjX/builds/UJcy5zmjphj1ROvjX/openapi.json
