# 🛍️ Shopify Store Scraper - Full Catalogue & Inventory (`that_red_bird/shopify-store-scraper`) Actor

⚡ Scrape any Shopify store's full catalogue through its own public endpoint. ✅ Products, variants, SKUs, prices, compare-at prices, stock flags, tags and images. ✅ One row per product or per variant. No API key, no rendering, no anti-bot.

- **URL**: https://apify.com/that\_red\_bird/shopify-store-scraper.md
- **Developed by:** [mohamed alaya](https://apify.com/that_red_bird) (community)
- **Categories:** E-commerce, Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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 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

Get any Shopify store's **entire catalogue** — products, variants, prices and stock — through
the store's own public endpoint.

Every Shopify storefront serves `/products.json`; it is the same data the shop's own pages
render from. No API key, no app install, no headless browser, no anti-bot. It is fast, cheap
and does not break when the theme changes.

### What you get

**Per product:** `title` · `handle` · `url` · `vendor` · `productType` · `tags` · `images` ·
`description` (HTML stripped) · `minPrice` / `maxPrice` · `inStock` · `variantCount` ·
`publishedAt` / `updatedAt`

**Per variant:** `sku` · `price` · `compareAtPrice` (the "was" price) · `available` ·
`option1/2/3` (size, colour…) · `grams`

### One row per product, or per variant

Turn on **`expandVariants`** to emit a row per size/colour with its own SKU, price and stock
flag. That is the shape you want for price monitoring, repricing and inventory feeds.

### Filtering

`collection` (scope to one collection handle) · `keywords` (title, description, tags) ·
`minPrice` / `maxPrice` · `inStockOnly` · `vendorFilter` · `productTypeFilter` ·
`maxProductsPerStore`.

### Typical uses

Competitor catalogue and price tracking · dropshipping product research · brand and
distributor monitoring for unauthorised sellers · building comparison sites · market research
on pricing and assortment · feeding a recommendation or search index.

### Honest limitations

- Works on Shopify stores only. Non-Shopify domains are reported as such, not silently empty.
- A minority of stores put a WAF in front of `products.json` and return 403 — those need the
  proxy option, and the store is reported with the exact error rather than skipped quietly.
- `products.json` exposes published products; it does not expose exact inventory counts,
  only per-variant availability.

# Actor input Schema

## `stores` (type: `array`):

One or more Shopify storefronts, e.g. https://www.allbirds.com. Any domain works as long as the store runs on Shopify.

## `collection` (type: `string`):

Limit to one collection, e.g. "all", "mens-shoes". Leave empty for the whole catalogue.

## `maxProductsPerStore` (type: `integer`):

Upper bound per store. Paging continues until this many products or the catalogue ends.

## `expandVariants` (type: `boolean`):

Emit a row per size/colour variant with its own SKU, price and stock flag instead of one row per product. This is what you want for price or inventory feeds.

## `inStockOnly` (type: `boolean`):

Skip products where every variant is sold out.

## `minPrice` (type: `integer`):

Keep products whose lowest variant price is at or above this. Store currency.

## `maxPrice` (type: `integer`):

Keep products whose lowest variant price is at or below this. Store currency.

## `vendorFilter` (type: `string`):

Exact vendor/brand match, case-insensitive.

## `productTypeFilter` (type: `string`):

Exact product-type match, case-insensitive.

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

Case-insensitive match on title, description and tags.

## `includeDescription` (type: `boolean`):

Include the product description as plain text (HTML stripped). Turn off for a smaller dataset.

## `concurrency` (type: `integer`):

How many stores to fetch in parallel.

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

Optional Apify proxy. A few stores put a WAF in front of products.json and need one.

## Actor input object example

```json
{
  "stores": [
    "https://www.allbirds.com"
  ],
  "maxProductsPerStore": 250,
  "expandVariants": false,
  "inStockOnly": false,
  "includeDescription": true,
  "concurrency": 3
}
```

# Actor output Schema

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

No description

## `downloadCsv` (type: `string`):

No description

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

No description

## `count` (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 = {
    "stores": [
        "https://www.allbirds.com"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("that_red_bird/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 = { "stores": ["https://www.allbirds.com"] }

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

```

## MCP server setup

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