# Amazon Search Scraper (`danthedataman/amazon-search-scraper`) Actor

Amazon search results by keyword/URL in 18 marketplaces (no FR/CA). Two 16-row amazon.com runs on 2026-10-12: 32/32 rows had USD prices and US delivery-location text. No login.

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

## Pricing

from $0.12 / 1,000 search 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 Search Scraper

Collect Amazon search cards from keywords or marketplace search URLs, with each card's displayed price, rating, review count, rank, badges and delivery information.

```json
{"keywords": ["wireless headphones"], "marketplace": "US", "maxPages": 1, "maxItems": 16}
```

Supply `keywords`, `searchUrls`, or both. Omitted or empty query arrays collect no rows and incur no row charges; the start charge still applies. Each keyword and URL is a separate query; repeated ASINs across queries or pages remain separate rows.

### Input

| Field | Type | Default | What it does |
| --- | --- | --- | --- |
| `keywords` | array | None | Keyword searches; the input form prefills `wireless headphones`. |
| `searchUrls` | array | None | HTTPS Amazon marketplace `/s` URLs; preserves department and refinement parameters. |
| `marketplace` | string | `US` | Keyword host: US, UK, DE, JP, IN, AU, IT, ES, MX, BR, NL, SE, PL, TR, SG, SA, AE or EG. URLs use their own host. |
| `language` | string | Omitted | US: en_US/es_US; DE: en_GB/de_DE; JP: en_US/ja_JP; IN: en_IN/hi_IN; IT: en_GB/it_IT; ES: en_GB/es_ES. Other host/value combinations are refused. |
| `sort` | string | Source choice | `relevanceblender`, `price-asc-rank`, `price-desc-rank`, `review-rank`, `date-desc-rank` or `exact-aware-popularity-rank`. |
| `minPrice` | number | Omitted | Amazon's minimum-price parameter in major currency units. |
| `maxPrice` | number | Omitted | Amazon's maximum-price parameter in major currency units. |
| `minStars` | number | Omitted | `4` follows the page's own four-star refinement; other values are refused. |
| `primeOnly` | boolean | `false` | `true` is unavailable: the logged-out pages expose no Prime refinement. |
| `maxPages` | integer | `1` | Maximum pages per query, following the source Next link; at most `20`. |
| `maxItems` | integer | `16` | Maximum delivered rows per query. |
| `maxResults` | integer | `1000` | Maximum delivered rows across the run. |
| `includeSponsored` | boolean | `true` | `false` omits sponsored cards after source ranks are assigned. |
| `deliveryZip` | string | Omitted | Anonymous delivery ZIP/postal code within the marketplace country. |
| `deliveryCountry` | string | Omitted | Two-letter country selected from the site's anonymous delivery options. |
| `proxyConfiguration` | object | Residential by marketplace | Optional buyer proxy settings. The form prefill selects RESIDENTIAL; country is derived from the target host unless supplied. |

Zero for any row or page limit collects no rows; the start charge still applies. Price, star and sort filters use Amazon's own parameters, and unsupported source options are refused. Amazon's price filter can include edge rows; the Actor preserves the source answer. Queries end when the source has no Next link, a limit binds, or the collection time budget is reached. Pagination varies by query; a source can end before the requested page limit.

### Output

One row represents one complete source card occurrence. Errors are saved in `ERRORS`, with query coverage and transport outcomes in `SUMMARY`, and never enter the billable dataset. A source-confirmed no-results page is a successful empty answer.

| Fields | Meaning |
| --- | --- |
| `query`, `searchUrl`, `queryServed` | Requested query and starting URL, plus the page's own query or spelling substitution. |
| `marketplace`, `language`, `scrapedAt` | Verified page host code, actual page language and UTC collection timestamp. |
| `page`, `rank`, `positionOverall` | One-based source page/card ranks. Overall position adds preceding pages' card counts for a walk starting on page one; it is null throughout a walk starting later. Sponsored cards count before removal; limits never renumber rows. |
| `asin`, `title`, `url`, `imageUrl` | The card's own identity, title, product link and image. |
| `price`, `listPrice` | Displayed money as `{value, currency, raw}`; value is in major currency units, and raw retains the source text. List price is the displayed strike-through price. |
| `priceType` | `featured`, `other_offer`, `subscription_offer`, or null when no price is displayed. |
| `rating`, `reviewCount` | Individual product rating on the source's five-star scale and integer review count; brand averages and purchase counts are excluded. |
| `isSponsored`, `isPrime`, `isBestSeller`, `isAmazonChoice` | Card-owned flags. Prime is null when the card offers no delivery or Prime marker. |
| `boughtPastMonth`, `offersCount`, `couponText`, `dealText` | Displayed purchase count, offer-count text, coupon and deal text. |
| `deliveryText`, `fastestDeliveryText`, `locationText` | Card delivery text and the page's delivery location. |
| `variantTeaser`, `sustainability` | Displayed variant and sustainability text. |

