Shopify Store Scraper
Pricing
Pay per usage
Shopify Store Scraper
Scrape product data from any Shopify store using the public /products.json API. Extracts titles, prices, variants, images, tags, and more. Perfect for dropshipping research, competitor analysis, and price monitoring.
Pricing
Pay per usage
Rating
0.0
(0)
Developer

Ricardo Akiyoshi
Actor stats
0
Bookmarked
2
Total users
1
Monthly active users
12 hours ago
Last modified
Categories
Share
Scrape product data from any Shopify store using the public /products.json API endpoint. No anti-bot measures, no proxies needed, extremely fast and reliable.
Why This Scraper?
All Shopify stores expose a public JSON API at /products.json. This actor leverages that endpoint to extract structured product data without needing to parse HTML or deal with anti-scraping measures. It just works.
Use Cases
- Dropshipping Research — Find winning products by analyzing competitor stores. Compare prices, identify trending items, and discover new product opportunities across multiple stores.
- Competitor Analysis — Monitor competitor product catalogs, pricing strategies, and inventory levels. Track when new products are added or prices change.
- Price Monitoring — Set up scheduled runs to track price changes over time. Compare your pricing against competitors and identify market trends.
- Product Research — Analyze product descriptions, tags, and categories to understand market positioning. Study how successful stores organize and present their products.
- Market Intelligence — Aggregate data across multiple stores to identify trending products, popular price points, and market gaps.
- Inventory Tracking — Monitor variant availability to understand demand patterns and stock levels.
Input
| Parameter | Type | Default | Description |
|---|---|---|---|
storeUrls | array | (required) | Shopify store URLs (e.g. https://gymshark.com) |
maxProducts | integer | 50 | Max products per store. Set to 0 for unlimited. |
includeVariants | boolean | true | Include variant details (sizes, colors, SKUs, prices) |
Output
Each product in the dataset includes:
| Field | Description |
|---|---|
title | Product name |
handle | URL-friendly slug |
description | Full product description (HTML stripped) |
vendor | Brand or vendor name |
productType | Product category |
tags | Array of product tags |
price | Lowest variant price |
compareAtPrice | Original/compare price (if on sale) |
currency | Store currency code |
available | Whether any variant is in stock |
totalInventory | Total inventory count (if exposed) |
variants | Array of variant objects (if enabled) |
images | Array of image URLs |
options | Product options (Size, Color, etc.) |
createdAt | Product creation date |
updatedAt | Last update date |
publishedAt | Publication date |
storeUrl | Source store URL |
productUrl | Direct link to product page |
scrapedAt | Timestamp of scrape |
Example Output
{"title": "Crest T-Shirt","handle": "crest-t-shirt","description": "A classic cotton t-shirt with embroidered logo.","vendor": "Gymshark","productType": "Tops","tags": ["men", "t-shirts", "cotton", "new-arrivals"],"price": "30.00","compareAtPrice": "40.00","currency": "USD","available": true,"variants": [{"title": "S / Black","price": "30.00","compareAtPrice": "40.00","sku": "GS-CREST-BLK-S","available": true,"weight": 200,"weightUnit": "g"}],"images": ["https://cdn.shopify.com/s/files/1/example/crest-tshirt.jpg"],"options": [{ "name": "Size", "values": ["S", "M", "L", "XL"] },{ "name": "Color", "values": ["Black", "White", "Navy"] }],"createdAt": "2026-01-15T10:00:00-05:00","updatedAt": "2026-02-28T14:30:00-05:00","storeUrl": "https://gymshark.com","productUrl": "https://gymshark.com/products/crest-t-shirt","scrapedAt": "2026-03-01T12:00:00.000Z"}
How It Works
- Takes each store URL and normalizes it
- Fetches
/products.json?limit=250&page=1(Shopify's public API) - Falls back to
/collections/all/products.jsonif the primary endpoint fails - Paginates through all pages until no more products or
maxProductsis reached - Extracts and normalizes all product data
- Pushes structured results to the Apify dataset
Tips
- Unlimited scraping: Set
maxProductsto 0 to scrape entire product catalogs - Reduce output size: Set
includeVariantsto false if you only need product-level data - Scheduled runs: Set up a schedule to monitor price changes and new products over time
- Multiple stores: Add as many store URLs as you want — the actor processes them all in one run
- Finding Shopify stores: Most stores built on Shopify have
cdn.shopify.comin their page source
Limitations
- Only works with Shopify stores (not WooCommerce, Magento, etc.)
- Some stores may have disabled the
/products.jsonendpoint (rare) - Product descriptions are returned as plain text (HTML tags stripped)
- Shopify limits the API to 250 products per page
Cost
This actor is very lightweight. It makes simple JSON API calls — no browser rendering, no proxy rotation needed. A typical run scraping 1,000 products costs less than $0.01 in platform usage.
Integration — Python
from apify_client import ApifyClientclient = ApifyClient("YOUR_API_TOKEN")run = client.actor("sovereigntaylor/shopify-store-scraper").call(run_input={"searchTerm": "shopify store","maxResults": 50})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(f"{item.get('title', item.get('name', 'N/A'))}")
Integration — JavaScript
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_API_TOKEN' });const run = await client.actor('sovereigntaylor/shopify-store-scraper').call({searchTerm: 'shopify store',maxResults: 50});const { items } = await client.dataset(run.defaultDatasetId).listItems();items.forEach(item => console.log(item.title || item.name || 'N/A'));