# Ecommerce-Product-Scraper (`codingfrontend/ecommerce-product-scraper`) Actor

Extract public products, complete published descriptions, images, native prices and stock from same-origin catalog and detail pages with supported structured data or product markup. Source access and layout determine coverage.

- **URL**: https://apify.com/codingfrontend/ecommerce-product-scraper.md
- **Developed by:** [Coding Frontned](https://apify.com/codingfrontend) (community)
- **Stats:** 2 total users, 1 monthly users, 60.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.99 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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

## Ecommerce product scraper

Collect source-published product names, complete descriptions, images, SKUs, native prices, stock, physical attributes and tags from public catalog and product pages. The Actor reads supported Product structured data and product markup, including classic and block-based WooCommerce product cards, follows same-origin next-page links, and enriches each selected listing product from its public detail page before saving it.

The default ScrapeMe catalog is a publisher-authored **demonstration catalog**, not verified real merchandise, sale prices or retailer inventory. Its examples establish extraction of that published demonstration. Coverage of other stores depends on their layout and permitted public access; universal retailer coverage and commercial market completeness are not verified. Private, account, cart, checkout and action links are excluded.

### Input

```json
{"startUrl":"https://scrapeme.live/shop/","maxProducts":2}
```

The preserved defaults are startUrl https://scrapeme.live/shop/, maxProducts 100, maxPages 5 and timeoutMs 30000. maxProducts accepts 0–10000; 0 retains its safety limit of 1000 products. maxPages accepts 1–20. The product limit applies across all listing pages and does not skip detail enrichment for the final selected product. A transparent userAgent is optional.

Direct public requests are the supported route. Requested proxy use fails before any request because this transport does not support proxies. An explicitly direct configuration such as {"useApifyProxy":false} is accepted. Invalid types, private targets and unknown controls fail without fabricated output.

### Example product

These native fields were verified against the published demonstration product and a saved Actor run. Runtime descriptions retain their complete published text; the sample shows that full description.

One complete native sentence is “By soaking up the sun’s rays, the seed grows progressively larger.” It appears within the full description below.

```json
{
  "name": "Bulbasaur",
  "sku": "4391",
  "description": "Bulbasaur can be seen napping in bright sunlight. There is a seed on its back. By soaking up the sun's rays, the seed grows progressively larger.",
  "price": 63,
  "currency": "GBP",
  "priceValidThrough": "2027-12-31",
  "valueAddedTaxIncluded": false,
  "availability": "https://schema.org/InStock",
  "inStock": true,
  "stockText": "45 in stock",
  "stockQuantity": 45,
  "weight": "15.2 kg",
  "dimensions": "2 × 2 × 2 cm",
  "tags": ["bulbasaur", "Overgrow", "Seed"],
  "image": "https://scrapeme.live/wp-content/uploads/2018/08/001.png",
  "productUrl": "https://scrapeme.live/shop/Bulbasaur/"
}
```

Missing brand, rating, review count, currency or other source values are omitted. Missing reviews are not converted to zero. Currency is retained from native codes or explicit symbols; an ambiguous dollar symbol remains a symbol rather than being guessed as USD. Native offer qualifiers and price units are exposed when published without price conversion. Weight and dimensions retain their native units; stockQuantity is present only when visible stock wording states a number. `images` contains distinct product image assets, not thumbnail size variants. `sourceUrl` appears only when a separate listing/source page contributed to the product row. Run start and completion timestamps are stored in the run summary.

### Results and access

Every dataset row is a genuine source product. OUTPUT and OUTPUT_SUMMARY record acknowledged saved counts, request counts and any failures. Useful records retained after a later failure produce SUCCEEDED with partial=true. Zero useful records produce FAILED and an empty dataset. A configured page or product cap limits coverage; it is not a claim that the whole catalog was collected.

Current publisher robots rules are checked before catalog, detail and redirect requests. Explicit denial or a challenge is not retried or bypassed. Only genuinely transient failures receive one bounded retry. Login, CAPTCHA solving, protection evasion, proxy rotation and alternative sources are not used. Each publisher's terms still govern use of its material. Raspberry Pi's dated terms expressly reserve against this collection; that specific origin is unavailable and does not create a blanket restriction on other publishers.

# Actor input Schema

## `startUrl` (type: `string`):

URL of the ecommerce website or product listing page to scrape.

## `maxProducts` (type: `integer`):

Maximum number of products to scrape. Use 0 for unlimited (bounded to a safe local maximum).

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

Maximum same-origin listing pages to follow when pagination is exposed; bounded to 20.

## `timeoutMs` (type: `integer`):

Maximum time allowed for each public request.

## `userAgent` (type: `string`):

Optional transparent HTTP user-agent string.

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

Direct public requests are used by default. A requested proxy route is rejected before any request because this transport has no proxy support.

## Actor input object example

```json
{
  "startUrl": "https://scrapeme.live/shop/",
  "maxProducts": 100,
  "maxPages": 5,
  "timeoutMs": 30000
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

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

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {};

// Run the Actor and wait for it to finish
const run = await client.actor("codingfrontend/ecommerce-product-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {}

# Run the Actor and wait for it to finish
run = client.actor("codingfrontend/ecommerce-product-scraper").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{}' |
apify call codingfrontend/ecommerce-product-scraper --silent --output-dataset

```

## MCP server setup

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

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/wlT6UL5hNH01QUgGm/builds/J9skV6SBSf8MWqRay/openapi.json
