# Shopify Products Scraper: Prices & Variants (`beike_r/shopify-products`) Actor

Get all products from any Shopify store: title, vendor, type, tags, images, description, min and max price, currency, availability and every variant with SKU, price and compare-at price. Give store URLs, get JSON, CSV or Excel. No browser, no proxy, fast. $0.80 per 1,000 products.

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

## Pricing

from $0.80 / 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 Products Scraper: Prices & Variants

### What you get

This Actor reads the product catalog of any public Shopify store and gives you **one clean item per product**:

- title, vendor, product type, tags and a plain-text description;
- all image URLs and the product options (for example Size and Color with their values);
- the lowest and highest price, the store currency, and whether the product is available;
- every variant with its ID, title, SKU, price, compare-at price (the "was" price), availability and options;
- the product URL and the created, updated and published dates.

It uses the store's own public `products.json` feed, so there is no browser, no proxy and no HTML parsing. That makes it fast and cheap: one request returns up to 250 products.

### Pricing

You pay **$0.80 per 1,000 products**: one result event per product stored in the dataset.

- 1,000 products = $0.80
- 10,000 products = $8.00
- a store with 700 products = $0.56

You can set a maximum cost per run in Apify Console. When that budget is reached, the Actor stops and keeps everything it collected so far.

### How to use it

1. Open the Actor in Apify Console and go to the **Input** tab.
2. Add one or more store addresses under **Store URLs**. Any page of the store works, with or without `https://`: the Actor only keeps the store address.
3. Set **Maximum number of products**. This is a total across all stores; stores are scraped in the order you list them.
4. Click **Start** and download the results as JSON, CSV or Excel from the **Output** tab, or read them through the Apify API.

### Input and output example

Input:

```json
{
    "startUrls": ["https://www.allbirds.com"],
    "maxItems": 10
}
```

One output item (shortened):

```json
{
    "shopUrl": "https://www.allbirds.com",
    "productId": 7340901859408,
    "handle": "womens-allbirds-flip-flop-dusty-pink",
    "url": "https://www.allbirds.com/products/womens-allbirds-flip-flop-dusty-pink",
    "title": "Women's Allbirds Flip Flop - Dusty Pink",
    "vendor": "Allbirds",
    "productType": "Shoes",
    "tags": ["..."],
    "descriptionText": "Sun on your feet. Comfort underneath. ...",
    "images": ["https://cdn.shopify.com/s/files/..."],
    "options": [{"name": "Size", "values": ["5", "6", "7", "8", "9", "10", "11"]}],
    "priceMin": 25.0,
    "priceMax": 25.0,
    "currency": "USD",
    "available": true,
    "variants": [
        {
            "variantId": 42146889039952,
            "title": "5",
            "sku": "A12513W050",
            "price": 25.0,
            "compareAtPrice": 50.0,
            "available": false,
            "option1": "5",
            "option2": null,
            "option3": null
        }
    ],
    "createdAt": "2026-03-27T14:03:50-07:00",
    "updatedAt": "2026-10-05T04:53:56-07:00",
    "publishedAt": "2026-09-25T16:58:13-07:00",
    "scrapedAt": "2026-10-05T12:00:00+00:00"
}
```

### Supported stores

Every Shopify store whose storefront is public and whose `products.json` feed is switched on. That includes stores on their own domain (such as `www.allbirds.com`) and stores on a `myshopify.com` address. Stores built on other platforms (WooCommerce, Magento, BigCommerce) are not supported; the Actor tells you so in the log.

### Limitations

- **Availability only, no stock quantities.** The public feed says whether a variant can be bought (`available` true or false), not how many are in stock.
- **At most 25,000 products per store.** Shopify itself stops the feed there. The Actor then stops for that store with a warning and keeps the 25,000 products.
- **No password-protected stores.** A store with a storefront password gives an error in the log and is skipped.
- **No proxy.** A store that blocks the request (HTTP 403) is skipped with an error; try again later.
- **Prices in the store's currency.** Prices are not converted. The `currency` field tells you which currency it is; if the store does not share it, `currency` is null.
- Reviews, collections and customer data are not collected.

### FAQ

**Why do some stores fail?** The log says why for each store: password-protected, not a Shopify store, products feed disabled, or blocked. The other stores in the same run continue.

**Does it collect personal data?** No. It only returns product fields that the store publishes itself, never customer data. The description is passed on as plain text, as the store wrote it.

**What happens when my maximum cost is reached?** The run stops, succeeds, and keeps all products collected so far.

**Can I scrape only new products?** Not in this version. Every run reads the whole catalog up to your maximum number of products.

# Actor input Schema

## `startUrls` (type: `array`):

Addresses of public Shopify stores, one per line, for example https://www.allbirds.com. Any page of the store works: the path is dropped and the Actor reads the store's /products.json.

## `maxItems` (type: `integer`):

Stop after this many products in total, across all stores. Each product is one result you pay for.

## Actor input object example

```json
{
  "startUrls": [
    "https://www.allbirds.com"
  ],
  "maxItems": 10
}
```

# 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 = {
    "startUrls": [
        "https://www.allbirds.com"
    ],
    "maxItems": 10
};

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

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

```

## MCP server setup

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