# Amazon Scraper: Products, Search Results & Best Sellers (`deepmine/amazon-scraper`) Actor

Scrape Amazon products by URL, ASIN or keyword, search results and Best Seller lists on any marketplace: price, rating and star breakdown, reviews count, Best Sellers Rank, specs, images, variants, seller, delivery for your ZIP and seller offers. No login, no browser.

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

## Pricing

from $1.49 / 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.
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: Products, Search Results & Best Sellers

Scrape Amazon products by URL, ASIN or keyword, whole search results and Best Seller lists, on any Amazon
marketplace: price and list price, rating with the star breakdown, reviews count, Best Sellers Rank, every spec,
features, images, variants, seller, delivery for your ZIP code, seller offers, seller profiles and Amazon's AI review
summary. No login, no cookies, no browser.

| title | brand | price | stars | reviewsCount | position | listName | asin |
|---|---|---|---|---|---|---|---|
| Apple EarPods Headphones with USB-C Plug, Wired Ear Buds wit… | Apple | $19.00 | 4.5 | 19,206 | 2 | Electronics | B0DCH8VDXF |
| Apple AirTag (2nd Generation): Tracker for Keychain, Wallet,… | Apple | $24.00 | 4.6 | 12,062 | 3 | Electronics | B0GJTFXNRX |
| Amazon Fire TV Stick 4K Plus with AI-powered Fire TV Search,… | Amazon | $69.99 | 4.6 | 115,523 | 5 | Electronics | B0F7Z4QZTT |

<sub>Collected 2026-10-19 from the Best Sellers in Electronics list (a platform run of the prefilled input).</sub>

With **🏪 Seller profiles** on, every third-party seller gets a row of its own:

| sellerName | sellerBusinessName | sellerAddress | sellerPhone | sellerRating12mStars | sellerRating12mCount | sellerRating12mPositivePercent |
|---|---|---|---|---|---|---|
| 6ave | 6TH AVENUE EXPRESS LLC | 50 Atrium Drive, SOMERSET, NJ, 08873, US | 800-927-0702 | 4.6 | 1,341 | 91 |
| World of Books (previously glenthebookseller) | SBYB, INC. | 900 KNELL ST, UNIT E, MONTGOMERY, IL, 60538-1381, US | | 4.6 | 20,999 | 89 |
| B King | Shenzhen Shanshanzikeji Youxiangongsi | Minxin Community, Minzhi Street, Longhua District, … Shenzhen, Guangdong, 518131, CN | | 4.9 | 2,476 | 100 |

<sub>Collected 2026-10-19: the sellers of 4 products' buy boxes and offers (a platform run, 22 profiles).</sub>

**$1.99 per 1,000 products** on the Starter plan ($2.49 Free, $1.69 Scale, $1.49 Business, Platinum and Diamond).
Seller offers, only if you turn them on: $0.75 per 1,000 offers. Seller profiles, only if you turn them on: $0.99 per
1,000 sellers, once per seller per run. The prefilled run (40 products: 20 from a search and 20 best
sellers, offers off) costs about $0.08 on Starter.

### What you can scrape

- **Products** by URL (`amazon.com/dp/B0…`, any marketplace) or by ASIN.
- **Search results** by keyword or by a search URL with any filters (price, brand, Prime…), and category pages
  (`amazon.com/b?node=…`).
- **Ranked lists**: Best Sellers, New Releases, Movers & Shakers, Most Wished For, Most Gifted: all 100 ranks.
- **Seller offers** ($): every seller's price, condition, delivery and rating from the all-offers panel, in a
  second dataset.
- **Seller profiles** ($): business name, business address, phone, storefront and ratings (30 days, 90 days, 12
  months, lifetime, with the star breakdown) of the buy box seller and every offer's seller, read once per seller per
  run: one row per seller in a third dataset, and the profile on their product and offer rows.
- **Delivery location**: prices, stock and delivery dates for a ZIP / postcode, or for international shipping to a
  country. Other marketplaces are read for their own capital (amazon.de: Berlin, in EUR) unless you set one.

### How to use it

1. Paste **🔗 Amazon URLs** (products, searches, best seller lists) or type **🔍 Search keywords**.
2. Set **📊 Max products per URL or keyword** (a best seller list has 100).
3. Leave **📝 Full product details** on for the full row; off returns only what the list shows (title, price,
   rating, reviews, image, position), much faster, at the same price.
4. Press **Start**. Rows stream into the dataset in the list's order. The first 3 go out as soon as their pages
   arrive, so they can come in a different order; every row has its `position` in the list (search rows also
   their `pageNumber`).

