# Shopify Products Scraper (`dhrumil/shopify-products-scraper`) Actor

Scrape any shopify powered website / store and automate / monitor all products products in a structured form, including product title, price, description, etc. Data can be exported or connected through API for further analysis and integration.

- **URL**: https://apify.com/dhrumil/shopify-products-scraper.md
- **Developed by:** [Dhrumil Bhankhar](https://apify.com/dhrumil) (community)
- **Categories:** E-commerce, Automation
- **Stats:** 686 total users, 8 monthly users, 95.3% runs succeeded, 21 bookmarks
- **User rating**: 4.99 out of 5 stars

## Pricing

from $3.00 / 1,000 starter tier per 1k 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 is Shopify Products Scraper?

This Shopify products scraper will enable you scrape any shopify site and build the complete list of products from given shopify site.

👀 Unlike any other shopify scraper or API, ths scraper also provides category information along with product to make the data more useful.

📩 You can simply enter any shopify site URL or even particular collection URL. This actor will crawl through all products and generate dataset for you. Moreover, this actor is extremely fast!

Website url can be either shopify site url or collection url:

- https://artisaire.com
- https://artisaire.com/collections/greetings

⬇️ Download products data in Excel, CSV, JSON, and other formats

### 📚 How do I start scraping with this scraper?

1. Register for your free Apify account [here](https://apify.com/pricing?fpr=z2di7)
2. You don't need to provide your credit card details for free acount. Just click on "Get Started" button on above link and complete the registration only.
3. Free account comes with reasonable credits to try out this actor. This actor also comes with free trial of 3 days without any commitment/upfront charge.
4. Run this actor and verify the scraped data. Apify has huge integration possibilities. You can download the data or push the data into any 3rd party platform directly.

### 🌳 What Shopify data can I extract using this tool?

|       📝         |             📝            |
|------------------|----------------------------|
| Product Title    | Description                |
| Product URL      | Product Handle             |
| Publish Date     | Update Date                |
| Vendor           | Product Type               |
| Tags             | Images                     |
| Variants         | Categories                 |
| SKU              | Availability               |
| Price            | Taxability                 |

### 💸 Pricing Model & Usage Logic

This actor uses a tiered pay-per-event pricing model, with usage tracked and charged based on the number of products processed and additional multipliers. Charges are triggered at specific usage thresholds and events.

**There is no monthly fixed rental!** You can keep this actor with you right now and it will cost you only if/when you are using it actively.

#### 🟢 Charge Events & Tiers

The actor uses a tiered pricing model based on the number of products processed. Each tier has a specific charge event and rate per 1,000 products:

> **🔻 Cost Efficiency as You Scale:**
> The tier-based pricing model is designed to reduce your cost per product as your usage increases. The more products you process, the lower your per-unit cost becomes, helping keep your overall costs under control as you scale up to higher volumes.

##### Starter Tier (`starter-tier-1K`)

For the first 25,000 products processed, the cost per 1,000 products is **$3 USD**.
This tier is ideal for small to medium jobs and ensures a low entry cost for initial usage.

##### Growth Tier (`growth-tier-1K`)

For products processed from 25,000 up to 50,000 the cost per 1,000 products drops to **$2 USD**.
This tier rewards higher volume usage with a reduced rate, making it cost-effective for scaling up.

##### Scale Tier (`scale-tier-1K`)

For products processed from 50,000 up to 100,000 the cost per 1,000 products is **$1 USD**.
This tier is designed for large-scale operations, offering further discounts as your volume increases.

##### Enterprise Tier (`enterprise-tier-1K`)

For products processed above 100,000 the cost per 1,000 products is **$0.80 USD**.
This tier is for enterprise-level usage, providing the lowest rate for very high-volume processing.

Each charge event is triggered automatically as your processed product count crosses into the next tier. The actor tracks usage and applies the correct rate for each tier, ensuring transparent and predictable billing.

These pricing tiers are applied on a **monthly** basis, and your usage count resets at the start of each new month. This ensures you always start fresh and only pay for what you use each month.

##### Example:

- Scraping 150,000 products in a month:
  - $3 per 1K products for the first 25,000 products ($75)
  - $2 per 1K products from 25,000 to 50,000 products ($50)
  - $1 per 1K products from 50,000 to 100,000 products ($50)
  - $0.80 per 1K products above 100,000 products ($40)
  - **Total:** $215

#### ⚡ Additional Usage Parameters (Multipliers)

The actor may apply additional usage multipliers based on your input settings. These do **not** directly charge you extra, but they affect how quickly you use up your monthly quota.

- **🌐 Residential Proxy Usage:** If you use a residential proxy, an additional 5x usage multiplier will apply. This is due to the higher cost and complexity of residential proxy traffic.
- **🧠 Memory Usage:** If you run the actor with more than 256 MB of memory, you will be charged an additional usage multiplier. For example, running at 512 MB will double your usage cost.
- **📄 404 / Not Found:** If a requested product or page returns a 404 response, a 2x penalty charge is applied for that request.
- **📄 Failed Requests:** Any request that fails after all retries will incur a 1x usage charge.

These multipliers are **cumulative**.

> **💡 Tip:**
> For best cost efficiency, run this actor on **256 MB memory**. The actor is highly optimized for this setting, and using more memory will increase your additional usage charges. Only increase memory if you have a specific need.

### ⬇️ Input

You can provide either a website URL to scrape all products, or a specific product URL to scrape just one product.

#### Input examples

**To scrape all products from a website:**

```json
{
    "websiteUrl": "https://artisaire.com"
}
```

**To scrape a single product:**

```json
{
    "productUrl": "https://artisaire.com/products/prosecco-sealing-wax-sticks"
}
```

You can either provide site url or provide particular collection url to crawl all products, or use productUrl to scrape a specific product.

### ⬆️ Output

The scraped data is stored in the dataset of each run. The data can be viewed or downloaded in many popular formats, such as *JSON, CSV, Excel, XML, RSS, and HTML*.

#### Output example

The result for scraping a single product like this:

```json
{
	"id": 7558389334172,
	"title": "Harrison Wax Stamp",
	"handle": "harrison-wax-stamp",
	"url": "https://artisaire.com/products/harrison-wax-stamp",
	"body_html": "<p><em></em><span>The Harrison brings it all together with a strong woven pattern.</span></p>\n<p><span><em>Designed by ARTISAIRE for our Wedding Collection, Essentials '23 Release.</em></span></p>\n<p>Wax Stamp shown with Classic Black handle</p>\n<p><strong><span data-preserver-spaces=\"true\">Details</span></strong></p>\n<ul>\n<li><span data-preserver-spaces=\"true\">Premium brass die improves heat control which reduces stickiness</span></li>\n<li><span data-preserver-spaces=\"true\">Classic handle is made from a premium FSC® certified Hard Maple</span></li>\n<li><span data-preserver-spaces=\"true\">Laser engraved for precise and beautiful artwork</span></li>\n<li><span data-preserver-spaces=\"true\">Materials sourced from North America</span></li>\n<li><span data-preserver-spaces=\"true\">Made with love in Canada</span></li>\n</ul>\n<p><strong><span data-preserver-spaces=\"true\">Dimensions</span></strong></p>\n<ul>\n<li><span data-preserver-spaces=\"true\">Brass die face is 1\" in diameter and makes approximately a 1.25\" wax seal</span></li>\n<li><span data-preserver-spaces=\"true\">Classic Black and Classic Blonde handle are 3.5\" tall and 0.75\" wide</span></li>\n<li><span data-preserver-spaces=\"true\">Classic Brass handle is 2.5\" tall and 0.70\" wide</span></li>\n</ul>\n<p><strong><span data-preserver-spaces=\"true\">How To Use</span></strong></p>\n<p><span data-preserver-spaces=\"true\">Materials: Wax Stamp, </span><a href=\"https://artisaire.com/sealing-wax/\" class=\"editor-rtfLink\" target=\"_blank\"><u><span data-preserver-spaces=\"true\">Sealing Wax</span></u></a><span data-preserver-spaces=\"true\">, </span><a href=\"https://artisaire.com/low-temperature-sealing-wax-gun/\" class=\"editor-rtfLink\" target=\"_blank\"><u><span data-preserver-spaces=\"true\">Low Temperature Glue Gun</span></u></a></p>\n<ul>\n<li><span data-preserver-spaces=\"true\">Insert Sealing Wax into Glue Gun, and allow 5-7 minutes to melt</span></li>\n<li><span data-preserver-spaces=\"true\">Squeeze trigger to dispense a 1\" circle of sealing wax on your surface</span></li>\n<li><span data-preserver-spaces=\"true\">Press Wax Stamp into sealing wax and allow 5-10 seconds to cool</span></li>\n<li><span data-preserver-spaces=\"true\">Gently peel Wax Stamp from sealing wax, if sticking occurs give more time to cool</span></li>\n</ul>\n<p><span data-preserver-spaces=\"true\">We recommend chilling your stamp on an ice pack between sealing.</span></p>\n<p><strong><span data-preserver-spaces=\"true\">Care</span></strong></p>\n<ul>\n<li><span data-preserver-spaces=\"true\">Made with uncoated brass to preserve the integrity of the impression as the stamp ages. The die will develop a natural patina and can be cleaned with a simple jewelry cloth for brass.</span></li>\n</ul>\n<ul></ul>",
	"published_at": "2023-03-28T06:37:47-07:00",
	"created_at": "2023-02-14T13:03:25-08:00",
	"updated_at": "2023-11-29T03:28:00-08:00",
	"vendor": "By Artisaire",
	"product_type": "Wax Stamp",
	"tags": [
		"cm",
		"motif",
		"wedding"
	],
	"collections": [
		"Wedding Collection",
		"Wax Stamps For Weddings",
		"Wax Stamps For Branding",
		"Wax Stamps",
		"Cyber Monday Collection"
	],
	"variants": [
		{
			"id": 42344034271388,
			"title": "Default Title",
			"option1": "Default Title",
			"option2": null,
			"option3": null,
			"sku": "OHA-23A-46",
			"requires_shipping": true,
			"taxable": true,
			"featured_image": null,
			"available": true,
			"price": "28.80",
			"grams": 60,
			"compare_at_price": "48.00",
			"position": 1,
			"product_id": 7558389334172,
			"created_at": "2023-02-14T13:03:25-08:00",
			"updated_at": "2023-11-29T03:28:00-08:00"
		}
	],
	"images": [
		{
			"id": 35809731182748,
			"created_at": "2023-03-02T14:08:08-08:00",
			"position": 1,
			"updated_at": "2023-03-02T14:08:09-08:00",
			"product_id": 7558389334172,
			"variant_ids": [],
			"src": "https://cdn.shopify.com/s/files/1/0587/5954/4988/products/23A-46a-2023House-WaxStamp-img1-01Black-1.jpg?v=1677794889",
			"width": 2048,
			"height": 2048
		},
		{
			"id": 35840927662236,
			"created_at": "2023-03-09T11:20:24-08:00",
			"position": 2,
			"updated_at": "2023-03-09T11:20:26-08:00",
			"product_id": 7558389334172,
			"variant_ids": [],
			"src": "https://cdn.shopify.com/s/files/1/0587/5954/4988/products/Harrison-WaxStamp-img2_23-2.jpg?v=1678389626",
			"width": 2048,
			"height": 2048
		},
		{
			"id": 35908829872284,
			"created_at": "2023-03-27T11:31:17-07:00",
			"position": 3,
			"updated_at": "2023-03-27T11:31:19-07:00",
			"product_id": 7558389334172,
			"variant_ids": [],
			"src": "https://cdn.shopify.com/s/files/1/0587/5954/4988/products/WaxStamp-img3-Indicator-BLK-1_d253a05c-ad95-4640-aa77-b154ce1ce75c.jpg?v=1679941879",
			"width": 2048,
			"height": 2048
		}
	],
	"options": [
		{
			"name": "Title",
			"position": 1,
			"values": [
				"Default Title"
			]
		}
	]
}
```

### 🙋‍♀️ For custom solutions

In case you need some custom solution, you can contact me : <dhrumil@techvasu.com>

Or learn more about me on github : <https://github.com/dhrumil4u360>

# Changelog

This Actor's version history is a separate document: https://apify.com/dhrumil/shopify-products-scraper/changelog.md

# Actor input Schema

## `websiteUrl` (type: `string`):

Shopify Website Url to scrape data from, don't forget to add 'https://'

## `productUrl` (type: `string`):

URL of a specific Shopify product to scrape (e.g., https://artisaire.com/products/prosecco-sealing-wax-sticks). Use this to scrape just one product instead of the entire site.

## `email` (type: `string`):

Email address to send notifications or reports to.

## `proxy` (type: `object`):

Select proxies to be used by your crawler.

## Actor input object example

```json
{
  "websiteUrl": "https://artisaire.com",
  "email": "",
  "proxy": {
    "useApifyProxy": true
  }
}
```

# 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 = {
    "websiteUrl": "https://artisaire.com",
    "proxy": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("dhrumil/shopify-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 = {
    "websiteUrl": "https://artisaire.com",
    "proxy": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("dhrumil/shopify-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 '{
  "websiteUrl": "https://artisaire.com",
  "proxy": {
    "useApifyProxy": true
  }
}' |
apify call dhrumil/shopify-products-scraper --silent --output-dataset

```

## MCP server setup

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