# Shopify Product Catalog Scraper — Prices & Variants (`datamule/shopify-product-catalog-scraper`) Actor

Export accessible public Shopify product catalogs with variants, prices, availability, images and product links. Bounded multi-store CSV/JSON exports. $0.80 per 1,000 delivered products, no start fee or API key.

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

## Pricing

$0.80 / 1,000 delivered products

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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

## Shopify Product Catalog Scraper

Export product catalogs from accessible public Shopify stores into structured JSON, CSV or Excel. Supply several storefront URLs and receive **one row per unique product**, with every publicly returned variant kept inside that row. Use it for catalog research, price comparisons and product-feed analysis.

### Quick start

```json
{"storeUrls":["https://www.allbirds.com"],"maxProducts":25}
```

Use a store's final, canonical **HTTPS** hostname. Paths normalize to the shop origin; redirects are not followed. The example is an independent public storefront, not a demo dataset or an affiliation. Catalogs change over time.

### What you receive

- Product ID, title, handle, description HTML, vendor, type, tags and product URL.
- `shopOrigin` so catalogs from multiple stores stay attributable.
- All publicly returned variants, including IDs, titles, options, SKU, price, compare-at price and boolean availability.
- Images and product options as returned by the public catalog.
- Storefront creation, update and publication timestamps when present.

Prices remain source strings. **Currency is null:** this public `products.json` interface does not assert a reliable currency code alongside its prices. We do not infer currency from a domain, language, price symbol or a shopping-cart cookie. Verify the store's pricing currency separately before combining monetary values. `available` means at least one variant is marked available by the storefront; **it is not an exact inventory quantity**.

### Inputs and limits

| Input | Default | Meaning |
|---|---|---|
| `storeUrls` | Public example above | 1–20 HTTPS storefront URLs |
| `maxProducts` | 25 | Global unique-product cap across all stores, 1–10,000 |

Stores are processed in input order. Identical normalized origins and product IDs within an origin are deduplicated. Products on different store origins remain separate, even if their titles match. Pagination uses at most 250 products per request. A changing live catalog can shift page boundaries; this is not an atomic shop snapshot.

Only public `/products.json` and `/robots.txt` are requested. No Admin API, login, cart operations, checkout, customer data, proxy bypass or anti-bot workarounds. Store robots rules and crawl delays are honored; inaccessible or disallowed catalogs are skipped. Follow applicable source terms and use only catalogs you are authorized to collect. Password-protected shops, blocked JSON endpoints and redirects are unsupported; use the final storefront hostname rather than expecting bypasses. Response size is capped at 12 MiB, individual HTTP calls time out after 25 seconds, and pagination has a safety ceiling. Unusually large or malformed products can be skipped. No full-catalog completeness guarantee is made.

The `SUMMARY` key-value record reports delivered products, malformed-product skips and source failures. If no current valid catalog is accessible, the run fails rather than returning invented products. An accessible empty catalog can succeed with zero products. With multiple stores, successful rows may accompany reported source errors.

### Pricing and spending

**$0.0008 per delivered product ($0.80 per 1,000)**, with no start fee. All variants and images inside a product row are included. One product costs $0.0008; 25 cost $0.02; 100 cost $0.08. These are Actor event charges; consult Apify for any separate platform charges.

Set a positive maximum run charge in Apify to bound billed results. A positive limit below one product's price produces no rows or product events. Do not use a run charge setting of zero as a zero-spend guarantee: Apify may interpret zero as unset. The global result cap and remaining budget both apply.

Output uses the Apify SDK's charged push, which clips delivery to affordability. Dataset and charged-event history are reconciled on restart; disagreement stops the run instead of silently rebilling. Dataset writes and billing are not transactional: a crash or billing failure can leave an unmatched output prefix requiring investigation. We do not promise exactly-once billing across an ambiguous failure.

This independent Actor is not endorsed by Shopify or any example storefront.

# Actor input Schema

## `storeUrls` (type: `array`):

One to twenty public HTTPS storefront URLs. Paths normalize to the shop origin. Use the final canonical hostname: redirects are not followed.

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

Global unique-product limit across all stores, not per store. Billing budget may stop the run earlier.

## Actor input object example

```json
{
  "storeUrls": [
    "https://www.allbirds.com"
  ],
  "maxProducts": 25
}
```

# Actor output Schema

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

No description

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

No description

# API

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

## JavaScript example

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

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

// Prepare Actor input
const input = {
    "storeUrls": [
        "https://www.allbirds.com"
    ],
    "maxProducts": 25
};

// Run the Actor and wait for it to finish
const run = await client.actor("datamule/shopify-product-catalog-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 = {
    "storeUrls": ["https://www.allbirds.com"],
    "maxProducts": 25,
}

# Run the Actor and wait for it to finish
run = client.actor("datamule/shopify-product-catalog-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 '{
  "storeUrls": [
    "https://www.allbirds.com"
  ],
  "maxProducts": 25
}' |
apify call datamule/shopify-product-catalog-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,datamule/shopify-product-catalog-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/fOtDKkCJxxhb7Vp4k/builds/2SzMmXMkFPw8x7v42/openapi.json
