E-commerce · Lead generation
Shopify Store Leads Scraper
Turn a domain list into qualified Shopify B2B leads in one Actor run — multi-signal detection (products.json + headers + HTML markers) enriches every confirmed store with product count, contact email, social links, and currency. Works even on stores that block the products endpoint.
Free Apify credit covers a first run. No credit card to try.
What this Actor scrapes
Shopify powers over 4 million stores worldwide. This Actor takes a list of website domains and runs multi-signal detection across each one: it tries /products.json, reads HTTP headers (x-shopify-stage, x-sorting-hat-shopid, powered-by), and scans the homepage HTML for cdn.shopify.com, Shopify.theme, and *.myshopify.com references. Whichever signal fires first wins. Confirmed Shopify stores are then enriched with product count, a sample of product titles, the *.myshopify.com subdomain, any contact email found on the homepage or /contact page, social profile links, and the storefront currency.
Run it once to qualify a prospect list, or schedule it weekly to monitor an entire vertical.
What we handle for you
- 🛡️ Multi-signal detection — three independent detection layers so stores that block
/products.json(like Gymshark) are still correctly identified via headers and HTML markers. - 🌐 Residential proxy rotation via Apify Proxy — fresh session and exit IP on every request so your detection run doesn't get flagged as a crawler.
- 🔁 Retries with exponential backoff on
408 / 429 / 5xx— up to 5 attempts per domain,Retry-Afterhonoured. - 🧱 Rate-limit-aware pacing — when a CDN or WAF pushes back, we slow down and rotate before retrying, not after failing.
- 🧊 Clean, typed dataset rows — Pydantic-validated, ISO-8601 timestamps, JSON / CSV / Excel export from the Apify Console.
- 💰 Pay-Per-Event pricing — you pay only for confirmed results that hit your dataset. Zero rows, zero charge (beyond the small start event).
Use cases
- Shopify app vendor prospecting — feed a domain list from a niche directory, get back every Shopify store with email and product count, ready to import into your CRM.
- DTC agency outreach — qualify inbound leads: "does this prospect actually run Shopify?" answered programmatically, no manual checks.
- Competitive intelligence — track which new entrants in a product category have spun up Shopify stores over the last 30 days.
- Platform migration research — identify the Shopify footprint in a specific industry vertical before pitching a replatforming project.
- Market-sizing for app developers — count confirmed Shopify stores in a niche to validate an app idea before building.
Input
Paste this into the Apify Console, or send it as the run input over the API. Proxy settings are on by default; you rarely need to touch them.
| Field | Type | Required | What it does |
|---|---|---|---|
domains | array | yes | List of website domains or URLs to probe. Include the domain only (e.g. allbirds.com) or a full URL — the Actor normalises both. At least one domain is required. |
includeProducts | boolean | no | Fetch a sample of product titles from /products.json or the sitemap when the endpoint responds. Adds product_count and sample_product_titles to every row. |
maxProductsSample | integer | no | Upper bound on product titles fetched per domain. Caps the /products.json?limit=N request and the sitemap scan. |
onlyShopify | boolean | no | When true, non-Shopify domains are silently dropped from the dataset. Set to false to get a full audit of every domain checked. |
maxResults | integer | no | Hard cap on dataset rows emitted. Useful when testing or on a budget. Set to 0 for unlimited. |
{
"domains": [
"allbirds.com",
"gymshark.com",
"kylie.com"
],
"includeProducts": true,
"maxProductsSample": 10,
"onlyShopify": true,
"maxResults": 50,
"proxyConfiguration": {
"useApifyProxy": true,
"apifyProxyGroups": [
"RESIDENTIAL"
]
}
} Output
One row per result, schema-validated before it is written. Export JSON, CSV, Excel or XML from the run, or read it over the API.
domainis_shopifydetection_methodmyshopify_domainproduct_countsample_product_titlescurrencyemailsocial_linkshomepage_titlescraped_at
{
"domain": "allbirds.com",
"is_shopify": true,
"detection_method": "products_json",
"myshopify_domain": "allbirds.myshopify.com",
"product_count": 87,
"sample_product_titles": [
"Men's Tree Runners",
"Women's Wool Runners",
"Tree Dasher 2"
],
"currency": "USD",
"email": null,
"social_links": [
"https://www.instagram.com/allbirds/",
"https://twitter.com/allbirds",
"https://www.facebook.com/allbirds"
],
"homepage_title": "Allbirds | Sustainable, Comfortable Shoes Made With Natural Materials",
"scraped_at": "2026-06-07T10:00:00Z"
} Pricing
| Event | Price | When |
|---|---|---|
| Actor start | $0.20 | Once per run, covers warm-up and proxy session setup. |
| Result row | $0.0025 | Per result written to the dataset. |
You pay only for results that land. Cap any run with maxTotalChargeUsd. See pricing & billing for worked examples.
Limitations
- Some stores block
/products.json: stores like Gymshark return 403. We fall back to header and HTML-marker detection, which confirms Shopify but can't retrieve product lists —product_countandsample_product_titleswill be null for those. - Email is best-effort: many Shopify stores hide contact email behind forms or Zendesk widgets. We surface
mailto:links only; JavaScript-rendered contact forms are out of scope for the HTTP-tier implementation. - Social links are homepage-scraped: some brands link social accounts only in the footer of inner pages. If they're not on the homepage, they won't appear.
- Rate limiting on large lists: running thousands of domains in a single Actor run is possible but slow. Batch in groups of 500–1 000 for predictable run times. Use
maxResultsto cap during testing. - Shopify Markets / headless: some enterprise Shopify deployments use custom domains + headless frontends that mask Shopify signals entirely. Detection rates on headless stores are lower.
FAQ
Does this work on stores that block /products.json?
/products.json first, but it doesn't stop there. It also reads HTTP response headers (x-shopify-stage, x-sorting-hat-shopid) and scans the homepage HTML for Shopify CDN references and theme globals. A store that 403s /products.json will still be detected if any other signal is present — we just won't be able to populate product_count for it.What domains should I feed it?
How accurate is the detection?
Can I get more than 10 product titles per store?
maxProductsSample up to 250. Keep in mind that /products.json?limit=250 is a single larger request, which may tip rate-limit thresholds on stores that monitor request size.Can I run this on a schedule?
I need the full product catalogue, not just a sample — can you do that?
Ready to run it?
Open the listing on Apify, paste the input above, and watch rows land. If it ever breaks, it is our problem before it is yours.
Related Actors