Shopify Store Leads
Check domains for Shopify, then get public emails, phones, socials, currency, theme and tech. $4.50 per 1,000 confirmed stores.
How it works
- 1Open it on Apify
Hit Run on Apify — it opens the tool in the cloud, no install.
- 2Set the inputs
Adjust
stores,defaultCountry,startUrls(sensible defaults are pre-filled). - 3Click Run
The tool runs on Apify’s cloud and collects the data for you.
- 4Export the results
Download as JSON, CSV or Excel, or pipe straight into your app, Google Sheets, or an AI agent.
Pricing
$0.0045 per Shopify store lead = $4.5 per 1,000
| You are charged for | When | Price |
|---|---|---|
| Shopify store lead | One confirmed Shopify store enriched with public lead and catalog data. | $0.0045 |
Pay-per-event pricing: you are billed per result, not per subscription. Billing is handled by Apify on your own account. These are the live Apify store prices, in effect since 2026-07-25, and they are what you are actually charged.
Inputs
| Field | What it does | Type |
|---|---|---|
stores | Shopify store domains or full URLs, one per line. Values without a scheme use HTTPS. | array |
defaultCountry | Optional ISO 3166-1 alpha-2 country code used to normalize local phone numbers. | string |
startUrls | Alternative Apify request-list input. Can be combined with Store domains or URLs. | array |
maxPagesPerStore | Maximum HTML page attempts per store. Contact and about pages are prioritized. | integer |
maxProducts | Maximum products to retain from the public Shopify catalog endpoint. Set to 0 to skip catalog lookup. | integer |
maxConcurrency | Number of stores worked on at once. A 1 GB run works on at most 10 at a time and a 512 MB run at most 5, whatever this says. | integer |
requestTimeoutSecs | Maximum duration of each HTTP request. | integer |
maxResponseSizeKb | Maximum HTML or JSON response body size per request. | integer |
What you get
A structured dataset — each result includes fields like:
domaintitlecountrycurrencyproductCountemailsphonessocialstechnologiesshopifyConfidencestoreUrlok_samplerequestedUrldescriptionisShopifyshopifySignalsproductCountTypeproductsthemecontactUrlsaboutUrlssourcePagespagesCrawlederrorCodeerrorExport every run as JSON, CSV or Excel, or send it to your app, a database, Google Sheets, or an AI agent.
1 ready-to-run use cases
Shopify Store Product Catalogue Export
Export a Shopify store's products: title, price, variants, images and handle. Paste the store URL and run.
Related tools in B2B Leads & Contact Data
Other ready-to-run tools in the same category — all pay-per-use on the Apify cloud.
Thomasnet Suppliers Scraper
Scrape Thomasnet suppliers by product and US location. Get name, phone, website, address, year founded, employees, sales, ISO certs. $0.85 per 1,000.
LinkedIn Profiles Scraper
Get public LinkedIn profile data from URLs you supply. You get name, headline, description, image link and public identifier. $0.90 per 1,000 profiles.
LinkedIn Companies Scraper
Get public LinkedIn company data from company URLs. You get name, description, followers, employee count, HQ, website and logo. $0.90 per 1,000, flat rate.
YouTube Channel Email Scraper
Find the business emails creators publish in their YouTube channel description, plus their linked site's contact pages. $1.50 per 1,000 channels.
Domain Inspector
Check many domains at once. Get DNS, WHOIS registrar and expiry, TLS dates, redirects, security headers, robots and tech. $1.50 per 1,000.
Google Maps Scraper
Scrape Google Maps places and reviews. Business name, category, address, rating, GPS coordinates and place ID. $0.27 per 1,000 rows.
Where this tool sits
- Categories
- B2B Leads & Contact Data
- Platforms
- Shopify
Shopify Store Leads: check a domain list for Shopify, then pull the contact details
Feed it a list of domains. It works out which ones actually run on Shopify, then reads the store's public pages and returns the emails, phone numbers and social profiles it published, plus currency, country, theme, a short technology list and a sample of the catalog.
It only finds what the store chose to put on its own site. Plenty of Shopify stores publish no email anywhere, and no scraper changes that. You are charged for confirmed stores, so a domain that turns out not to be Shopify does not cost you a row.
| Input | Domains or store URLs, one per line |
| Output | One row per domain checked |
| Ceiling | 500 domains per run, 250 product samples per store |
| Account needed | None from you |
| Price | $4.50 per 1,000 confirmed stores, flat on every plan |
🛍️ What Shopify Store Leads does
Each domain goes through the same two steps.
Step one: is it Shopify? The homepage is checked for the markers a Shopify storefront leaves behind, and the two public endpoints every Shopify store exposes are tried. The row tells you what it found, in shopifySignals, and how sure it is, in shopifyConfidence. A domain that fails this step comes back as a row with isShopify: false and is not charged.
Step two: the lead. On a confirmed store it reads the homepage and then the contact and about pages, up to your page limit, and merges everything it finds: emails, phones normalised to international format, social profiles across seven platforms, the currency and country the shop declares, and a sample of products from the public catalog.
Enter the same site as example.com and www.example.com and it is checked once, not twice.
📥 What you give it
{
"stores": ["allbirds.com", "https://www.gymshark.com"],
"maxPagesPerStore": 4,
"maxProducts": 20
}
| Field | Default | What it is |
|---|---|---|
stores | box holds one example store | Domains or full URLs, one per line. A bare domain is tried over HTTPS. |
startUrls | empty | The same job in Apify's request-list format. Can be used alongside stores. |
defaultCountry | empty | Two-letter country code, used to make sense of local-format phone numbers. |
maxPagesPerStore | 4 | How many pages to read per store, 1 to 10. Contact and about pages go first. |
maxProducts | 20 | How many catalog products to keep, 0 to 250. 0 skips the catalog entirely. |
maxConcurrency | 5 | How many stores to work on at once, 1 to 20. A 1 GB run works on at most 10 at a time, a 512 MB run at most 5. |
requestTimeoutSecs | 12 | How long to wait on one request, 3 to 45 seconds. |
maxResponseSizeKb | 2048 | The biggest page body to read, in KB. Anything larger is skipped with a row saying so. |
proxyConfiguration | leave it alone | Optional. Only fill this in if you want the run to go out through your own servers. |
Run it with everything empty and you get one labelled sample row.
📤 What you get back
A real row from a recent run. The products list and socials are trimmed here.
{
"ok": true,
"requestedUrl": "https://www.allbirds.com",
"storeUrl": "https://www.allbirds.com/",
"domain": "allbirds.com",
"title": "Allbirds: Comfortable, Sustainable Shoes & Apparel",
"description": "Allbirds: The world's most comfortable shoes, flats, and clothing made with natural materials ...",
"isShopify": true,
"shopifyConfidence": "high",
"shopifySignals": ["shopify_html_marker", "shopify_asset_marker", "products_json"],
"emails": ["[email protected]"],
"phones": [{"phone": "+1 424 363 8064", "e164": "+14243638064", "country": "US"}],
"socials": [{"platform": "instagram", "url": "https://www.instagram.com/allbirds"}, {"platform": "tiktok", "url": "https://www.tiktok.com/@weareallbirds"}],
"currency": null,
"country": null,
"productCount": 250,
"productCountType": "products_endpoint_sample",
"products": [{"id": 7218356060240, "title": "Men's Strider Explore - Natural Black (Dark Grey Sole)", "handle": "mens-strider-explore", "vendor": "Allbirds", "productType": "Shoes", "available": false, "price": "130.00", "url": "/products/mens-strider-explore"}],
"theme": {"raw": "{\"name\":\"[DNAM Theme July 2026]\",\"id\":130450260048,\"schema_name\":\"allbirds-theme\",\"schema_version\":\"1.231.12\", ...}"},
"technologies": ["Shopify"],
"contactUrls": ["mailto:[email protected]", "https://www.allbirds.com/pages/help"],
"aboutUrls": ["https://optout.aboutads.info/"],
"sourcePages": ["https://www.allbirds.com/", "https://www.allbirds.com/pages/help"],
"pagesCrawled": 2,
"crawledAt": "2026-09-17T06:43:34.355Z"
}
| Field | What it is |
|---|---|
isShopify, shopifyConfidence, shopifySignals | The verdict, how sure it is, and exactly which markers produced it. |
emails, phones, socials | Up to 50 emails, 30 phones and 50 social profiles. Phones carry the international string, the E.164 form and the country. |
currency, country | What the shop declares about itself. Both are null on plenty of stores. |
productCount, productCountType | How many products were seen, and where the number came from. It is a sample, not a catalog total. |
products | Title, handle, vendor, type, availability, first-variant price and path for each sampled product. |
theme | A raw snippet of the store's theme object, up to 500 characters. The theme name is in there, alongside ids and version numbers. |
technologies | Four things are detected: Shopify, Klaviyo, Google Analytics and Meta Pixel. Nothing else. |
contactUrls, aboutUrls, sourcePages, pagesCrawled | What it found to read, and what it actually read. |
🧾 Reading the output
Four kinds of row can land in your dataset.
| Row | How to spot it |
|---|---|
| A confirmed store | ok is true and isShopify is true |
| A domain that is not Shopify | ok is false with errorCode: NOT_SHOPIFY |
| The sample row | Written only when the input was empty |
| A diagnostic | ok is false and it carries an errorCode |
Only confirmed stores are charged. Everything else in that table is free of charge.
| Code | What it means |
|---|---|
NOT_SHOPIFY | The homepage carried none of the Shopify markers and neither public endpoint answered. |
UNSAFE_URL | That address points at a private or local network, so nothing was requested. |
RESPONSE_TOO_LARGE | The page was bigger than maxResponseSizeKb. Raise it and re-run that domain. |
HTTP_ERROR | The store answered with an error page. Re-run that domain later. |
RATE_LIMITED | The store asked for fewer requests. Re-run that domain later. |
Anything else that goes wrong on one domain writes its own row with the error on it, and the rest of the list carries on.
▶️ How to run it
1. Open Shopify Store Leads and click Try for free. 2. Paste your domains into Store domains or URLs, one per line. 3. Leave the limits alone for the first run. They are what the run is allowed to fetch. 4. Click Start. 5. Download the dataset as JSON, CSV or Excel, or read it from the Apify API.
💰 How much does it cost?
$4.50 per 1,000 confirmed Shopify stores. Flat on every Apify plan, no volume tiers.
You pay for stores it confirms, not for domains it checks. A domain that is not Shopify, an address it refused to fetch, a page that was too big and the sample row are all uncharged, so you can throw a mixed list at it without paying for the misses.
💡 What people use it for
- Filtering a bought or scraped domain list down to the ones actually running Shopify.
- Building an outreach list for an app, an agency or a supplier, with emails and socials on the row.
- Sizing prospects roughly by
productCountand the price range in the product sample. - Spotting stores already running Klaviyo, Google Analytics or Meta Pixel before pitching them.
- Re-checking an existing customer list to see who has moved off Shopify.
🚧 What it does not do
- It finds only what the store published. No login walls, no contact forms, no guessing at
addresses. A store with no email on its site returns none.
currencycan be wrong. When the shop does not declare one, the value falls back to a
three-letter code taken off the page, which is occasionally a language rather than a currency. Check it against country before you rely on it.
- A store having a bad moment gets an error row, not a verdict. If its homepage answers with an
error, the row says HTTP_ERROR or RATE_LIMITED and costs nothing. Re-run that domain later.
- A run close to its time limit stops early. It stops starting new domains, keeps what it
delivered, and its status says how many were checked. The rest cost nothing; start a new run for them.
themeis a raw snippet, not a tidy name. The name is inside it, along with ids and version
numbers.
- The product list is a sample. It is the first page of the public catalog, 250 products at most,
and productCount counts that page rather than the whole store.
- Four technologies, not a full stack report. Shopify, Klaviyo, Google Analytics, Meta Pixel.
- 500 domains per run. Anything past that in the list is dropped without a row. Split a bigger
list across runs.
- Contact details are capped per store: 50 emails, 30 phones, 50 social profiles.
🧭 Which Shopify scraper do you need?
| If you want | Use |
|---|---|
| To confirm Shopify and get the store's contact details | This one |
| Every product in a store's catalog, with variants and prices | Shopify Products Scraper |
| Emails and phones from any website, Shopify or not | Contact Details Scraper |
| Registration, DNS and hosting facts about a domain | Domain Inspector |
❓ Questions people ask
Do I pay for domains that turn out not to be Shopify? No. The charge only fires on a confirmed store, which is the whole point of putting a mixed list in.
How accurate is the Shopify verdict? Read shopifySignals. Several independent markers plus a public endpoint answering is as strong as it gets, and shopifyConfidence sums that up as high, medium or low.
Why are some rows missing an email? Because the store never published one. Check contactUrls on the row to see which pages were found and read.
Can it get past a contact form? No. It reads published addresses, it does not fill anything in.
Can I run it on a schedule? Yes. domain is stable, so re-running a list and diffing tells you who changed platform or published new contact details.
Is this legal? These are public pages on public websites. Apify's write-up on scraping and the law is a good place to start, and we are not lawyers.
🆘 If something breaks
Open the Issues tab on the actor page. Send the domain and the run ID. The errorCode on the row usually names the problem on its own.