# E-commerce Product Scraper Pro — Prices, Reviews & Variants (`constructive_calm/ecommerce-product-scraper-pro`) Actor

Scrape products, prices, variants, reviews and sellers from Amazon, Walmart, Target, IKEA, Zalando, Shopify, WooCommerce and 50+ stores. ISO currency, stock, full image galleries, price monitoring and Google Shopping. Input-compatible with the E-commerce Scraping Tool.

- **URL**: https://apify.com/constructive_calm/ecommerce-product-scraper-pro.md
- **Developed by:** [Omar Eldeeb](https://apify.com/constructive_calm) (community)
- **Categories:** E-commerce, Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $0.80 / 1,000 product scrapeds

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

### What does E-commerce Product Scraper Pro do?

**E-commerce Product Scraper Pro** extracts products, prices, stock, variants, reviews, sellers and Amazon Influencer storefronts from online stores and marketplaces: **Amazon** (24 storefronts), **Walmart**, **Target**, **IKEA**, **Zalando**, **Flipkart**, **AliExpress** reviews, UK grocers, and **any Shopify, WooCommerce, BigCommerce, PrestaShop, Magento or Salesforce Commerce store**. It also covers Google Shopping results and Wolt, Glovo and DoorDash food-delivery stores.

Each product row has the price as a number with an **ISO currency code**, plus the original and unit price, `inStock` and a stock count, the **variants** and the **image gallery** whenever the page states them, and the source URL. Every input gets a **status row**, so you always know what was found, what was blocked and why. The supported-sites matrix below lists exactly what works where.

It runs on the Apify platform, so you get scheduling, an API, webhooks, integrations (Make, Zapier, Google Sheets, Slack), and exports to JSON, CSV, Excel or XML.

### Why use E-commerce Product Scraper Pro?

- **Price and stock monitoring.** Monitor mode compares every product with your previous run and flags `price-down`, `price-up`, `back-in-stock`, `out-of-stock` and `removed`. Optionally it outputs only what changed.
- **Catalog and competitor research.** Category pages, keyword searches and whole Shopify collections, with pagination followed automatically where the site supports it (up to 200 pages per input; some sites are first page only, see Limitations), variants as rows inside `variants[]`, and all images.
- **Review analysis.** Product reviews from Walmart, Target, AliExpress, Flipkart, Mercado Libre and Shopify review apps (Yotpo, Judge.me, Okendo, Stamped), plus WooCommerce, with the sort you choose where the site offers it.
- **Lead generation.** Seller profiles (Amazon, Walmart) and store contact details (email, phone, address) from any store's own pages.
- **AI and data pipelines.** One flat, documented schema with a `recordType` field on every row, an optional AI summary per product, and an OUTPUT record with yield and billing counters for monitoring.

### How to use E-commerce Product Scraper Pro

1. Open the Actor and paste product URLs, category / listing URLs, or a keyword plus marketplaces.
2. Optionally add review URLs, seller URLs, an Amazon Influencer storefront, Google Shopping keywords or food-delivery inputs. Each section of the input form is independent.
3. Set limits (`maxProductResults`, `maxItemsPerStartUrl`, `maxReviewResults`, …) so the run stays inside your budget.
4. Click **Start**. Products appear in the **Products** view as they are scraped. The **Status per input** view shows one row per input with its outcome.
5. Download the results as JSON, CSV, Excel or XML, or read them through the API.

### Input

Products from URLs and a Shopify collection (this is the prefilled example):

```json
{
    "detailsUrls": [{ "url": "https://www.skullcandy.com/products/crusher-540-active" }],
    "listingUrls": [{ "url": "https://www.deathwishcoffee.com/collections/coffee" }],
    "maxProductResults": 10
}
```

Keyword search on marketplaces, with at most 25 products per marketplace:

```json
{
    "keyword": "usb c cable",
    "marketplaces": ["www.amazon.com", "www.walmart.com", "www.target.com"],
    "maxItemsPerStartUrl": 25
}
```

Lowest-rated reviews first, capped at 200:

```json
{
    "reviewDetailsUrls": [{ "url": "https://www.target.com/p/apple-airpods-pro-2nd-generation/-/A-85978612" }],
    "sortReview": "Lowest rated",
    "maxReviewResults": 200
}
```

Daily price watch (schedule this; only changed products are written):

```json
{
    "detailsUrls": [{ "url": "https://www.amazon.com/dp/B0H6XS28T1" }, { "url": "https://www.walmart.com/ip/5113183757" }],
    "monitorMode": true,
    "onlyChanges": true
}
```

Sellers and an Amazon Influencer storefront:

```json
{
    "sellerUrls": [{ "url": "https://www.amazon.com/sp?seller=A294P4X9EWVXLJ" }, { "url": "https://www.beardbrand.com/" }],
    "influencerUrls": [{ "url": "https://www.amazon.com/shop/mkbhd" }],
    "scrapeInfluencerProducts": true,
    "maxInfluencerResults": 20
}
```

URLs placed in the wrong field are moved automatically, with a log line. A product URL in "Category listing URLs" is scraped as a product, and a category URL in "Product detail URLs" is read as a listing.

#### Options added on top of the standard fields

| Field | What it does |
|---|---|
| `maxItemsPerStartUrl` | Maximum rows per input (per product URL, listing, keyword × marketplace, review input or storefront). |
| `followPagination` | Follow next pages on listings and searches (default on). |
| `includeVariants` | Include the `variants[]` array (default on). |
| `proxyCountry` | Pin the residential exit to a country. This fixes prices showing in the wrong currency. Default: each marketplace's own country. |
| `monitorMode` / `onlyChanges` | Compare with your previous run and flag the changes; with `onlyChanges`, write only changed products. |

### Switching from the E-commerce Scraping Tool

If you already use Apify's E-commerce Scraping Tool, **the input field names are identical**: paste your existing input JSON and it runs. All 38 fields are accepted with the same types and options, including the review, seller, influencer, Google Shopping ("search engine") and food-delivery sections. The internal `disableFallbacks` flag is accepted and ignored.

Rows keep the main output field names the E-commerce Scraping Tool documents (`url`, `inputUrl`, `name`, `image`, `offers`, `brand`, `description`, `additionalProperties`, `aiSummary`, `keyword`, and the review / seller / influencer keys), plus flat, spreadsheet-friendly fields and a `recordType` on every row. Output compatibility is checked against that tool's documented dataset views and samples, not field by field, so check your integration against a sample run. Per-input outcomes (`error`, `errorDescription`, `invalidUrls`) are in the **Status** dataset described below.

### Output

All data rows go to the run's default dataset, with a `recordType` field: `product`, `review`, `seller`, `influencerPost`, `search-result` or `delivery`. Per-input status rows go to a **separate Status dataset**, and a run summary goes to the `OUTPUT` record. The views (Products, Products as CSV, Reviews, Sellers, Influencer posts, Status per input) are linked on the run's Output tab.

#### Product

Real row (shortened) from the prefilled example:

```json
{
    "recordType": "product",
    "url": "https://www.skullcandy.com/products/crusher-540-active",
    "inputUrl": "https://www.skullcandy.com/products/crusher-540-active",
    "name": "Crusher® 540 Active",
    "image": "https://cdn.shopify.com/s/files/1/0635/5114/3993/files/1_crusher-active_soft-pink.png?v=1762210740",
    "offers": { "price": 229.99, "priceCurrency": "USD" },
    "brand": { "slogan": "Skullcandy US" },
    "description": "CRUSH THE ACTION WITH MIND-BENDING BASS\nMeet Crusher 540 Active, the ultimate active-use h…",
    "additionalProperties": { "shopifyProductId": 7883339530297, "handle": "crusher-540-active", "productType": "Headphones", "tags": ["active", "wireless"] },
    "price": 229.99,
    "currency": "USD",
    "originalPrice": null,
    "inStock": true,
    "availability": "InStock",
    "sku": "S6EVW-U054",
    "brandName": "Skullcandy US",
    "images": ["https://cdn.shopify.com/s/files/1/0635/5114/3993/files/1_crusher-active_soft-pink.png?v=1762210740", "…"],
    "imageCount": 60,
    "rating": 4.3,
    "reviewCount": 1367,
    "variants": [
        { "sku": "S6EVW-U054", "name": "Skullcandy X Baker Skateboards", "price": 229.99, "currency": "USD", "inStock": true, "options": { "Color": "Skullcandy X Baker Skateboards" }, "url": "https://www.skullcandy.com/products/crusher-540-active?variant=50564609998905" }
    ],
    "variantCount": 6,
    "site": "skullcandy.com",
    "tierUsed": "datacenter",
    "source": "shopify",
    "extractionComplete": true,
    "changeType": null,
    "scrapedAt": "2026-10-17T13:37:17.581Z"
}
```

| Field | Meaning |
|---|---|
| `price`, `currency`, `currencyRaw` | Numeric price, ISO 4217 code, and the currency as the page printed it. |
| `originalPrice`, `unitPrice`, `unitPriceUnit` | Was-price (only when higher than `price`) and price per kg / l / unit when shown. |
| `inStock`, `stockQty`, `availability` | Normalized stock flag, the count from text like "Only 3 left", and the raw availability. |
| `sku`, `gtin`, `mpn`, `brandName`, `seller`, `breadcrumbs[]` | Identifiers and context when the page states them. |
| `images[]`, `variants[]` | Full gallery in page order, and every variant with its own price / stock / options. |
| `keyword`, `position` | For listing and search inputs: the keyword and the product's rank on that input. |
| `influencerUrl`, `influencerListId` | For Amazon Influencer products: the storefront and list the product came from. |
| `aiSummary`, `aiSummaryStatus` | The AI summary (only when requested; `ok` is the only billed status). |
| `changeType`, `changes[]`, `previousPrice`, `priceChange`, `priceChangePct`, `previousInStock` | Monitor mode fields. |
| `tierUsed`, `dataSources[]`, `extractionComplete`, `partialReason` | How the row was fetched and assembled, and whether a data source failed and the row fell back. |

#### Review

```json
{
    "recordType": "review",
    "productUrl": "https://www.skullcandy.com/products/crusher-540-active",
    "inputUrl": "https://www.skullcandy.com/products/crusher-540-active",
    "author": "Victoria C.",
    "datePublished": "2026-10-12T21:52:57.000Z",
    "name": "Faulty equipment and poor service",
    "reviewBody": "These were a birthday gift for my son, They were faulty. …",
    "reviewRating": { "ratingValue": 1, "bestRating": 5 },
    "additionalProperties": { "verified": true, "helpfulVotes": 0, "unhelpfulVotes": 0, "incentivized": false, "language": "en" },
    "reviewId": "904420651",
    "rating": 1,
    "verified": true,
    "helpfulVotes": 0,
    "images": [],
    "productName": "Crusher® 540 Active",
    "position": 1,
    "sortApplied": "Lowest rated",
    "site": "skullcandy.com",
    "source": "yotpo",
    "scrapedAt": "2026-10-17T11:11:05.210Z"
}
```

`sortApplied` is the order the reviews actually follow. When a site does not offer the sort you asked for, its default order is used, and the input's status row says so. `datePublished` never invents precision: "3 months ago" becomes `2026-07`.

#### Seller

```json
{
    "recordType": "seller",
    "url": "https://www.walmart.com/seller/101011839",
    "name": "UGREEN Official Store",
    "parentOrganization": { "name": "AMERICA UGREEN LIMITED", "legalName": "AMERICA UGREEN LIMITED" },
    "address": { "streetAddress": "108 WEST 13TH ST", "addressLocality": "WILMINGTON", "addressRegion": "DE", "postalCode": "19801", "addressCountry": "US" },
    "aggregateRating": { "ratingValue": 4.7, "bestRating": 5, "ratingCount": 1865, "positivePercent": null },
    "sellerEmail": "support.wm@ugreen.com",
    "sellerPhone": "+1 7862391173",
    "sellerId": "101011839",
    "emails": ["support.wm@ugreen.com"],
    "phones": ["+1 7862391173"],
    "site": "walmart-us",
    "source": "walmart-seller"
}
```

#### Influencer post (Amazon Influencer storefront list)

```json
{
    "recordType": "influencerPost",
    "image": "https://m.media-amazon.com/images/S/shoppable-media-external-prod-iad-us-east-1/2a7221ae-71b2-407b-ac73-69ee05c065c7/e36120f5-1e45-4fdb-a9bd-5af640ae5f20._SX500_SCLZZZZZZZ_.png",
    "influencerUrl": "https://www.amazon.com/shop/mkbhd",
    "inputUrl": "https://www.amazon.com/shop/mkbhd",
    "url": "https://www.amazon.com/shop/mkbhd/list/2907Y239RZWWA",
    "type": "list",
    "postId": "amzn1.ideas.2907Y239RZWWA",
    "likes": null,
    "itemsCount": 11,
    "title": "Public MKBHD",
    "influencerName": "MKBHD",
    "asins": ["B07H484HLT", "B07WFQYJYP", "B07F5SMRB6"]
}
```

#### Google Shopping result

```json
{
    "recordType": "search-result",
    "keyword": "usb c cable",
    "product": { "title": "Anker 515 USB-C to USB-C Cable", "price": 23.99, "priceCurrency": "USD" },
    "sellers": [],
    "mode": "Google Listing",
    "position": 1,
    "price": 23.99,
    "currency": "USD",
    "originalPrice": 30,
    "merchant": "Anker US",
    "delivery": "Free delivery",
    "badge": "20% OFF",
    "rating": 5,
    "reviewCount": 119,
    "catalogId": "10153306070466319820",
    "country": "US",
    "site": "google-shopping"
}
```

#### Food-delivery store

```json
{
    "recordType": "delivery",
    "url": "https://wolt.com/en/fin/helsinki/restaurant/huuva-pitjnmki",
    "title": "Huuva Pitäjänmäki",
    "brand": "burgeri, kana, katuruoka",
    "offers": { "priceRange": "€€", "deliveryFee": null, "minimumOrder": null, "currency": "EUR" },
    "additionalDetails": [{ "name": "Naughty BRGR: Naughty Smash + Ranskalaiset", "price": 14.7, "currency": "EUR", "category": "Naughty BRGR 🍔" }],
    "platform": "wolt",
    "rating": 8.8,
    "ratingScale": 10,
    "deliveryEstimate": "40-50 min",
    "isOpen": true,
    "storeAddress": "Höyläämötie 11c",
    "city": "Helsinki",
    "country": "FI",
    "menuItemCount": 95,
    "menuComplete": true
}
```

#### Status dataset (one row per input)

```json
{
    "recordType": "status",
    "inputUrl": "https://www.deathwishcoffee.com/collections/coffee",
    "inputField": "listingUrls",
    "site": "deathwishcoffee.com",
    "pageType": "listing",
    "outcome": "ok",
    "error": null,
    "errorDescription": "50 product(s) found on 1 page(s) (the site states 82); 9 delivered; 41 not scraped; stopped: maxProductResults (10) reached.",
    "itemsFound": 50,
    "itemsExpected": 82,
    "itemsDelivered": 9,
    "pagesFetched": 1,
    "stopReason": "cap",
    "tierUsed": "datacenter",
    "tiersTried": ["datacenter"],
    "blockedBy": null,
    "sortApplied": null
}
```

`outcome` is one of `ok`, `partial`, `blocked`, `not-found`, `restricted`, `invalid`, `internal`, `unsupported`, `not-yet-supported` or `skipped`. `error` uses the same error codes as the E-commerce Scraping Tool's documented errors dataset. `blockedBy` names the anti-bot vendor or network reason. `stopReason` is `exhausted` only when the end was proven (a short last page, no next page, or the site's stated total reached) and every product found was scraped. It is `deadline`, `charge-limit` or `aborted` when the run ended before that, `no-products` when the first page listed no product links, and `blocked` when a page failed on every tier.

