# Shopify Store Product Scraper (`mina_safwat/shopify-product-scraper`) Actor

Scrapes the full product catalogue of any Shopify store — titles, prices, variants, SKUs, stock, and images

- **URL**: https://apify.com/mina\_safwat/shopify-product-scraper.md
- **Developed by:** [Mina](https://apify.com/mina_safwat) (community)
- **Categories:** E-commerce, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.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/actors/running/actors-in-store.md#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

Scrape the **full product catalogue of any Shopify store** — titles, prices, every variant with its SKU and stock, images, and categories. No API key, no login, no app install.

### What does Shopify Store Product Scraper do?

Give it a store address like `gymshark.com` and it returns the store's whole catalogue as structured data. For each product you get the title, brand, type, tags, price range, whether it is discounted, whether it is in stock, the image URLs, and a full breakdown of every variant — size, colour, SKU, price, and availability.

It works on any store built on Shopify, which is millions of them. Stores that are not on Shopify are reported clearly rather than failing the run.

### Why use Shopify Store Product Scraper?

- **Competitor price monitoring** — track a rival's catalogue and catch price changes and discounts.
- **Stock tracking** — see which sizes and colours are selling out, and how fast.
- **Product research** — study assortment, pricing tiers, and how competitors group products.
- **Dropshipping and retail sourcing** — pull supplier catalogues into your own system.
- **Market analysis** — compare pricing across a whole set of brands in one run.

Running it on Apify adds scheduling, an API, integrations (Sheets, Slack, Zapier, S3), and run monitoring.

### How to use Shopify Store Product Scraper

1. Enter one or more **Shopify stores**, one per line — just the domain is enough.
2. Set **Max products per store**.
3. Click **Start**.

Results appear in the Output tab as they are scraped, and download as JSON, CSV, Excel, or XML.

### Input

| Field | Description |
| --- | --- |
| `store_urls` | Store addresses, one per line. A domain, a full URL, or a link to any page on the store all work. |
| `max_products_per_store` | Stops after this many products from each store. |
| `include_description` | Add the product description as plain text. |
| `include_collections` | Attach the store's categories with a product count for each. |
| `in_stock_only` | Skip products where every variant is sold out. |
| `on_sale_only` | Only products currently discounted. |

### Output

```json
{
  "store": "gymshark.com",
  "product_id": 7382910,
  "title": "Vital Seamless Tee",
  "url": "https://gymshark.com/products/vital-seamless-tee",
  "vendor": "Gymshark",
  "product_type": "T-Shirts",
  "tags": ["tops", "new"],
  "price_min": 38.0,
  "price_max": 42.0,
  "compare_at_price_max": 50.0,
  "on_sale": true,
  "in_stock": true,
  "variant_count": 12,
  "options": ["Size", "Colour"],
  "images": ["https://cdn.shopify.com/a.jpg"],
  "variants": [
    { "variant_id": 1, "title": "S / Black", "sku": "GS-S-BLK",
      "price": 38.0, "compare_at_price": 50.0, "available": true, "grams": 180 }
  ]
}
```

You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.

#### Data fields

| Field | Description |
| --- | --- |
| `store`, `product_id`, `title`, `handle`, `url` | Which store, and which product. |
| `vendor`, `product_type`, `tags` | Brand and how the store classifies it. |
| `price_min`, `price_max` | Cheapest and dearest variant. |
| `compare_at_price_max`, `on_sale` | The was-price, and whether anything is currently discounted. |
| `in_stock`, `variant_count`, `options` | Availability and how the product varies. |
| `variants` | Every variant with its SKU, price, weight, and stock. |
| `images`, `image_count` | Product images. |
| `published_at`, `updated_at` | When the product went live and last changed. |
| `description` | Plain-text description, when you ask for it. |
| `store_collections` | The store's categories, when you ask for them. |

### How much does it cost to scrape a Shopify store?

Products come back 250 at a time, so even a large catalogue is a handful of requests. Cost tracks the number of products, and **Max products per store** is the lever.

### Tips

- **Just the domain is fine.** Paste `brand.com` — no need to find a product page first.
- **Monitor prices by scheduling it.** Run daily against the same stores and the dataset becomes a price and stock history.
- **`updated_at` shows movement.** Sort by it to see what a store has changed most recently.
- **Not every store is on Shopify.** Those are skipped with a note in the log, so a long list of stores never fails as a whole.

### FAQ and support

**How do I know if a store uses Shopify?** Just run it. If the store is not on Shopify, the log says so and moves on to the next one.

**Does this need a Shopify app, API key, or partner account?** No. It reads the same public product feed the storefront itself uses.

**Why did a store return nothing?** Some merchants hide their product feed, and some stores are password-protected or genuinely empty. The log distinguishes "not a Shopify store" from "Shopify store with no visible products".

**Are prices in the store's currency?** Prices come back as plain numbers in whatever currency the storefront serves by default, which usually depends on the country the request came from. If currency matters, set a single proxy country so every run is consistent.

**Is scraping Shopify stores legal?** The product feed is published publicly by the store, and no personal data is involved. You are responsible for how you use it, including each store's terms. Consult a lawyer if you are unsure.

Found a bug or want a field that is missing? Open an issue on the Actor's Issues tab.

### SEO Keywords

shopify scraper, shopify product scraper, scrape shopify store products, shopify catalogue export, shopify variants and skus, ecommerce product data, competitor product monitoring, shopify inventory scraper, shopify price tracker, dropshipping product research

# Actor input Schema

## `store_urls` (type: `array`):

Store addresses, one per line. "gymshark.com", "https://gymshark.com", or a link to any page on the store all work.

## `max_products_per_store` (type: `integer`):

Stops after this many products from each store. Products arrive 250 at a time.

## `include_description` (type: `boolean`):

Add the product description as plain text, with the HTML stripped out.

## `include_collections` (type: `boolean`):

Attach the store’s list of collections (categories) with a product count for each.

## `in_stock_only` (type: `boolean`):

Skip products where every variant is sold out.

## `on_sale_only` (type: `boolean`):

Only products currently discounted below their compare-at price.

## `proxy_country` (type: `string`):

Comma-separated 2-letter codes, rotated across retries.

## Actor input object example

```json
{
  "store_urls": [
    "gymshark.com",
    "allbirds.com"
  ],
  "max_products_per_store": 250,
  "include_description": false,
  "include_collections": false,
  "in_stock_only": false,
  "on_sale_only": false,
  "proxy_country": "US,GB,DE,NL,FR"
}
```

# Actor output Schema

## `dataset` (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 = {
    "store_urls": [
        "gymshark.com",
        "allbirds.com"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("mina_safwat/shopify-product-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 = { "store_urls": [
        "gymshark.com",
        "allbirds.com",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("mina_safwat/shopify-product-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 '{
  "store_urls": [
    "gymshark.com",
    "allbirds.com"
  ]
}' |
apify call mina_safwat/shopify-product-scraper --silent --output-dataset

```

## MCP server setup

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