# E-commerce Website Scraping Tool (`qaseemiqbal/e-commerce-website-scraping-tool`) Actor

Scrape public e-commerce pages for product names, prices, stock status, reviews, sellers, and price changes. Use URLs or keywords, export clean data, and keep runs cheap with low-cost defaults.

- **URL**: https://apify.com/qaseemiqbal/e-commerce-website-scraping-tool.md
- **Developed by:** [Muhammad Qaseem Iqbal](https://apify.com/qaseemiqbal) (community)
- **Categories:** E-commerce
- **Stats:** 2 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 results

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## E-commerce Website Scraping Tool

Extract product, price, review, seller, and price-change data from public e-commerce websites.

E-commerce Website Scraping Tool helps you turn online store pages into clean, downloadable data. Add product URLs, category or listing pages, review pages, seller pages, or search keywords, then run the actor to collect structured results you can open in Apify, download to a spreadsheet, send to an API, or connect to your own tools.

The actor is designed for public web pages and everyday e-commerce research tasks such as competitor price checks, product catalog tracking, review analysis, seller monitoring, and market discovery.

### What can this actor do?

- Collect product names, prices, currencies, descriptions, stock status, categories, images, ratings, and identifiers.
- Extract reviews when they are visible on the page.
- Capture seller and offer information where the website shows it.
- Discover product pages from search keywords and optional domain filters.
- Monitor prices and stock over time by comparing a new run with a previous dataset.
- Export results from Apify in formats such as JSON, CSV, Excel, XML, or through the Apify API.
- Keep costs low by using lightweight HTTP scraping by default, with browser mode available only when needed.

### Common use cases

| Use case | How this actor helps |
| --- | --- |
| Price monitoring | Track product prices and stock status on competitor websites. |
| Market research | Build a list of products, brands, categories, and prices in a market. |
| Product comparison | Collect product details from several stores and compare them in one dataset. |
| Review analysis | Gather customer reviews for sentiment analysis, product feedback, or quality research. |
| Seller research | Extract visible seller names, seller pages, offers, shipping details, and prices. |
| Catalog checks | Monitor whether products are in stock, discounted, renamed, or removed. |
| AI and analytics workflows | Send structured e-commerce data into spreadsheets, dashboards, databases, or AI tools. |

### What data can you extract?

The exact fields depend on what the website shows publicly, but the actor can collect the following types of information.

| Product data | Price and availability | Reviews and sellers |
| --- | --- | --- |
| Product name | Current price | Review title |
| Product URL | Currency | Review text |
| Description | List price, when available | Review rating |
| Brand | Discount text, when available | Review date |
| Category and breadcrumbs | Stock status | Verified purchase flag, when visible |
| Product identifiers such as SKU, GTIN, EAN, UPC, ISBN, ASIN, or MPN | Shipping text, when visible | Seller name |
| Images | Product variants | Seller URL |
| Rating and review count | Offers from sellers, when visible | Seller or offer price |

### How it works

1. You provide product URLs, listing URLs, review URLs, seller URLs, or keywords.
2. The actor opens those public pages and reads the visible product information.
3. It organizes the extracted data into clean rows.
4. You view the results in Apify or export them to your preferred format.
5. For price monitoring, you can schedule repeat runs and compare the latest data with an earlier dataset.

For most simple product pages, the actor uses fast HTTP scraping. For pages that load important data with JavaScript, you can enable browser scraping or automatic browser fallback.

### How to use E-commerce Website Scraping Tool

1. Open the actor in Apify Console.
2. Choose what you want to extract in the **Operation** field.
3. Add one or more product, listing, review, seller, or storefront URLs in **Start URLs**.
4. Optionally add **Keywords** and **Search domains** to discover product pages from search results.
5. Keep the default **Lowest cost** settings for a cheap first run.
6. Click **Start**.
7. Open the dataset when the run finishes and download the data or connect it to another tool.

### Operations

| Operation | Best for | What it returns |
| --- | --- | --- |
| Products | Product pages and product listings | Product rows with price, stock, category, rating, images, variants, and identifiers. |
| Reviews | Review pages or product pages with visible reviews | One row per review. |
| Sellers/offers | Seller pages, offer blocks, or product pages with visible sellers | Seller and offer rows. |
| Discovery | Finding product pages from keywords, search pages, or listing pages | Discovered product URLs and basic product details. |
| Food delivery | Public menu or delivery pages | Menu/product rows, using your delivery location when prices depend on location. |
| Influencer storefront | Public storefront or promoted-product pages | Storefront posts, product links, images, and creator names where visible. |
| Price monitor | Scheduled tracking of known product URLs | Current product rows plus price or stock change records when compared with a previous dataset. |

### Input options

| Input | Required? | Plain-English explanation |
| --- | --- | --- |
| Operation | Yes | Choose whether you want products, reviews, sellers, discovery, food delivery, influencer storefronts, or price monitoring. |
| Start URLs | Usually yes | Product pages, category pages, review pages, seller pages, menu pages, or storefront pages to scrape. |
| Keywords | Optional | Search terms used to find product pages. Use this when you do not already have exact URLs. |
| Search domains | Optional | Limit keyword search to specific websites, such as `example.com`. |
| Country code and locale | Optional | Helps with localized search and output preferences. |
| Preferred currency | Optional | Used when a page shows a price but does not clearly show the currency. |
| Delivery location | Required for food delivery | Address, ZIP code, city, or region used for location-sensitive menu pages. |
| Maximum records | Optional | Stops the run after a set number of output rows. |
| Maximum requests per run | Optional | Adds a hard safety limit so a run does not crawl too many pages. |
| Scrape mode | Optional | Choose fast HTTP scraping, browser scraping, or automatic mode. |
| Proxy configuration | Optional | Leave off for lower cost. Turn on only when a site blocks normal requests or requires a specific location. |

### Example input

This is a simple low-cost product scraping run.

```json
{
  "operation": "PRODUCTS",
  "costPreset": "LOWEST_COST",
  "scrapeMode": "HTTP",
  "startUrls": [
    {
      "url": "https://example.com/products/demo-headphones"
    }
  ],
  "maxItems": 25,
  "maxConcurrency": 3,
  "maxRequestsPerRun": 100,
  "allowBrowserFallback": false,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
````

### Example price monitoring input

Use this when you already have product URLs and want to compare the latest scrape with a previous Apify dataset.

```json
{
  "operation": "PRICE_MONITOR",
  "scrapeMode": "HTTP",
  "startUrls": [
    {
      "url": "https://example.com/products/demo-headphones"
    }
  ],
  "previousDatasetId": "YOUR_PREVIOUS_DATASET_ID",
  "maxItems": 100
}
```

### Example output

Results are saved to the actor dataset. A product row can look like this:

```json
{
  "recordType": "product",
  "url": "https://example.com/products/demo-headphones",
  "name": "Demo Wireless Headphones",
  "brand": {
    "name": "Demo Brand"
  },
  "price": {
    "amount": 129.99,
    "currency": "USD",
    "text": "$129.99"
  },
  "availability": "IN_STOCK",
  "category": {
    "breadcrumbs": ["Electronics", "Headphones"],
    "path": "Electronics > Headphones"
  },
  "rating": {
    "ratingValue": 4.6,
    "bestRating": 5,
    "reviewCount": 248
  },
  "source": {
    "domain": "example.com"
  },
  "extraction": {
    "confidence": 0.86,
    "mode": "HTTP"
  }
}
```

### Dataset views

The actor includes ready-made dataset views so you can quickly inspect the data in Apify.

| View | What it shows |
| --- | --- |
| Products | Product names, brands, prices, availability, ratings, URLs, and confidence score. |
| Reviews | Review text, rating, date, author alias, helpful votes, and product link. |
| Sellers and offers | Seller names, seller URLs, offer prices, shipping text, availability, and product link. |
| Price changes | Previous price, current price, price delta, stock change, alert severity, and detection time. |
| All fields | The full raw output for advanced analysis. |

The actor also writes a run summary to the key-value store under `OUTPUT`. Price monitor runs with detected changes also write an `ALERTS` record.

### Keeping costs low

This actor is configured to start cheaply by default.

- **Lowest cost** is the default cost preset.
- **HTTP mode** is the default scrape mode because it is faster and cheaper than launching a browser.
- **Browser fallback** is off by default.
- **Apify Proxy** is off by default.
- **Discovery enrichment** is off by default, so keyword discovery does not automatically open every discovered product page.
- **Review media** is off by default to reduce output size.
- Default limits are modest: 25 records, 100 requests per run, 3 concurrent requests, 1 retry, and a 30-second request timeout.

For the cheapest test run, use one product URL, keep HTTP mode, leave proxy disabled, and set a small maximum record limit.

For harder websites, use the settings below only when needed:

```json
{
  "costPreset": "BALANCED",
  "scrapeMode": "AUTO",
  "allowBrowserFallback": true,
  "maxBrowserFallbackPages": 5,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

### Tips for better results

- Start with direct product URLs when accuracy matters most.
- Use listing or category pages when you want to collect many products from the same store.
- Use keywords plus search domains when you want to discover product pages from selected websites.
- Use browser mode for websites that show empty pages or load prices only after JavaScript runs.
- Use proxy only when direct requests are blocked or location matters.
- Keep `maxItems` and `maxRequestsPerRun` low while testing a new website.
- Schedule recurring price monitor runs to build your own price history over time.

### Frequently asked questions

#### Can I scrape Amazon, Walmart, eBay, Shopify stores, or other e-commerce sites?

You can use the actor with many public e-commerce websites, including marketplaces, regional retailers, and independent stores. Results depend on how each website displays its data and whether the page is publicly accessible. Very protected or JavaScript-heavy websites may require browser mode, proxy settings, or a more specialized actor.

#### Can it scrape pages behind a login?

No. This actor is intended for publicly available pages. It does not log in to accounts, bypass paywalls, or access private customer information.

#### Can it collect historical prices?

It captures the current data visible at the time of each run. To build history, schedule regular runs and save each dataset. Price monitor mode can compare the current run with a previous dataset and create price or stock change records.

#### Why are some fields empty?

Some websites do not show every field, or they load certain fields later with JavaScript. Empty fields usually mean the information was not visible in the page version the actor could access. Try browser mode, automatic fallback, or proxy settings if the page looks incomplete.

#### How often should I run it for price monitoring?

Daily runs are enough for many products. Use hourly runs for fast-changing categories, flash sales, or highly competitive products. Use weekly runs for slower catalogs or long-term market tracking.

#### Can I export the data?

Yes. Apify datasets can be downloaded in common formats such as JSON, CSV, Excel, XML, and HTML. You can also use the Apify API, integrations, webhooks, or scheduling to send results into other systems.

#### Is e-commerce scraping legal?

This actor is designed for publicly available information. Web scraping rules vary by website and country, so you should review the target website's terms and follow applicable laws and policies.

### Local development

Most users do not need this section. It is only for developers who want to run or modify the actor locally.

```bash
npm install
npm run build
npm test
npm run dev
```

### Support

If a page does not work as expected, include the target URL, your input settings, and the run ID when reporting the issue. This makes it much easier to reproduce the problem and improve extraction for that website.

# Actor input Schema

## `operation` (type: `string`):

Select which commerce records to extract.

## `costPreset` (type: `string`):

Controls defaults for speed, reliability, and cost. Lowest cost avoids browser fallback and paid proxy traffic unless explicitly enabled.

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

HTTP is cheapest. AUTO can use browser fallback only when browser fallback is enabled. BROWSER is most expensive.

## `allowBrowserFallback` (type: `boolean`):

Allow AUTO mode to retry low-confidence pages with Playwright. Keep disabled for the lowest compute cost.

## `maxBrowserFallbackPages` (type: `integer`):

Hard cap for expensive browser fallback pages in AUTO mode.

## `startUrls` (type: `array`):

Product, listing, review, seller, food-delivery, or storefront URLs.

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

Search terms used for discovery or keyword-based product/review/seller workflows.

## `searchDomains` (type: `array`):

Optional domain restrictions for keyword discovery.

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

ISO country code used for localization and proxy country hints.

## `locale` (type: `string`):

Preferred content locale, such as en-US.

## `currency` (type: `string`):

Optional ISO currency code used when a page omits currency.

## `deliveryLocation` (type: `string`):

Address, ZIP, city, or region for location-sensitive food-delivery scraping.

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

Global hard cap for pushed dataset records.

## `maxSearchResults` (type: `integer`):

Maximum candidate product URLs to collect from each keyword or search/listing source.

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

Maximum number of review rows to extract for each product or review page.

## `maxSellersPerProduct` (type: `integer`):

Maximum number of seller or offer rows to extract for each product page.

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

Maximum number of pages processed in parallel.

## `maxRequestsPerRun` (type: `integer`):

Hard cap for total crawled pages. Prevents runaway queue growth and unexpected compute cost.

## `requestRetries` (type: `integer`):

Retry count for failed pages. Lower values reduce compute and proxy traffic.

## `requestTimeoutSecs` (type: `integer`):

Timeout for each page request. Shorter timeouts reduce long-running failed requests.

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

Include visible product variant information when available.

## `includeSellers` (type: `boolean`):

Also extract visible seller and offer information during product runs.

## `includeReviewMedia` (type: `boolean`):

Include image or video URLs attached to reviews when available.

## `enrichDiscoveredProducts` (type: `boolean`):

When true, DISCOVERY enqueues discovered product URLs for product extraction. Disable to avoid extra requests.

## `previousDatasetId` (type: `string`):

Optional dataset used by PRICE\_MONITOR to emit price\_change records.

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

Apify proxy configuration. Leave disabled for the lowest cost; enable only for sites that block direct requests.

## Actor input object example

```json
{
  "operation": "PRODUCTS",
  "costPreset": "LOWEST_COST",
  "scrapeMode": "HTTP",
  "allowBrowserFallback": false,
  "maxBrowserFallbackPages": 0,
  "startUrls": [
    {
      "url": "https://example.com/product/example"
    }
  ],
  "keywords": [],
  "searchDomains": [],
  "countryCode": "US",
  "locale": "en-US",
  "currency": "",
  "deliveryLocation": "",
  "maxItems": 25,
  "maxSearchResults": 10,
  "maxReviewsPerProduct": 50,
  "maxSellersPerProduct": 5,
  "maxConcurrency": 3,
  "maxRequestsPerRun": 100,
  "requestRetries": 1,
  "requestTimeoutSecs": 30,
  "includeVariants": true,
  "includeSellers": false,
  "includeReviewMedia": false,
  "enrichDiscoveredProducts": false,
  "previousDatasetId": "",
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

All rows produced by the actor in the default dataset.

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

Product rows with names, prices, stock status, ratings, categories, source URLs, and confidence score.

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

Review rows with review text, rating, date, helpful votes, and product link when available.

## `sellersAndOffers` (type: `string`):

Seller and offer rows with seller name, offer price, shipping details, availability, and source domain.

## `priceChanges` (type: `string`):

Price and stock change rows created by price monitoring runs.

## `runSummary` (type: `string`):

Summary of the run, including operation, scrape mode, record counts, failed requests, and warnings.

## `priceAlerts` (type: `string`):

Optional alert summary written when price monitor mode detects price or stock changes.

# 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 = {
    "startUrls": [
        {
            "url": "https://example.com/product/example"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("qaseemiqbal/e-commerce-website-scraping-tool").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 = { "startUrls": [{ "url": "https://example.com/product/example" }] }

# Run the Actor and wait for it to finish
run = client.actor("qaseemiqbal/e-commerce-website-scraping-tool").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "startUrls": [
    {
      "url": "https://example.com/product/example"
    }
  ]
}' |
apify call qaseemiqbal/e-commerce-website-scraping-tool --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=qaseemiqbal/e-commerce-website-scraping-tool",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "E-commerce Website Scraping Tool",
        "description": "Scrape public e-commerce pages for product names, prices, stock status, reviews, sellers, and price changes. Use URLs or keywords, export clean data, and keep runs cheap with low-cost defaults.",
        "version": "0.1",
        "x-build-id": "DKQnfEPA422I3tTw1"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/qaseemiqbal~e-commerce-website-scraping-tool/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-qaseemiqbal-e-commerce-website-scraping-tool",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/qaseemiqbal~e-commerce-website-scraping-tool/runs": {
            "post": {
                "operationId": "runs-sync-qaseemiqbal-e-commerce-website-scraping-tool",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/qaseemiqbal~e-commerce-website-scraping-tool/run-sync": {
            "post": {
                "operationId": "run-sync-qaseemiqbal-e-commerce-website-scraping-tool",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "operation"
                ],
                "properties": {
                    "operation": {
                        "title": "Operation",
                        "enum": [
                            "PRODUCTS",
                            "REVIEWS",
                            "SELLERS",
                            "DISCOVERY",
                            "FOOD_DELIVERY",
                            "INFLUENCER",
                            "PRICE_MONITOR"
                        ],
                        "type": "string",
                        "description": "Select which commerce records to extract.",
                        "default": "PRODUCTS"
                    },
                    "costPreset": {
                        "title": "Cost preset",
                        "enum": [
                            "LOWEST_COST",
                            "BALANCED",
                            "FULL_COVERAGE"
                        ],
                        "type": "string",
                        "description": "Controls defaults for speed, reliability, and cost. Lowest cost avoids browser fallback and paid proxy traffic unless explicitly enabled.",
                        "default": "LOWEST_COST"
                    },
                    "scrapeMode": {
                        "title": "Scrape mode",
                        "enum": [
                            "AUTO",
                            "HTTP",
                            "BROWSER"
                        ],
                        "type": "string",
                        "description": "HTTP is cheapest. AUTO can use browser fallback only when browser fallback is enabled. BROWSER is most expensive.",
                        "default": "HTTP"
                    },
                    "allowBrowserFallback": {
                        "title": "Allow browser fallback",
                        "type": "boolean",
                        "description": "Allow AUTO mode to retry low-confidence pages with Playwright. Keep disabled for the lowest compute cost.",
                        "default": false
                    },
                    "maxBrowserFallbackPages": {
                        "title": "Maximum browser fallback pages",
                        "minimum": 0,
                        "maximum": 10000,
                        "type": "integer",
                        "description": "Hard cap for expensive browser fallback pages in AUTO mode.",
                        "default": 0
                    },
                    "startUrls": {
                        "title": "Start URLs",
                        "type": "array",
                        "description": "Product, listing, review, seller, food-delivery, or storefront URLs.",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL",
                                    "description": "Public commerce page URL to crawl."
                                }
                            }
                        },
                        "default": []
                    },
                    "keywords": {
                        "title": "Keywords",
                        "type": "array",
                        "description": "Search terms used for discovery or keyword-based product/review/seller workflows.",
                        "items": {
                            "type": "string"
                        },
                        "default": []
                    },
                    "searchDomains": {
                        "title": "Search domains",
                        "type": "array",
                        "description": "Optional domain restrictions for keyword discovery.",
                        "items": {
                            "type": "string"
                        },
                        "default": []
                    },
                    "countryCode": {
                        "title": "Country code",
                        "type": "string",
                        "description": "ISO country code used for localization and proxy country hints.",
                        "default": "US"
                    },
                    "locale": {
                        "title": "Locale",
                        "type": "string",
                        "description": "Preferred content locale, such as en-US.",
                        "default": "en-US"
                    },
                    "currency": {
                        "title": "Preferred currency",
                        "type": "string",
                        "description": "Optional ISO currency code used when a page omits currency.",
                        "default": ""
                    },
                    "deliveryLocation": {
                        "title": "Delivery location",
                        "type": "string",
                        "description": "Address, ZIP, city, or region for location-sensitive food-delivery scraping.",
                        "default": ""
                    },
                    "maxItems": {
                        "title": "Maximum records",
                        "minimum": 1,
                        "maximum": 100000,
                        "type": "integer",
                        "description": "Global hard cap for pushed dataset records.",
                        "default": 25
                    },
                    "maxSearchResults": {
                        "title": "Maximum search results",
                        "minimum": 1,
                        "maximum": 10000,
                        "type": "integer",
                        "description": "Maximum candidate product URLs to collect from each keyword or search/listing source.",
                        "default": 10
                    },
                    "maxReviewsPerProduct": {
                        "title": "Maximum reviews per product",
                        "minimum": 1,
                        "maximum": 10000,
                        "type": "integer",
                        "description": "Maximum number of review rows to extract for each product or review page.",
                        "default": 50
                    },
                    "maxSellersPerProduct": {
                        "title": "Maximum sellers per product",
                        "minimum": 1,
                        "maximum": 500,
                        "type": "integer",
                        "description": "Maximum number of seller or offer rows to extract for each product page.",
                        "default": 5
                    },
                    "maxConcurrency": {
                        "title": "Maximum concurrency",
                        "minimum": 1,
                        "maximum": 100,
                        "type": "integer",
                        "description": "Maximum number of pages processed in parallel.",
                        "default": 3
                    },
                    "maxRequestsPerRun": {
                        "title": "Maximum requests per run",
                        "minimum": 1,
                        "maximum": 100000,
                        "type": "integer",
                        "description": "Hard cap for total crawled pages. Prevents runaway queue growth and unexpected compute cost.",
                        "default": 100
                    },
                    "requestRetries": {
                        "title": "Request retries",
                        "minimum": 0,
                        "maximum": 10,
                        "type": "integer",
                        "description": "Retry count for failed pages. Lower values reduce compute and proxy traffic.",
                        "default": 1
                    },
                    "requestTimeoutSecs": {
                        "title": "Request timeout seconds",
                        "minimum": 5,
                        "maximum": 300,
                        "type": "integer",
                        "description": "Timeout for each page request. Shorter timeouts reduce long-running failed requests.",
                        "default": 30
                    },
                    "includeVariants": {
                        "title": "Include variants",
                        "type": "boolean",
                        "description": "Include visible product variant information when available.",
                        "default": true
                    },
                    "includeSellers": {
                        "title": "Include sellers/offers",
                        "type": "boolean",
                        "description": "Also extract visible seller and offer information during product runs.",
                        "default": false
                    },
                    "includeReviewMedia": {
                        "title": "Include review media",
                        "type": "boolean",
                        "description": "Include image or video URLs attached to reviews when available.",
                        "default": false
                    },
                    "enrichDiscoveredProducts": {
                        "title": "Enrich discovered products",
                        "type": "boolean",
                        "description": "When true, DISCOVERY enqueues discovered product URLs for product extraction. Disable to avoid extra requests.",
                        "default": false
                    },
                    "previousDatasetId": {
                        "title": "Previous dataset ID",
                        "type": "string",
                        "description": "Optional dataset used by PRICE_MONITOR to emit price_change records.",
                        "default": ""
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Apify proxy configuration. Leave disabled for the lowest cost; enable only for sites that block direct requests.",
                        "default": {
                            "useApifyProxy": false
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