Saved inputs of junglee/Amazon-crawler run as they are: `categoryOrProductUrls`, `maxItemsPerStartUrl`,
`maxSearchPagesPerStartUrl`, `scrapeProductDetails`, `maxOffers`, `scrapeSellers`,
`maxProductVariantsAsSeparateResults`, `zipCode` and `countryCode` work the same way. `scrapeProductVariantPrices`,
`locationDeliverableRoutes`, `useCaptchaSolver`, `proxyCountry` and non-English `language` are not used: the log and
the run summary say so.

### Pricing

You pay per product in the dataset, once per product per run however many of your inputs list it, at your Apify
plan's price (see the Pricing tab). Seller offers are charged per offer, only when **🛍️ Seller offers per
product** is above 0. Seller profiles are charged per seller, once per run however many products it sells, only when
**🏪 Seller profiles** is on; Amazon itself has no profile page and is never charged. Products that fail are listed in the run summary and never charged. A run stops at your
spending limit without reading pages it can't deliver.

### Output

One row per product (the default dataset), with the same keys on every row; anything Amazon doesn't show is
`null`. Views: **📊 Overview**, **📈 Stats** (every number), **📝 Details**, **🛒 Buy box** and **💬 Reviews**.

| Key | What it is |
|---|---|
| thumbnailImage | The main picture |
| title, brand, author | Title, brand, book author |
| asin, url | Amazon's id and the product page |
| price, priceValue, currency | Price as shown ($19.00), as a number, ISO currency |
| listPrice, listPriceValue, discountPercent | Crossed-out list price and the discount in percent |
| priceRange, priceRangeMin, priceRangeMax | Variation parents: the price range |
| unitPrice, subscribeSavePrice | Price per unit ("$4.25 / count"), the Subscribe & Save price |
| coupon, promotions | The buy box coupon ("Apply $2 coupon") and other promotions ("Buy 4, save 10%") |
| shippingPrice, shippingPriceValue | Delivery price ('Free' or the amount) |
| inStock, inStockText, stockLeft, condition | Availability, units left ("Only 4 left in stock"), the buy box condition |
| isPrime | Prime delivery on the buy box offer |
| stars, reviewsCount | Average rating and number of ratings |
| fiveStarPercent … oneStarPercent | The star breakdown in percent |
| hasReviews | Whether it has ratings |
| aiReviewsSummarySnippet, aiReviewsSummary, aiReviewsKeywords | Amazon's "Customers say" summary and aspects |
| topReviews, topReviewsCount | The reviews the product page shows (8-13 when it shows them), one JSON object each: id, title, stars, date, country, verified purchase, helpful votes, variant, text, images. No reviewer names |
| reviewHighlights, reviewsLayout | Amazon's review snippets per aspect (~30, each with its review id); which of the two the page showed (A: full reviews, B: highlights) |
| monthlyPurchaseVolume, monthlyPurchases | "10K+ bought in past month" and the number |
| isAmazonChoice, amazonChoiceText | The Amazon's Choice badge |
| isBestSeller, bestSellerBadge, isClimatePledgeFriendly, badges | The #1 Best Seller badge, Climate Pledge Friendly, every badge shown |
| bestsellerRank, bestsellerCategory, bestsellerCategoryUrl | Best Sellers Rank in the main category |
| bestsellerRanks, bestsellerRankUrls | Every rank shown ("#12 in Earbud Headphones") and its list |
| breadCrumbs | The category path |
| descriptionSnippet, description, bookDescription | Description (or the seller's A+ "Product description") |
| features | The "About this item" bullets |
| attributes, productOverview, manufacturerAttributes | Product details, overview and technical specs as "Key: Value" |
| modelNumber, manufacturer, dateFirstAvailable, isbn13 | The same facts as their own columns (date as YYYY-MM-DD) |
| importantInformation, sustainabilityFeatures | Safety/legal notes, Climate Pledge Friendly features |
| aPlusContent, aPlusImages, aPlusVideos | The A+ (From the manufacturer) block |
| brandStory, brandStoryImages | The "From the brand" block |
| productComparisonAsins | ASINs in the comparison table |
| relatedAsins, relatedAsinsSource | The "Customers also viewed / bought" carousel's ASINs and its heading (never a sponsored carousel) |
| galleryThumbnails, highResolutionImages, videosCount, videoUrls | Gallery images, videos and their video files (mp4 / m3u8) |
| variantAsins, variantDimensions, variantAttributes, variantDetails | Variants: ASINs, what they differ in, this one's values, each variant |
| variantPrices, variantImages | Each variant's price ("ASIN: $19.99", when its swatch shows one or it was read as its own row) and picture |
| sellerName, sellerId, sellerUrl | The buy box seller |
| soldBy, shipsFrom, isFulfilledByAmazon | Who sells and who ships the buy box offer, and whether Amazon ships it |
| offersCount | Offers on the all-offers panel (with offers on), else the count the product page or a best seller list shows |
| lowestOfferPrice, lowestOfferText | The all-offers link: "New & Used (5) from $17.87" and that lowest price |
| returnPolicy, support, storeUrl | Returns, support, the brand store |
| delivery, fastestDelivery, locationText, loadedCountryCode | Delivery promise and the location it was read for |
| answeredQuestions, reviewsUrl | Answered questions (when shown), the reviews page |
| listType, position, pageNumber, isSponsored, badge | Where it was found: Product, Search or a ranked list, its rank/position |
| listName, listFullName, listUrl, subcategories, subcategoryUrls | The list or search it came from |
| marketplace, originalAsin, unNormalizedProductUrl, input, scrapedAt | Provenance and time (UTC) |

**🛍️ Seller Offers** (second dataset, with offers on): asin, productTitle, position, isPinnedOffer (the buy box),
condition, price, priceValue, currency, shippingPrice, shippingPriceValue, delivery, shipsFrom, sellerName,
sellerId, sellerUrl, sellerRating and its numbers (sellerStars, sellerRatingsCount, sellerPositivePercent12m: "4.5
out of 5, 553 ratings, 91% positive over 12 months"), offersUrl, productUrl, marketplace, input, scrapedAt.

**🏪 Seller Profiles** (third dataset, with seller profiles on): one row per seller: sellerLogoUrl, sellerName,
sellerId, sellerBusinessName, sellerAddress, sellerAddressLines, sellerPhone, sellerDetails (other labelled lines,
such as a VAT number), sellerUrl, sellerStorefrontUrl, sellerFeedbackSummary, and for each period (30d, 90d, 12m,
Lifetime) sellerRating30dStars, sellerRating30dCount, sellerRating30dPositivePercent (4-5 star ratings, as Amazon
counts "positive") and sellerRating30dBreakdown ("5 star: 84% (1,131)"); then sellerAbout, foundOnAsin (the product
that named it first), marketplace, input, scrapedAt. Buyer feedback comments are never read.

With seller profiles on, product rows (after `sellerUrl`, for the buy box seller) and offer rows (for that offer's
seller) also carry sellerProfileStatus (`read`; `amazon`: Amazon itself, amazon.com rows get Amazon's business
record; `failed`: Amazon refused the page on every try; `notRead`: your spending limit or the run's end came first;
`noSellerId`; null: no seller), sellerBusinessName, sellerAddress, sellerPhone, sellerStorefrontUrl and the 12 rating
numbers (sellerRating30dStars … sellerRatingLifetimePositivePercent).

**🧾 Run summary** (the OUTPUT record): per input its status, products delivered, products it listed that an
earlier input already delivered (with their position), failures; the delivery location per marketplace; calls and
traffic; thin product pages asked again (`thinPagesRetried`: Amazon sometimes serves a page without its price,
availability and rating breakdown, so it is read once more on a new IP and the fuller page is kept) and how many stayed
thin (`thinPagesKept`); with seller profiles on, `sellers`: profiles read, failed and not read.

#### Field map for junglee/Amazon-crawler users

Every field junglee/Amazon-crawler returns (its 57 product fields, then its seller profile fields) has a place here, flattened so it fits a table:

| junglee field | Our key(s) |
|---|---|
| aiReviewsSummary | aiReviewsSummary, aiReviewsKeywords |
| amazonChoiceText | amazonChoiceText |
| answeredQuestions | answeredQuestions |
| aPlusContent | aPlusContent, aPlusImages, aPlusVideos |
| asin | asin |
| attributes | attributes |
| attributesMapped | attributes |
| author | author |
| bestsellerPageData | position, listName, listFullName, listUrl |
| bestsellerRanks | bestsellerRanks, bestsellerRankUrls, bestsellerRank, bestsellerCategory, bestsellerCategoryUrl |
| bookDescription | bookDescription |
| brand | brand |
| brandStory | brandStory, brandStoryImages |
| breadCrumbs | breadCrumbs |
| categoryPageData | position, pageNumber, isSponsored, badge, listUrl |
| condition | condition |
| delivery | delivery |
| description | description |
| fastestDelivery | fastestDelivery |
| features | features |
| galleryThumbnails | galleryThumbnails |
| hasReviews | hasReviews |
| highResolutionImages | highResolutionImages |
| importantInformation | importantInformation |
| input | input |
| inStock | inStock |
| inStockText | inStockText |
| isAmazonChoice | isAmazonChoice |
| listPrice | listPrice, listPriceValue |
| loadedCountryCode | loadedCountryCode |
| locationText | locationText |
| manufacturerAttributes | manufacturerAttributes |
| monthlyPurchaseVolume | monthlyPurchaseVolume, monthlyPurchases |
| offers | offersCount + the offers dataset |
| originalAsin | originalAsin |
| price | price, priceValue, currency |
| priceRange | priceRange, priceRangeMin, priceRangeMax |
| productComparison | productComparisonAsins |
| productOverview | productOverview |
| returnPolicy | returnPolicy |
| reviewsCount | reviewsCount |
| reviewsLink | reviewsUrl |
| seller | sellerName, sellerId, sellerUrl |
| shippingPrice | shippingPrice, shippingPriceValue |
| stars | stars |
| starsBreakdown | fiveStarPercent .. oneStarPercent |
| support | support |
| sustainabilityFeatures | sustainabilityFeatures |
| thumbnailImage | thumbnailImage |
| title | title |
| unNormalizedProductUrl | unNormalizedProductUrl |
| url | url |
| variantAsins | variantAsins |
| variantAttributes | variantAttributes |
| variantDetails | variantDetails, variantDimensions, variantPrices, variantImages |
| videosCount | videosCount |
| visitStoreLink | storeUrl |
| seller.businessName | sellerBusinessName |
| seller.address | sellerAddress, sellerAddressLines |
| seller.phone | sellerPhone |
| seller.storefrontUrl | sellerStorefrontUrl |
| seller.rating30Days / rating90Days / rating12Months / ratingLifetime .starsOutOf5, .ratingCount | sellerRating30dStars, sellerRating30dCount … sellerRatingLifetimeStars, sellerRatingLifetimeCount |
| seller.rating… .percentageNStar, .absoluteNStar | sellerRating30dBreakdown … sellerRatingLifetimeBreakdown, sellerRating30dPositivePercent …  |
| seller.VAT, seller.email | sellerDetails (when the profile shows them) |
| offers\[].seller.reviewsCount, .averageRating | sellerRatingsCount, sellerStars (offer rows) |

junglee/amazon-bestsellers: `name` → `title`, `thumbnailUrl` →
`thumbnailImage`, `categoryName` / `categoryFullName` / `categoryUrl` → `listName` / `listFullName` / `listUrl`,
`numberOfOffers` → `offersCount`.

Other Amazon product scrapers' fields: `discount_percent` → `discountPercent`, `coupon` → `coupon`, `unit_price` →
`unitPrice`, `subscribe_save_price` → `subscribeSavePrice`, `videos` → `videoUrls`, `ships_from` → `shipsFrom`,
`sold_by / soldBy` → `soldBy`, `model_number` → `modelNumber`, `manufacturer` → `manufacturer`, `stock_left` →
`stockLeft`, `is_fba` → `isFulfilledByAmazon`, `is_prime` → `isPrime`, `related_asins` → `relatedAsins`, `badges` →
`badges`, `top_reviews` → `topReviews`.

### Limits

- Reviews: the product row has the rating, the star breakdown, the AI summary and the reviews the product page shows
  logged out (8-13 full reviews, or Amazon's highlight snippets); deeper review lists need a sign-in, which this Actor
  never uses.
- Rows are read from Amazon's English pages; titles and descriptions keep the language the seller wrote them in.
- A delivery postcode Amazon rejects stops that marketplace's inputs (rather than return another location's prices).
- Image links are Amazon's own and don't expire.

### FAQ

**Do I need proxies?** No: the default Apify datacenter proxy works for Amazon. A page Amazon refuses is asked
again on another IP.

**Why did a product come out once when two inputs list it?** You pay once per product per run; the run summary
lists the second input's position for it.

**What if a run is interrupted?** Resurrect it: products already in the dataset are never pushed or charged again,
seller offers are charged exactly once, for the offers stored, and seller profiles once per seller stored.

### Your feedback

Found a bug, or a field you need? Open an issue on the Issues tab and we'll answer within two days. If the data
helped you, a short review on this page helps other users find the Actor.

# Actor input Schema

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

Product pages (amazon.com/dp/B0…), search results with any filters (amazon.com/s?k=keyboard), category pages (amazon.com/b?node=…) and ranked lists: Best Sellers, New Releases, Movers & Shakers. Any Amazon marketplace.

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

Searched on the marketplace set under More inputs, like an amazon.com/s?k=… URL, e.g. usb c cable.

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

Each search or ranked list stops after this many products (a Best Seller list has 100). A product URL always gives one. Products found twice count once.

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

On: open every product found and return the full row (specs, Best Sellers Rank, features, images, variants, seller, delivery). Off: only what the list shows (title, price, rating, reviews, image, position), much faster. Same price.

## `maxOffers` (type: `integer`):

Also list up to this many seller offers per product (price, condition, seller, ships from, delivery) in the Offers dataset, charged per offer. 0 = none.

## `scrapeSellers` (type: `boolean`):

Also read each seller's Amazon profile (business name, address, phone, storefront, ratings over 30 days, 90 days, 12 months and lifetime) for the buy box seller and, with offers on, every offer's seller: one row per seller in the Sellers dataset, and the profile on their product and offer rows. Charged once per seller per run, however many products it sells. Amazon itself is never charged.

## `asins` (type: `array`):

Product IDs (10 characters, e.g. B0DCH8VDXF), looked up on the marketplace below.

## `domain` (type: `string`):

The Amazon site ASINs and keywords are looked up on. Pick one, or type a host such as amazon.de or www.amazon.de.

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

Read prices and delivery for this postcode, e.g. 10001 (amazon.com) or 10115 (amazon.de). Empty = each marketplace's capital; amazon.com uses the proxy's US location. The run stops if Amazon rejects it.

## `countryCode` (type: `string`):

Two-letter country to deliver to, for international shipping prices, e.g. DE on amazon.com. Empty = the marketplace's own country. Not used with a postcode.

## `maxProductVariantsAsSeparateResults` (type: `integer`):

Also return up to this many variants (sizes, colors…) of each product as their own rows, each with its own price and stock, on top of Max products. Every row already lists its variant ASINs. 0 = none.

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

Leave as is: Apify datacenter proxies work for Amazon. Residential is replaced by datacenter (it costs more per page than a product row earns).

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

Kept for saved junglee/Amazon-crawler inputs: searches stop at Max products anyway.

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

Engine setting.

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

Kept for saved junglee/Amazon-crawler inputs: rows are read from Amazon's English pages.

## `scrapeProductVariantPrices` (type: `boolean`):

Kept for saved junglee/Amazon-crawler inputs: not used (see Variants as separate products).

## `useCaptchaSolver` (type: `boolean`):

Kept for saved junglee/Amazon-crawler inputs: not needed (a refused page is retried on a new IP).

## `proxyCountry` (type: `string`):

Kept for saved junglee/Amazon-crawler inputs: not used (see Delivery location).

## `locationDeliverableRoutes` (type: `array`):

Kept for saved junglee/Amazon-crawler inputs: not used.

## Actor input object example

```json
{
  "categoryOrProductUrls": [
    {
      "url": "https://www.amazon.com/s?k=wireless+earbuds"
    },
    {
      "url": "https://www.amazon.com/Best-Sellers-Electronics/zgbs/electronics/"
    }
  ],
  "maxItemsPerStartUrl": 20,
  "scrapeProductDetails": true,
  "maxOffers": 0,
  "scrapeSellers": false,
  "domain": "www.amazon.com",
  "maxProductVariantsAsSeparateResults": 0,
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "maxSearchPagesPerStartUrl": 9999,
  "maxConcurrency": 12
}
```

# Actor output Schema

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

No description

## `offersUrl` (type: `string`):

No description

## `sellersUrl` (type: `string`):

No description

## `summary` (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=wireless+earbuds"
        },
        {
            "url": "https://www.amazon.com/Best-Sellers-Electronics/zgbs/electronics/"
        }
    ],
    "maxItemsPerStartUrl": 20,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("deepmine/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 = {
    "categoryOrProductUrls": [
        { "url": "https://www.amazon.com/s?k=wireless+earbuds" },
        { "url": "https://www.amazon.com/Best-Sellers-Electronics/zgbs/electronics/" },
    ],
    "maxItemsPerStartUrl": 20,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("deepmine/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 '{
  "categoryOrProductUrls": [
    {
      "url": "https://www.amazon.com/s?k=wireless+earbuds"
    },
    {
      "url": "https://www.amazon.com/Best-Sellers-Electronics/zgbs/electronics/"
    }
  ],
  "maxItemsPerStartUrl": 20,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call deepmine/amazon-scraper --silent --output-dataset

```

## MCP server setup

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