# Cheap Amazon Scraper — Search, Category & Product Data (`istmobot/amazon-scraper-cheap`) Actor

Scrape Amazon products from search, category and product URLs on amazon.com, .co.uk, .de and .es: title, price, list price, stars, reviews count, ASIN, brand, images, availability, seller, best-seller ranks. Same input and output fields as the popular Amazon crawlers at $2.25 per 1,000 products.

- **URL**: https://apify.com/istmobot/amazon-scraper-cheap.md
- **Developed by:** [Istmobot](https://apify.com/istmobot) (community)
- **Categories:** E-commerce, Lead generation, Developer tools
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.25 / 1,000 products

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

## Cheap Amazon Scraper: search, category and product data

**A cheaper drop-in alternative with the same input and output fields.** Paste the input you already use with the most popular Amazon crawler on Apify Store (`categoryOrProductUrls`, `maxItemsPerStartUrl`, ...) and get the same field names back (`title`, `price`, `stars`, `reviewsCount`, `asin`, `url`, `brand`, `thumbnailImage`, ...). The price is **$2.75 per 1,000 products** with full details (about 1.8× cheaper) instead of $5, or $2.25 per 1,000 for search-page data only.

### Price comparison

| | This Actor | Most popular Amazon crawler |
|---|---|---|
| Product with full details (default) | **$2.75 / 1,000** | $5.00 / 1,000 (free plan) |
| Search-page data only (`scrapeProductDetails: false`) | **$2.25 / 1,000** | $5.00 / 1,000 |
| Run start | $0.001 | — |
| Errors (invalid URL, product not found) | free | free |

You pay per product returned, not for compute or proxies. Set a maximum cost per run and the Actor stops cleanly when it is reached.

### What it scrapes

- **Search result pages**: `https://www.amazon.com/s?k=keyboard`. All search filters in the URL (price range, brand, rating, Prime, sort order) are kept. Without a sort order (`s=`), results are sorted by popularity (`s=popularity-rank`), the same as the original crawler.
- **Category pages**: `https://www.amazon.com/s?bbn=16225016011&rh=n%3A20972781011` or `https://www.amazon.com/b?node=172282`
- **Product pages**: `https://www.amazon.com/dp/B09X7MPX8L` (any `/dp/` or `/gp/product/` link)

**Marketplaces:** amazon.com, amazon.co.uk, amazon.de, amazon.es.

Prices are **local and include VAT**: amazon.co.uk and amazon.de get a local delivery address (London SW1A 1AA, Berlin 10115; override with `zipCode`), amazon.com is scraped from US IPs and amazon.es from Spanish ones. You see what a local shopper sees.

### Input

```json
{
    "categoryOrProductUrls": [
        { "url": "https://www.amazon.com/s?k=keyboard" },
        { "url": "https://www.amazon.de/dp/B09CG11ZW1" }
    ],
    "maxItemsPerStartUrl": 100,
    "maxSearchPagesPerStartUrl": 9999,
    "scrapeProductDetails": true
}
```

| Field | Description |
|---|---|
| `categoryOrProductUrls` | Search, category or product URLs (required). |
| `maxItemsPerStartUrl` | Max products per start URL. 0 or empty = no limit. |
| `maxSearchPagesPerStartUrl` | Max result pages per start URL. |
| `scrapeProductDetails` | `true` (default): open every product page for the full record. `false`: quick search-page fields only, $2.25 instead of $2.75 per 1,000. |
| `zipCode` | Optional delivery postcode for amazon.co.uk and amazon.de. |
| `language` | Page language. Empty = English wherever the marketplace offers it (e.g. amazon.de), the same as the original crawler; set `de` for German pages on amazon.de. Unsupported languages fall back to the marketplace's own. |

### Output

One item per product. Example (amazon.com, with details):

```json
{
    "title": "Logitech MK270 Full Size Wireless Keyboard and Mouse Combo - Rose",
    "url": "https://www.amazon.com/dp/B0D2X7DCG5",
    "asin": "B0D2X7DCG5",
    "brand": "Logitech",
    "author": null,
    "price": { "value": 19.99, "currency": "$" },
    "listPrice": { "value": 29.99, "currency": "$" },
    "inStock": true,
    "inStockText": "In Stock",
    "delivery": "Tuesday, November 3",
    "stars": 4.5,
    "starsBreakdown": { "5star": 0.75, "4star": 0.12, "3star": 0.05, "2star": 0.02, "1star": 0.06 },
    "reviewsCount": 111464,
    "hasReviews": true,
    "reviewsLink": "https://www.amazon.com/product-reviews/B0D2X7DCG5",
    "breadCrumbs": "Electronics > Computers & Accessories > Computer Accessories & Peripherals > Keyboards, Mice & Accessories > Keyboard & Mouse Combos",
    "thumbnailImage": "https://m.media-amazon.com/images/I/61mtdhRTYmL._AC_SL1500_.jpg",
    "highResolutionImages": ["https://m.media-amazon.com/images/I/61mtdhRTYmL._AC_SL1500_.jpg"],
    "description": "Logitech® Wireless Combo MK270. The reliable wireless combo with a tiny Logitech plug-and-forget receiver...",
    "features": ["Reliable Plug and Play: The USB receiver provides a reliable wireless connection..."],
    "productOverview": [{ "key": "Brand", "value": "Logitech" }],
    "attributes": [{ "key": "Connectivity Technology", "value": "RF, Usb" }, { "key": "Number of Keys", "value": "104" }],
    "seller": { "name": "Amazon.com", "id": null, "url": null },
    "bestsellerRanks": [{ "rank": 1, "category": "Computer Keyboard & Mouse Combos" }],
    "isAmazonChoice": false,
    "monthlyPurchaseVolume": "9K+ bought in past month",
    "variantAsins": ["B079JLY5M5", "B0DK5M7QJR", "B0DHGDJF67"],
    "locationText": "Update location",
    "loadedCountryCode": "US",
    "input": "https://www.amazon.com/s?k=keyboard",
    "categoryPageData": { "pageNumber": 1, "saleSummary": null, "isSponsored": false, "bestsellerBadge": null, "productPosition": 6 },
    "unNormalizedProductUrl": "https://www.amazon.com/s?k=keyboard&s=popularity-rank",
    "scrapedAt": "2026-10-29T06:25:00.000Z"
}
```

With `scrapeProductDetails: false` you get `title`, `url`, `asin`, `price`, `listPrice`, `stars`, `reviewsCount`, `thumbnailImage`, `isAmazonChoice`, `monthlyPurchaseVolume` and `categoryPageData`.

#### Error items

Problems are reported as free items with the same format as the original:

```json
{ "error": "product_not_found", "errorDescription": "Loaded a 404 page. The product does not exist.", "input": "https://www.amazon.com/dp/B0ZZZZZZZZ", "url": "https://www.amazon.com/dp/B0ZZZZZZZZ" }
```

| `error` | Meaning |
|---|---|
| `invalid_url` | Not an Amazon search, category or product URL, or an unsupported marketplace |
| `product_not_found` | The product page is a 404 |
| `no_results_found` | The search returned no products |
| `fetch_failed` | Amazon kept blocking the page after all retries |

### Not included (yet)

To keep the price low, these extras of the bigger crawlers are not scraped: all offers (`offers` is always `[]`), seller profiles (`scrapeSellers`; `seller.reviewsCount`/`averageRating` stay `null`), per-variant prices (`variantDetails[].price` is `null`) and variants as separate results, the brand story and sustainability badges (`brandStory`, `sustainabilityFeatures` are `null`), A+ content modules (`aPlusContent` has `title`, `rawText`, `rawImages`), review snippets per AI-summary keyword, best-seller list pages (`/zgbs/`), reviews, and marketplaces other than .com, .co.uk, .de and .es. If you need one of them, open an issue.

### Tips

- Search filters are part of the URL. Set them on Amazon, then copy the URL.
- Amazon shows at most about 7 to 20 result pages per search. To get more products, split a search into narrower ones (price ranges, sub-categories).
- Schedule the Actor to track prices, ranks or new products over time.

# Actor input Schema

## `categoryOrProductUrls` (type: `array`):

Search result URLs (e.g. https://www.amazon.com/s?k=keyboard), category URLs (https://www.amazon.com/s?bbn=16225016011\&rh=n%3A20972781011 or https://www.amazon.com/b?node=172282) or product URLs (https://www.amazon.com/dp/B09X7MPX8L). Filters in a search URL (price, brand, rating, sort...) are kept. Marketplaces: amazon.com, amazon.co.uk, amazon.de, amazon.es.

## `maxItemsPerStartUrl` (type: `integer`):

Maximum number of products for each start URL. 0 or empty = no limit (Amazon shows up to about 7-20 result pages per search).

## `maxSearchPagesPerStartUrl` (type: `integer`):

Stop after this many search result pages for each start URL. Works together with the results limit: whichever is reached first.

## `scrapeProductDetails` (type: `boolean`):

On (default): opens each product page for brand, availability, delivery, seller, features, description, attributes, images, best-seller ranks, star breakdown and variants. Off: only the quick fields from the search page (title, price, list price, stars, reviews count, thumbnail, Amazon's Choice, bought in past month), at $2.25 instead of $2.75 per 1,000.

## `zipCode` (type: `string`):

Delivery address used for prices, availability and delivery dates. Applies to amazon.co.uk and amazon.de (default: London SW1A 1AA, Berlin 10115). amazon.com uses US addresses and amazon.es Spanish ones.

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

Page language. Empty = English wherever the marketplace offers it (e.g. amazon.de), like the original crawler. Set "de" for German pages on amazon.de. Unsupported languages fall back to the marketplace's own.

## `maxConcurrency` (type: `integer`):

Pages downloaded in parallel.

## Actor input object example

```json
{
  "categoryOrProductUrls": [
    {
      "url": "https://www.amazon.com/s?k=keyboard"
    }
  ],
  "maxItemsPerStartUrl": 100,
  "maxSearchPagesPerStartUrl": 9999,
  "scrapeProductDetails": true,
  "maxConcurrency": 10
}
```

# Actor output Schema

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

No description

# 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 = {
    "categoryOrProductUrls": [
        {
            "url": "https://www.amazon.com/s?k=keyboard"
        }
    ],
    "maxItemsPerStartUrl": 100,
    "maxSearchPagesPerStartUrl": 9999
};

// Run the Actor and wait for it to finish
const run = await client.actor("istmobot/amazon-scraper-cheap").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 = {
    "categoryOrProductUrls": [{ "url": "https://www.amazon.com/s?k=keyboard" }],
    "maxItemsPerStartUrl": 100,
    "maxSearchPagesPerStartUrl": 9999,
}

# Run the Actor and wait for it to finish
run = client.actor("istmobot/amazon-scraper-cheap").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 '{
  "categoryOrProductUrls": [
    {
      "url": "https://www.amazon.com/s?k=keyboard"
    }
  ],
  "maxItemsPerStartUrl": 100,
  "maxSearchPagesPerStartUrl": 9999
}' |
apify call istmobot/amazon-scraper-cheap --silent --output-dataset

```

## MCP server setup

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

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/2wIZ1Hmq0vMH1tl1K/builds/Ra3onM825JrnUbZVy/openapi.json
