# Shopify Store Products Scraper: Prices, Variants, Stock (`nickatnite79/shopify-store-products-scraper`) Actor

Export any Shopify store's products with prices, sale prices, variants, SKUs, stock and images. Fast, no proxy, $0.0005 per product.

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

## Pricing

$0.50 / 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

### What does Shopify Store Products Scraper do?

**Shopify Store Products Scraper** exports the full product catalog of any Shopify store: **prices, sale (compare-at) prices, every variant with SKU and stock status, images, tags, vendor, product type and description**. Enter a store domain or a collection URL and get clean JSON, CSV or Excel.

It reads Shopify's public product feed, so there is **no browser and no proxy**, and it fetches 250 products per request. It works as a simple **Shopify products API** for any public Shopify store, without needing the store owner's admin access.

### Why use this Shopify scraper?

- 🛍️ **Whole catalog or one collection.** Add `/collections/<handle>` to a store URL to scrape just that collection.
- 🏷️ **Variant-level detail.** Every variant's SKU, price, compare-at price and availability.
- 🔥 **Sale detection.** `onSale` and `compareAtPriceMax` show discounted products at a glance.
- 🔎 **Filters.** Keyword filter, in-stock only and max products per store.
- 💸 **Pay per product.** Sites that are not Shopify, or that disabled the feed, are skipped and never charged.

#### Use cases

- Competitor price and discount monitoring for Shopify stores
- Dropshipping and product research
- Catalog migration, product feeds and spreadsheets
- Stock and new-product alerts with scheduled runs

### How to scrape a Shopify store's products

1. Click **Try for free** or **Start** to open the Actor in Apify Console.
2. Add one or more **store** domains or URLs, for example `https://www.allbirds.com` or `https://kith.com/collections/mens-footwear`.
3. Optionally set **max products per store**, **keywords** or **only available**.
4. Click **Start**.
5. Download products as JSON, CSV or Excel, or schedule the run to track price and stock changes.

### Input

| Field | What it does |
| --- | --- |
| `stores` | Store domains or URLs. Add `/collections/<handle>` to scrape one collection. |
| `maxProductsPerStore` | 0 = all products. |
| `keywords` | Keep products whose title, type, tags or vendor contain any keyword. |
| `onlyAvailable` | Skip sold-out products. |
| `includeDescription` | Include the plain-text product description. |

Example input from a real run:

```json
{
  "stores": [
    "https://www.allbirds.com",
    "https://kith.com/collections/mens-footwear"
  ],
  "maxProductsPerStore": 10,
  "onlyAvailable": false,
  "includeDescription": true
}
```

### Output example

Each product includes `store`, `productId`, `title`, `handle`, `url`, `vendor`, `productType`, `tags`, `currency`, `priceMin`, `priceMax`, `compareAtPriceMax`, `onSale`, `available`, `variantCount`, `variants[]` (id, title, sku, price, compareAtPrice, available), `image`, `images[]`, `description`, `createdAt`, `updatedAt` and `publishedAt`.

First results from a real run on 2026-10-16 (20 results in about 4 seconds; arrays shortened):

```json
[
  {
    "store": "https://www.allbirds.com",
    "productId": 7340901859408,
    "title": "Women's Allbirds Flip Flop - Dusty Pink",
    "handle": "womens-allbirds-flip-flop-dusty-pink",
    "url": "https://www.allbirds.com/products/womens-allbirds-flip-flop-dusty-pink",
    "vendor": "Allbirds",
    "productType": "Shoes",
    "tags": [
      "allbirds::carbon-score => undefined",
      "allbirds::cfId => color-a4d5d0f6620dc304306f503bf67bc5f9"
    ],
    "currency": "USD",
    "priceMin": 25,
    "priceMax": 25,
    "compareAtPriceMax": 50,
    "onSale": true,
    "available": true,
    "variantCount": 7,
    "variants": [
      {
        "id": 42146889039952,
        "title": "5",
        "sku": "A12513W050",
        "price": 25,
        "compareAtPrice": 50,
        "available": false
      },
      {
        "id": 42146889072720,
        "title": "6",
        "sku": "A12513W060",
        "price": 25,
        "compareAtPrice": 50,
        "available": false
      }
    ],
    "image": "https://cdn.shopify.com/s/files/1/1104/4168/files/A12513_26Q2_Allbirds-Flip-Flop-Dusty-Pink_PDP_LEFT.png?v=1774646345",
    "images": [
      "https://cdn.shopify.com/s/files/1/1104/4168/files/A12513_26Q2_Allbirds-Flip-Flop-Dusty-Pink_PDP_LEFT.png?v=1774646345",
      "https://cdn.shopify.com/s/files/1/1104/4168/files/A12513_26Q2_Allbirds-Flip-Flop-Dusty-Pink_PDP_BACK.png?v=1774646345"
    ],
    "description": "Sun on your feet. Comfort underneath. Light, easy, and made for warm weather, these flip flops bring everyday comfort to sunny days, beach walks, and everything in between. Just slip them on and go.",
    "createdAt": "2026-03-27T14:03:50-07:00",
    "updatedAt": "2026-10-15T17:41:41-07:00",
    "publishedAt": "2026-09-25T16:58:13-07:00"
  },
  {
    "store": "https://www.allbirds.com",
    "productId": 7258385809488,
    "title": "Men's Canvas Runner NZ - Deep Navy Stripes (Blizzard Sole)",
    "handle": "mens-canvas-runner-nz",
    "url": "https://www.allbirds.com/products/mens-canvas-runner-nz",
    "vendor": "Allbirds",
    "productType": "Shoes",
    "tags": [
      "allbirds::carbon-score => undefined",
      "allbirds::cfId => color-1cef6be0d20d9c20d604095208afc4c8"
    ],
    "currency": "USD",
    "priceMin": 100,
    "priceMax": 100,
    "compareAtPriceMax": null,
    "onSale": false,
    "available": true,
    "variantCount": 13,
    "variants": [
      {
        "id": 41884546990160,
        "title": "8",
        "sku": "A12498M080",
        "price": 100,
        "compareAtPrice": null,
        "available": false
      },
      {
        "id": 41884547022928,
        "title": "8.5",
        "sku": "A12498M085",
        "price": 100,
        "compareAtPrice": null,
        "available": true
      }
    ],
    "image": "https://cdn.shopify.com/s/files/1/1104/4168/files/A12500_26Q1_Runner-NZ-Canvas-Stripes-Deep-Navy-Blizzard-Sole_PDP_LEFT.png?v=1774550585",
    "images": [
      "https://cdn.shopify.com/s/files/1/1104/4168/files/A12500_26Q1_Runner-NZ-Canvas-Stripes-Deep-Navy-Blizzard-Sole_PDP_LEFT.png?v=1774550585",
      "https://cdn.shopify.com/s/files/1/1104/4168/files/A12500_26Q1_Runner-NZ-Canvas-Stripes-Deep-Navy-Blizzard-Sole_PDP_BACK.png?v=1774550584"
    ],
    "description": "",
    "createdAt": "2025-12-04T12:15:25-08:00",
    "updatedAt": "2026-10-15T17:41:41-07:00",
    "publishedAt": "2026-09-25T16:58:09-07:00"
  }
]
```

