# Shopify Product Scraper - Prices, Inventory & Deals (`jungle_thunder/shopify-spy`) Actor

Extract products, prices and inventory from ANY Shopify store. Track competitor pricing, find deals up to 90% off, monitor stock levels. Perfect for dropshippers, resellers and e-commerce pros. Only 0.15 per store.

- **URL**: https://apify.com/jungle\_thunder/shopify-spy.md
- **Developed by:** [Ani Björkström](https://apify.com/jungle_thunder) (community)
- **Categories:** AI, Automation, E-commerce
- **Stats:** 6 total users, 1 monthly users, 100.0% runs succeeded, 2 bookmarks
- **User rating**: No ratings yet

## Pricing

$8.00 / 1,000 results

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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 Spy - The Cheapest Shopify Scraper on Apify

### Only $0.15 per store - Scrape UNLIMITED products!

Stop overpaying for Shopify data. **Shopify Spy** gives you everything at a fraction of the cost:

- Scrape **ANY Shopify store** in seconds
- Extract **1000s of products** per run
- Find **hidden deals up to 90% off**
- Track **competitor prices** automatically
- Discover **low-stock items** before they sell out

**Perfect for:** Dropshippers, Resellers, E-commerce Pros, Market Researchers

### Key Features

#### Deal Finder

- **Only On Sale** - Filter to products with active discounts
- **Minimum Discount %** - Find products with 20%, 50%, or any discount threshold
- **Savings Calculator** - See exactly how much customers save

#### Stock Alerts

- **Low Stock Detection** - Find items with 10 or fewer units left
- **Stock Status** - Clear labels: in\_stock, low\_stock, out\_of\_stock
- **Inventory Tracking** - Actual unit counts when available

#### Store Validation

- **Auto-Detection** - Verifies URLs are Shopify before scraping
- **Skips Non-Shopify** - Won't waste time on incompatible sites
- **Product Count** - Shows how many products each store has

#### Price Filters

- **Min/Max Price** - Target specific price ranges
- **Compare Prices** - Original vs sale price comparison
- **Discount Percentage** - Calculated automatically

### What Makes This Different

| Feature | Other Scrapers | Shopify Spy |
|---------|---------------|-------------|
| Deal Detection | No | **Yes - finds products on sale** |
| Low Stock Alerts | No | **Yes - flags items running low** |
| Store Validation | No | **Yes - verifies Shopify before scraping** |
| Discount Calculator | No | **Yes - calculates % off and savings** |
| Price Range Filter | Sometimes | **Yes - min and max price filters** |

### Output Fields

Each product includes:

| Field | Description |
|-------|-------------|
| `is_on_sale` | True if discounted |
| `discount_percentage` | Percentage off (e.g., 25.5) |
| `savings_amount` | Dollar amount saved |
| `is_low_stock` | True if ≤10 units remain |
| `stock_status` | in\_stock / low\_stock / out\_of\_stock |
| `inventory_quantity` | Actual unit count |
| Plus all standard fields... | title, price, SKU, images, etc. |

### Use Cases

#### For Dropshippers

1. Set `onlyOnSale: true` + `minDiscount: 30`
2. Find products 30%+ off to resell at profit
3. Check `is_low_stock` to avoid overselling

#### For Competitor Monitoring

1. Add competitor store URLs
2. Schedule daily runs
3. Track price changes and new products

#### For Bargain Hunters

1. Set `maxPrice: 50` + `onlyOnSale: true`
2. Find deals under $50
3. Sort by `discount_percentage` descending

### Quick Start

#### Find All Deals

```json
{
  "startUrls": [{ "url": "https://www.allbirds.com" }],
  "onlyOnSale": true
}
```

#### Find Deep Discounts (50%+ off)

```json
{
  "startUrls": [{ "url": "https://www.gymshark.com" }],
  "onlyOnSale": true,
  "minDiscount": 50
}
```

#### Find Low Stock Items

```json
{
  "startUrls": [{ "url": "https://colourpop.com" }],
  "onlyLowStock": true,
  "onlyInStock": true
}
```

#### Budget Shopping ($20-50 range)

```json
{
  "startUrls": [{ "url": "https://www.fashionnova.com" }],
  "minPrice": 20,
  "maxPrice": 50,
  "onlyOnSale": true
}
```

### Input Parameters

#### Store Settings

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `startUrls` | array | required | Shopify store URLs (max 50) |
| `validateStores` | boolean | true | Verify URLs are Shopify before scraping |
| `proxyConfiguration` | object | disabled | Enable Apify Proxy for blocked stores |

#### Deal & Stock Filters

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `onlyOnSale` | boolean | false | Only products with discounts |
| `minDiscount` | number | - | Minimum discount % (e.g., 20) |
| `onlyLowStock` | boolean | false | Only items with ≤10 units |
| `onlyInStock` | boolean | false | Exclude out-of-stock items |
| `minPrice` | number | - | Minimum price filter |
| `maxPrice` | number | - | Maximum price filter |

#### Output Options

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `maxProducts` | integer | 0 | Limit per store (0 = unlimited) |
| `includeDescriptions` | boolean | true | Include HTML descriptions |
| `includeTags` | boolean | true | Include product tags |
| `exportCsv` | boolean | true | Generate CSV file |
| `csvFileName` | string | shopify-products.csv | CSV filename |

### Output Example

```json
{
  "store": "https://www.allbirds.com",
  "product_title": "Men's Tree Runners",
  "variant_title": "Charcoal / 10",
  "price": 74.00,
  "compare_at_price": 98.00,
  "is_on_sale": true,
  "discount_percentage": 24.5,
  "savings_amount": 24.00,
  "available": true,
  "inventory_quantity": 8,
  "stock_status": "low_stock (8 left)",
  "is_low_stock": true,
  "sku": "TRMC-CH-10",
  "vendor": "Allbirds",
  "product_url": "https://www.allbirds.com/products/mens-tree-runners",
  "main_image_url": "https://cdn.shopify.com/..."
}
```

### Run Summary

After each run, check `RUN_SUMMARY.json` for:

- Total items scraped
- Items on sale (with total savings)
- Low stock item count
- Store validation results
- Filters applied

### Pricing - Unbeatable Value!

#### Only $0.15 per store scraped!

Compare us to competitors charging $5-20 per store. We're **97% cheaper**.

| What You Get | Price |
|--------------|-------|
| 1 store (unlimited products) | **$0.15** |
| 10 stores | **$1.50** |
| 100 stores | **$15.00** |

**Why so cheap?**

- No expensive browser automation
- Lightning-fast API calls
- Optimized for efficiency

**That's it. No hidden fees. No per-product charges.**

### Troubleshooting

| Issue | Solution |
|-------|----------|
| "NOT A SHOPIFY STORE" | URL is not Shopify - verify at `/products.json` |
| "403 Forbidden" | Enable proxy in settings |
| No results | Check filters aren't too restrictive |
| Missing inventory | Store doesn't expose inventory data |

### FAQ

**Q: How do I know if a site is Shopify?**
A: Visit `https://[site]/products.json` - if you see JSON data, it's Shopify.

**Q: Why are some items missing inventory\_quantity?**
A: Not all stores expose inventory counts publicly.

**Q: Can I track price changes over time?**
A: Yes! Schedule runs and compare results to detect changes.

**Q: What's the difference between price and compare\_at\_price?**
A: `price` is current/sale price, `compare_at_price` is original price.

### Changelog

#### v1.0 - Launch

- Deal Finder with discount calculations
- Low Stock Alert system
- Shopify Store Validator
- Price range filters
- Enhanced run summary with stats

# Actor input Schema

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

Shopify store URLs to scrape (e.g., https://www.allbirds.com). Maximum 50 stores per run.

## `validateStores` (type: `boolean`):

Check if URLs are valid Shopify stores before scraping. Skips non-Shopify sites automatically.

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

Use Apify Proxy to avoid blocking. Residential proxy works best for stubborn stores.

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

DEAL FINDER: Only return products with active discounts (compare\_at\_price > price).

## `minDiscount` (type: `number`):

Only return products with at least this discount percentage (e.g., 20 for 20% off).

## `onlyLowStock` (type: `boolean`):

STOCK ALERT: Only return items with 10 or fewer units in stock.

## `onlyInStock` (type: `boolean`):

Exclude out-of-stock variants from results.

## `minPrice` (type: `number`):

Only return products priced at or above this amount.

## `maxPrice` (type: `number`):

Only return products priced at or below this amount.

## `maxProducts` (type: `integer`):

Limit results per store. Set to 0 for unlimited.

## `delaySeconds` (type: `integer`):

Wait time between API requests. Increase if getting rate limited.

## `maxRetries` (type: `integer`):

Retry attempts on failed requests.

## `includeDescriptions` (type: `boolean`):

Include full HTML product descriptions in output.

## `includeTags` (type: `boolean`):

Include product tags in output.

## `exportCsv` (type: `boolean`):

Generate a downloadable CSV file in Key-Value Store.

## `csvFileName` (type: `string`):

Name for the CSV file.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.allbirds.com"
    }
  ],
  "validateStores": true,
  "proxyConfiguration": {
    "useApifyProxy": false
  },
  "onlyOnSale": false,
  "onlyLowStock": false,
  "onlyInStock": false,
  "maxProducts": 0,
  "delaySeconds": 1,
  "maxRetries": 3,
  "includeDescriptions": true,
  "includeTags": true,
  "exportCsv": true,
  "csvFileName": "shopify-products.csv"
}
```

# 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": [
        {
            "url": "https://www.allbirds.com"
        }
    ]
};

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

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

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/CMGGS1wzpu1KlC32q/builds/S8JRLgVXiYfTB594q/openapi.json
