# Shopify Store Products Scraper – Prices, Variants & Stock (`loudtzu/shopify-store-products`) Actor

Export every product from any Shopify store: title, vendor, type, tags, min/max price, compare-at price, sale %, stock, variants with SKUs, images. Reads the store's public products feed. $0.00019 per product + $0.0005 per run.

- **URL**: https://apify.com/loudtzu/shopify-store-products.md
- **Developed by:** [LOUDTZU TZULOUD](https://apify.com/loudtzu) (community)
- **Categories:** E-commerce, Business
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.19 / 1,000 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?

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 Store Products Scraper – Prices, Variants & Stock

Give it one or more Shopify store addresses. It returns every product in the store (or in one collection): title, brand/vendor, type, tags, lowest and highest price, "compare at" (was) price, sale %, stock, variants with SKUs, and images. One row per product.

It reads the store's own public products feed (`/products.json`), the same feed Shopify serves to every visitor. No login, no browser, no residential proxies, so it is fast and cheap.

### What you can use it for

- **Price monitoring:** track a competitor's prices and sales every day.
- **Catalogue export:** copy a supplier's product list into a spreadsheet.
- **Market research:** see how many products, which brands and which price bands a store carries.
- **Stock checks:** see which sizes or colours are sold out.

### Input

| Field | What it does | Default |
|---|---|---|
| Store URLs | One store per line: `https://www.allbirds.com`, `shop.example.com`, or a collection like `https://shop.example.com/collections/sale` | allbirds.com |
| Max products per store | Stop after this many products from each store (1–50,000) | 100 |
| Include variants | Adds a `variants` list (size/colour, SKU, price, was-price, in stock) | on |
| Include description | Adds the description as plain text (emails and phone numbers removed) | on |

Example input:

```json
{ "storeUrls": ["https://www.allbirds.com", "https://shop.example.com/collections/sale"], "maxProductsPerStore": 500 }
```

### Output (one row per product)

```json
{
  "store": "www.allbirds.com",
  "productId": 7012345678901,
  "title": "Men's Tree Runners",
  "url": "https://www.allbirds.com/products/mens-tree-runners",
  "vendor": "Allbirds",
  "productType": "Shoes",
  "tags": ["mens", "running"],
  "priceMin": 98.0,
  "priceMax": 98.0,
  "compareAtPriceMax": null,
  "onSale": false,
  "maxDiscountPct": null,
  "currency": "USD",
  "available": true,
  "variantCount": 12,
  "availableVariantCount": 9,
  "imageUrl": "https://cdn.shopify.com/…jpg",
  "updatedAt": "2026-11-01T10:00:00-04:00",
  "variants": [{ "variantId": 1, "title": "8 / Black", "sku": "TR-8-BK", "price": 98.0, "compareAtPrice": null, "available": true }]
}
```

The table view in Apify Console shows the main columns; the JSON, CSV and Excel exports have every field. Field notes are in the dataset schema.

### Pricing

Pay per result:

- **$0.00019 per product** saved (= $0.19 per 1,000 products)
- **$0.0005 per run**, charged only once the first product is saved.

Runs that save nothing (not a Shopify store, blocked, robots.txt says no) cost you nothing. You can set "Max charge per run" in Apify; the Actor stops cleanly when it is reached and says so in the status.

### Rivals (checked 2026-11-05)

Live Apify Store prices read on 2026-11-05 (~16:30 AST) from the Store API. One row per Apify plan (Free, Bronze, Silver, Gold, Platinum, Diamond). Users = monthly users at that time. Prices change; check the Store before relying on them.

| Actor | Users (30 d) | Plan | Main result price | Start fee |
|---|---|---|---|---|
| autofacts/shopify | 111 | Free | $0.001 per product | $0.00005 |
| autofacts/shopify | 111 | Bronze | $0.0009 per product | $0.00005 |
| autofacts/shopify | 111 | Silver | $0.0008 per product | $0.00005 |
| autofacts/shopify | 111 | Gold | $0.0007 per product | $0.00005 |
| autofacts/shopify | 111 | Platinum | $0.0007 per product | $0.00005 |
| autofacts/shopify | 111 | Diamond | $0.0007 per product | $0.00005 |
| trovevault/shopify-products-scraper | 105 | Free | $0.001 per result | $0.001 |
| trovevault/shopify-products-scraper | 105 | Bronze | $0.00095 per result | $0.00095 |
| trovevault/shopify-products-scraper | 105 | Silver | $0.0009 per result | $0.0009 |
| trovevault/shopify-products-scraper | 105 | Gold | $0.00085 per result | $0.00085 |
| trovevault/shopify-products-scraper | 105 | Platinum | $0.00085 per result | $0.00085 |
| trovevault/shopify-products-scraper | 105 | Diamond | $0.00085 per result | $0.00085 |
| clearpath/shop-by-shopify-product-scraper | 68 | Free | $0.00249 per product | $0.00005 |
| clearpath/shop-by-shopify-product-scraper | 68 | Bronze | $0.00229 per product | $0.00005 |
| clearpath/shop-by-shopify-product-scraper | 68 | Silver | $0.00199 per product | $0.00005 |
| clearpath/shop-by-shopify-product-scraper | 68 | Gold | $0.00179 per product | $0.00005 |
| clearpath/shop-by-shopify-product-scraper | 68 | Platinum | $0.00179 per product | $0.00005 |
| clearpath/shop-by-shopify-product-scraper | 68 | Diamond | $0.00179 per product | $0.00005 |
| lergassy/shopify-store-intel | 19 | Free | $0.0005 per product | none |
| lergassy/shopify-store-intel | 19 | Bronze | $0.00045 per product | none |
| lergassy/shopify-store-intel | 19 | Silver | $0.0004 per product | none |
| lergassy/shopify-store-intel | 19 | Gold | $0.00035 per product | none |
| lergassy/shopify-store-intel | 19 | Platinum | $0.00035 per product | none |
| lergassy/shopify-store-intel | 19 | Diamond | $0.00035 per product | none |
| rl1987/shopify-api-scraper | 1 | Free | $0.000399 per variant row | none |
| rl1987/shopify-api-scraper | 1 | Bronze | $0.0003 per variant row | none |
| rl1987/shopify-api-scraper | 1 | Silver | $0.000276 per variant row | none |
| rl1987/shopify-api-scraper | 1 | Gold | $0.00025392 per variant row | none |
| rl1987/shopify-api-scraper | 1 | Platinum | $0.00025392 per variant row | none |
| rl1987/shopify-api-scraper | 1 | Diamond | $0.00025392 per variant row | none |
| **This Actor** | – | All plans | **$0.00019 per product** | $0.0005 (only after the first product) |

Notes: rl1987 charges per variant row, so a product with several sizes costs several rows there; this Actor charges once per product with all variants included.

### What to expect from a run

- **Expected case:** clean runs on real, working stores that save several products. That is what the price is designed for.
- **Bad URLs still use some compute:** a store that is blocked, isn't a store of this type, has no products, or is closed by robots.txt still takes a few requests (and some run time) before the Actor can tell. It returns no products, and **nothing is charged for it**: no product fee, and no run fee if no product is saved at all. Each such store is listed with its reason in the `ERRORS` record and the status message.
- If every store in a run fails, the run ends with "0 products saved … Nothing was charged."

### Legal and fair use

- **Public data only.** It reads the public products feed that Shopify stores serve to everyone. It never logs in, never opens password-protected stores, and never gets past a paywall.
- **robots.txt is checked for every store before any product request.** If a store's robots.txt disallows `/products.json` (or the collection feed), that store is skipped and listed in the ERRORS record. If robots.txt cannot be read because of a server error, the store is skipped too (RFC 9309). A `Crawl-delay` for all user agents is honoured (up to 30 s).
- **Terms:** each store has its own terms of service; some forbid automated copying. You are responsible for checking the terms of the stores you read and for how you use the data. Shopify's own platform terms cover merchants, not visitors reading public storefront pages.
- **No personal data.** Products are not people. Descriptions are scrubbed of email addresses and phone numbers. The `vendor` field is the brand name the store set for the product; it is kept as-is.
- Requests go one at a time per store, through Apify's datacenter proxy.

### FAQ

**How do I know if a site is a Shopify store?**
Just add it. If it isn't one (or the feed is turned off), the run lists it in the ERRORS record as "no public Shopify products feed" and charges nothing for it.

**Can I read just one collection?**
Yes. Paste the collection URL, e.g. `https://shop.example.com/collections/sale`.

**What currency are prices in?**
The store's main currency. The `currency` field comes from the store's public `/meta.json`; it is null if the store hides it, or if the store's robots.txt asks for a crawl-delay above 2 seconds (the Actor then skips that extra request to keep runs fast). Prices are not converted.

**Why is `available` sometimes null?**
Some stores hide stock in their feed. Then `available` and `availableVariantCount` can't be known.

**Is the stock number shown?**
No. Shopify's public feed only says whether a variant can be bought, not how many are left.

**Why did a store stop early?**
Shopify returns 250 products per page. The run stops at your "Max products per store", at the end of the feed, or if the store blocks or rate-limits the requests after retries (shown in the ERRORS record).

**Does it get reviews or customer data?**
No. Only product data.

**Where are problems listed?**
In the run's key-value store, record `ERRORS`, and in the status message.

# Actor input Schema

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

One Shopify store per line, e.g. 'https://www.allbirds.com' or 'shop.example.com'. Add '/collections/<name>' to read just that collection. Empty lines stop the run before anything is charged. If you leave this out, the Actor reads allbirds.com.

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

Stop after this many products from each store (default 100, max 50,000).

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

Add a 'variants' list (size/colour, SKU, price, compare-at price, availability) to each product.

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

Add the product description as plain text (emails and phone numbers removed).

## Actor input object example

```json
{
  "storeUrls": [
    "https://www.allbirds.com"
  ],
  "maxProductsPerStore": 100,
  "includeVariants": true,
  "includeDescription": true
}
```

# Actor output Schema

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

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

# Run the Actor and wait for it to finish
run = client.actor("loudtzu/shopify-store-products").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"
  ]
}' |
apify call loudtzu/shopify-store-products --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,loudtzu/shopify-store-products"
        }
    }
}
```

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/1rJybbUckeKtbWEMj/builds/z2d2NeZWgy2z7iiMk/openapi.json
