Shopify Store Scraper
Pricing
Pay per event
Shopify Store Scraper
Scrape every product from any Shopify store: titles, prices, compare-at prices, variants, images, vendor, product type, tags and stock. Paste store URLs and get clean JSON, CSV or Excel. $0.001 per product plus $0.005 per run start.
Pricing
Pay per event
Rating
0.0
(0)
Developer
NanoScrape
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
9 days ago
Last modified
Categories
Share
Get the product catalog of any Shopify store as a clean table: names, prices, discounts, variants, images and store details. The actor reads the public /products.json endpoint that Shopify stores expose. Returns product details, descriptions, prices, discount info, variant data, images, and store metadata. No login required. Pay-per-result.
Features
- Any Shopify store: works with myshopify.com subdomains and custom domains
- Complete product data: title, description, vendor, type, tags, all images, options, price range, discount detection
- Variant details: optional full variant data with SKU, individual prices, option values, and weight
- Store metadata: name, domain, myshopify domain, description, currency, country, city and published product count from the public
/meta.json - Automatic pagination: fetches all pages up to your limit (250 per page)
- Automatic fallback: tries
/collections/all/products.jsonif/products.jsonis blocked - Clear errors: a site that is not a Shopify store, or blocks access, is reported in the run status message
- Deduplication: no duplicate product IDs per store
Use with AI Agents (MCP)
Connect this actor to any MCP-compatible AI client: Claude Desktop, Claude.ai, Cursor, VS Code, LangChain, LlamaIndex, or custom agents.
Apify MCP server URL:
https://mcp.apify.com?tools=santamaria-automations/shopify-store-scraper
Example prompt once connected:
"Use
shopify-store-scraperto extract all products from allbirds.com and kith.com. Return a table with product name, vendor, price range, and availability."
Clients that support dynamic tool discovery (Claude.ai, VS Code) will receive the full input schema automatically via add-actor.
Output Data
Each record represents one product, with store metadata embedded:
Product Fields
| Field | Type | Description |
|---|---|---|
product_id | string | Shopify product ID |
product_title | string | Product title |
product_handle | string | URL slug |
product_type | string|null | Merchant-assigned product type |
description | string|null | Product description (HTML stripped to plain text) |
vendor | string|null | Brand or vendor name |
tags | array | Merchant-assigned tags |
min_price | number|null | Lowest variant price |
max_price | number|null | Highest variant price |
compare_at_price_min | number|null | Lowest original/compare-at price (indicates discount) |
compare_at_price_max | number|null | Highest original/compare-at price |
currency | string|null | Store default currency |
available | boolean | True if any variant is purchasable |
variant_count | integer | Number of variants (sizes, colors, etc.) |
image_url | string|null | Primary product image URL |
image_urls | array | All product image URLs |
options | array | Product options with values (e.g. {name: "Size", values: ["S","M","L"]}) |
variants | array|null | Full variant details (only when includeVariants is enabled) |
product_url | string | Direct link to the product page |
product_created_at | string|null | ISO 8601 creation timestamp |
product_updated_at | string|null | ISO 8601 last-updated timestamp |
product_published_at | string|null | ISO 8601 publish timestamp |
Variant Fields (when includeVariants: true)
Each variant in the variants array contains:
| Field | Type | Description |
|---|---|---|
id | string | Variant ID |
title | string | Variant title (e.g. "M / Black") |
sku | string | Stock Keeping Unit code |
price | number | Variant price |
compare_at_price | number|null | Original price before discount |
available | boolean | Whether this variant is in stock |
option1 | string|null | First option value (e.g. "Medium") |
option2 | string|null | Second option value (e.g. "Black") |
option3 | string|null | Third option value |
grams | integer | Weight in grams |
Store Fields (embedded per product)
| Field | Type | Description |
|---|---|---|
store_url | string | Store URL as provided in input |
store_name | string|null | Store display name |
store_domain | string|null | Primary domain |
store_myshopify_domain | string|null | myshopify.com subdomain |
store_description | string|null | Store description |
store_currency | string|null | Default currency code |
store_country | string|null | Country code |
store_city | string|null | Store city |
store_province | string|null | Store state or province |
store_published_products_count | integer|null | Number of published products the store reports |
scraped_at | string | ISO 8601 scrape timestamp |
Input
| Parameter | Type | Default | Description |
|---|---|---|---|
storeUrls | array | https://allbirds.com (demo) | List of Shopify store URLs to scrape. Empty input scrapes the demo store allbirds.com, limited to 10 products |
maxProductsPerStore | integer | 250 | Maximum products per store (1-10,000). Ignored in the empty-input demo, which returns 10 products |
includeVariants | boolean | false | Include full variant details (SKU, prices, options, weight) per product |
Input Examples
Scrape a single store
{"storeUrls": ["https://allbirds.com"],"maxProductsPerStore": 500}
Scrape multiple stores with variant details
{"storeUrls": ["https://www.allbirds.com","https://kith.com"],"maxProductsPerStore": 250,"includeVariants": true}
Scrape with myshopify.com domains
{"storeUrls": ["https://weareallbirds.myshopify.com"],"maxProductsPerStore": 100}
Pricing
Pay per result. You are charged only for products that were saved to the dataset; a run with no results costs nothing.
| Event | Price |
|---|---|
actor-start (once per run, charged with the first saved product) | $0.005 |
shopify-product-result (per product saved) | $0.001 |
If you set a maximum total charge for the run, the actor stops saving products before the next charge would exceed it.
Notes
- Fallback endpoint: If
/products.jsonis blocked, the actor automatically tries/collections/all/products.jsonas a fallback. - Pagination: Shopify returns up to 250 products per page. The actor paginates automatically using the legacy
?page=Nparameter, which works on all Shopify stores. - Custom domains: The actor follows HTTP redirects, so custom domains pointing to Shopify backends are fully supported.
- Public endpoint only:
/products.jsonand/meta.jsonare public Shopify endpoints. Some shops (for example headless storefronts) block them with HTTP 403 or 404; those stores are reported as skipped and the actor does not try to work around the block. - Store email and phone: not available from the public endpoints. Use a website contact extractor on the store domain for contact details.
- Discount detection: Compare
min_pricewithcompare_at_price_minto identify products on sale.
Issues & Feature Requests
If something is not working or you're missing a field, please open an issue.