# Shopify Product & Price Scraper (`automation_buddy/shopify-product-price-scraper`) Actor

Scrape any Shopify store's full catalog — products, variants, prices, compare-at prices, discounts and stock — from the public products.json. No API key.

- **URL**: https://apify.com/automation\_buddy/shopify-product-price-scraper.md
- **Developed by:** [Ronak Patel](https://apify.com/automation_buddy) (community)
- **Categories:** E-commerce, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.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 a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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 & Price Scraper

Scrape the **full product catalog of any Shopify store** — every product, variant, price, discount, and stock status — straight from the store's public `products.json` feed. No API key, no login, no headless browser.

Just paste one or more store domains (e.g. `allbirds.com`) and get clean, structured data you can export to CSV/Excel/JSON or pull via API.

---

### Why this scraper is different

- **It almost never breaks.** It reads the official `products.json` that Shopify itself serves to every visitor — a stable, documented JSON feed. There's no fragile HTML parsing and no anti-bot cat-and-mouse, so it keeps working when storefront designs change.
- **Built-in discount detection.** Every product and variant is tagged with `onSale`, `discountAmount`, and `discountPercent` (calculated from the compare-at price). Perfect for finding deals and tracking competitor promotions.
- **Two output shapes.** One row per product (variants nested) for catalog snapshots, or one flat row per variant for price feeds and monitoring.
- **Pay per product — variants are free.** You're charged once per product scraped, no matter how many sizes/colors it has.

---

### What you can do with it

- **Competitor price & promo monitoring** — schedule daily runs and watch when rivals drop prices or launch sales.
- **Dropshipping & product research** — pull entire catalogs to find winning products, vendors, and price points.
- **MAP / pricing compliance** — check that resellers honor your minimum advertised price.
- **Market & trend research** — analyze assortments, price tiers, and new arrivals across many stores at once.
- **Build product feeds** — generate clean variant-level feeds for marketplaces, ads, or internal tools.

---

### Input

| Field | Type | Description |
|---|---|---|
| `storeUrls` | array | One or more Shopify store domains or URLs (bare domain, full URL, or even a collection link — only the domain is used). **Required.** |
| `outputMode` | select | `product` (one row per product, variants nested) or `variant` (one flat row per variant). Default `product`. |
| `maxProductsPerStore` | integer | Cap products per store. `0` = whole catalog. Default `0`. |
| `onlyOnSale` | boolean | Keep only discounted products/variants. Default `false`. |
| `onlyAvailable` | boolean | Keep only in-stock products/variants. Default `false`. |
| `includeBodyHtml` | boolean | Include each product's raw HTML description. Default `false`. |
| `maxConcurrency` | integer | How many stores to scrape in parallel. Default `5`. |
| `proxyConfiguration` | object | Optional Apify Proxy. Usually not needed; enable it if a large store rate-limits you (HTTP 430). |

#### Example input

```json
{
  "storeUrls": ["allbirds.com", "https://www.gymshark.com"],
  "outputMode": "variant",
  "onlyOnSale": true,
  "maxProductsPerStore": 0
}
````

***

### Output

**Product mode** (one row per product):

```json
{
  "store": "allbirds.com",
  "productId": 7134115037264,
  "title": "Women's Tree Dasher Relay",
  "vendor": "Allbirds",
  "productType": "Shoes",
  "url": "https://allbirds.com/products/womens-tree-dasher-relay-natural-black-twilight-teal",
  "price": 67,
  "priceMax": 67,
  "compareAtPrice": 135,
  "onSale": true,
  "discountPercent": 50,
  "available": false,
  "variantCount": 13,
  "availableVariantCount": 0,
  "tags": ["FINAL SALE"],
  "image": "https://cdn.shopify.com/.../left.png",
  "images": ["https://cdn.shopify.com/.../left.png", "..."],
  "variants": [
    {
      "variantId": 41016739233872,
      "variantTitle": "5",
      "sku": "A11465W050",
      "options": { "Size": "5" },
      "price": 67,
      "compareAtPrice": 135,
      "onSale": true,
      "discountAmount": 68,
      "discountPercent": 50,
      "available": false,
      "grams": 638,
      "image": "https://cdn.shopify.com/.../left.png"
    }
  ],
  "scrapedAt": "2026-06-28T20:30:00.000Z"
}
```

**Variant mode** flattens this to one row per variant (each with its own `price`, `compareAtPrice`, `onSale`, `discountPercent`, `available`, `sku`, and `options`) — ideal for price tracking and feeds.

***

### Good to know (honest limitations)

- `products.json` does **not** expose a currency code or exact inventory counts. You get prices as numbers and a reliable in-stock `available` boolean per variant — not "12 left in stock."
- Only **public, published** products are returned. Password-protected stores and unpublished/draft products aren't accessible (by design).
- A small number of stores disable the `products.json` endpoint. When that happens the actor logs a clear warning and moves on; enabling Apify Proxy resolves most rate-limit cases.

### Is this allowed?

Yes. `products.json` is a public endpoint Shopify serves to every visitor and is widely used for catalog syndication. This actor only reads public catalog data and respects polite request limits. Use the data in line with applicable laws and the target store's terms.

***

*Built with the Apify SDK + got-scraping. Pay-per-event pricing: you're billed per product scraped.*

# Actor input Schema

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

One or more Shopify store domains or URLs. You can paste a bare domain (allbirds.com), a full URL, or a collection/product link — only the store domain is used.

## `outputMode` (type: `string`):

How to shape the dataset. 'Product' = one row per product with variants nested (great for catalogs). 'Variant' = one flat row per variant (great for price tracking and feeds).

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

Limit how many products to scrape from each store. Use 0 for no limit (the whole catalog).

## `onlyOnSale` (type: `boolean`):

Keep only products/variants that are on sale (compare-at price is higher than the current price).

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

Keep only products/variants that are currently available to buy.

## `includeBodyHtml` (type: `boolean`):

Include each product's raw HTML description (body\_html). Off by default to keep the dataset small.

## `maxConcurrency` (type: `integer`):

How many stores to scrape in parallel. 5 is a safe default.

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

Optional. products.json rarely needs a proxy, but enable Apify Proxy if a large store starts rate-limiting (HTTP 430).

## Actor input object example

```json
{
  "storeUrls": [
    "allbirds.com",
    "https://www.gymshark.com"
  ],
  "outputMode": "product",
  "maxProductsPerStore": 0,
  "onlyOnSale": false,
  "onlyAvailable": false,
  "includeBodyHtml": false,
  "maxConcurrency": 5,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# 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"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("automation_buddy/shopify-product-price-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"] }

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

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).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"
  ]
}' |
apify call automation_buddy/shopify-product-price-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=automation_buddy/shopify-product-price-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Shopify Product & Price Scraper",
        "description": "Scrape any Shopify store's full catalog — products, variants, prices, compare-at prices, discounts and stock — from the public products.json. No API key.",
        "version": "1.0",
        "x-build-id": "hRZvFHWl50SQEKIJy"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/automation_buddy~shopify-product-price-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-automation_buddy-shopify-product-price-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/automation_buddy~shopify-product-price-scraper/runs": {
            "post": {
                "operationId": "runs-sync-automation_buddy-shopify-product-price-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/automation_buddy~shopify-product-price-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-automation_buddy-shopify-product-price-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "storeUrls"
                ],
                "properties": {
                    "storeUrls": {
                        "title": "Shopify store URLs",
                        "type": "array",
                        "description": "One or more Shopify store domains or URLs. You can paste a bare domain (allbirds.com), a full URL, or a collection/product link — only the store domain is used.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "outputMode": {
                        "title": "Output mode",
                        "enum": [
                            "product",
                            "variant"
                        ],
                        "type": "string",
                        "description": "How to shape the dataset. 'Product' = one row per product with variants nested (great for catalogs). 'Variant' = one flat row per variant (great for price tracking and feeds).",
                        "default": "product"
                    },
                    "maxProductsPerStore": {
                        "title": "Max products per store",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Limit how many products to scrape from each store. Use 0 for no limit (the whole catalog).",
                        "default": 0
                    },
                    "onlyOnSale": {
                        "title": "Only discounted items",
                        "type": "boolean",
                        "description": "Keep only products/variants that are on sale (compare-at price is higher than the current price).",
                        "default": false
                    },
                    "onlyAvailable": {
                        "title": "Only in-stock items",
                        "type": "boolean",
                        "description": "Keep only products/variants that are currently available to buy.",
                        "default": false
                    },
                    "includeBodyHtml": {
                        "title": "Include description HTML",
                        "type": "boolean",
                        "description": "Include each product's raw HTML description (body_html). Off by default to keep the dataset small.",
                        "default": false
                    },
                    "maxConcurrency": {
                        "title": "Max concurrency",
                        "minimum": 1,
                        "maximum": 20,
                        "type": "integer",
                        "description": "How many stores to scrape in parallel. 5 is a safe default.",
                        "default": 5
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Optional. products.json rarely needs a proxy, but enable Apify Proxy if a large store starts rate-limiting (HTTP 430).",
                        "default": {
                            "useApifyProxy": false
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
