# Shopify Products Scraper & Price Monitor (`krasyn-side/shopify-products-scraper`) Actor

Scrape all products from any Shopify store: prices, sale (compare-at) prices, discounts, variants, SKUs, stock availability, vendor, tags, images, dates. Per product or per variant. Public products.json feed, no proxies. For price monitoring, competitor and dropshipping research.

- **URL**: https://apify.com/krasyn-side/shopify-products-scraper.md
- **Developed by:** [Krasyn Labs](https://apify.com/krasyn-side) (community)
- **Categories:** E-commerce, Lead generation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.56 / 1,000 product scrapeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## Shopify Products Scraper & Price Monitor

**Press Start. The input is already filled in.** It reads the catalogs of Allbirds, Gymshark and ColourPop: **150 products with prices, sale prices and stock in 4 seconds** (50 per store, test run 23 Oct 2026). Paste any Shopify store domain and raise the limit to get the full catalog.

| What you get | |
|---|---|
| Price | **$0.80 per 1,000 products**, and less on paid Apify plans: $0.72 (Starter), $0.64 (Scale), $0.56 (Business). No start fee. Apify's free monthly credit covers your first runs |
| Bill cap | `maxProductsPerStore`, plus Apify's *Max cost per run* option, so a run cannot exceed your budget |
| Reliability | Each store's own public products.json endpoint. No proxies, browser or login. Re-tested on the Apify platform on 23 Oct 2026 |

Extract the **full product catalog of any Shopify store**: titles, prices, **compare-at (sale) prices and discount %**, variants (size / color), SKUs, **stock availability**, vendor, product type, tags, images and created / updated / published dates. Paste store domains, get a clean table. One row per product, or one row per variant.

### Use cases

- **Price monitoring**: schedule it daily and track price changes, new discounts and sell-outs across competitor stores.
- **Competitor research**: see a brand's full assortment, price architecture, vendors, product types and how fast they launch new products (`publishedAt`, `createdAt`).
- **Dropshipping and product research**: find what stores sell, at what price, and which items are on sale or out of stock.
- **Catalog and feed building**: export SKUs, options, images and URLs to CSV, Excel or JSON for comparison sites, analytics or AI agents.

### Input

| Field | Description |
|---|---|
| `storeUrls` | Store domains or URLs: `allbirds.com`, `https://colourpop.com`, `mystore.myshopify.com`. A collection URL like `https://store.com/collections/sale` scrapes only that collection. |
| `collectionHandle` | Optional. Only scrape this collection in every store, e.g. `sale`, `new-arrivals`, `mens`. |
| `maxProductsPerStore` | Stop after N products per store (default 1,000, up to 100,000). |
| `flattenVariants` | `true` = one row per variant with its own price, SKU, availability and URL. `false` (default) = one row per product with min/max price and aggregated availability. |
| `includeDescription` | Add the product description as plain text. |

Example (this is the prefilled input, and it works as is):

```json
{
  "storeUrls": ["allbirds.com", "gymshark.com", "colourpop.com"],
  "maxProductsPerStore": 50,
  "flattenVariants": false,
  "includeDescription": false
}
```

Only one collection, one row per variant:

```json
{ "storeUrls": ["allbirds.com"], "collectionHandle": "mens", "maxProductsPerStore": 200, "flattenVariants": true }
```

### Output

One row per product (or per variant):

```json
{
  "store": "allbirds.com",
  "storeName": "Allbirds",
  "productId": 7340901859408,
  "title": "Women's Allbirds Flip Flop - Dusty Pink",
  "handle": "womens-allbirds-flip-flop-dusty-pink",
  "vendor": "Allbirds",
  "productType": "Shoes",
  "tags": ["allbirds::gender => womens", "allbirds::material => sugar"],
  "url": "https://allbirds.com/products/womens-allbirds-flip-flop-dusty-pink?variant=42146889039952",
  "collection": null,
  "currency": "USD",
  "variantId": 42146889039952,
  "variantTitle": "5",
  "options": { "Size": "5" },
  "price": 25,
  "maxPrice": 25,
  "compareAtPrice": 50,
  "onSale": true,
  "discountPercent": 50,
  "available": false,
  "variantCount": 7,
  "availableVariantCount": 1,
  "sku": "A12513W050",
  "barcode": null,
  "grams": 455,
  "requiresShipping": true,
  "inventoryQuantity": null,
  "imageUrl": "https://cdn.shopify.com/s/files/1/1104/4168/files/A12513_26Q2_Allbirds-Flip-Flop-Dusty-Pink_PDP_LEFT.png",
  "imageCount": 5,
  "createdAt": "2026-03-27T14:03:50-07:00",
  "updatedAt": "2026-10-14T10:12:01-07:00",
  "publishedAt": "2026-03-27T14:05:12-07:00",
  "scrapedAt": "2026-10-14T23:39:20.366Z"
}
```

In per-product mode, `price` is the cheapest variant, `maxPrice` the most expensive, `options` lists every option value (e.g. all sizes), `available` is true if any variant is in stock, and `variantId` / `variantTitle` are null.
`inventoryQuantity` is filled only if the store exposes it publicly (most do not). `currency` comes from the store's public `/meta.json`.
A run summary per store (`ok` / `skipped` with the reason) is saved to the key-value store as `SUMMARY`.

### Pricing

Pay per result: **$0.0008 per product** ($0.80 per 1,000 products). No start fee. In variant mode you still pay per product, not per variant row. Plus the small Apify platform compute usage (runs on 256 MB).

### How it works and limits

- Reads the **public JSON feed every Shopify storefront serves** (`/products.json`, `/collections/<handle>/products.json`, `/meta.json`), the same data shown to every visitor. No login, no API key, no HTML scraping, no proxies.
- Polite: about **1 request per second per store** (250 products per request), automatic retries with backoff on HTTP 429 / 5xx, descriptive User-Agent. Several stores run in parallel.
- Non-Shopify sites, password-protected stores and stores that disabled the products feed (some large brands do) are **logged and skipped**, not charged.
- Some stores disable collection feeds while keeping the main feed; in that case scrape the full store instead.
- Only published products visible on the online store are returned. No customer or order data, no personal data.

### About

Built and maintained by an AI agent (Claude, by Anthropic) operated by Krasyn LLC (Krasyn Labs). Not affiliated with, endorsed by, or sponsored by Shopify Inc. or any store. Shopify is a trademark of Shopify Inc. Please respect each store's terms of use. Issues and feature requests: please use the Issues tab.

# Actor input Schema

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

Store domains or URLs, e.g. allbirds.com, https://colourpop.com, mystore.myshopify.com. A collection URL (https://store.com/collections/sale) scrapes only that collection. Non-Shopify sites and stores with the products feed disabled are logged and skipped.

## `collectionHandle` (type: `string`):

Only scrape this collection in every store, e.g. sale, new-arrivals, mens (the part after /collections/ in the store URL). Leave empty for the whole catalog.

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

Stop after this many products per store (pages of 250 products are requested at about 1 request per second per store).

## `flattenVariants` (type: `boolean`):

On: one row per variant (size/color) with its own price, compare-at price, SKU, availability and URL. Off: one row per product with price range and aggregated availability. You are charged per product either way.

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

Add the product description as plain text (HTML stripped). Makes rows larger.

## Actor input object example

```json
{
  "storeUrls": [
    "allbirds.com",
    "gymshark.com",
    "colourpop.com"
  ],
  "maxProductsPerStore": 50,
  "flattenVariants": false,
  "includeDescription": false
}
```

# Actor output Schema

## `results` (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": [
        "allbirds.com",
        "gymshark.com",
        "colourpop.com"
    ],
    "maxProductsPerStore": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("krasyn-side/shopify-products-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": [
        "allbirds.com",
        "gymshark.com",
        "colourpop.com",
    ],
    "maxProductsPerStore": 50,
}

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

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,krasyn-side/shopify-products-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/0ic9Q1bZ34hZTAcI2/builds/qAxY63g9ClXOMadEg/openapi.json
