# Shopify Store Products: Prices, Variants, Stock & Sales (`spellzcode/shopify-store-products`) Actor

Export the full product catalog of any Shopify store: titles, prices, sale prices and discount, stock status, variants with SKUs, images, tags and descriptions. Filter for items on sale, in stock, in a price range or matching keywords.

- **URL**: https://apify.com/spellzcode/shopify-store-products.md
- **Developed by:** [Mårten Fitzback](https://apify.com/spellzcode) (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

from $0.70 / 1,000 product returneds

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 Store Products: Prices, Variants, Stock & Sales

Enter one or more Shopify stores and export their product catalogs: every product with its price, sale price, stock status, variants, images and description.

It reads the product feed that Shopify stores publish themselves, so a catalog of thousands of products takes seconds and nothing needs a browser. **You pay only for products returned**, after your filters are applied.

### What you get for each product

| Field | What it is |
|---|---|
| `title`, `url`, `vendor`, `productType`, `tags` | What the product is and where to find it |
| `price`, `maxPrice`, `currency` | Lowest and highest variant price, in the store's currency |
| `onSale`, `compareAtPrice`, `discountPercent` | Whether it is discounted, the original price and the discount |
| `available` | Whether at least one variant can be bought now |
| `variants` | Each variant's price, compare-at price, SKU, options (size, color and so on), stock status and weight |
| `image`, `images` | Product images |
| `description` | The description as plain text |
| `createdAt`, `updatedAt`, `publishedAt` | Dates |
| `store`, `storeName` | The store the product belongs to |

### Filters

Keep only products that are on sale, in stock, within a price range, or that match keywords in the title, vendor, type or tags.

### Input

```json
{
  "stores": ["https://www.allbirds.com"],
  "onSaleOnly": true,
  "availableOnly": true,
  "maxProductsPerStore": 1000
}
```

### Typical uses

- **Price monitoring:** run daily on competitors' stores and compare prices, discounts and stock.
- **Deal finding:** list everything on sale across a set of stores, sorted by discount.
- **Market research:** see a store's assortment, price points and newest products.
- **Catalog migration and feeds:** export your own store's products with variants and images.

### Pricing

$1.00 per 1,000 products ($0.001 each). One charge per product returned.

A store with 800 products costs $0.80. A filtered run that returns the 150 products on sale costs $0.15.

Each run also has a start charge of $0.00005. There is no separate charge for computing time. Apify's paid plans get 10% to 30% off these prices; the Pricing tab shows yours. Apify's free plan includes $5 of credit a month, which covers 5,000 products.

### Limits

- It works for stores built on Shopify that leave their product feed public, which most do. Stores on other platforms, or that have blocked the feed, are listed in the run's `NOT_FOUND` record and cost nothing.
- Stock is reported as available or not; exact quantities are not public.

### Questions

#### Can I run it on a schedule?

Yes. Save your input as a task and add an Apify schedule, for example every morning.

#### How do I get the results into Excel or Google Sheets?

Every run's results can be downloaded as Excel, CSV or JSON from the run's Output tab. Apify's integrations with Make, Zapier, n8n and Google Sheets can pass them on automatically.

#### Can I call it from my own code or from an AI agent?

Yes. The API tab has ready-made code for Python, JavaScript and cURL, and the tool can be connected to AI agents through Apify's MCP server.

#### Something looks wrong or is missing

Open a report under the Issues tab and include the input you used.

### Optional restock planning workbook

If you operate your own store, the separate [SpellzCode Reorder & Restock Planner](https://0di5in-jp.myshopify.com/products/reorder-restock-planner-inventory-workbook-for-100-skus?utm_source=apify_shopify_products\&utm_medium=owned_referral\&utm_campaign=shop_launch) is a paid, one-time Excel download for up to 100 SKUs. It calculates reorder points and pack-rounded order quantities from your own sales, stock and supplier figures.

The workbook is optional and independent of this Actor. A public Shopify product feed does not provide the sales history, exact stock quantities or supplier lead times needed for restock planning. The workbook does not automatically import this Actor's dataset.

# Actor input Schema

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

Shopify stores, one per line, for example allbirds.com. Any page address on the store works.

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

You are charged per product returned, so set this to cap the cost for large stores.

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

Optional. Keep only products whose title, vendor, type or tags contain at least one of these words.

## `onSaleOnly` (type: `boolean`):

Keep only products with a variant priced below its compare-at price.

## `availableOnly` (type: `boolean`):

Keep only products with at least one variant available to buy.

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

Optional. Keep only products whose lowest variant price is at least this, in the store's currency.

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

Optional. Keep only products whose lowest variant price is at most this, in the store's currency.

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

Adds each variant's price, SKU, options and stock status. Turn off for smaller results.

## Actor input object example

```json
{
  "stores": [
    "https://www.allbirds.com"
  ],
  "maxProductsPerStore": 100000,
  "onSaleOnly": false,
  "availableOnly": false,
  "includeVariants": true
}
```

# Actor output Schema

## `products` (type: `string`):

One item per product: prices, sale status, stock, variants, images, tags and 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("spellzcode/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 = { "stores": ["https://www.allbirds.com"] }

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

```

## MCP server setup

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