The `OUTPUT` record in the key-value store summarizes the run: delivered vs expected per site, outcome counts, tiers used, billing counters, and unbilled proxy spend.

### How much does it cost to scrape e-commerce sites?

Pay per event: you pay for results, not for compute time. Prices in USD by Apify plan tier (PLATINUM and DIAMOND pay the GOLD price):

| Event | When it is charged | FREE | BRONZE | SILVER | GOLD |
|---|---|---|---|---|---|
| Actor start | Once per run per GB of memory (platform event; the default 1 GB = 1 event) | $0.005 | $0.005 | $0.005 | $0.005 |
| **Product scraped** | One product row delivered (food delivery: one store with its menu) | $0.0048 | $0.0012 | $0.001 | $0.0008 |
| Product checked (unchanged) | Monitor mode with `onlyChanges`: re-checked, unchanged, not written | $0.0012 | $0.0003 | $0.00025 | $0.0002 |
| Listing page scraped | A category / search / pagination page that returned product links | $0.0004 | $0.00034 | $0.00027 | $0.00021 |
| Residential proxy traffic (per MB) | MB of residential traffic used to deliver your results, including retries (see below) | $0.018 | $0.016 | $0.015 | $0.014 |
| Browser-rendered page | Every browser render used to deliver an item, including its failed retries | $0.008 | $0.007 | $0.0065 | $0.006 |
| Search engine request | One successful Google Shopping request | $0.0045 | $0.004 | $0.0038 | $0.0035 |
| Review scraped | One review row | $0.0016 | $0.0008 | $0.00068 | $0.00056 |
| Seller scraped | One seller / store-contact row (per seller, not once per run) | $0.0024 | $0.0016 | $0.001 | $0.0008 |
| AI summary | One AI summary, only when the model returns a complete answer | $0.006 | $0.0032 | $0.0028 | $0.0022 |
| Influencer post scraped | One Amazon Influencer storefront list | $0.0016 | $0.0008 | $0.00068 | $0.00056 |

