๐Ÿ›๏ธ Shopify Store Leads Scraper - Emails, Phones & Ratings avatar

๐Ÿ›๏ธ Shopify Store Leads Scraper - Emails, Phones & Ratings

Pricing

from $4.99 / 1,000 results

Go to Apify Store
๐Ÿ›๏ธ Shopify Store Leads Scraper - Emails, Phones & Ratings

๐Ÿ›๏ธ 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

Scraper Engine

Maintained by Community

Actor 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 CategoryPublished by the merchant on Shop.appNot exposed by Shop.app
Store name, website & myshopify.com domainAlways publicโ€”
Business address (street, city, region, postal code, country)Public only if the merchant added oneBlank when not published
Contact channels (email, phone, web, social links)Public only if the merchant listed themBlank 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 storeFull catalog, exact stock levels
Order history, customer records, sales/financial dataNever published on shop.appShopify 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 NameDescription
idShop.app's internal store identifier (opaque numeric string).
nameThe store's display name.
websiteUrlThe store's live storefront URL (utm_source=shop_app kept; per-run session-tracking parameters stripped).
myshopifyDomainThe store's underlying *.myshopify.com domain.
shareUrlThe store's public shop.app share link.
addressBusiness address object โ€” null when the merchant hasn't published one (see breakdown below).
contactsArray of every public contact channel the store lists โ€” { method, target } pairs.
ratingAverage product rating across the store's catalog.
totalProductRatingsTotal number of product ratings behind that average.
totalProductReviewsTotal number of written product reviews.
sampleProductsUp to 3 real products sold by the store (see breakdown below).
scrapedAtISO-8601 UTC timestamp of when this store record was collected.
searchQueryWhich 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) and target (the email address, phone number, or URL).
  • address โ€” address1, address2, city, zone, zoneCode, country, postalCode, company, phone, and formatted (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, imageUrl for 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.

  1. Open the Actor's page in the Apify Store and click Try for free (or Start, if you already have it).
  2. 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.
  3. Optionally narrow results with ๐Ÿ“ Store Location, the ๐ŸŽ›๏ธ Product Filters (price, on-sale, in-stock, ships-from/to), and โญ๏ธ Skip Stores From Previous Runs.
  4. Click โ–ถ๏ธ Start.
  5. 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 (the email/phone entries) and name to compile a verified list of Shopify merchants in one niche, without hand-collecting them from shop.app.
  • ๐Ÿค A wholesale/dropship sourcing manager combines category with sampleProducts[].price to shortlist Shopify stores selling in a niche at a target price point before reaching out.
  • ๐ŸŒ A regional sales rep uses address.country and the shipsTo filter to narrow leads down to stores based in, or shipping to, a specific target market.
  • ๐Ÿงช A market researcher compares rating, totalProductRatings, and totalProductReviews across competing stores in the same category to gauge review strength before entering a niche.
  • ๐Ÿค– An AI agent or RAG pipeline ingests the JSON output directly โ€” name, address.formatted, and contacts feed 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

ParameterRequiredTypeDescriptionExample Value
searchQueriesNoarrayOne 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"]
categoryNostringFilter 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"
storeLocationNostringFind 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"
maxItemsNointegerMaximum number of unique stores to return per search query. Default 10, minimum 1, maximum 100000.50
skipPreviouslyScrapedNobooleanSkip stores already returned in a previous run of the same search (query + category + store location + ships-to combination). Default false.true
priceMinNointegerOnly discover stores selling products above this price (USD). Minimum 0.20
priceMaxNointegerOnly discover stores selling products below this price (USD). Minimum 0.100
onSaleNobooleanOnly discover stores with products currently on sale. Default false.true
inStockNobooleanOnly discover stores with products currently in stock (matches shop.app's own default search behaviour). Default true.true
shipsFromNobooleanOnly discover stores that ship FROM the selected Store Location. Has no effect if Store Location is left as "Any location". Default false.true
shipsToNostringOnly discover stores that ship TO a specific destination country. Default "" (any country) โ€” see the full list of country codes below."GB"
proxyConfigurationNoobjectDefault = 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}
maxRetriesNointegerHow 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
maxScannedNointegerSafety 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 ApifyClient
client = 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-apify and 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-items endpoint 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.

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.

Scraper NameWhat it extracts
Linkedin Profile Scraper with Email & Company DataLinkedIn profiles enriched with contact emails and company details
LinkedIn People Profile ScraperLinkedIn people-profile data
Naukri Job Scraper India Gulf Emails & 41 FieldsJob listings with recruiter emails across India and the Gulf
Y Combinator ScraperY 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.