Shopify Scraper — Products, Collections, Reviews & Emails
Pricing
from $3.00 / 1,000 product scrapeds
Shopify Scraper — Products, Collections, Reviews & Emails
Extract Shopify products, collections, reviews and merchant emails from any store as CRM-ready JSON. No login needed; works with Apify MCP and the API.
Pricing
from $3.00 / 1,000 product scrapeds
Rating
0.0
(0)
Developer
Khadin Akbar
Maintained by CommunityActor stats
1
Bookmarked
35
Total users
0
Monthly active users
9 hours ago
Last modified
Categories
Share
What is 🛍️ Shopify Scraper — Products, Collections, Reviews & Emails?
Use this Apify Actor to extract Shopify store data into one dataset, with each record representing one product, one collection, one customer review, or one merchant contact result. It accepts Shopify store URLs or bare domains, and it is designed for known stores rather than keyword discovery. The output can include product IDs, handles, URLs, titles, prices, compare-at prices, discounts, variants, images, review ratings, review counts, merchant email, phone, address, language, currency, and social links. The result is CRM-ready JSON that you can use in apps, pipelines, and Apify MCP workflows.
Best fit and connected workflows
This actor fits workflows where the input is already a specific Shopify store and the goal is structured data from that store.
It routes well into:
- product catalog export when you need titles, pricing, stock, variants, images, and product metadata
- collection mapping when you want categories, handles, descriptions, and product counts
- review analysis when you want star ratings, review text, verified buyer status, and helpful votes
- merchant lead capture when you want public contact details for outreach or account research
- scheduled monitoring when you want repeatable snapshots of the same store over time
- downstream enrichment or filtering by
record_typein your own systems
Related Shopify workflows that connect naturally:
- Use Shopify Products Scraper for a more focused product-only step
- Use Shopify App Store Scraper when your next step is Shopify app research
Practical scenario
Maya, a sales operations specialist, starts with a known store domain, gymshark.com, and wants a contact record plus a small product sample for context. She enables scrapeContactInfo and scrapeProducts, then sets a product cap for a quick run.
The actor returns fields such as merchant_email, merchant_phone, store_currency, store_language, title, price, currency, available, and discount_percentage. Maya uses the merchant email to route the lead to the right account owner, then reviews the product pricing and availability before planning outreach.
Input
| Field | Type | Purpose |
|---|---|---|
storeUrls | array of strings | Shopify store URLs or bare domains for known stores |
scrapeProducts | boolean | Extract product data from public Shopify catalog endpoints |
scrapeCollections | boolean | Extract collection data from public Shopify collection endpoints |
scrapeReviews | boolean | Extract customer reviews when a supported review platform is detected |
scrapeContactInfo | boolean | Extract public merchant contact details from the store pages |
maxProductsPerStore | integer | Upper bound for products per store |
maxCollectionsPerStore | integer | Upper bound for collections per store |
maxReviewsPerProduct | integer | Upper bound for reviews per product |
Focused input example
{"storeUrls": ["https://www.allbirds.com","gymshark.com"],"scrapeProducts": true,"scrapeCollections": true,"scrapeReviews": false,"scrapeContactInfo": true,"maxProductsPerStore": 25,"maxCollectionsPerStore": 50,"maxReviewsPerProduct": 20}
Output
Each dataset item includes record_type so you can filter records by product, collection, review, or contact.
| Field | Type | Purpose |
|---|---|---|
record_type | string | Record discriminator: product, collection, review, or contact |
store_url | string | Full base URL of the Shopify store |
store_domain | string | Hostname of the store |
scraped_at | string | ISO 8601 extraction timestamp |
source_url | string | Source page or endpoint used for the record |
product_id | string or null | Shopify product ID for product records |
product_handle | string or null | Shopify product slug |
product_url | string or null | Direct product URL |
title | string or null | Product title or collection title |
vendor | string or null | Product vendor or brand |
product_type | string or null | Product type from Shopify |
tags | array or null | Product tags |
description | string or null | Plain-text product description |
price | number or null | Current lowest selling price |
compare_at_price | number or null | Original price before discount |
discount_percentage | number or null | Calculated discount value |
currency | string or null | ISO 4217 currency code |
available | boolean or null | Current availability status |
variants_count | number or null | Number of variants |
variants | array or null | Variant details such as SKU, barcode, and option values |
images | array or null | Image URLs in store order |
image_url | string or null | Main image URL |
sku | string or null | SKU from the first variant |
barcode | string or null | Barcode from the first variant |
review_platform | string or null | Detected review platform |
review_rating | number or null | Average review rating |
review_count | number or null | Number of scraped reviews |
created_at | string or null | Shopify creation timestamp |
updated_at | string or null | Last update timestamp |
published_at | string or null | Storefront publish timestamp |
collection_id | string or null | Shopify collection ID |
collection_handle | string or null | Collection slug |
collection_title | string or null | Collection title |
collection_description | string or null | Plain-text collection description |
collection_image_url | string or null | Collection image URL |
collection_product_count | number or null | Product count in collection |
review_id | string or null | Review platform ID |
reviewer_name | string or null | Review author name |
review_title | string or null | Review headline |
review_body | string or null | Full review text |
review_date | string or null | Review submission date |
review_star_rating | number or null | Individual star rating |
verified_buyer | boolean or null | Verified buyer flag |
helpful_votes | number or null | Helpful vote count |
merchant_name | string or null | Store or merchant name |
merchant_email | string or null | Public business email |
merchant_phone | string or null | Public business phone number |
merchant_address | string or null | Public business address |
store_language | string or null | Store language code |
store_currency | string or null | Store currency code |
contact_page_url | string or null | Contact page URL |
social_instagram | string or null | Instagram profile URL |
social_facebook | string or null | Facebook page URL |
social_twitter | string or null | Twitter or X profile URL |
social_tiktok | string or null | TikTok profile URL |
social_youtube | string or null | YouTube channel URL |
Illustrative output record
{"record_type": "product","store_url": "https://www.allbirds.com","store_domain": "www.allbirds.com","scraped_at": "2026-04-03T10:30:00.000Z","source_url": "https://www.allbirds.com/products.json?limit=250&page=1","product_id": "7234567890123","product_handle": "mens-wool-runners","product_url": "https://www.allbirds.com/products/mens-wool-runners","title": "Men's Wool Runners","vendor": "Allbirds","product_type": "Shoes","tags": ["mens","running","wool"],"description": "Lightweight everyday shoes made with merino wool.","price": 120,"compare_at_price": null,"discount_percentage": null,"currency": "USD","available": true,"variants_count": 4,"variants": [{"variant_id": "41234567890","title": "8 / Medium Grey","sku": "M-WR-8-MGR","price": 120,"available": true,"option1": "8","option2": "Medium Grey"}],"images": ["https://cdn.shopify.com/s/files/1/0001/product-main.jpg"],"image_url": "https://cdn.shopify.com/s/files/1/0001/product-main.jpg","sku": "M-WR-8-MGR","barcode": "0123456789012","review_platform": "yotpo","review_rating": 4.8,"review_count": 2341,"created_at": "2023-06-01T00:00:00Z","updated_at": "2026-03-20T14:30:00Z","published_at": "2023-06-01T00:00:00Z"}
How it works
The actor works from Shopify's public surfaces and store pages, using the implementation facts provided in the contract:
- product data from
/products.json - collection data from
/collections.json - store metadata from public store pages and metadata surfaces
- contact details from public contact and footer pages
- social links from the homepage footer
- review data from detected review platforms such as Judge.me and Yotpo
The output uses a single dataset schema with a record_type field so you can separate products, collections, reviews, and contact records in downstream processing.
Pricing
Startup billing and empty runs
The apify-actor-start event costs $0.00005 per startup unit. Apify charges one startup unit per GB of allocated memory, with a minimum of one unit, so a 2 GB run incurs two units. This startup charge still applies when input is invalid, no results are found, or an upstream request fails. Statements about free, unbilled, or skipped results refer only to the corresponding result event; they do not waive the startup charge. Apify platform usage is included in the event prices and is not passed through as an additional customer charge. Check the live Pricing tab for current events, tiers, and rates. Result limits cap result events, not the entire run cost.
This actor uses Pay per event pricing on Apify. Each extracted record type maps to an event, and Apify platform usage is included in the event price. For the current breakdown and total run cost, open the actor's Pricing tab in Apify Console.
A simple example in words: if you scrape one hundred products, the product event is charged one hundred times; if you also scrape one contact record for that store, the contact event is charged once; if you add twenty reviews, the review event is charged twenty times.
Use with AI agents (MCP)
This Actor is usable through Apify MCP, so an AI agent can call it as a tool to gather Shopify store data before reasoning, enrichment, routing, or follow-up actions.
Tool description: extract Shopify product, collection, review, and merchant contact records from a known store domain or URL, then return structured dataset items for filtering by record_type.
Exact Actor identity: khadinakbar/shopify-all-in-one-scraper
Scrape the Shopify store
www.allbirds.comfor products and merchant contact info. Return the dataset items, then separate product records from contact records byrecord_type. Keep the result in structured JSON and include the source URLs for traceability.
Output interpretation: use record_type first, then read the fields that match that record family. For example, product records center on title, price, currency, available, and variants, while contact records center on merchant_email, merchant_phone, merchant_address, and social links.
Provenance: each item includes source_url and scraped_at, which makes it easier to trace where the record came from and when it was extracted.
Scope: use storeUrls for stores you already know. This actor is designed for direct store targets rather than keyword discovery.
Pagination and cost guidance: product and collection extraction is governed by the per-store caps in the input, while review volume is governed by maxReviewsPerProduct. Because pricing is event-based, raising the cap increases the number of billable records.
Apify API example
import { ApifyClient } from 'apify-client';const client = new ApifyClient({token: process.env.APIFY_TOKEN || 'YOUR_APIFY_TOKEN',});const run = await client.actor('khadinakbar/shopify-all-in-one-scraper').call({storeUrls: ['https://www.allbirds.com'],scrapeProducts: true,scrapeCollections: true,scrapeReviews: false,scrapeContactInfo: true,maxProductsPerStore: 10,maxCollectionsPerStore: 10,});const { items } = await client.dataset(run.defaultDatasetId).listItems();const products = items.filter((item) => item.record_type === 'product');const contacts = items.filter((item) => item.record_type === 'contact');console.log(`Products: ${products.length}`);console.log(`Contacts: ${contacts.length}`);console.log(items);
Best results and outcome guidance
Start with a known Shopify domain or full store URL, then enable only the record types you need for the current task. Use smaller caps for sampling and larger caps when you want fuller catalog coverage. For lead generation, pair scrapeContactInfo with a small product sample so you have both outreach data and store context. For analysis workflows, filter the dataset by record_type before transforming or exporting the records.
Continue the workflow
- Then use Shopify Products Scraper to extend 🛍️ Shopify Scraper — Products, Collections, Reviews & Emails research with a complementary content contract.
- Then use Target Product Reviews Scraper & Ratings to extend 🛍️ Shopify Scraper — Products, Collections, Reviews & Emails with a neighboring commerce research source when the brief calls for Target data.
Design note
I found that the dataset contract uses a single shared schema with record_type as the discriminator, which makes it practical to mix products, collections, reviews, and contact records in one run and still separate them cleanly downstream.
FAQ
Can I send multiple Shopify stores in one run?
Yes. Add multiple URLs or domains to storeUrls and process them together.
Which input field is the suitable fit for a known store domain?
Use storeUrls for a specific Shopify store you already identified.
How do I get only product rows from the dataset?
Filter results where record_type equals product.
How do I get merchant contact records for outreach?
Enable scrapeContactInfo and filter dataset items where record_type equals contact.
How do I connect this with a product-only Shopify step?
Use Shopify Products Scraper when a later workflow needs a narrower product export.
How do I connect this with Shopify app research?
Use Shopify App Store Scraper when the next step is app discovery or app-store analysis.
Responsible use
Use this actor on stores you are authorized to review and on public pages that are available for access. Review the live Pricing tab before running larger jobs so you can match the input caps to your intended budget and data volume. When exporting contact information, keep outreach aligned with your internal policies and applicable laws.