#### How billing protects you

- **Residential traffic is billed at 89 % of the measured traffic, and only for items that delivered.** 89 % is below the lowest ratio between the proxy's own meter and our byte count across our cloud tests, so the billed MB stays at or below what the proxy itself recorded.
- **Items that never deliver are never charged.** A blocked, empty or not-found page costs you nothing: no row event, no residential MB, no browser fee.
- **Your maximum cost per run is respected.** Set it in the run options (`maxTotalChargeUsd` in the API). Before each item the Actor checks that the item's full cost still fits, so it stops slightly below the limit instead of above it. Rows that cannot be paid for are not delivered.
- **No free trial inside the Actor.** Apify's free monthly platform credit covers trying it, so every event is a paid event from the first row.
- **The start fee is per run:** $0.005 for the default 1 GB of memory, plus one more start event for each extra GB you give the run.

#### How the residential fee works

Most sites in the matrix are scraped through **datacenter** connections and pay **no traffic fee**. Some sites block datacenter traffic. For those, the Actor switches to **residential** proxies (or a real browser over residential), and you pay for the residential traffic of the items that delivered:

- Traffic is metered in MB (1 MB = 1,000,000 bytes). The billed amount is a fixed share of the measured traffic (see "How billing protects you" above), charged as whole MB while the run progresses; the last partial MB is rounded up once at the end of the run.
- A product's retries and escalations count toward its own traffic. Traffic spent on inputs that delivered **nothing** is never charged.
- Browser-rendered pages pay the browser-page fee for **every browser render used to deliver the item, including its failed retries**, plus their residential traffic (the same rule as residential MB). Renders spent on inputs that delivered nothing are never charged.

**Worked example (GOLD prices, measured October 2026):** 1,000 IKEA products. IKEA product pages need residential access and used 0.125–0.135 MB of traffic each in our cloud tests, so 1,000 products ≈ 125–135 MB, billed as 112–121 MB (89 % of the measured traffic, see "How billing protects you").

- Products: 1,000 × $0.0008 = $0.80
- Residential traffic: 112–121 MB × $0.014 = $1.57–$1.69
- Actor start: $0.005
- **Total ≈ $2.37–$2.50** (on FREE prices ≈ $6.82–$6.98)

The same 1,000 products from a Shopify store (datacenter, no traffic fee) cost $0.80 + $0.005 on GOLD.

**Residential traffic per delivered product** (measured traffic in our cloud tests, October 2026; the billed MB are lower, see "How billing protects you"). Ranges cover several runs; sites marked "varies" moved a lot from run to run:

| Site | How it is usually reached | MB per delivered product |
|---|---|---|
| Shopify / WooCommerce / BigCommerce / PrestaShop stores, Amazon.com, Walmart, Target, Zalando, John Lewis, Marks & Spencer, Aldi UK, Craigslist | Datacenter | 0 (no traffic fee) |
| IKEA | Residential | 0.13 |
| Bol | Residential | 0.2 |
| amazon.co.uk | Mostly residential | 0.3–0.5 |
| amazon.de | Datacenter or residential (varies by run) | 0–0.5 (varies) |
| Columbia (Salesforce Commerce) | Residential, some browser | 0.25–0.5 |
| Noon | Residential, some browser | 0.1–0.4 |
| Sephora (product pages) | Browser + residential | 0.2–0.4 |
| Bloomingdale's | Browser + residential | 0.3–1.0 (varies) |
| Wayfair | Browser + residential | 0.3–1.1 (varies) |
| Mercado Libre | Browser + residential | 0.7–2.1 (varies) |