### How much does it cost to scrape Shopify products?

This Actor uses pay-per-event pricing: **$0.0005 per product ($0.50 per 1,000 products)**, with **no start fee**. One product includes all of its variants. A 2,000-product store costs $1 in product fees. Non-Shopify sites and failed inputs are free.

The Apify Free plan includes monthly platform usage credits with no credit card required. Check the **Pricing** tab for the current rate.

### Use the Shopify scraper with AI agents and the API

This Actor is available as a tool through the Apify MCP server (`https://mcp.apify.com`). You can also call it from the Apify API, the JavaScript or Python client, n8n, Make or Zapier, and send results to Google Sheets or a webhook on a schedule. To check one product page against an exact SKU or GTIN with price and stock evidence, see the [Shopping Offer Verifier](https://apify.com/nickatnite79/shopping-offer-verifier).

### FAQ

#### How do I know if a site is a Shopify store?

Just add it. If the site is not on Shopify, or the store disabled its public product feed, it is skipped with a warning and not charged.

#### Can I scrape only one collection?

Yes. Use the collection URL, for example `https://kith.com/collections/mens-footwear`.

#### Does it include inventory quantities?

It returns each variant's `available` (in stock or sold out) flag from the public feed. Exact inventory counts are not public on most stores.

#### Do I need the store owner's API key, a proxy or cookies?

No. It reads the public storefront feed.

#### Is it legal to scrape Shopify stores?

The Actor reads publicly available product data. Make sure your use complies with the store's terms and the laws that apply to you.

#### Something broke or a field is missing?

Open an issue on the **Issues** tab with the store URL you used.

### Related Actors

Other tools by the same developer that return clean JSON for automations and AI agents:

| Actor | What it does |
| --- | --- |
| [Career Site Jobs Scraper](https://apify.com/nickatnite79/career-site-jobs-scraper) | Scrape open jobs from Greenhouse, Lever, Ashby and Workable career sites |
| [Workday & iCIMS Job Status Checker](https://apify.com/nickatnite79/job-listing-rechecker) | Check whether known job posting links are still open, closed or changed |
| [RFP Amendment and Addendum Analyzer](https://apify.com/nickatnite79/rfp-amendment-analyzer) | Compare RFP revisions and addenda for deadline and requirement changes |
| [Shopping Offer Verifier](https://apify.com/nickatnite79/shopping-offer-verifier) | Verify a product URL against an exact SKU, model or GTIN with price and stock evidence |
| [BizBuySell & BizQuest Deal Change Monitor](https://apify.com/nickatnite79/bizbuysell-bizquest-deal-change-monitor) | Alerts for new businesses for sale and asking price or cash flow changes |
| [Google Trends API for AI Agents](https://apify.com/nickatnite79/google-trends-agent-summary) | Google Trends data with a rising, falling or flat verdict per keyword |
| [App Store & Google Play Reviews Scraper](https://apify.com/nickatnite79/app-store-google-play-reviews) | iOS and Android app reviews in one run with one schema |
| [Google News Scraper](https://apify.com/nickatnite79/google-news-scraper-cheap) | Google News search results and topic headlines as JSON |

Need a custom field, source or integration? Open an issue on the **Issues** tab.

# Actor input Schema

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

Store domains or URLs. Add /collections/<handle> to scrape just one collection.

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

0 = all products.

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

Keep products whose title, type, tags, or vendor contain any keyword.

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

Skip sold-out products.

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

Plain-text product description.

## Actor input object example

```json
{
  "stores": [
    "https://www.allbirds.com",
    "https://kith.com/collections/mens-footwear"
  ],
  "maxProductsPerStore": 10,
  "onlyAvailable": false,
  "includeDescription": true
}
```

# 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 = {
    "stores": [
        "https://www.allbirds.com",
        "https://kith.com/collections/mens-footwear"
    ],
    "maxProductsPerStore": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("nickatnite79/shopify-store-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 = {
    "stores": [
        "https://www.allbirds.com",
        "https://kith.com/collections/mens-footwear",
    ],
    "maxProductsPerStore": 10,
}

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

```

## MCP server setup

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