# Shopify Store Scraper — no browser, full catalog (`cstamigo/shopify-store-scraper`) Actor

Extract the full product catalog of any Shopify store: SKU, price, compare-at price, discount %, stock, images and tags. Pure HTTP, no browser — fast and cheap.

- **URL**: https://apify.com/cstamigo/shopify-store-scraper.md
- **Developed by:** [Cristian Amigo](https://apify.com/cstamigo) (community)
- **Categories:** E-commerce, AI, Lead generation
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

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

## 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 Store Scraper — full catalog, no browser

Extract the **complete product catalog of any Shopify store** in one run: SKU, current price,
compare-at price, **discount %**, stock per variant, images, vendor, product type and tags.

No browser. No proxies needed. No anti-bot fight.

***

### Why this one is different

Most Shopify scrapers drive a headless browser to read pages that a Shopify store already
publishes as clean JSON. That makes them slow, expensive and fragile.

This Actor uses the store's own public catalog endpoint. The consequences are direct:

| | Browser-based scrapers | This Actor |
|---|---|---|
| Compute cost | High — a browser per page | **Minimal — plain HTTP** |
| Speed | Seconds per page | **250 products per request** |
| Breaks when the theme changes | Yes | **No** — it doesn't read the theme |
| Non-Shopify URL | Hangs or returns empty | **Says so, clearly, and moves on** |

**Verified on real stores** (14 Aug 2026): `gymshark.com`, `allbirds.com`, `kyliecosmetics.com`.

***

### What you get

One row per variant — the format you actually want in a spreadsheet, a CRM or a price feed:

| Field | Example |
|---|---|
| `titulo` | Men's Strider - Medium Grey |
| `sku` | B7B5R-NDLF-M |
| `precio` | 91.0 |
| `precio_antes` | 130.0 |
| **`descuento_pct`** | **30.0** |
| `hay_stock` | true |
| `marca` / `tipo` / `tags` | Allbirds / Shoes / running, wool |
| `url` / `imagen` / `n_imagenes` | direct links |
| `peso_gr`, `requiere_envio` | for shipping calculations |

Switch **One row per variant** off to get one compact row per product with `precio_min` / `precio_max`.

***

### What people use it for

- **Competitive price monitoring** — run daily, diff the `precio` column
- **Discount hunting** — `descuento_pct` is computed for you; sort and you're done
- **Dropshipping / product research** — full catalogs with SKU and stock
- **Lead generation** — catalog size, vendors and product types per store
- **Product feeds** — clean, flat, ready for Google Merchant or a marketplace

***

### Input

```json
{
  "shopUrls": ["gymshark.com", "https://www.allbirds.com/"],
  "maxProductsPerShop": 0,
  "includeVariants": true,
  "onlyAvailable": false
}
```

Any URL format works — bare domain, with `www`, with `https://`, or even a link to a product page.
The Actor normalizes it to the store root.

Set `maxProductsPerShop` to `20` first to preview the output, then to `0` for the full catalog.

***

### Honest limits

- Works on stores that keep `/products.json` public. **That is the vast majority, but not all** —
  a store can disable it, and a few large brands do. When that happens the Actor tells you exactly
  which store and why, instead of silently returning nothing.
- Returns the **published catalog**. Products hidden from the online store are not included.
- Does not scrape reviews, collections or customer data.
- Rate-limited on purpose (0.4 s between pages) to stay polite. Large catalogs take a bit longer.

***

### Pricing — $0.50 per 1,000 products

**You pay per product delivered. Not per run, not per minute.** If a store returns nothing, you are
not charged for it.

**No compute surcharge.** Most scrapers bill you their platform usage on top of their own fee,
because driving a browser is expensive. This one doesn't need a browser, so there is nothing to
pass on. The $0.50 is the whole price.

| | Products / month | Cost |
|---|---|---|
| Monitor one competitor daily (500 products) | 15,000 | **$7.50** |
| Monitor 10 competitors daily | 150,000 | **$75** |
| One-off catalog export of a large store | 5,000 | **$2.50** |

For comparison, scrapers that fight anti-bot systems with a headless browser typically charge
$1.50–$2.00 per 1,000 results — and add compute on top.

# Actor input Schema

## `shopUrls` (type: `array`):

One or more Shopify store URLs. Any format works — 'gymshark.com', 'https://www.allbirds.com/', or a link to a product page. The Actor normalizes it to the store root.

## `maxProductsPerShop` (type: `integer`):

Stop after this many products per store. Set 0 for the full catalog. Tip: start at 20 to preview the output before running the whole catalog.

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

ON: one row per variant, with SKU, price, compare-at price, discount % and stock. This is what you want for spreadsheets, price monitoring and feeds. OFF: one row per product with min/max price.

## `onlyAvailable` (type: `boolean`):

Skip products where every variant is out of stock.

## Actor input object example

```json
{
  "shopUrls": [
    "gymshark.com"
  ],
  "maxProductsPerShop": 0,
  "includeVariants": true,
  "onlyAvailable": false
}
```

# Actor output Schema

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

Full product catalog scraped from the Shopify stores you provided.

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

Rows extracted per store, and the reason when a store returned nothing.

# 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 = {
    "shopUrls": [
        "gymshark.com",
        "allbirds.com"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("cstamigo/shopify-store-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 = { "shopUrls": [
        "gymshark.com",
        "allbirds.com",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("cstamigo/shopify-store-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 '{
  "shopUrls": [
    "gymshark.com",
    "allbirds.com"
  ]
}' |
apify call cstamigo/shopify-store-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,cstamigo/shopify-store-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/PYXvf7mPpb54PLITh/builds/MVDiph22THxjaaSEJ/openapi.json