Sites not listed were not measured in the cloud; residential product pages are usually in the 0.1–0.5 MB range.

**More examples (GOLD prices; traffic measured October 2026):**

| Run | Cost |
|---|---|
| 100 Amazon.com products (datacenter) | 100 × $0.0008 + $0.005 = **$0.085** |
| 100 amazon.co.uk products (mostly residential, 0.3–0.5 MB each) | $0.08 + 27–45 MB × $0.014 + $0.005 ≈ **$0.46–$0.71** |
| 500 Target reviews | 500 × $0.00056 + $0.005 = **$0.285** |
| A 20-page category, 1,000 products (datacenter) | 20 × $0.00021 + 1,000 × $0.0008 + $0.005 = **$0.809** |
| 1,000 Noon products (residential, some browser renders) | $0.80 + 30–200 renders × $0.006 + 89–356 MB × $0.014 + $0.005 ≈ **$2.23–$6.99** |
| Daily watch of 500 unchanged Shopify products (`onlyChanges`) | 500 × $0.0002 + $0.005 = **$0.105 per run** |

### Supported sites

**supported** = verified repeatedly in our cloud tests (October 2026). **best-effort** = works, but with a known gap (first page only, browser route, lower or variable success). **unsupported** = blocked by anti-bot protection on every route we tested. Unsupported inputs are never fetched: each gets a status row saying why, and they cost nothing beyond the run's start fee. A run in which every input is unsupported (or every attempted input is blocked) ends as FAILED, with the reason per input in the Status dataset. A "—" under Listings and Keyword search means the site takes product URLs only.