A value the card does not display stays null. A displayed value that cannot be extracted becomes an unbilled extraction error; it is never replaced with a guessed value. Currency comes from the displayed marker within the page's verified marketplace identity. Explicit displayed currencies are preserved even when different from that marketplace's home currency. In two 16-row amazon.com runs on 2026-10-12, all 32 rows carried USD prices and US delivery-location text. Lazy carousel placeholders emit no row.

### Access and limits

The primary path uses anonymous browserless requests through residential proxies. A slow first read can start one more fresh identity after 0.75 seconds; the accepted identity is kept for later reads and the other is retired, and a read still in flight is cancelled. This can add proxy traffic and does not guarantee faster small jobs. `SUMMARY` counts the extra requests and their known completed transfer bytes; cancelled reads have unknown byte totals.

Classified source refusals rotate to a fresh identity within a bounded ladder. WAF, captcha, login and rate-limit responses stop new primary requests and switch to the shared browser service, unless an already-running first read returns an accepted answer. Browser fallback is capped: reads beyond 3 browser fallbacks per run are skipped, listed in ERRORS and not charged. Buyer proxy settings are passed to the browser where supported; unsupported custom URLs, groups or countries produce an unbilled fallback error.

Collection stops about 30 seconds before the run's timeout (about 270 seconds at the default 300-second timeout), and a charge limit stops further collection. No product-detail, offers, sellers or review-list pages are crawled.

CA is available through the browser fallback at higher cost; not yet offered. CA keywords and URLs are refused before collection. FR is unavailable: search returns HTTP 202 through every route measured; its keywords and URLs are also refused. A requested delivery location is refused if the browser service cannot preserve it. The six listed language preference pairs use the source's language parameter; other values are refused. UK and AU preference pages expose no language selector, and MX exposes no language-preference link on the measured search page. Additional marketplace language preferences have not been verified. Prime-only filtering remains unavailable on the logged-out source.

Amazon's [Conditions of Use](https://www.amazon.com/gp/help/customer/display.html?nodeId=508088) exclude commercial use of product listings, descriptions and prices, and data-mining or similar extraction tools. This restriction applies to the source; buyers should assess their intended use. Search cards and availability change over time and with the delivery location.

### Billing

Each returned row is one result event. Each run also has a start event, charged once per GB of run memory (one event at the default 256 MB); a run that returns no rows still pays it. Records in `ERRORS` are never charged.

# Actor input Schema

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

Search terms. Omitted or empty keywords start no keyword searches.

## `searchUrls` (type: `array`):

HTTPS marketplace /s URLs. Department and refinement parameters are preserved.

## `marketplace` (type: `string`):

Marketplace for keywords. Search URLs use their own host. CA is available through the browser fallback at higher cost; not yet offered. FR search returns HTTP 202 through every route measured and is unavailable.

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

A source-supported language preference code. Unsupported marketplace/value combinations are refused.

## `sort` (type: `string`):

Amazon's own sort value. Omit to preserve the URL's choice or the source default.

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

Amazon low-price parameter in the displayed marketplace currency's major units.

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

Amazon high-price parameter in major currency units; source filters may include edge rows.

## `minStars` (type: `number`):

4 follows the current page's own 4-star refinement. Other values are refused.

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

True is refused where the logged-out page offers no Prime refinement. Results are never filtered locally to simulate it.

## `maxPages` (type: `integer`):

Follow source Next links up to this limit. Zero collects no rows.

## `maxItems` (type: `integer`):

Maximum delivered card occurrences per query. Zero collects no rows.

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

Overall delivered row cap. Zero collects no rows.

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

False omits sponsored cards after assigning the source ranks.

## `deliveryZip` (type: `string`):

Anonymous delivery ZIP in the marketplace country. Refused if the route cannot preserve it.

## `deliveryCountry` (type: `string`):

Two-letter country from the site's anonymous delivery options. Use instead of ZIP for international delivery.

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

Optional buyer proxy settings. The residential prefill derives country from the target marketplace unless you supply one.

## Actor input object example

```json
{
  "keywords": [
    "wireless headphones"
  ],
  "marketplace": "US",
  "primeOnly": false,
  "maxPages": 1,
  "maxItems": 16,
  "maxResults": 1000,
  "includeSponsored": true,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

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

No description

## `errors` (type: `string`):

Handled request failures, when present; never result rows.

# 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 headphones"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("danthedataman/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 = {
    "keywords": ["wireless headphones"],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("danthedataman/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 '{
  "keywords": [
    "wireless headphones"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call danthedataman/amazon-search-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,danthedataman/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/mgjCn9WDIaC4McSzh/builds/xXkmgNePDj3sRRkkR/openapi.json
