๐๏ธ Shopify Store Leads Scraper - Emails, Phones & Ratings
Pricing
from $4.99 / 1,000 results
๐๏ธ Shopify Store Leads Scraper - Emails, Phones & Ratings
Spotify Play Count Scraper extracts public track data including play counts, song titles, artists, albums, release dates, durations, and Spotify URLs. Monitor streaming performance, compare tracks, analyze music trends, and build structured datasets for research.
Pricing
from $4.99 / 1,000 results
Rating
0.0
(0)
Developer
Scraper Engine
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
5 days ago
Last modified
Categories
Share
Shopify Store Leads Scraper - Emails, Phones & Ratings
Shopify Store Leads Scraper - Emails, Phones & Ratings finds real, currently-operating Shopify stores by product keyword or category and returns structured lead data โ emails, phone numbers, business addresses, review ratings, and sample products โ as clean JSON, no HTML parsing needed. Every store streams into the dataset the moment it's enriched, split into ready-to-browse views for contacts, ratings, and products. Add a keyword below and start a run to see leads arrive in real time.
๐ What is Shopify Store Leads Scraper - Emails, Phones & Ratings?
Shopify Store Leads Scraper - Emails, Phones & Ratings is an Apify Actor that queries shop.app โ Shopify's own consumer shopping app โ to discover real Shopify-powered stores by product keyword and/or category, then enriches each unique store with its published contact channels, business address, review analytics, and sample products. It returns structured JSON with no Shopify account, shop.app login, or API key required โ the Actor mints its own guest session internally. It's built for growth/sales teams doing Shopify lead generation, dropship and wholesale sourcing, and market-research or AI/RAG pipelines that need a verified list of real Shopify merchants.
๐ What Shopify store data is publicly available to scrape?
Every field this Actor returns is data a merchant chose to publish on shop.app โ the same public storefront data any shopper sees while browsing or searching the app, no login required.
| Data Category | Published by the merchant on Shop.app | Not exposed by Shop.app |
|---|---|---|
| Store name, website & myshopify.com domain | Always public | โ |
| Business address (street, city, region, postal code, country) | Public only if the merchant added one | Blank when not published |
| Contact channels (email, phone, web, social links) | Public only if the merchant listed them | Blank when not published |
| Product review analytics (average rating, ratings count, reviews count) | Public | โ |
| Sample product listings (title, price, currency, image) | Public โ up to 3 per store | Full catalog, exact stock levels |
| Order history, customer records, sales/financial data | Never published on shop.app | Shopify admin login (store owner only) |
Shopify Store Leads Scraper - Emails, Phones & Ratings only returns publicly visible data โ what any visitor to shop.app sees. Nothing behind a login wall.
๐ What data can I extract with Shopify Store Leads Scraper - Emails, Phones & Ratings?
The Actor returns one record per discovered Shopify store, covering its identity, published contacts and address, review analytics, and up to three sample products.
| Field Name | Description |
|---|---|
id | Shop.app's internal store identifier (opaque numeric string). |
name | The store's display name. |
websiteUrl | The store's live storefront URL (utm_source=shop_app kept; per-run session-tracking parameters stripped). |
myshopifyDomain | The store's underlying *.myshopify.com domain. |
shareUrl | The store's public shop.app share link. |
address | Business address object โ null when the merchant hasn't published one (see breakdown below). |
contacts | Array of every public contact channel the store lists โ { method, target } pairs. |
rating | Average product rating across the store's catalog. |
totalProductRatings | Total number of product ratings behind that average. |
totalProductReviews | Total number of written product reviews. |
sampleProducts | Up to 3 real products sold by the store (see breakdown below). |
scrapedAt | ISO-8601 UTC timestamp of when this store record was collected. |
searchQuery | Which input search query surfaced this store โ null when discovered by category alone. |
๐ฌ Store identity fields
id, name, websiteUrl, myshopifyDomain, shareUrl, searchQuery, scrapedAt โ what the store is called, where it lives online, and which input run found it.
๐ Contact & address fields
contacts[]โmethod(e.g.email,phone,web,facebook,instagramโ whatever channels the store itself publishes) andtarget(the email address, phone number, or URL).addressโaddress1,address2,city,zone,zoneCode,country,postalCode,company,phone, andformatted(an array of pre-formatted display lines).
โญ Ratings & sample products
rating,totalProductRatings,totalProductReviewsโ review analytics for the store as a whole.sampleProducts[]โtitle,price,currency,url,imageUrlfor up to 3 real products.
๐ค Why not build this yourself?
Shop.app has no public developer API, and Shopify's own Admin and Storefront APIs are scoped to a single authenticated store โ neither one lets you search across the platform's stores by keyword or category. Building this yourself means reverse-engineering shop.app's internal GraphQL schema, keeping pace with its Remix-based asset bundling (endpoint paths have to be resolved live from hashed JS chunk names, since they're never literal strings in the bundle), and clearing its guest-session gate, which rejects plain HTTP clients and headless browsers alike โ only a real, visible Chrome session passes it. On top of that, you'd own proxy rotation and cost yourself. This Actor already handles all of it: live endpoint discovery every run, a real (Xvfb-backed) Chrome session for the one-time guest sign-in, and an automatic Direct โ Datacenter โ Residential proxy ladder that only spends a proxy tier when shop.app actually blocks a request.
๐ How to use Shopify Store Leads Scraper - Emails, Phones & Ratings
This Actor runs on the Apify platform โ there's no separate signup or API key to obtain beyond an Apify account.
- Open the Actor's page in the Apify Store and click Try for free (or Start, if you already have it).
- Add at least one keyword to ๐ Search Queries (bulk), or pick a ๐ Category โ the Actor needs one of the two to run; leaving both empty stops the run with a clear error.
- Optionally narrow results with ๐ Store Location, the ๐๏ธ Product Filters (price, on-sale, in-stock, ships-from/to), and โญ๏ธ Skip Stores From Previous Runs.
- Click โถ๏ธ Start.
- Open the Output tab โ while the run is still going or after it finishes โ and export the results as JSON or CSV, or switch between the Overview, Contacts & Address, Ratings & Reviews, and Sample Products views.
๐ฆ How to scale to bulk store-lead extraction
searchQueries is a bulk field (stringList editor) โ add as many keywords as you like and each is scraped as its own independent search, with every store streaming into the same dataset as it's found. ๐ฆ Max Stores (per query) (maxItems) applies per keyword, so the run's ceiling is roughly maxItems ร number of queries. There's no need to start separate runs for each keyword โ one run with a long searchQueries list covers all of them.
๐ฏ What can you do with Shopify store data?
- ๐ A growth marketer building a cold-outreach list uses
contacts(theemail/phoneentries) andnameto compile a verified list of Shopify merchants in one niche, without hand-collecting them from shop.app. - ๐ค A wholesale/dropship sourcing manager combines
categorywithsampleProducts[].priceto shortlist Shopify stores selling in a niche at a target price point before reaching out. - ๐ A regional sales rep uses
address.countryand theshipsTofilter to narrow leads down to stores based in, or shipping to, a specific target market. - ๐งช A market researcher compares
rating,totalProductRatings, andtotalProductReviewsacross competing stores in the samecategoryto gauge review strength before entering a niche. - ๐ค An AI agent or RAG pipeline ingests the JSON output directly โ
name,address.formatted, andcontactsfeed a lead-enrichment agent that drafts a personalized outreach message per store, with no HTML parsing or selectors involved.
Because the output is typed, normalized JSON, any of these records can be handed straight to an agent framework or MCP client as tool output โ see Integrations below.
๐ก๏ธ How does Shopify Store Leads Scraper - Emails, Phones & Ratings handle rate limits and blocking?
By default every request goes straight to shop.app with no proxy, which is enough for most runs. If shop.app starts rejecting requests, the Actor escalates itself automatically: Direct โ ๐ฅ๏ธ Datacenter proxy โ ๐ Residential proxy, retrying the residential tier up to 3 times on a fresh IP before giving up on that one request; once residential is reached, the run stays on it for every remaining request (including the one-time Chrome session mint), and every switch is logged. Independently, ๐ Max Retries Per Request (maxRetries, default 3) controls how many times one request is retried on its current proxy tier, with a growing delay, before the Actor escalates to the next tier. The one-time guest session is minted with a real, visible Chrome session running under a virtual display, since shop.app's guest sign-in endpoint rejects both plain HTTP clients and headless browsers. If a single store's contacts/rating/sample-products fetch fails outright, that one store is skipped with a warning and the run continues; if shop.app becomes completely unreachable for 12 requests in a row, the Actor logs the failure clearly and stops instead of looping forever. The Actor does not solve CAPTCHAs.
โ ๏ธ No proxy ladder can guarantee shop.app won't block a request โ the Direct โ Datacenter โ Residential escalation maximizes the chance of success but isn't a 100% guarantee. If a run keeps coming back with 0 stores, configure a Residential proxy explicitly in proxyConfiguration rather than relying on the automatic fallback alone.
โฌ๏ธ Input
| Parameter | Required | Type | Description | Example Value |
|---|---|---|---|---|
searchQueries | No | array | One or more product keywords to search for โ each is scraped as its own independent search and results stream into the same dataset. Leave empty to discover stores by Category alone. | ["wireless headphones", "organic coffee"] |
category | No | string | Filter to stores selling in this product category; works alone or combined with a search query. Default "" (no filter) โ one of 15 values (blank, or a gid://shopify/ProductCategory/โฆ value), see below. | "gid://shopify/ProductCategory/7" |
storeLocation | No | string | Find stores based in a specific country or region. Stores with no published business address are still included as likely matches. Default "" (any location) โ see the full list of regions/countries below. | "US" |
maxItems | No | integer | Maximum number of unique stores to return per search query. Default 10, minimum 1, maximum 100000. | 50 |
skipPreviouslyScraped | No | boolean | Skip stores already returned in a previous run of the same search (query + category + store location + ships-to combination). Default false. | true |
priceMin | No | integer | Only discover stores selling products above this price (USD). Minimum 0. | 20 |
priceMax | No | integer | Only discover stores selling products below this price (USD). Minimum 0. | 100 |
onSale | No | boolean | Only discover stores with products currently on sale. Default false. | true |
inStock | No | boolean | Only discover stores with products currently in stock (matches shop.app's own default search behaviour). Default true. | true |
shipsFrom | No | boolean | Only discover stores that ship FROM the selected Store Location. Has no effect if Store Location is left as "Any location". Default false. | true |
shipsTo | No | string | Only discover stores that ship TO a specific destination country. Default "" (any country) โ see the full list of country codes below. | "GB" |
proxyConfiguration | No | object | Default = no proxy (direct connection). Auto-escalates Direct โ Datacenter โ Residential if shop.app blocks requests; override to force a specific proxy from the start. Prefill: {"useApifyProxy": false}. | {"useApifyProxy": false} |
maxRetries | No | integer | How many times to retry one blocked/failed request on the same proxy tier before escalating to the next tier. Default 3, minimum 1, maximum 10. | 3 |
maxScanned | No | integer | Safety cap on how many raw search result rows a single query may scan before giving up, even if maxItems hasn't been reached. Default 20000, minimum 100, maximum 200000. | 20000 |
โ ๏ธ maxItems defaults to 10 in the Apify Console UI, but the Actor's own code falls back to 50 if the field is omitted entirely (e.g. an API call that doesn't send it at all) rather than left at its schema default โ worth knowing if you call the Actor directly through the API without the Console form.
Example input
{"searchQueries": ["wireless headphones", "organic coffee"],"category": "","storeLocation": "US","maxItems": 50,"skipPreviouslyScraped": true,"priceMin": 20,"priceMax": 100,"onSale": false,"inStock": true,"shipsFrom": false,"shipsTo": "","proxyConfiguration": { "useApifyProxy": false },"maxRetries": 3,"maxScanned": 20000}
โฌ๏ธ Output
Every store is pushed to the dataset as typed, normalized JSON the moment it's enriched โ the field names stay the same across every run. Results are available as full JSON, through the per-section dataset views (Overview, Contacts & Address, Ratings & Reviews, Sample Products), or as a CSV export.
Example output
{"id": "1235","name": "JLab","websiteUrl": "https://www.jlab.com?utm_source=shop_app","myshopifyDomain": "jlabgrabbag.myshopify.com","shareUrl": "https://shop.app/m/jlab?utm_source=shop_app","address": {"address1": "5927 Landau Court","address2": "","city": "Carlsbad","zone": "California","zoneCode": "CA","country": "US","postalCode": "92008","company": null,"phone": null,"formatted": ["5927 Landau Court", "Carlsbad, California 92008", "United States"]},"contacts": [{ "method": "web", "target": "https://www.jlab.com?utm_source=shop_app" },{ "method": "facebook", "target": "https://www.facebook.com/JLabTech/" },{ "method": "instagram", "target": "https://www.instagram.com/jlabaudio" },{ "method": "email", "target": "support@jlab.com" },{ "method": "phone", "target": "405-445-7219" }],"rating": 4.6127,"totalProductRatings": 7820,"totalProductReviews": 3932,"sampleProducts": [{"title": "GO POP+ True Wireless Earbuds Black","price": 24.99,"currency": "USD","url": "https://www.jlab.com/products/go-pop-true-wireless-earbuds-black?utm_source=shop_app","imageUrl": "https://cdn.shopify.com/s/files/1/0240/9337/files/GOPop_Black3.jpg?v=1762446393"}],"scrapedAt": "2026-09-01T07:37:40.114187+00:00","searchQuery": "wireless headphones"}
โ๏ธ How does it work?
Every run starts by fetching shop.app's live category taxonomy and endpoint paths from its own web bundle, rather than hardcoded values, so the Actor keeps working if shop.app renames a route. A one-time guest session is then minted using a real, visible Chrome browser under a virtual display โ shop.app's guest sign-in endpoint rejects both plain HTTP clients and headless browsers, so a genuinely non-headless session is required. Those cookies are handed to a fast, browser-impersonating HTTP client for every search and enrichment call, each carrying the same headers shop.app's own web client sends. If shop.app blocks a request, the Actor escalates through Datacenter and then Residential proxies automatically. Only data shop.app already serves publicly is returned, and output field names stay stable run over run, even if shop.app changes its layout.
๐ Integrations
Shopify Store Leads Scraper - Emails, Phones & Ratings runs on the Apify platform, so it works with anything that can call the Apify API โ your own scripts, no-code automation tools, and AI agent frameworks.
Calling Shopify Store Leads Scraper - Emails, Phones & Ratings programmatically
from apify_client import ApifyClientclient = ApifyClient("<APIFY_TOKEN>")run = client.actor("testt0/shopify-store-leads-scraper-emails-phones-ratings").call(run_input={"searchQueries": ["wireless headphones"], "maxItems": 20})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item)
Works in Go, Ruby, Node.js, cURL โ any language that can make an HTTP request to the Apify API.
MCP integration for AI agents
This Actor is reachable through Apify's own hosted MCP server โ no extra deployment needed. Point an MCP-compatible client at https://mcp.apify.com?tools=testt0/shopify-store-leads-scraper-emails-phones-ratings, or run it locally with npx @apify/actors-mcp-server --tools actors,docs,testt0/shopify-store-leads-scraper-emails-phones-ratings and an APIFY_TOKEN environment variable. Compatible clients include Claude Desktop, Claude Code, Cursor, and VS Code (GitHub Copilot).
No-code tools (n8n, Make, LangChain)
- n8n โ install
@apify/n8n-nodes-apifyand use its Run Actor action (with this Actor's ID) followed by Get dataset items, or a plain HTTP Request node against the run-sync-get-dataset-items endpoint. - Make โ use an HTTP module to call the Actor's
run-sync-get-dataset-itemsendpoint with your Apify API token, the same way any REST integration is wired into a Make scenario. - LangChain โ use
ApifyWrapper().call_actor(actor_id="testt0/shopify-store-leads-scraper-emails-phones-ratings", run_input={...}, dataset_mapping_function=...)to run the Actor and load its dataset straight into a LangChain document loader for RAG.
โ๏ธ Is it legal to scrape Shopify store leads?
Scraping publicly available business information is generally legal in most jurisdictions, and Shopify Store Leads Scraper - Emails, Phones & Ratings returns only data merchants themselves chose to publish on shop.app โ nothing behind a login. The contacts and address fields this Actor collects are store-level business records (a support inbox, a company phone line, a registered business address) rather than data about a named individual, so this falls under standard terms-of-service and database-rights considerations rather than GDPR/CCPA's personal-data regime. That said, a sole trader whose published "business" email or phone is also their personal one could still bring that specific record within scope of GDPR/CCPA depending on your jurisdiction and use โ review your own use case accordingly. Consult legal counsel if your use case involves bulk storage of personal data.
โ Frequently asked questions
What Shopify store fields does Shopify Store Leads Scraper - Emails, Phones & Ratings return?
The top fields are contacts (email, phone, social links), address (business address), rating/totalProductRatings/totalProductReviews, sampleProducts, and websiteUrl/myshopifyDomain. See What data can I extract above for the full list.
Does Shopify Store Leads Scraper - Emails, Phones & Ratings require a Shopify account or login?
No. The Actor mints its own guest session with shop.app internally โ you don't need a Shopify account, a shop.app login, or an API key to run it.
How many Shopify stores can I extract in one run?
maxItems caps unique stores per search query at up to 100,000, and searchQueries accepts multiple keywords in one run, so the run-wide ceiling is roughly maxItems ร number of queries. A maxScanned safety cap (up to 200,000 raw result rows per query) stops a hopeless keyword from scanning forever even if maxItems isn't reached.
What happens if a search query returns zero results?
That query is logged as "0 stores found" and the run moves on to the next one โ it doesn't fail the whole run. If every query in a run returns nothing, the Actor logs a warning suggesting a broader keyword, fewer filters, or an explicit Residential proxy in case shop.app is blocking the run outright.
Can I scrape multiple Shopify stores at once?
Yes โ searchQueries is a bulk array field. Add as many keywords as you like in one run; each is searched independently and every discovered store streams into the same dataset.
Does Shopify Store Leads Scraper - Emails, Phones & Ratings work with Claude, ChatGPT, and other AI agent tools?
Yes. It's reachable through Apify's hosted MCP server (see Integrations above) for MCP-native clients like Claude Desktop and Claude Code, and callable as a plain HTTP endpoint by any other agent framework, including ChatGPT's custom-tool/Actions setups.
Does Shopify Store Leads Scraper - Emails, Phones & Ratings avoid duplicate leads across runs?
Yes, if you turn on skipPreviouslyScraped. Each unique search (keyword + category + store location + ships-to combination) keeps its own history in a named key-value store, so a later run of the same search returns only stores it hasn't returned before; price, availability, and shipping-origin filters don't start a new history.
Does Shopify Store Leads Scraper - Emails, Phones & Ratings return data in a format LLMs can use directly?
Yes. Typed, normalized JSON with consistent field names across runs โ no HTML parsing, no selectors. Pass it directly to an LLM, index it into a vector store, or feed it to an agent tool.
What happens when shop.app changes its layout or anti-bot system?
The Actor is maintained and its output field names stay stable. It also re-resolves its own endpoint paths and category taxonomy live at the start of every run rather than relying on hardcoded values, so it tolerates smaller shop.app changes (a renamed route, a new category) without needing a code update.
Can I use Shopify Store Leads Scraper - Emails, Phones & Ratings without managing proxies or browser infrastructure?
Yes. The Actor handles the one-time Chrome session mint (under a virtual display), the browser-impersonating HTTP client for search/enrichment calls, and the Direct โ Datacenter โ Residential proxy escalation itself โ you only need to touch proxyConfiguration if you want to force a specific tier from the start.
Which Shopify store fields work best for AI training data and RAG indexing?
For RAG, index the high-information text fields: name, address.formatted, contacts, and sampleProducts[].title. For training data, the most consistently structured fields are rating, totalProductRatings, totalProductReviews, and sampleProducts[].price โ all typed primitives (numbers, strings, or arrays of objects), never free-form HTML.
๐ Related scrapers
| Scraper Name | What it extracts |
|---|---|
| Linkedin Profile Scraper with Email & Company Data | LinkedIn profiles enriched with contact emails and company details |
| LinkedIn People Profile Scraper | LinkedIn people-profile data |
| Naukri Job Scraper India Gulf Emails & 41 Fields | Job listings with recruiter emails across India and the Gulf |
| Y Combinator Scraper | Y Combinator startup company records |
๐ฌ Your feedback
Found a bug or missing a field? Let us know โ reach the Scraper Engine team at dev.scraperengine@gmail.com or open an issue from the Actor's page in Apify Store. Feedback on data quality and edge cases is always welcome.