| Site | Status | Tier (product pages) | Products | Listings | Keyword search | Reviews | Sellers |
|---|---|---|---|---|---|---|---|
| Any **Shopify** store | supported | Datacenter | ✓ (store JSON) | ✓ (collections) | ✓ (store search, home page + keyword) | ✓ Yotpo / Judge.me / Okendo / Stamped widgets, else page data | store contact |
| Any **WooCommerce** store | supported | Datacenter | ✓ (Store API) | ✓ | ✓ (store search) | ✓ (Store API reviews) | store contact |
| Any **BigCommerce / PrestaShop / Magento / Salesforce Commerce** store | best-effort | Datacenter (residential / browser when the store is behind Cloudflare) | ✓ | ✓ | ✓ (store search) | best-effort (page data) | store contact |
| Any other store with schema.org Product data | best-effort | Datacenter → residential → browser as needed | ✓ | best-effort (link discovery) | only when the store engine is detected | best-effort (page data) | store contact |
| Aldi (aldi.co.uk) | supported | Datacenter | ✓ | ✓ | ✓ | best-effort (page data) | store contact |
| Amazon (amazon.com) | supported | Datacenter | ✓ | ✓ | ✓ | top reviews only | ✓ |
| Amazon (amazon.de) | supported | Datacenter; listings residential | ✓ | ✓ | ✓ | top reviews only | ✓ |
| American Eagle (ae.com) | supported | Datacenter | ✓ | ✓ | ✓ | best-effort (page data) | store contact |
| Ariat (ariat.com) | supported | Datacenter | ✓ | ✓ | ✓ | best-effort (page data) | store contact |
| Bluemercury (bluemercury.com) | supported | Datacenter | ✓ | ✓ | ✓ | best-effort (page data) | store contact |
| Bol (bol.com) | supported | Residential | ✓ | ✓ | ✓ | best-effort (page data) | store contact |
| Craigslist (5 domains: craigslist.org, toronto.craigslist.org, vancouver.craigslist.org, london.craigslist.org, sydney.craigslist.org) | supported | Datacenter | ✓ | ✓ (first page, ~340 results) | ✓ (first page, ~340 results) | best-effort (page data) | store contact |
| John Lewis (johnlewis.com) | supported | Datacenter | ✓ | ✓ | ✓ | best-effort (page data) | store contact |
| M\&S (marksandspencer.com) | supported | Datacenter | ✓ | ✓ | ✓ | best-effort (page data) | store contact |
| Target (target.com) | supported | Datacenter (crawler UA) | ✓ | ✓ | ✓ | ✓ (all pages) | store contact |
| Waitrose (waitrose.com) | supported | Datacenter | ✓ | ✓ | ✓ | best-effort (page data) | store contact |
| Walmart (walmart.com) | supported | Datacenter | ✓ | ✓ | ✓ | ✓ (all pages) | ✓ |
| Zalando (zalando.de) | supported | Datacenter | ✓ | ✓ | ✓ | — | store contact |
| AliExpress (2 domains: aliexpress.com, aliexpress.us) | best-effort | Browser; listings datacenter | — (captcha) | best-effort | best-effort | ✓ (all pages) | partial (name + ids) |
| Alza (5 domains: alza.cz, alza.sk, alza.hu, alza.at, alza.de) | best-effort | Residential | ✓ | best-effort | best-effort | best-effort (page data) | store contact |
| Amazon (22 domains: amazon.ca, amazon.com.mx, amazon.com.br, amazon.co.uk, amazon.fr, amazon.it, …) | best-effort | Datacenter; listings residential | ✓ | best-effort | best-effort | top reviews only | ✓ |
| Ashley (ashleyfurniture.com) | best-effort | Datacenter | ✓ | best-effort | — | best-effort (page data) | store contact |
| Bloomingdale's (bloomingdales.com) | best-effort | Browser | ✓ (browser) | best-effort | best-effort | — | store contact |
| Cdiscount (cdiscount.com) | best-effort | Browser | ✓ (browser) | best-effort | best-effort | — | store contact |
| Christian Louboutin (christianlouboutin.com) | best-effort | Browser | ✓ (browser) | best-effort | — | — | store contact |
| Coles (coles.com.au) | best-effort | Residential | ✓ | best-effort | best-effort | best-effort (page data) | store contact |
| Columbia Sportswear (columbia.com) | best-effort | Residential | ✓ | best-effort | best-effort | best-effort (page data) | store contact |
| Flipkart (flipkart.com) | best-effort | Residential; listings datacenter | ✓ | best-effort | best-effort | ✓ (all pages) | store contact |
| Hepsiburada (hepsiburada.com) | best-effort | Datacenter | ✓ | best-effort | best-effort | best-effort (page data) | store contact |
| Iceland (iceland.co.uk) | best-effort | Browser | ✓ (browser) | best-effort | best-effort | — | store contact |
| Idealo (2 domains: idealo.de, idealo.at) | best-effort | Datacenter | ✓ | best-effort (first page only) | best-effort (first page only) | best-effort (page data) | store contact |
| Idealo (4 domains: idealo.co.uk, idealo.es, idealo.fr, idealo.it) | best-effort | Datacenter | ✓ | best-effort (first page only) | — | best-effort (page data) | store contact |
| IKEA (ikea.com) | best-effort | Residential | ✓ | best-effort (first page only) | — | best-effort (page data) | store contact |
| InsulationPoint (insulationpoint.co.uk) | best-effort | Datacenter | ✓ | best-effort | best-effort | best-effort (page data) | store contact |
| J.Crew (jcrew.com) | best-effort | Datacenter | ✓ | best-effort (first page only) | best-effort (first page only) | best-effort (page data) | store contact |
| Le Creuset (lecreuset.com) | best-effort | Datacenter | ✓ | best-effort | best-effort | best-effort (page data) | store contact |
| Lidl (lidl.co.uk) | best-effort | Datacenter | ✓ | best-effort (first page only) | best-effort (first page only) | best-effort (page data) | store contact |
| Macy's (macys.com) | best-effort | Residential | ✓ | best-effort | best-effort | best-effort (page data) | store contact |
| MediaMarkt (mediamarkt.de) | best-effort | Residential | ✓ | — | — | best-effort (page data) | store contact |
| Meijer (meijer.com) | best-effort | Datacenter | ✓ | — | — | best-effort (page data) | store contact |
| Mercado Libre (17 domains: mercadolibre.com.mx, mercadolibre.com.ar, mercadolibre.cl, mercadolibre.com.co, mercadolibre.com.pe, mercadolibre.com.uy, …) | best-effort | Browser | ✓ (browser) | best-effort | best-effort | ✓ (catalog /p/ URLs) | — |
| Morrisons (groceries.morrisons.com) | best-effort | Residential; listings datacenter | ✓ | best-effort (first page only) | best-effort (first page only) | best-effort (page data) | store contact |
| Noon (noon.com) | best-effort | Browser | ✓ (browser) | best-effort | best-effort | best-effort (page data) | store contact |
| Ocado (ocado.com) | best-effort | Residential | ✓ | best-effort (first page only) | best-effort (first page only) | best-effort (page data) | store contact |
| Sainsbury's (sainsburys.co.uk) | best-effort | Datacenter | ✓ | best-effort (first page only) | best-effort (first page only) | best-effort (page data) | store contact |
| Sephora (sephora.com) | best-effort | Browser | ✓ (browser) | — | — | — | store contact |
| Shein (shein.com) | best-effort | Browser | — (captcha) | best-effort (first page only) | — | — | store contact |
| Space NK (spacenk.com) | best-effort | Datacenter | ✓ | best-effort (first page only) | best-effort (first page only) | best-effort (page data) | store contact |
| Staples (staples.com) | best-effort | Datacenter | ✓ | best-effort | best-effort | best-effort (page data) | store contact |
| Takealot (takealot.com) | best-effort | Browser | ✓ (browser) | best-effort (first page only) | best-effort (first page only) | — | store contact |
| Tesco (tesco.com) | best-effort | Residential | ✓ | best-effort | best-effort | best-effort (page data) | store contact |
| Trendyol (trendyol.com) | best-effort | Residential | ✓ | best-effort | best-effort | best-effort (page data) | store contact |
| Ulta Beauty (ulta.com) | best-effort | Datacenter | ✓ | — | — | best-effort (page data) | store contact |
| Walmart (walmart.ca) | best-effort | Datacenter | ✓ | best-effort | best-effort | best-effort (page data) | store contact |
| Wayfair (4 domains: wayfair.com, wayfair.ca, wayfair.co.uk, wayfair.de) | best-effort | Browser | ✓ (browser) | best-effort | best-effort | — | store contact |
| Zalando (15 domains: zalando.at, zalando.ch, zalando.fr, zalando.it, zalando.es, zalando.nl, …) | best-effort | Datacenter | ✓ | best-effort | best-effort | — | store contact |
| Academy Sports + Outdoors (academy.com) | unsupported | — | — | — | — | — | — |
| Albertsons (albertsons.com) | unsupported | — | — | — | — | — | — |
| Alibaba (alibaba.com) | unsupported | — | — | — | — | — | — |
| Allegro (3 domains: allegro.pl, allegro.cz, allegro.sk) | unsupported | — | — | — | — | — | — |
| Anthropologie (anthropologie.com) | unsupported | — | — | — | — | — | — |
| AO (ao.com) | unsupported | — | — | — | — | — | — |
| Argos (argos.co.uk) | unsupported | — | — | — | — | — | — |
| Asda (asda.com) | unsupported | — | — | — | — | — | — |
| AutoZone (autozone.com) | unsupported | — | — | — | — | — | — |
| Barnes & Noble (barnesandnoble.com) | unsupported | — | — | — | — | — | — |
| Bass Pro Shops (basspro.com) | unsupported | — | — | — | — | — | — |
| Best Buy (2 domains: bestbuy.com, bestbuy.ca) | unsupported | — | — | — | — | — | — |
| BJ's Wholesale Club (bjs.com) | unsupported | — | — | — | — | — | — |
| Boots (boots.com) | unsupported | — | — | — | — | — | — |
| Chewy (chewy.com) | unsupported | — | — | — | — | — | — |
| Co-op (coop.co.uk) | unsupported | — | — | — | — | — | — |
| Costco (3 domains: costco.com, costco.ca, costco.co.uk) | unsupported | — | — | — | — | — | — |
| CVS (cvs.com) | unsupported | — | — | — | — | — | — |
| Dick's Sporting Goods (dickssportinggoods.com) | unsupported | — | — | — | — | — | — |
| eBay (8 domains: ebay.com, ebay.co.uk, ebay.de, ebay.fr, ebay.it, ebay.es, …) | unsupported | — | — | — | — | — | — |
| Etsy (etsy.com) | unsupported | — | — | — | — | — | — |
| Galaxus (3 domains: galaxus.ch, galaxus.de, galaxus.at) | unsupported | — | — | — | — | — | — |
| Goofish (goofish.com) | unsupported | — | — | — | — | — | — |
| Grainger (2 domains: grainger.com, grainger.ca) | unsupported | — | — | — | — | — | — |
| Harbor Freight (harborfreight.com) | unsupported | — | — | — | — | — | — |
| Home Depot (2 domains: homedepot.com, homedepot.ca) | unsupported | — | — | — | — | — | — |
| Kaufland (7 domains: kaufland.de, kaufland.cz, kaufland.sk, kaufland.pl, kaufland.at, kaufland.it, …) | unsupported | — | — | — | — | — | — |
| Kohl's (kohls.com) | unsupported | — | — | — | — | — | — |
| Levi's (levi.com) | unsupported | — | — | — | — | — | — |
| Lowe's (2 domains: lowes.com, lowes.ca) | unsupported | — | — | — | — | — | — |
| Men's Wearhouse (menswearhouse.com) | unsupported | — | — | — | — | — | — |
| Mercado Livre (mercadolivre.com.br) | unsupported | — | — | — | — | — | — |
| MSC Industrial Supply (mscdirect.com) | unsupported | — | — | — | — | — | — |
| Newegg (2 domains: newegg.com, newegg.ca) | unsupported | — | — | — | — | — | — |
| Next (next.co.uk) | unsupported | — | — | — | — | — | — |
| Nordstrom (nordstrom.com) | unsupported | — | — | — | — | — | — |
| Petco (petco.com) | unsupported | — | — | — | — | — | — |
| SalonCentric (saloncentric.com) | unsupported | — | — | — | — | — | — |
| Smyths Toys (smythstoys.com) | unsupported | — | — | — | — | — | — |
| Staples (staples.ca) | unsupported | — | — | — | — | — | — |
| Superdrug (superdrug.com) | unsupported | — | — | — | — | — | — |
| Temu (temu.com) | unsupported | — | — | — | — | — | — |
| Uline (2 domains: uline.com, uline.ca) | unsupported | — | — | — | — | — | — |
| Walgreens (walgreens.com) | unsupported | — | — | — | — | — | — |

