# Shopify Scraper (`rover-omniscraper/shopify-scraper`) Actor

Universal Shopify Scraper for Apify — Extract product data from any Shopify store via API. Multi-store support, auto-detection, smart filtering by price/tags/sales, new arrival flags, sale detection. Handles pagination, configurable request delays, pure HTTP (no browser). Perfect for e-com research

- **URL**: https://apify.com/rover-omniscraper/shopify-scraper.md
- **Developed by:** [Rover Omniscraper](https://apify.com/rover-omniscraper) (community)
- **Categories:** E-commerce, Automation
- **Stats:** 4 total users, 3 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.90 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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

## Universal Shopify Scraper — Extract Product Data from Any Shopify Store

**The fastest, most reliable way to scrape Shopify stores at scale.** Extract complete product catalogs — prices, variants, inventory, images, sale status, and more — from any Shopify-powered store without a browser.

Built on [Apify](https://apify.com), the world's leading web scraping platform. No coding required. Export to JSON, CSV, or Excel in one click.

---

### What is the Universal Shopify Scraper?

The Universal Shopify Scraper is an [Apify Actor](https://apify.com/actors) that extracts **full product data from any Shopify store** using Shopify's public `/products.json` API endpoint. It auto-detects Shopify stores, paginates through entire catalogs, normalizes the data into a clean schema, and delivers structured results ready for analysis.

Whether you need to monitor competitor pricing, track inventory levels, research market trends, or build a product feed — this actor was built for you.

> 💡 Works on **any public Shopify store** — no API key, store credentials, or browser required.

---

### Why Use This Shopify Scraper?

| Feature | This Actor | Browser-Based Scrapers |
|---|---|---|
| Speed | ⚡ Pure HTTP — no browser overhead | 🐢 5–20× slower |
| Cost | 💰 $2.50 per 1,000 products | 💸 Much more expensive |
| Reliability | ✅ Does not break on JS changes | ❌ Breaks when UI changes |
| Data completeness | ✅ Full catalog including hidden fields | ⚠️ Only visible fields |
| Proxy-friendly | ✅ Apify proxy support built-in | Variable |

---

### Key Features

- **Auto-detection** — Automatically verifies if any URL is a Shopify store before scraping (JSON probe + HTML fingerprint fallback)
- **Multi-store scraping** — Scrape multiple Shopify stores in a single actor run
- **Full catalog pagination** — Fetches every product page (250 products/page) with automatic `since_id` cursor fallback for stores with 10,000+ products
- **Sale detection** — Identifies discounted products where `compare_at_price > price` and computes the exact discount percentage per variant
- **New arrivals flag** — Marks recently published products within a configurable time window (default: 30 days)
- **Smart filtering** — Filter output by tags, price range, sale status, or in-stock availability before it hits your dataset
- **Collection targeting** — Scrape a specific product collection instead of the full catalog
- **Proxy support** — Integrates with Apify's residential and datacenter proxy network for high reliability
- **Batch output** — Pushes data to the Apify dataset in efficient batches for large catalogs
- **Clean, normalized schema** — Consistent field names across all stores; no raw Shopify fields to decode

---

### Use Cases

#### 🛍️ E-commerce Price Monitoring
Track pricing changes across competing Shopify stores. Get alerts when a competitor drops prices or launches a sale. Compare your pricing against the market in real time.

#### 📊 Market Research & Trend Analysis
Extract entire product catalogs to analyze product assortment, vendor distribution, tag taxonomy, and pricing strategies. Find gaps in the market or spot trends in product launches.

#### 🏷️ Sale & Discount Tracking
Filter for only on-sale products across multiple stores. The scraper computes the exact `discountPercent` per variant, so you can rank deals by savings instantly.

#### 🆕 New Arrivals Intelligence
Monitor newly launched products with the `isNewArrival` flag. Great for fashion, sneakers, and streetwear industries where velocity of new drops matters.

#### 📦 Inventory and Stock Monitoring
Track which variants are available or out of stock with `availableVariants`. Use this for restock alerts or to understand competitor supply chains.

#### 🔗 Product Feed Generation
Build automated product feeds for affiliate marketing, comparison shopping engines, or internal product databases — refreshed on a schedule via Apify's scheduler.

#### 🤖 AI & LLM Training Data
Collect normalized, clean product descriptions, tags, and metadata at scale for training product classification models or recommendation engines.

---

### How It Works

````

Input URLs → Shopify Detection → Pagination → Normalization → Filtering → Dataset

````

1. **Input validation** — Reads your list of store URLs and scraping preferences
2. **Shopify detection** — Probes each URL for `/products.json`; falls back to HTML fingerprint scanning for `cdn.shopify.com` and `Shopify.theme` signatures
3. **Full pagination** — Fetches products in pages of 250; auto-switches to `since_id` cursor-based pagination for very large stores (12,500+ products)
4. **Normalization** — Transforms every raw Shopify product object into a clean, enriched record with sale detection, new-arrival flagging, and price aggregation
5. **Filtering** — Applies your tag, price, sale, and stock filters server-side before pushing to the dataset
6. **Output** — Pushes results in batches of 100 to your Apify dataset; exportable as JSON, CSV, JSONL, or Excel

---

### Input Configuration

#### Required

| Field | Type | Description |
|---|---|---|
| `storeUrls` | `string[]` | One or more Shopify store URLs to scrape. Example: `["https://kith.com", "https://allbirds.com"]` |

#### Optional — Scope Control

| Field | Type | Default | Description |
|---|---|---|---|
| `collection` | `string` | `""` | Scrape only a specific collection by its handle (e.g., `"new-arrivals"`). Leave empty to scrape all products. |
| `maxProducts` | `integer` | `0` | Maximum number of products to scrape per store. `0` means unlimited — full catalog. |

#### Optional — Filtering

| Field | Type | Default | Description |
|---|---|---|---|
| `filterTags` | `string` | `""` | Comma-separated list of tags. Only products with at least one matching tag are included. |
| `minPrice` | `number` | `0` | Exclude products whose lowest variant price is below this value. `0` disables the filter. |
| `maxPrice` | `number` | `0` | Exclude products whose lowest variant price is above this value. `0` disables the filter. |
| `onlyOnSale` | `boolean` | `false` | If `true`, only include products with at least one variant on sale (`compare_at_price > price`). |
| `onlyInStock` | `boolean` | `false` | If `true`, only include products with at least one available variant. |

#### Optional — Behavior

| Field | Type | Default | Description |
|---|---|---|---|
| `newArrivalsDays` | `integer` | `30` | Number of days since publication to flag a product as `isNewArrival: true`. |
| `requestDelay` | `integer` | `500` | Milliseconds to wait between page requests. Increase to reduce rate-limiting risk. |
| `proxyConfig` | `object` | `{}` | Apify proxy configuration. Leave as default for automatic proxy handling. |

---

### Example Inputs

#### Scrape an entire store catalog
```json
{
  "storeUrls": ["https://gymshark.com"],
  "requestDelay": 500
}
````

#### Scrape sale items only across multiple stores

```json
{
  "storeUrls": [
    "https://kith.com",
    "https://allbirds.com",
    "https://gymshark.com"
  ],
  "onlyOnSale": true,
  "onlyInStock": true
}
```

#### Scrape a specific collection with price filtering

```json
{
  "storeUrls": ["https://kith.com"],
  "collection": "footwear",
  "minPrice": 50,
  "maxPrice": 300,
  "onlyInStock": true
}
```

#### Track new arrivals from a sneaker store

```json
{
  "storeUrls": ["https://kith.com"],
  "newArrivalsDays": 7,
  "filterTags": "sneakers,footwear",
  "maxProducts": 200
}
```

***

### Output Data Schema

Each scraped product is stored as a structured JSON object:

```json
{
  "store": "kith.com",
  "id": 8286284742784,
  "title": "VANS Premium Classic Slip-On - Indigo Blue",
  "handle": "vn000d9pind1",
  "url": "https://kith.com/products/vn000d9pind1",
  "vendor": "VANS",
  "productType": "Low Top Sneakers",
  "description": "Premium Classic Slip-On silhouette. Canvas and leather upper. Vulcanized build with waffle rubber outsole.",
  "tags": ["footwear", "sneakers", "mens", "low top sneakers"],
  "publishedAt": "2026-04-07T15:50:28-04:00",
  "isNewArrival": true,
  "images": [
    "https://cdn.shopify.com/s/files/1/0094/2252/files/vans-slip-on-hero.jpg"
  ],
  "featuredImage": "https://cdn.shopify.com/s/files/1/0094/2252/files/vans-slip-on-hero.jpg",
  "variants": [
    {
      "id": 45139595591808,
      "title": "US 10 / Indigo Blue",
      "sku": "10869433",
      "price": 95.00,
      "compareAtPrice": 120.00,
      "onSale": true,
      "discountPercent": 21,
      "available": true,
      "option1": "US 10",
      "option2": "Indigo Blue",
      "option3": null,
      "weight": 0.5,
      "weightUnit": "kg",
      "requiresShipping": true
    }
  ],
  "lowestPrice": 85.00,
  "highestPrice": 105.00,
  "onSale": true,
  "maxDiscountPercent": 21,
  "totalVariants": 12,
  "availableVariants": 8,
  "scrapedAt": "2026-04-08T10:30:00.000Z"
}
```

#### Output Field Reference

| Field | Type | Description |
|---|---|---|
| `store` | `string` | The store's hostname (e.g., `kith.com`) |
| `id` | `number` | Shopify product ID |
| `title` | `string` | Product title |
| `handle` | `string` | URL-safe product handle |
| `url` | `string` | Direct product page URL |
| `vendor` | `string` | Brand or vendor name |
| `productType` | `string` | Product category type |
| `description` | `string` | Plain-text description (HTML stripped) |
| `tags` | `string[]` | Array of product tags |
| `publishedAt` | `string` | ISO 8601 publication timestamp |
| `isNewArrival` | `boolean` | `true` if published within `newArrivalsDays` |
| `images` | `string[]` | All product image URLs |
| `featuredImage` | `string\|null` | First (main) product image URL |
| `variants` | `object[]` | Full variant list (see below) |
| `lowestPrice` | `number\|null` | Lowest price across all variants |
| `highestPrice` | `number\|null` | Highest price across all variants |
| `onSale` | `boolean` | `true` if any variant is on sale |
| `maxDiscountPercent` | `number` | Highest discount % across variants |
| `totalVariants` | `number` | Total number of variants |
| `availableVariants` | `number` | Number of in-stock variants |
| `scrapedAt` | `string` | ISO 8601 timestamp of when data was collected |

##### Variant Fields

| Field | Type | Description |
|---|---|---|
| `id` | `number` | Shopify variant ID |
| `title` | `string` | Variant title (e.g., `"Small / Black"`) |
| `sku` | `string` | SKU code |
| `price` | `number\|null` | Current price |
| `compareAtPrice` | `number\|null` | Original price (before discount) |
| `onSale` | `boolean` | `true` if `compareAtPrice > price` |
| `discountPercent` | `number` | Percentage discount (0 if not on sale) |
| `available` | `boolean` | Whether this variant is in stock |
| `option1` | `string\|null` | First option value (e.g., size) |
| `option2` | `string\|null` | Second option value (e.g., color) |
| `option3` | `string\|null` | Third option value |
| `weight` | `number` | Item weight |
| `weightUnit` | `string` | Weight unit (`kg`, `lb`, etc.) |
| `requiresShipping` | `boolean` | Whether the item requires shipping |

***

### Pricing

**$2.50 per 1,000 products scraped.**

The actor charges based on the number of products pushed to your dataset. There are no hidden costs, no per-store fees, and no minimum commitments. You only pay for what you use.

| Volume | Cost |
|---|---|
| 1,000 products | $2.50 |
| 10,000 products | $25.00 |
| 100,000 products | $250.00 |
| 1,000,000 products | $2,500.00 |

Apify platform compute costs (memory/CPU) are billed separately and are typically minimal for this actor due to its pure HTTP architecture.

***

### Proxy Configuration

This actor supports [Apify Proxy](https://docs.apify.com/platform/proxy) for reliable, uninterrupted scraping.

```json
{
  "proxyConfig": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"]
  }
}
```

Proxy groups available:

- `RESIDENTIAL` — Residential IPs (recommended for high-volume runs)
- `DATACENTER` — Datacenter IPs (faster, sufficient for most Shopify stores)

Leave `proxyConfig` as `{}` (default) to use automatic proxy selection.

***

### Performance

- **Speed**: Typically 2,000–5,000 products per minute depending on store size and `requestDelay`
- **Memory**: 256 MB default (sufficient for catalogs of any size)
- **Concurrency**: Single-threaded per store (respects rate limits)
- **Pagination**: Handles unlimited product counts via automatic `since_id` cursor fallback
- **Retries**: Up to 3 retries per page with exponential backoff on failures or rate-limits (HTTP 429)

***

### Frequently Asked Questions

#### Does this work on any Shopify store?

Yes — any public Shopify store that has the `/products.json` endpoint enabled (which is the default for all Shopify stores). Some stores may restrict this endpoint; the actor will skip those with a warning and continue.

#### Do I need a Shopify API key or login?

No. This actor uses Shopify's **public** product API, which requires no authentication. There is no login, no API key, and no store owner permissions needed.

#### How many stores can I scrape in one run?

As many as you want. Add all your target URLs to the `storeUrls` array and the actor will process them sequentially.

#### Will it get blocked?

The actor uses a configurable `requestDelay` (default 500ms) between page requests to behave like a polite crawler. For large-scale runs, enable Apify Proxy with `RESIDENTIAL` group for the best reliability.

#### How do I scrape only a specific product category?

Use the `collection` input field with the collection's URL handle. For example, if the collection URL is `https://example.com/collections/new-arrivals`, the handle is `new-arrivals`.

#### Can I schedule this to run automatically?

Yes. Use [Apify's built-in scheduler](https://docs.apify.com/platform/schedules) to run this actor on any cron schedule — hourly, daily, weekly, or custom.

#### What export formats are available?

From the Apify dataset you can export: **JSON**, **JSONL**, **CSV**, **Excel (XLSX)**, **XML**, and **RSS** — all without any additional configuration.

#### How fresh is the data?

The data is live — scraped directly from the store at the time the actor runs. There is no caching. Use Apify Scheduler for recurring freshness.

#### Does it handle stores with 10,000+ products?

Yes. Shopify's page-based pagination caps at 12,500 products (`page=50 × limit=250`). This actor automatically detects this limit and switches to `since_id` cursor-based pagination, enabling complete extraction of unlimited-size catalogs.

***

### Supported Stores

This actor has been tested on 100+ popular Shopify stores including:

- **Fashion & Apparel**: Kith, Gymshark, Allbirds, Kylie Cosmetics, Pura Vida
- **Footwear**: Steve Madden, Vans, Steve Madden, many independent sneaker boutiques
- **Beauty & Wellness**: ColourPop, Morphe, OUAI, Herbivore Botanicals
- **Home & Lifestyle**: MVMT, Beardbrand, BarkBox
- **Food & Beverage**: Death Wish Coffee, Jones Road Beauty

> If a store runs on Shopify, this actor can scrape it.

***

### Legal & Compliance

This actor accesses only **publicly available data** through Shopify's documented public API endpoint (`/products.json`). It does not bypass authentication, access private data, or violate any platform security controls.

Users are responsible for ensuring their use of scraped data complies with:

- The target website's **Terms of Service**
- Applicable **data protection laws** (GDPR, CCPA, etc.)
- Apify's [Terms of Service](https://apify.com/terms-of-service)

This tool is intended for **legitimate business use cases** such as market research, competitive analysis, price monitoring, and product feed generation.

***

### About

Built with ❤️ as an [Apify Actor](https://apify.com/actors). Open source, pure Node.js, no browser required.

- **Runtime**: Node.js 20
- **HTTP client**: `got-scraping`
- **Platform**: [Apify](https://apify.com)
- **Source**: Available on Apify platform

**Questions or issues?** Use the [Apify community forum](https://community.apify.com) or open a support ticket.

### Local Development

```bash
## Install dependencies
npm install

## Create input file
echo '{"storeUrls":["https://kith.com"],"maxProducts":10}' > storage/key_value_stores/default/INPUT.json

## Run locally
npm start
```

### Tech Stack

- **Node.js 20** (ES modules)
- **Apify SDK v3** — Actor lifecycle, dataset storage, proxy management
- **got-scraping** — HTTP requests optimized for scraping
- No browser / Puppeteer / Playwright — pure HTTP for speed and low cost

### License

ISC

# Actor input Schema

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

One or more Shopify store URLs to scrape (e.g. https://kith.com)

## `collection` (type: `string`):

Optional: scrape only a specific collection (e.g. "new-arrivals"). Leave empty for all products.

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

Maximum number of products to scrape per store. Set to 0 for unlimited.

## `filterTags` (type: `string`):

Comma-separated list of tags. Only products matching at least one tag will be included.

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

Only include products with lowest variant price >= this value. Set to 0 to disable.

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

Only include products with lowest variant price <= this value. Set to 0 to disable.

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

If checked, only products with an active sale (compare\_at\_price > price) will be included.

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

If checked, only products with at least one available variant will be included.

## `newArrivalsDays` (type: `integer`):

Products published within this many days will be flagged as new arrivals.

## `requestDelay` (type: `integer`):

Milliseconds to wait between page requests to avoid rate limiting.

## `proxyConfig` (type: `object`):

Apify proxy configuration. Leave default for automatic proxy handling.

## Actor input object example

```json
{
  "storeUrls": [
    "https://kith.com"
  ],
  "collection": "",
  "maxProducts": 0,
  "filterTags": "",
  "minPrice": 0,
  "maxPrice": 0,
  "onlyOnSale": false,
  "onlyInStock": false,
  "newArrivalsDays": 30,
  "requestDelay": 500,
  "proxyConfig": {}
}
```

# 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://kith.com"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("rover-omniscraper/shopify-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 = { "storeUrls": ["https://kith.com"] }

# Run the Actor and wait for it to finish
run = client.actor("rover-omniscraper/shopify-scraper").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 '{
  "storeUrls": [
    "https://kith.com"
  ]
}' |
apify call rover-omniscraper/shopify-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Shopify Scraper",
        "description": "Universal Shopify Scraper for Apify — Extract product data from any Shopify store via API. Multi-store support, auto-detection, smart filtering by price/tags/sales, new arrival flags, sale detection. Handles pagination, configurable request delays, pure HTTP (no browser). Perfect for e-com research",
        "version": "0.0",
        "x-build-id": "LciX6T4xMisHIZ4WJ"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/rover-omniscraper~shopify-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-rover-omniscraper-shopify-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/rover-omniscraper~shopify-scraper/runs": {
            "post": {
                "operationId": "runs-sync-rover-omniscraper-shopify-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/rover-omniscraper~shopify-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-rover-omniscraper-shopify-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "storeUrls"
                ],
                "properties": {
                    "storeUrls": {
                        "title": "Store URLs",
                        "type": "array",
                        "description": "One or more Shopify store URLs to scrape (e.g. https://kith.com)",
                        "items": {
                            "type": "string"
                        }
                    },
                    "collection": {
                        "title": "Collection Handle",
                        "type": "string",
                        "description": "Optional: scrape only a specific collection (e.g. \"new-arrivals\"). Leave empty for all products.",
                        "default": ""
                    },
                    "maxProducts": {
                        "title": "Max Products Per Store",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Maximum number of products to scrape per store. Set to 0 for unlimited.",
                        "default": 0
                    },
                    "filterTags": {
                        "title": "Filter by Tags",
                        "type": "string",
                        "description": "Comma-separated list of tags. Only products matching at least one tag will be included.",
                        "default": ""
                    },
                    "minPrice": {
                        "title": "Minimum Price",
                        "minimum": 0,
                        "type": "number",
                        "description": "Only include products with lowest variant price >= this value. Set to 0 to disable.",
                        "default": 0
                    },
                    "maxPrice": {
                        "title": "Maximum Price",
                        "minimum": 0,
                        "type": "number",
                        "description": "Only include products with lowest variant price <= this value. Set to 0 to disable.",
                        "default": 0
                    },
                    "onlyOnSale": {
                        "title": "Only On-Sale Products",
                        "type": "boolean",
                        "description": "If checked, only products with an active sale (compare_at_price > price) will be included.",
                        "default": false
                    },
                    "onlyInStock": {
                        "title": "Only In-Stock Products",
                        "type": "boolean",
                        "description": "If checked, only products with at least one available variant will be included.",
                        "default": false
                    },
                    "newArrivalsDays": {
                        "title": "New Arrivals Threshold (days)",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Products published within this many days will be flagged as new arrivals.",
                        "default": 30
                    },
                    "requestDelay": {
                        "title": "Delay Between Requests (ms)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Milliseconds to wait between page requests to avoid rate limiting.",
                        "default": 500
                    },
                    "proxyConfig": {
                        "title": "Proxy Configuration",
                        "type": "object",
                        "description": "Apify proxy configuration. Leave default for automatic proxy handling.",
                        "default": {}
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
