Shopify Store Scraper · Qualified Leads from Any Domain List avatar

Shopify Store Scraper · Qualified Leads from Any Domain List

Pricing

from $8.00 / 1,000 scraped stores

Go to Apify Store
Shopify Store Scraper · Qualified Leads from Any Domain List

Shopify Store Scraper · Qualified Leads from Any Domain List

Paste store domains, get one qualified row per Shopify store: exact product count, price band, newest product date, theme, location, currency, public e-mails, phones, socials and lead signals. Non-Shopify, password and duplicate domains are never charged.

Pricing

from $8.00 / 1,000 scraped stores

Rating

0.0

(0)

Developer

TheQuietStack

TheQuietStack

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Share

Paste a list of store domains, from a lead export, a Google Maps list, a competitor list or a CSV. You get one qualified row per Shopify store: whether it really is a public Shopify storefront, how many products it sells (counted, not estimated), price band, when it last published a product, theme, location and currency, the contact details the store itself shows publicly, and lead signals such as no new product in 90 days or outdated copyright year.

Domains that turn out not to be Shopify, password-protected, headless, behind a bot wall or duplicates of a store you already listed are reported in the run summary and never charged.

No login. No API key. Nothing is guessed or enriched from third-party databases.

Who it is for

  • Agencies and freelancers who sell Shopify design, SEO, apps, photography or support: find stores that have gone quiet, show no phone number, or still carry a 2021 footer.
  • Sales teams qualifying a list before outreach: drop dead stores and stores outside your size range before you pay.
  • Market research: price bands, catalog size and publishing pace of a set of competitors, side by side.

Why this scraper

  • Counted, not estimated. Shopify's own store metadata reports a product count, but we measured on 24 Sep 2026 that it changes with the visitor's market: for one store it said 212 products with a US English browser and 608 without, while the store's product feed listed 608 both ways. This Actor counts the products itself. productCount is filled only when the whole catalog was read; otherwise you get productCountAtLeast and Shopify's figure in productCountShopifyMeta, never a number dressed up as exact.
  • Freshness from the right date. Shopify bumps updated_at on every product whenever inventory syncs (all 250 products on a page showed the same day in our tests), so "last updated" says nothing about the merchant. We use the publish date. Shopify lists newest products first, so daysSinceNewestProduct is exact even for stores with 25,000 products.
  • You pay for stores, not for domains. Not Shopify, password page, headless front end, bot wall, dead domain, or the same store under a second domain (www., .myshopify.com alias, same shop ID): all listed in the SUMMARY, none charged. No silent zero-result runs: every input domain is accounted for.
  • Lead signals you can filter on. Filtered-out stores are not charged.

Input example

{
"domains": ["allbirds.com", "chalk-line.com", "horizonmotorsport.com", "not-a-shop.com"],
"countries": ["US"],
"maxProductCount": 200,
"requiredLeadSignals": ["no-new-product-90d", "no-phone-shown"],
"maxStores": 500
}

Set "includeProducts": true to also get one row per product (title, URL, type, vendor, tags, price range, compare-at price, availability, image, publish date), newest first.

Output example (store row, measured 24 Sep 2026)

{
"name": "Horizon Motorsport",
"url": "https://horizonmotorsport.com",
"domain": "horizonmotorsport.com",
"myshopifyDomain": "horizon-motorsport.myshopify.com",
"city": "Irvine",
"province": "California",
"country": "US",
"currency": "USD",
"productCount": 565,
"productCountAtLeast": null,
"productCountShopifyMeta": 565,
"catalogFullyScanned": true,
"priceMin": 4,
"priceMedian": 380,
"priceMax": 6599,
"priceStatsBasis": "all 565 products",
"newestProductPublishedAt": "2026-09-15T21:50:35.000Z",
"daysSinceNewestProduct": 8,
"productsPublishedLast30Days": 4,
"productsPublishedLast90Days": 54,
"topProductTypes": [{ "name": "Front Lip", "count": 51 }, { "name": "Exterior Accessories", "count": 45 }],
"themeSchemaName": "Streamline",
"copyrightYear": 2026,
"emails": ["sales@horizonmotorsport.com"],
"emailSources": { "sales@horizonmotorsport.com": "contact page" },
"phones": [],
"legalName": "Horizon Motorsport",
"publishedAddress": "Horizon Motorsport Inc, 20 Pebblewood, Irvine CA 92604, United States",
"instagram": "https://www.instagram.com/horizon.motorsport",
"hasContactPage": true,
"leadSignals": ["no-phone-shown"],
"leadSignalCount": 1
}
FieldMeaning
productCountProducts we counted in the public product feed. Only set when the whole catalog was read (catalogFullyScanned).
productCountAtLeastLower bound when the catalog is bigger than the pages you allowed (productPagesPerStore × 250).
productCountShopifyMetaShopify's own figure. Depends on the visitor's market and can differ from the feed.
priceMin / priceMedian / priceMaxLowest variant price per product, across the products read. priceStatsBasis says which products.
daysSinceNewestProductDays since the most recently published product. Always exact.
productsPublishedLast30Days / …90DaysExact, or null with …AtLeast when the window reaches past the pages read.
onSaleShare / soldOutShareShare of products with a compare-at price / with no available variant.
themeName / themeSchemaName / themeSchemaVersion / themeStoreIdFrom the storefront's public theme object.
emails / phonesOnly what the store shows: homepage, its contact page and Shopify's contact-information page. emailSources says where each e-mail was found.
legalName / publishedAddressFrom Shopify's contact-information page, if the merchant filled it in.
leadSignalsSee below.
homepageRedirectedToSet when the homepage sends visitors to another host (headless front end). Homepage-based signals are then left out instead of guessed.

Lead signals

no-new-product-90d · no-new-product-365d · small-catalog-under-20 · no-products · mostly-sold-out (half or more of the products have no available variant) · no-email-shown · no-phone-shown · no-contact-page-found (no contact link on the homepage and no /pages/contact) · no-social-links · outdated-copyright-year (footer year older than last year) · no-custom-domain.

Run summary

SUMMARY in the key-value store lists, per input domain, why it produced no row: notShopify, passwordProtected, headless, blockedByBotProtection, unreachable, duplicateStores, failed, invalid inputs, how many stores each filter dropped, and HTTP status counts.

Honest limits

  • Public storefront data only. No login, no password pages, no checkout. Password-protected stores are skipped, not opened.
  • No bot-wall bypass. Some large brands run their storefront behind bot protection or a headless front end; they are listed as blockedByBotProtection or headless in the summary. In our 24-domain test on 24 Sep 2026: 16 store rows, 1 bot wall (HTTP 429 on every request), 1 password page, 4 not Shopify, 1 dead domain, 1 duplicate alias.
  • No e-mail guessing. If a store only offers a contact form, emails is empty and the row carries no-email-shown. That is often exactly the lead you want.
  • Discovery is up to you. This Actor qualifies domains you already have; it does not search for stores.
  • The product catalog shown can depend on the visitor's market. storefrontLocale records which locale the store served.

Pricing (pay per event)

  • Actor start: small flat fee per run
  • Per scraped store: only Shopify stores that pass your filters and are written to the dataset
  • Per scraped product: only when product rows are switched on