**Food delivery**

| Platform | Status | Tier | Stores (keyword / nearby / listing / store URL) | Store reviews |
|---|---|---|---|---|
| Wolt (wolt.com) | supported | Datacenter | ✓ one row per store, menu nested | rating + count only (no text reviews on the platform) |
| Glovo (glovoapp.com) | best-effort | Datacenter | ✓ one row per store, menu nested | rating + count only (no text reviews on the platform) |
| DoorDash (doordash.com) | best-effort | Residential | ✓ one row per store, menu nested | up to 5 text reviews per store ("Include extended delivery review data") |
| Instacart (instacart.com) | best-effort | Residential | product rows via category / product URLs (keyword search is client-side: honest status row) | — |

"store contact" = the store's own contact data (JSON-LD Organization, `mailto:` / `tel:` links, contact page). "page data" = reviews published in the product page's structured data or a detected review widget.

### Tips & advanced options

- **Scrape mode: use AUTO.** `AUTO` (default) starts each site on its lowest-cost route and moves to residential or the browser only when that route is blocked. `HTTP` never uses a browser. `BROWSER` renders every page, costs more, and can *lower* success on sites whose HTTP route works: in our cloud tests Walmart answered the browser with a PerimeterX challenge, and Target rendered its pages without a price. Pick `BROWSER` only for a site you have tested it on.
- **Wrong currency?** Set `proxyCountry` to the market's country. Amazon storefronts are pinned to their own currency automatically.
- **Caps.** `maxProductResults` is run-wide. `maxItemsPerStartUrl` is per input, so one big category cannot starve the others. Reviews, sellers and influencer results have their own caps.
- **Monitor mode.** State is kept in a named key-value store (`ecommerce-product-monitor`), keyed by the exact set of input URLs: change one URL and the next run starts a fresh comparison. Each row's `changeType` is one of `new`, `price-up`, `price-down`, `back-in-stock`, `out-of-stock`, `changed`, `unchanged` or `removed`. Schedule the same input daily or hourly.
- **AI summary.** Pick fields in "AI summary - data points" and/or write a custom prompt (up to 3,000 characters). It is billed only when the model returns a complete answer.
- **Health checks.** Read the Status dataset or the `OUTPUT` record, not just the run status. A run can succeed with 0 rows (for example, every product not found, or every input outside your caps), and the status rows say exactly why. When every input is unsupported or invalid, or every attempted input is blocked, the run is marked failed.
- **Memory.** 1 GB (the default) is enough for most runs. For runs with more than about 50 URLs on browser-rendered sites (Wayfair, Bloomingdale's, Mercado Libre, Sephora, Noon), use 2 GB: our 1 GB cloud runs on those sites peaked above 90 % of memory. The start fee is charged per GB, so 2 GB costs one extra start event per run.
- **Speed.** About 30–40 Shopify products per minute at 1 GB (1,000 product URLs took about 32 minutes in our cloud tests). Residential and browser sites are slower.
- **Long runs.** The Actor stops starting new pages shortly before its timeout and exits with a full status report. Raise the run timeout for big jobs. A platform restart resumes where it left off without delivering or charging rows twice.

### Limitations

Known limits as measured in our cloud tests (October 2026):

- **Unsupported sites** (status row only, start fee only): eBay, Home Depot, Lowe's, Costco, Etsy, Allegro, Newegg, Mercado Livre (Brazil), Best Buy product pages, and the other sites marked unsupported in the matrix. Listings and keyword search are not supported on Sephora, MediaMarkt, Meijer, Ulta and Temu (Temu is unsupported entirely). A run with only unsupported inputs, or in which every attempted input is blocked, ends as FAILED with the reason per input in the Status dataset.
- **Best-effort sites:**
  - Mercado Libre: about a third of product pages deliver (browser route).
  - Wayfair: 30–70 % of product pages deliver. Listing runs may stop early to keep costs bounded, and Wayfair sometimes blocks a listing's first page outright. Use 2 GB of memory for Wayfair listing and search URLs: its pages are heavy enough to reach the 1 GB limit.
  - Bloomingdale's: 80–97 % of product pages deliver.
  - Sephora: product pages only.
  - Columbia: some pages need the browser route.
  - Noon: high success. Akamai bursts are retried at the end of the run.
- **Amazon:** storefronts outside the US often need residential traffic. In our latest cloud tests amazon.de delivered 84 % and amazon.co.uk 95 % of deliverable products; Amazon occasionally serves empty pages or captchas, so expect some run-to-run variation. Pages that say the product cannot ship to the proxy's location are retried on another route; if they are still blocked, the product is delivered without a price and with a note.
- **Amazon reviews:** only the top reviews shown on the product page (about 8 to 13 per product). Amazon's full review pages require signing in, so the Actor does not page past them. When Amazon shows "Sign in to see customer reviews" instead of the top reviews, the Actor retries once and then reports the product as `restricted` with that reason, never as an empty success. A product with no reviews at all is reported as `not-found`.
- **Google Shopping:** "Reviews" mode is not available (Google loads those reviews in the browser), so it returns an explanatory status row. An answer for the wrong market gets one retry and is then reported as blocked, and not billed. Google may truncate long product titles in listings.
- **Scrape mode `BROWSER`** lowers success on Walmart and Target. Use `AUTO`.
- **Amazon Influencer storefronts:** list posts only. Photo and video posts are not included. `likes` is always null, because Amazon does not publish likes without a login. List pages show about 8 products per list.
- **Food delivery:** Glovo and DoorDash keyword search matches store names only. Instacart keyword search is client-side only, so use Instacart category URLs. Text reviews are available on DoorDash only; Wolt and Glovo give a rating and a count.
- **First page only:** listings and searches on IKEA, Idealo, J.Crew, Lidl, Sainsbury's, Ocado, Morrisons, Space NK and Takealot read the first page of results. Craigslist's first page holds about 340 results.
- **Reviews:** AliExpress reviews can be rating-only (no text). Review sorting depends on the site: unsupported sorts fall back to the site's default, as noted in `sortApplied` and the status row. Review listing and keyword inputs read the first listing page. Loox and Reviews.io widgets are not read; the page's structured reviews are used instead.
- **AliExpress and Shein product pages** answer with a captcha. AliExpress search, listings and reviews still work, and AliExpress seller rows carry the store name and ids only.
- **Mercado Libre** reviews work for catalog URLs (`/p/MLM…`). Seller profiles are not supported (they require an authenticated account).
- **Remote URL lists** (`requestsFromUrl`) are not fetched yet. Paste the URLs directly.

### Is it legal to scrape e-commerce sites?

This Actor collects publicly available information: product listings, prices, public reviews and published business contact details. Review each website's terms of service before scraping it, and use the data lawfully. Reviews and seller data can contain personal data, so do not collect or process it without a legitimate reason, and follow GDPR, CCPA and other applicable laws. If you are unsure, consult a lawyer. This Actor is an independent tool and is not affiliated with, or endorsed by, any of the retailers listed.

### FAQ

**Why did my run return no products?**
Open the **Status per input** view (or the `OUTPUT` record). Every input has a row explaining what happened: `blocked` with the anti-bot vendor in `blockedBy`, `not-found` for missing pages, `unsupported` for sites in the unsupported list, `skipped` for inputs not reached before your caps, cost limit or timeout. If every input was unsupported or invalid, or every attempted input was blocked, the run is marked failed, with the reason per URL in the Status dataset. Blocked and empty pages are never charged.

**Why are there two datasets?**
Data rows (products, reviews, sellers, …) are in the default dataset, so exports contain only data. The per-input status rows are in the separate Status dataset, linked from the run's Output tab as "Status per input".

**Do I need my own proxies or API keys?**
No. Datacenter, residential and browser routes are chosen automatically and billed as described above. The AI summary also runs without your own key.

**Can I switch from the E-commerce Scraping Tool without changing my integration?**
Yes for the input: the field names are identical, so paste your input as-is. Rows keep the main output field names that tool documents, plus flat fields; check your integration against a sample run. Status / error details are in the Status dataset rather than an `errors` dataset.

**My site is not in the matrix. Will it work?**
It often does if the site is a Shopify, WooCommerce, BigCommerce, PrestaShop, Magento or Salesforce Commerce store, or any store with schema.org product data. Try one URL first. The status row tells you what happened, and you are not charged for pages that fail.

**Found a bug or need a site?**
Open an issue on the Actor's Issues tab with the input URL and the run ID.

# Actor input Schema

## `scrapeMode` (type: `string`):

How pages are fetched. **Auto** (recommended) starts with the cheapest method that works for the site and escalates only when a page is blocked: datacenter HTTP → crawler user agent (Target) → residential proxy in the marketplace's country → browser. **HTTP** never uses a browser. **Browser** always renders pages in a browser — slower and usually LESS successful: many stores answer plain HTTP faster and block fewer requests than a browser; use **Auto** unless a site only works in a browser.

## `detailsUrls` (type: `array`):

Direct links to product pages. Any store with structured product data works (Shopify, WooCommerce, BigCommerce, PrestaShop, Salesforce Commerce, Magento), plus Amazon, Walmart, Target, IKEA, Zalando, Flipkart and more.

Examples:
• https://www.amazon.com/dp/B09B8V1LZ3
• https://www.walmart.com/ip/2387232905
• https://www.skullcandy.com/products/crusher-540-active

A category or search URL of a supported marketplace (Amazon, Walmart, Target, …) pasted here is moved to the listing queue automatically; on other stores the URL is scraped as a product page, as entered.

## `listingUrls` (type: `array`):

Category, collection or search-result pages. Every product found is scraped, following next pages (page links, page parameters and the site’s own "load more" API where we know it — e.g. Waitrose). Shopify collections and WooCommerce categories are read through the store’s JSON. A store home page together with a keyword below searches that store. Each listing page that yields new products is billed once.

## `keyword` (type: `string`):

A keyword to search for on the marketplaces selected below (and on any store home page in "Category listing URLs"). Every product row carries this keyword and its search rank (`position`).

## `marketplaces` (type: `array`):

Marketplaces to run the keyword search on. Marketplaces that block every automated visitor (eBay, Home Depot, Costco, Etsy and a few others) get one status row naming the blocker and are never billed. Each marketplace’s status row reports pages fetched, products found vs the total the site states, and why it stopped.

## `additionalProperties` (type: `boolean`):

Adds site-specific extras in `additionalProperties` (Amazon bullet points and product-details table, Walmart specifications, Shopify product type and tags, JSON-LD color/material/weight, …).

## `fieldsToAnalyze` (type: `array`):

Adds an AI-written summary (`aiSummary`) to every product, built from the data points selected here only. Leave empty for no AI summary. Each summary is billed as one AI summary event, and only when the AI returns a complete answer. `aiSummaryStatus` says why a product has no summary.

## `customPrompt` (type: `string`):

Your own instruction for the AI summary (up to 3000 characters), e.g. "List the 3 main selling points as one sentence each" or "Write a 20-word product title for a German shop". The selected data points are sent with it. Leave empty for the default: a concise 2 to 4 sentence buyer-facing summary in English. If no data points are selected, name, offers, brand and description are used.

## `maxProductResults` (type: `integer`):

Maximum number of products for the whole run (in monitor mode: products checked, including unchanged ones that are not output). Leave empty for no limit.

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

Limit for each listing / search URL separately (the total limit above still applies). Leave empty for no per-URL limit.

## `followPagination` (type: `boolean`):

On listing pages, follow next-page links, page parameters and "load more" buttons.

## `includeVariants` (type: `boolean`):

Adds every variant (size, color, pack…) with its own SKU, price and stock to `variants`.

## `searchEngineKeyword` (type: `string`):

Google Shopping search terms, one per line (up to 50). Each keyword is an independent search in the country / city / region below. Every successful Google request is billed once (search-engine request); failed or blocked requests are never billed.

## `scrapeModeSearchEngine` (type: `string`):

**Google Listing**: one row per product on the results page. **Products**: the same, plus each product’s Google product page (description, typical price, number of offers). **Sellers**: every store selling each product (merchant, price, old price, stock, coupon, seller rating, delivery, returns, offer link), billed per seller. **Reviews** is not available: Google loads product reviews in the browser only, so this mode returns one explanatory status row per keyword.

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

Country of the Google Shopping search (prices, currency and stores of that market). Default: United States.

## `citySearchEngine` (type: `string`):

Optional city to localize Google Shopping results (e.g. "New York"). Combine with the region for a precise location.

## `regionSearchEngine` (type: `string`):

Optional region or state (e.g. "New York", "California", "Bavaria").

## `additionalPropertiesSearchEngine` (type: `boolean`):

Includes additional properties in the products scrape response.

## `maxSearchEngineProducts` (type: `integer`):

Maximum products taken from each keyword’s results page (Google shows about 40–60). In Products / Sellers mode each product costs one extra Google request.

## `maxSearchEngineSellersPerProduct` (type: `integer`):

Sellers mode: maximum stores listed per product.

## `maxSearchEngineResults` (type: `integer`):

Maximum items for the whole search-engine section: product rows (Google Listing / Products) or seller entries (Sellers).

## `keywordDelivery` (type: `string`):

Food-delivery search term (store name or cuisine, e.g. "pizza"). Needs a delivery address. Wolt uses its own search; Glovo and DoorDash match the term on the stores near the address.

## `marketplacesDelivery` (type: `array`):

Delivery platforms to search. Wolt and Glovo work with any address they serve; DoorDash needs a US address with a state. Instacart search runs in the browser only — use Instacart category or product URLs below instead.

## `deliveryDetailsUrls` (type: `array`):

Store / restaurant pages (Wolt, Glovo, DoorDash) — one row per store with its full menu — or Instacart product pages (product rows).

## `deliveryListingUrls` (type: `array`):

Store lists (Glovo city / category pages, DoorDash city pages, Wolt city pages with an address) or Instacart category pages (their products).

## `addressDelivery` (type: `string`):

Delivery address (street, ZIP or city) used to find stores that deliver there, e.g. "2901 16th St, San Francisco, CA" or "Mannerheimintie 10, Helsinki".

## `scrapeReviewsDelivery` (type: `boolean`):

Adds customer reviews to each store row where the platform shows them (DoorDash: up to 5 per store), billed per review. Wolt and Glovo show ratings only.

## `maxDeliveryResults` (type: `integer`):

Maximum store rows for the whole food-delivery section.

## `reviewDetailsUrls` (type: `array`):

Direct links to individual product detail pages. Each page will be visited separately to extract review information.

## `reviewListingUrls` (type: `array`):

Links to pages with multiple product reviews. The scraper will collect all reviews from these listings.

## `keywordReviews` (type: `string`):

A keyword used to search for product reviews across marketplaces.

## `marketplacesReviews` (type: `array`):

Select the marketplaces where the keyword search should be performed for reviews.

## `sortReview` (type: `string`):

Select how product reviews should be sorted. Some marketplaces may not support all sorting options — in such cases, the scraper will fall back to the default.

## `additionalReviewProperties` (type: `boolean`):

Includes additional properties in the response.

## `maxReviewResults` (type: `integer`):

Defines the total number of review results to collect during the entire run.

## `sellerUrls` (type: `array`):

Direct links to seller profile or store pages. Each URL will be visited to extract detailed seller information.

## `maxSellerResults` (type: `integer`):

Defines the total number of seller results to collect during the entire run.

## `influencerUrls` (type: `array`):

Direct links to individual influencer pages. Each page will be visited separately to extract post information.

## `scrapeInfluencerProducts` (type: `boolean`):

Scrape products from influencer posts.

## `maxInfluencerResults` (type: `integer`):

Limits the total number of influencer posts or items to collect during the run.

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

Country of the residential exit used when a page needs one. **Auto** uses each marketplace's own country (amazon.de → Germany, ikea.com/gb → United Kingdom), which keeps prices in the store's currency. Pick a country to see the prices and stock shown to shoppers there.

## `monitorMode` (type: `boolean`):

Remembers every product between runs and marks what changed since the last run: `changeType` is new, price-down, price-up, back-in-stock, out-of-stock, changed (currency, original price or a variant) or unchanged, with `previousPrice`, `priceChange` and `priceChangePct`. A product page that now returns 404 is reported as removed in the Status view. The first run is the baseline (every product is new). The saved state belongs to this exact list of URLs (and proxy country): editing the list starts a new baseline.

## `onlyChanges` (type: `boolean`):

Output only products that are new or changed since the last run (switches monitor mode on). Unchanged products get a status row only and are not charged as products; a page that needed a residential proxy or a browser is still charged its page fee, because it was fetched.

## `disableFallbacks` (type: `boolean`):

Internal: skip Zyte/Shopify/Oxylabs fallbacks; use marketplace standby only.

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

Internal: pages fetched in parallel (default 8).

## Actor input object example

```json
{
  "scrapeMode": "AUTO",
  "detailsUrls": [
    {
      "url": "https://www.skullcandy.com/products/crusher-540-active"
    }
  ],
  "listingUrls": [
    {
      "url": "https://www.deathwishcoffee.com/collections/coffee"
    }
  ],
  "additionalProperties": true,
  "maxProductResults": 10,
  "followPagination": true,
  "includeVariants": true,
  "scrapeModeSearchEngine": "Google Listing",
  "countryCode": "us",
  "additionalPropertiesSearchEngine": true,
  "sortReview": "Most recent",
  "additionalReviewProperties": true,
  "proxyCountry": "",
  "monitorMode": false,
  "onlyChanges": false,
  "disableFallbacks": false
}
```

# Actor output Schema

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

Every data row of the run (products, reviews, sellers, influencer posts, Google Shopping results, food-delivery stores). Status rows are in the Status dataset.

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

Product view of the dataset.

## `flatCsv` (type: `string`):

Flat, spreadsheet-friendly product columns.

## `reviews` (type: `string`):

Review rows (one per review) with the sort actually applied.

## `sellers` (type: `string`):

Seller / store contact rows.

## `influencerPosts` (type: `string`):

Amazon Influencer storefront lists.

## `searchResults` (type: `string`):

Search-engine rows (one per product; Sellers mode nests every store selling it).

## `delivery` (type: `string`):

One row per store / restaurant with its menu nested (Wolt, Glovo, DoorDash).

## `status` (type: `string`):

Separate dataset: one row per input with outcome, items found vs expected, tier used and per-tier causes.

## `summary` (type: `string`):

OUTPUT record: delivered vs expected per site, outcome counts, tier usage, billing counters.

# 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 = {
    "detailsUrls": [
        {
            "url": "https://www.skullcandy.com/products/crusher-540-active"
        }
    ],
    "listingUrls": [
        {
            "url": "https://www.deathwishcoffee.com/collections/coffee"
        }
    ],
    "additionalProperties": true,
    "maxProductResults": 10,
    "additionalPropertiesSearchEngine": true,
    "scrapeReviewsDelivery": false,
    "additionalReviewProperties": true,
    "scrapeInfluencerProducts": false
};

