Shopify Store Leads Scraper: Emails, Apps, Products — No Login avatar

Shopify Store Leads Scraper: Emails, Apps, Products — No Login

Pricing

from $1.86 / 1,000 results

Go to Apify Store
Shopify Store Leads Scraper: Emails, Apps, Products — No Login

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

Fortuitous Pirate

Maintained by Community

Actor stats

0

Bookmarked

9

Total users

1

Monthly active users

15 days ago

Last modified

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)

FieldExampleSource
domain, url, storeStatusdeathwishcoffee.com, live / password / closed / not_shopifyhome page
storeName, myshopifyDomain, shopifyStoreIdDeath Wish Coffee, deathwishcoffee.myshopify.com, 2717209/meta.json
description"Bold, Smooth and Delicious since 2012…"/meta.json
city, province, country, currency, moneyFormatRound 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/contactmailto links and text of home, /policies/contact-information, contact page
phone, phones[](518) 400 1050tel: links first, then numbers next to a "Phone:" label
contactPageUrl, contactInfoTextthe store's contact page, the text of its Shopify contact-information policy (address block)
instagram, facebook, tiktok, twitter, youtube, linkedin, pinterestprofile URLshome + contact pages
themeName, themeSchema, themeVersion, themeStoreIdDawn 10.0.0, themeStoreId: null (custom build)Shopify.theme object
apps[], appCountKlaviyo, 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 Tagtracking snippets
payments[], shopPayCardBrands[], shopPayInstallmentsShop Pay, PayPal, Apple Pay, Afterpay, Venmo; visa, master, amex…; truehome page markers + /meta.json
shopifyPlusHinttrue only when the storefront mentions Shopify Plus explicitly
productCount, collectionCount152, 126/meta.json published counts
priceMin, priceMax, priceMedian, currency5, 149.95, 35up to 500 products sampled from /products.json
topVendors[], topProductTypes[]Death Wish Coffee, Sportiqe…; Coffee, Apparel, Mugscatalog sample
oldestProductAt, newestProductAt, lastProductUpdateAt2013-11-04, 2026-10-16, 2026-10-21first and last catalog page — the oldest product is a store-age hint
sampleProducts[]3 products with title, price, URL, imagecatalog or Shop search
discoveredBy, shopAppStoreId, shopAppUrl, shopAppRatingkeyword that found the store, https://shop.app/m/pawstruck, 4.8only for stores found by keyword
scrapedAtISO 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 to countries: ["US","CA"] and onlyWithEmail: 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: topVendors shows the brands a store carries; topProductTypes shows what it sells.
  • Weekly new-lead feed: schedule a keyword run with onlyNewLeads: true; the actor remembers delivered stores under leadListName and 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

InputTypeDefaultNotes
modeleads / productsautoLeads when keywords are given or nothing is given; products when only store URLs are given (legacy behaviour)
domainsarray–Store domains or URLs. storeUrls is accepted as an alias
listUrlstring–CSV, TXT or Google Sheet link
discoverarray–Keywords or niches. searchQuery (single string) is accepted as an alias
maxItemsinteger10Leads: total lead rows. Products: products per store
maxStoresinteger20Cap on keyword discovery
countriesarray–ISO-2 codes checked against the store's Shopify business address
onlyWithEmailbooleanfalseSkip stores with no published email
requiredApps / excludeAppsarray–Substring match on detected apps and pixels
minProducts / maxProductsinteger0By published product count
onlyNewLeads / leadListNameboolean / stringfalse / defaultNamed delivery history, skips stores already returned
collectionstring–Products mode: one collection handle
includeVariantsbooleantrueProducts mode
oneRowPerVariantbooleanfalseProducts mode
onlyAvailablebooleanfalseProducts mode
concurrencyinteger5Stores processed in parallel (1–10)
proxyConfigurationobjectnoneStores 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_TOKEN with the JSON input above; fetch results from the run's dataset (?format=csv or xlsx for 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: true and a leadListName per 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.