Shopify Store Leads Scraper: Emails, Apps, Products — No Login
Pricing
from $1.86 / 1,000 results
Shopify Store Leads Scraper: Emails, Apps, Products — No Login
Shopify store leads from domains, a CSV/Google Sheet or keyword discovery: emails, phones, socials, theme, apps and pixels, payment methods, product count, price range, store age and status. Products mode returns the full catalog of any store. No login or cookies. MCP-ready for AI agents.
Pricing
from $1.86 / 1,000 results
Rating
0.0
(0)
Developer
Fortuitous Pirate
Maintained by CommunityActor stats
0
Bookmarked
9
Total users
1
Monthly active users
15 days ago
Last modified
Categories
Share
Shopify Store Leads Scraper — emails, apps, theme, payments, products
Turn any list of Shopify stores into a lead sheet, or find stores by keyword and enrich them in the same run. One row per store with the published email and phone, social profiles, theme, installed apps and tracking pixels, payment methods, product count, price range, catalog age and store status. Switch to products mode and the same actor returns the full public catalog of any store (products, variants, prices, stock).
No API key, no login, no cookies. Everything comes from public storefront endpoints (/meta.json, /products.json, the home and contact pages) and from Shopify's public Shop search.
What you get per store (leads mode)
| Field | Example | Source |
|---|---|---|
domain, url, storeStatus | deathwishcoffee.com, live / password / closed / not_shopify | home page |
storeName, myshopifyDomain, shopifyStoreId | Death Wish Coffee, deathwishcoffee.myshopify.com, 2717209 | /meta.json |
description | "Bold, Smooth and Delicious since 2012…" | /meta.json |
city, province, country, currency, moneyFormat | Round Lake, New York, US, USD | /meta.json (the store's Shopify business address) |
shipsToCountries, locales | ["AD","AE",…], ["en","fr-ca"] | /meta.json, hreflang tags |
email, emails[], emailSources{} | hey@deathwishcoffee.com → found on /pages/contact | mailto links and text of home, /policies/contact-information, contact page |
phone, phones[] | (518) 400 1050 | tel: links first, then numbers next to a "Phone:" label |
contactPageUrl, contactInfoText | the store's contact page, the text of its Shopify contact-information policy (address block) | |
instagram, facebook, tiktok, twitter, youtube, linkedin, pinterest | profile URLs | home + contact pages |
themeName, themeSchema, themeVersion, themeStoreId | Dawn 10.0.0, themeStoreId: null (custom build) | Shopify.theme object |
apps[], appCount | Klaviyo, Gorgias, Ordergroove, Rebuy, Smile.io | ~100 script/asset signatures (reviews, subscriptions, helpdesk, loyalty, search, SMS, BNPL, analytics, page builders…) |
pixels[] | Meta Pixel, Google Tag Manager, TikTok Pixel, Pinterest Tag | tracking snippets |
payments[], shopPayCardBrands[], shopPayInstallments | Shop Pay, PayPal, Apple Pay, Afterpay, Venmo; visa, master, amex…; true | home page markers + /meta.json |
shopifyPlusHint | true only when the storefront mentions Shopify Plus explicitly | |
productCount, collectionCount | 152, 126 | /meta.json published counts |
priceMin, priceMax, priceMedian, currency | 5, 149.95, 35 | up to 500 products sampled from /products.json |
topVendors[], topProductTypes[] | Death Wish Coffee, Sportiqe…; Coffee, Apparel, Mugs | catalog sample |
oldestProductAt, newestProductAt, lastProductUpdateAt | 2013-11-04, 2026-10-16, 2026-10-21 | first and last catalog page — the oldest product is a store-age hint |
sampleProducts[] | 3 products with title, price, URL, image | catalog or Shop search |
discoveredBy, shopAppStoreId, shopAppUrl, shopAppRating | keyword that found the store, https://shop.app/m/pawstruck, 4.8 | only for stores found by keyword |
scrapedAt | ISO timestamp |
Fields that could not be found are null (or an empty list). Nothing is estimated: there are no traffic or revenue guesses in this dataset.
Use cases
- Shopify app and agency sales: list the stores in a niche that run a competitor's app (
requiredApps: ["Yotpo"]) or that do not yet run yours (excludeApps: ["Klaviyo"]), with the published email in the same row. - Enrich a domain list: paste the domains from your CRM, a CSV or a Google Sheet and get back which ones are Shopify, whether they are still live, and their contacts, stack and catalog size.
- Niche prospecting:
discover: ["organic dog treats"]finds stores selling that product through Shopify's own Shop search, then enriches each one. Filter tocountries: ["US","CA"]andonlyWithEmail: true. - Market mapping: price range, product count, theme and payment methods across every store in a segment, exported to CSV or Excel.
- Wholesale / stockist research:
topVendorsshows the brands a store carries;topProductTypesshows what it sells. - Weekly new-lead feed: schedule a keyword run with
onlyNewLeads: true; the actor remembers delivered stores underleadListNameand only returns stores you have not paid for yet. - Catalog and price monitoring: products mode returns every product and variant of a store; run it daily and diff by
productId.
Input
Leads from your own domains
{"mode": "leads","domains": ["allbirds.com", "https://www.gymshark.com/collections/sale", "deathwishcoffee.com"]}
Any page of the store works. Non-Shopify sites come back as storeStatus: "not_shopify" in the run's OUTPUT summary and are not returned or charged.
Leads from a CSV or Google Sheet
{"mode": "leads","listUrl": "https://docs.google.com/spreadsheets/d/1AbC.../edit#gid=0","maxItems": 500,"onlyWithEmail": true}
The first column of each row is read; a header row such as domain or website is skipped. The sheet must be shared as "anyone with the link".
Find stores by keyword
{"discover": ["yoga mats", "scented candles"],"maxItems": 50,"countries": ["US", "GB", "CA"],"requiredApps": ["Klaviyo"],"onlyNewLeads": true,"leadListName": "fitness-q4"}
Discovery uses Shopify's public Shop search (the same index behind shop.app). It returns 30 products per query, so each keyword yields roughly 10–50 distinct stores after the actor expands it with modifiers ("best …", "… uk", "handmade …"). It is a sample of merchants selling that product, not a complete directory. Supplied domains and discovered stores can be combined in one run.
Products (full catalog)
{"mode": "products","domains": ["deathwishcoffee.com"],"collection": "coffee","maxItems": 1000,"oneRowPerVariant": true,"onlyAvailable": true}
One row per product with nested variants, or one row per variant with the product fields repeated (oneRowPerVariant). Fields: storeUrl, storeDomain, productId, title, handle, productUrl, vendor, productType, tags, price, compareAtPrice, priceMin, priceMax, compareAtPriceMax, available, totalVariants, options, imageUrl, images, imageCount, description, createdAt, updatedAt, publishedAt, variants[] (variantId, title, sku, price, compareAtPrice, available, option1-3, grams).
All inputs
| Input | Type | Default | Notes |
|---|---|---|---|
mode | leads / products | auto | Leads when keywords are given or nothing is given; products when only store URLs are given (legacy behaviour) |
domains | array | – | Store domains or URLs. storeUrls is accepted as an alias |
listUrl | string | – | CSV, TXT or Google Sheet link |
discover | array | – | Keywords or niches. searchQuery (single string) is accepted as an alias |
maxItems | integer | 10 | Leads: total lead rows. Products: products per store |
maxStores | integer | 20 | Cap on keyword discovery |
countries | array | – | ISO-2 codes checked against the store's Shopify business address |
onlyWithEmail | boolean | false | Skip stores with no published email |
requiredApps / excludeApps | array | – | Substring match on detected apps and pixels |
minProducts / maxProducts | integer | 0 | By published product count |
onlyNewLeads / leadListName | boolean / string | false / default | Named delivery history, skips stores already returned |
collection | string | – | Products mode: one collection handle |
includeVariants | boolean | true | Products mode |
oneRowPerVariant | boolean | false | Products mode |
onlyAvailable | boolean | false | Products mode |
concurrency | integer | 5 | Stores processed in parallel (1–10) |
proxyConfiguration | object | none | Stores and Shop search answer without a proxy; residential only for stores that return 403 |
Filtered stores (country, email, apps, product count, not Shopify) are listed in the run's OUTPUT record with the reason and are not charged.
Output example (real row from a run on 2026-10-21)
{"domain": "deathwishcoffee.com","url": "https://www.deathwishcoffee.com","storeStatus": "live","isShopify": true,"storeName": "Death Wish Coffee","myshopifyDomain": "deathwishcoffee.myshopify.com","shopifyStoreId": 2717209,"description": "Bold, Smooth and Delicious since 2012. We source USDA Organic and Fair Trade Certified™ arabica and robusta coffee beans…","city": "Round Lake","province": "New York","country": "US","currency": "USD","moneyFormat": "${{amount}}","shipsToCountries": ["AD", "AE", "AF", "AG", "AI", "AL", "…"],"locales": null,"email": "hey@deathwishcoffee.com","emails": ["hey@deathwishcoffee.com"],"emailSources": { "hey@deathwishcoffee.com": "https://www.deathwishcoffee.com/pages/contact" },"phone": "(518) 400 1050","phones": ["(518) 400 1050"],"contactPageUrl": "https://www.deathwishcoffee.com/pages/contact","contactInfoText": null,"instagram": "https://www.instagram.com/deathwishcoffee","facebook": "https://www.facebook.com/deathwishcoffee","tiktok": null,"twitter": "https://twitter.com/deathwishcoffee","youtube": "https://www.youtube.com/channel/UC1uurJMded2rRJioe8yka7g","linkedin": null,"pinterest": null,"themeName": "deathwish-shopify-20/production","themeSchema": "Dawn","themeVersion": "10.0.0","themeStoreId": null,"apps": ["Klaviyo", "Gorgias", "Ordergroove", "Rebuy", "Smile.io", "Minmaxify"],"appCount": 6,"pixels": ["Google Tag Manager", "Google Ads"],"payments": ["Shop Pay", "PayPal", "Apple Pay", "Afterpay", "Venmo"],"shopPayCardBrands": ["visa", "master", "american_express", "discover", "diners_club"],"shopPayInstallments": true,"shopifyPlusHint": false,"productCount": 152,"collectionCount": 126,"catalogSampled": 152,"priceMin": 5,"priceMax": 149.95,"priceMedian": 35,"topVendors": ["Death Wish Coffee Company", "Death Wish Coffee", "Sportiqe", "Planet Apparel", "Deneen Pottery"],"topProductTypes": ["Coffee", "Apparel", "Coffee Bundle", "Accessories", "Mugs"],"oldestProductAt": "2013-11-04T13:44:10-05:00","newestProductAt": "2026-10-16T13:05:20-04:00","lastProductUpdateAt": "2026-10-21T12:17:23-04:00","sampleProducts": [{ "title": "Dark Spirits Chocolate Rum Ball Coffee", "price": 29.99, "url": "https://www.deathwishcoffee.com/products/dark-spirits-chocolate-rumball", "imageUrl": "https://cdn.shopify.com/s/files/1/0271/7209/files/Dark_Spirits_Chocolate_Rum_Ball_A1_SA.jpg?v=1792518012" }],"discoveredBy": null,"shopAppStoreId": null,"shopAppUrl": null,"shopAppRating": null,"scrapedAt": "2026-10-21T16:17:21.451Z"}
A keyword-discovered store additionally carries discoveredBy: "dog treats", shopAppStoreId: "813855", shopAppUrl: "https://shop.app/m/h9wxtkavmy", shopAppRating: 4.9 and sampleProducts with rating and reviewCount from Shop.
Pricing
Pay per event, no subscription:
- Actor start — a few tenths of a cent per run (one event per GB of memory; the actor runs at 1 GB).
- Record — every row saved to the dataset (product rows in products mode, every row in leads mode).
- Store lead — one extra event per live store lead row (status
live). Closed, password-protected and non-Shopify stores are never charged this event. This event starts being charged from the date shown on the Pricing tab; until then lead rows cost only the record price.
Prices in force are always on the actor's Pricing tab. At the listed record price plus $0.01 per lead, 1,000 live store leads cost about $15; 1,000 product rows cost the record price only (about $5 or less depending on your plan). Stores filtered out by countries, onlyWithEmail, requiredApps, excludeApps, minProducts/maxProducts, and sites that are not Shopify, are not charged at all. Set Max total charge on the run to cap spend.
Limits and FAQ
Which stores can it read? Any Shopify store whose public catalog is enabled (the default). A store with a password page is reported as storeStatus: "password" with the name, country and currency from /meta.json but no products or contacts. Stores that closed are closed. A few large brands run a custom (Hydrogen/headless) front end; the actor still reads their Shopify storefront data when it answers on the apex or www domain.
Does it verify emails? No. It returns the addresses the store publishes (mailto links, contact pages, the contact-information policy) and tells you on which page each one was found (emailSources). It does not guess addresses or check mailboxes.
How accurate is country? It is the country of the store's Shopify business address as published in /meta.json, not a market or shipping filter. shipsToCountries is separate.
How are apps detected? From script and asset hosts loaded by the home page (for example static.klaviyo.com → Klaviyo). Apps that only load on product or checkout pages, or that are server-side only, are not visible. Treat apps as "detected on the storefront", not as an installed-app inventory.
What is shopifyPlusHint? true only when the storefront explicitly mentions Shopify Plus. Most Plus stores do not, so false means "no evidence", not "not Plus".
How many stores does a keyword find? Shop search returns 30 products per query and has no pagination. The actor expands each keyword with up to 20 modifiers, so expect 10–50 distinct stores per keyword. For larger lists, give several keywords or import a domain list.
Can I filter by category, price, on-sale or ships-from in discovery? Not in the search itself. Use descriptive keywords instead; priceMin/priceMax, shipsToCountries and country are reported per store so you can filter the dataset.
Rate limits? Stores are read with 5 parallel workers and 4–6 requests each. Shop search calls are spaced 300 ms apart. No proxy is needed for either; if a store returns 403 to datacenter IPs, enable Apify residential proxy in proxyConfiguration.
Partial runs: if a store fails, the rest of the run continues; the OUTPUT record in the key-value store lists every store with its status, email, app count and skip reason.
Integrations
- API:
POST https://api.apify.com/v2/acts/fortuitous_pirate~shopify-store-scraper/runs?token=YOUR_TOKENwith the JSON input above; fetch results from the run's dataset (?format=csvorxlsxfor spreadsheets). - Python:
from apify_client import ApifyClient; run = ApifyClient(TOKEN).actor("fortuitous_pirate/shopify-store-scraper").call(run_input={"discover": ["yoga mats"], "maxItems": 50})then.dataset(run["defaultDatasetId"]).list_items().items. - JavaScript:
const run = await new ApifyClient({ token }).actor('fortuitous_pirate/shopify-store-scraper').call({ domains: ['allbirds.com'] }); - Schedules + Only new leads: run weekly with
onlyNewLeads: trueand aleadListNameper campaign; each run returns only stores not delivered before. - Webhooks, Make, Zapier, n8n: add a run-succeeded webhook on the actor or use the Apify app in each platform to push new rows to Google Sheets, HubSpot, Clay or your CRM.
- AI agents / MCP: the actor works with the Apify MCP server; the input is plain JSON and every field is documented above.
Changelog
- 2.0 (2026-10-21) — leads mode (contacts, socials, theme, apps, pixels, payments, catalog stats, status), keyword discovery through Shop search, CSV/Google Sheet import, lead filters, new-leads history, products mode gains
collection,oneRowPerVariant,onlyAvailable, price range and description fields. All 1.x inputs and output fields keep working. - 1.0 — products from
/products.json.