// Run the Actor and wait for it to finish
const run = await client.actor("constructive_calm/ecommerce-product-scraper-pro").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 = {
    "detailsUrls": [{ "url": "https://www.skullcandy.com/products/crusher-540-active" }],
    "listingUrls": [{ "url": "https://www.deathwishcoffee.com/collections/coffee" }],
    "additionalProperties": True,
    "maxProductResults": 10,
    "additionalPropertiesSearchEngine": True,
    "scrapeReviewsDelivery": False,
    "additionalReviewProperties": True,
    "scrapeInfluencerProducts": False,
}

# Run the Actor and wait for it to finish
run = client.actor("constructive_calm/ecommerce-product-scraper-pro").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 '{
  "detailsUrls": [
    {
      "url": "https://www.skullcandy.com/products/crusher-540-active"
    }
  ],
  "listingUrls": [
    {
      "url": "https://www.deathwishcoffee.com/collections/coffee"
    }
  ],
  "additionalProperties": true,
  "maxProductResults": 10,
  "additionalPropertiesSearchEngine": true,
  "scrapeReviewsDelivery": false,
  "additionalReviewProperties": true,
  "scrapeInfluencerProducts": false
}' |
apify call constructive_calm/ecommerce-product-scraper-pro --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,constructive_calm/ecommerce-product-scraper-pro"
        }
    }
}
```

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/jhXE55XKGfdJmmxCG/builds/Ng6QjLCn1JkeVu9zJ/openapi.json
