Shopify Merchant Scraper: Niche & Keyword Store Search
Pricing
from $2.99 / 1,000 results
Shopify Merchant Scraper: Niche & Keyword Store Search
Shopify Merchant Scraper: Niche & Keyword Store Search extracts Shopify stores by niche and keyword, including store names, URLs, product details, categories, prices, contact info, social links, and merchant data. Ideal for store discovery, lead generation, competitor research, and market analysis.
Pricing
from $2.99 / 1,000 results
Rating
0.0
(0)
Developer
SimpleAPI
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Shopify Merchant Scraper — Leads, Contact Info & Tech Stack
Shopify Merchant Scraper: Niche & Keyword Store Search turns a niche or product keyword into a list of real, live Shopify storefronts, then extracts one merchant-lead row per store — verified store name, domain, email, phone, 7 social profiles, theme and installed-app signals, product/collection counts, currency, and a derived leadQuality score. You can also feed it storeUrls you already know, run side by side with discovery. Built for outbound sales teams, ecommerce agencies, and market researchers who need a fresh list of Shopify merchants in a category without starting from a URL list.
🏪 What is Shopify Merchant Scraper: Niche & Keyword Store Search?
It is a Shopify lead-generation scraper that finds storefronts by niche or keyword — no starting URL list required — and then runs each one through a full merchant-lead extraction pipeline. No Shopify login, API key, or developer account is used anywhere in the run: every field is read from a store's own public homepage, public contact pages, and its public /meta.json / /products.json endpoints.
Key features:
- 🔍 Discovery by niche/keyword — one or more free-text terms (
nicheKeywords) are turned into real Shopify storefronts via targeted search queries; no pre-built URL list needed to get started - 🌐 Direct URL mode — pass known storefronts via
storeUrls, processed through the identical extraction pipeline as discovered stores - 📇 Identity & contact fields — verified merchant name, description, city/province,
myshopify.comdomain, email, and phone - 🔗 7-platform social detection — Facebook, Instagram, Twitter/X, TikTok, YouTube, Pinterest, LinkedIn
- 🎨 Theme & tech-stack signals — theme name/version and an installed-app/tech-stack inventory parsed straight from the storefront
- 💾 Live dataset writes — each row lands in the Output tab as soon as that store finishes, exportable as JSON, CSV, XLSX, or via the Apify API
📊 What data can I extract with Shopify Merchant Scraper?
Every scraped storefront returns one merchant-lead row carrying identity, contact, commerce, social, and tech-stack fields — 38 keys in total (the default dataset view surfaces 36 of them; hasEmail and hasPhone are pushed to every row but not shown in the view by default).
| Field | Example Value | Use Case |
|---|---|---|
storeName | "Kylie Cosmetics by Kylie Jenner" | Raw <title> of the storefront homepage |
merchantName | "Kylie Cosmetics" | Verified merchant name from /meta.json, falls back to storeName |
domain | "kyliecosmetics.com" | Apex domain of the store |
myshopifyDomain | "kylie-cosmetics.myshopify.com" | The store's underlying myshopify.com domain |
nicheKeyword | "vegan skincare" | The keyword that discovered this store, null for a storeUrls entry |
discoverySource | "keyword_search" | keyword_search or direct_url |
storefrontStatus | "open" | open / password_protected / unreachable / no_public_catalogue |
email | "customerservice@kyliecosmetics.com" | First validated contact email found |
phone | "1-877-916-6128" | First validated contact phone found |
facebook | "https://www.facebook.com/KylieCosmetics/" | Linked Facebook profile, null if not published |
instagram | "https://www.instagram.com/kyliecosmetics/" | Linked Instagram profile |
twitter | "https://twitter.com/kyliecosmetics" | Linked Twitter/X profile |
tiktok | null | Linked TikTok profile |
youtube | null | Linked YouTube channel |
pinterest | null | Linked Pinterest profile |
linkedin | null | Linked LinkedIn page |
socialPlatformCount | 3 | Count of the 7 social platforms found on this store |
leadQuality | "high" | Derived high / medium / low score |
productCount | 238 | Published product count |
publishedCollectionsCount | 226 | Published collection count |
currency | "USD" | Store's default selling currency |
moneyFormat | "${{amount}}" | Store's price display format string |
shipsToCountries | ["US", "CA"] | Country codes the store ships to |
acceptedCardBrands | ["visa", "mastercard", "american_express"] | Card brands accepted at checkout |
offersShopPayInstallments | true | Whether Shop Pay installment financing is offered |
themeName | "KYLIE" | Shopify theme name (schema_name) |
themeVersion | "12.0.0" | Shopify theme version (schema_version) |
installedApps | ["klaviyo", "yotpo"] | App handles detected from asset/proxy paths, capped at 30 |
themeAppExtensions | ["klaviyo"] | Theme-app-extension handles only, uncapped |
appProxyHandles | ["yotpo"] | App-proxy handles only, uncapped |
appCount | 2 | len(installedApps) |
merchantDescription | "Shop Kylie Cosmetics by Kylie Jenner…" | Store description from /meta.json |
merchantCity | "Calabasas" | Merchant city from /meta.json |
merchantProvince | "California" | Merchant province/state from /meta.json |
url | "https://kyliecosmetics.com/" | Store URL this row was scraped from |
scrapedAt | "2026-08-13T10:03:57.462Z" | UTC ISO-8601 scrape timestamp |
hasEmail | true | Boolean flag mirroring email |
hasPhone | true | Boolean flag mirroring phone |
🧩 Commerce & tech-stack signals
currency, moneyFormat, shipsToCountries, acceptedCardBrands, and offersShopPayInstallments come straight from the store's own /meta.json, with no extra request. productCount is sourced the same way whenever /meta.json is available, using Shopify's authoritative published_products_count — the fix for the common scraper mistake of counting /products.json pages, which silently caps at whatever limit you request. Only when /meta.json doesn't return that count does the actor fall back to counting /products.json?limit=250 directly, which is itself capped at 250 products in that fallback path. themeName/themeVersion and the app inventory (installedApps, themeAppExtensions, appProxyHandles) are all parsed from the already-fetched homepage HTML — a competitor-teardown workflow can pull tech stack and catalogue depth from one row, with no separate crawl.
🎯 Discovery & lead-quality signals
nicheKeyword and discoverySource tell you why a row exists — which keyword found it, or that it came from your own storeUrls. storefrontStatus distinguishes a live, scrapeable store from one that's password-gated, unreachable, or has no public catalogue, instead of returning a silent, unexplained empty row. leadQuality (high/medium/low) and the hasEmail/hasPhone/socialPlatformCount fields are a derived, non-AI score computed only from confirmed-real signals on that row — useful for segmenting a large discovery run down to the leads worth working first.
🧭 Why not build this yourself?
Shopify's own APIs — the Admin API and the Storefront API — are built for a merchant to manage or query their own store, authenticated with that store's own access token. Neither exposes a way to search or discover other merchants' storefronts by niche, keyword, or category, so there is no official endpoint to compare this Actor against for its core job: finding stores you don't already run.
Building the equivalent yourself means maintaining several moving parts that this Actor already runs end to end:
- A discovery layer that turns a keyword into candidate storefront URLs, deduplicated by domain
- A blocking-aware retry ladder that escalates from a direct request to a datacenter proxy to a residential proxy, and stays escalated once it does
- HTML parsers for theme identity, installed-app signals, and 7 social-platform link patterns — each with its own false-positive traps (tracking pixels, SVG coordinates, CSS-embedded digit runs)
- A
/meta.json-first strategy for authoritative product counts, with a bounded fallback when it's unavailable - Lead-quality scoring and storefront-status classification, so a password-gated or unreachable store is a labeled row, not a blank one
Shopify's Admin/Storefront APIs are the right tool once you already run a store and want to manage or query your own catalogue. This Actor is the right tool when you need to find and profile other merchants' storefronts by niche or keyword, without owning any of them.
💼 How to use data extracted from Shopify
🎯 Sales & outbound teams
Run nicheKeywords for the category you sell into, then filter the output on leadQuality == "high" and a non-null email or phone to build a call/email list without manually searching Shopify stores one by one. socialPlatformCount and the individual social fields (instagram, facebook, …) tell you where to warm up a prospect before the first outreach message.
🏢 Agencies & app developers
Point storeUrls at a client's own storefronts, or a target list of prospects, to audit themeName/themeVersion and installedApps/appCount before pitching a theme migration, app install, or tech-stack refresh — one recurring run per audit cycle, same schema every time.
📊 Market research and competitive intelligence
Run a batch of nicheKeywords across a category, then group the results by currency, shipsToCountries, or themeName to map how many live storefronts a niche actually has, which markets they ship to, and which theme/app choices are common among them — density and stack-adoption research without hand-collecting a single URL.
🤖 AI agents and automated pipelines
Because every row is typed, normalized JSON, an agent can call this Actor as a tool, feed the dataset straight into a CRM enrichment pipeline, or use leadQuality/storefrontStatus as a filter step before handing leads to a downstream outreach or research agent — no HTML parsing on the agent's side.
🔼 Input sample
| Parameter | Required | Type | Description | Example Value |
|---|---|---|---|---|
nicheKeywords | ❌ | array | One or more niche or product keywords (e.g. vegan skincare, handmade jewelry, knife accessories). Each term discovers new Shopify storefronts — no URL list needed. | ["vegan skincare", "handmade jewelry"] |
marketCountry | ❌ | string | Optionally scope discovery to storefronts more likely to serve a specific market/country. Leave blank for Any/Global. Enum: "", us, gb, ca, au, de, fr, in. Default "". | "us" |
storesPerKeyword | ❌ | integer | How many unique storefronts to discover per keyword before moving to the next one. Min 1, max 50. Default 10. | 10 |
storeUrls | ❌ | array | Specific Shopify storefront URLs you already know, scraped alongside anything discovered by keyword. | ["https://kyliecosmetics.com/"] |
maxStoresToProcess | ❌ | integer | Hard cap on the total number of stores (discovered + known) processed in this run. Min 1, max 10000. | 100 |
concurrency | ❌ | integer | How many stores to process in parallel. Min 1, max 50. Default 10. | 10 |
requestDelay | ❌ | number | Pause (seconds) between requests to the same storefront, to keep crawling polite. Min 0, max 10. Default 0.5. | 0.5 |
startUrls | ❌ | array | Legacy alias of storeUrls, kept so inputs built for the base actor keep working unchanged. | [] |
maxItems | ❌ | integer | Legacy alias of maxStoresToProcess. Min 1, max 10000. Default 100. | 100 |
proxyConfiguration | ❌ | object | Apify Proxy, custom proxy URLs, or no proxy for the per-store extraction requests. Default {"useApifyProxy": false}. | {"useApifyProxy": false} |
No parameter is required — but a run with neither nicheKeywords nor storeUrls/startUrls has nothing to scrape and exits immediately.
{"nicheKeywords": ["vegan skincare", "handmade jewelry"],"marketCountry": "us","storesPerKeyword": 15,"storeUrls": ["https://kyliecosmetics.com/"],"maxStoresToProcess": 200,"concurrency": 10,"requestDelay": 0.5,"proxyConfiguration": { "useApifyProxy": false }}
Common pitfall: the run builds its target list as discovered stores first, then storeUrls/startUrls, and only then slices the combined list down to maxStoresToProcess. If keyword discovery alone already finds enough stores to fill that cap, your explicitly-supplied storeUrls can be dropped from the run entirely without an error. If you need specific known stores guaranteed to run, set maxStoresToProcess well above storesPerKeyword × keyword count, or run a storeUrls-only job with no nicheKeywords.
🔽 Output sample
Each run pushes typed, normalized JSON — one row per storefront, exportable as JSON, CSV, or XLSX from the Output tab, or pulled via the Apify API.
{"storeName": "Kylie Cosmetics by Kylie Jenner","merchantName": "Kylie Cosmetics","domain": "kyliecosmetics.com","myshopifyDomain": "kylie-cosmetics.myshopify.com","nicheKeyword": "vegan skincare","discoverySource": "keyword_search","storefrontStatus": "open","email": "customerservice@kyliecosmetics.com","phone": "1-877-916-6128","facebook": "https://www.facebook.com/KylieCosmetics/","instagram": "https://www.instagram.com/kyliecosmetics/","twitter": "https://twitter.com/kyliecosmetics","tiktok": null,"youtube": null,"pinterest": null,"linkedin": null,"socialPlatformCount": 3,"leadQuality": "high","productCount": 238,"publishedCollectionsCount": 226,"currency": "USD","moneyFormat": "${{amount}}","shipsToCountries": ["US", "CA"],"acceptedCardBrands": ["visa", "mastercard", "american_express"],"offersShopPayInstallments": true,"themeName": "KYLIE","themeVersion": "12.0.0","installedApps": ["klaviyo", "yotpo"],"themeAppExtensions": ["klaviyo"],"appProxyHandles": ["yotpo"],"appCount": 2,"merchantDescription": "Shop Kylie Cosmetics by Kylie Jenner...","merchantCity": "Calabasas","merchantProvince": "California","url": "https://kyliecosmetics.com/","scrapedAt": "2026-08-13T10:03:57.462Z","hasEmail": true,"hasPhone": true}
⚠️ Every processed store is charged, under the row_result pay-per-event, whether or not it yielded a usable lead. A password_protected or unreachable store still produces one billed row — filter those out after the run with storefrontStatus == "open" (or leadQuality != "low") rather than expecting the Actor to skip billing for them.
🎯 How do you filter and target specific merchant leads?
Category vs. free-text query. nicheKeywords is free text, not a fixed category list — a narrow, specific term ("knife sharpening accessories") tends to return a more relevant, less noisy set of storefronts than a broad one ("accessories"), since discovery matches on the literal phrase. Use storeUrls instead whenever you already know exactly which stores you want; it skips the discovery step entirely and is the more complete option since it can't miss a store discovery didn't surface.
Scope precision. marketCountry biases the discovery search toward a market rather than filtering the actual stores found — pair it with the shipsToCountries output field if you need to confirm a discovered store genuinely ships to that market, rather than assuming from marketCountry alone.
Volume controls. storesPerKeyword (max 50) caps how many new stores each individual keyword contributes; maxStoresToProcess/maxItems (max 10000) caps the run as a whole, applied after discovered stores and known storeUrls are merged and deduplicated by domain — see the crowd-out pitfall above.
Quality thresholds aren't input parameters here — they're output fields you filter on after the run: leadQuality, hasEmail, hasPhone, and storefrontStatus == "open" let you narrow a large discovery batch down to the rows actually worth working, without re-running the scrape.
{ "nicheKeywords": ["organic dog treats"], "storesPerKeyword": 20, "maxStoresToProcess": 20 }
{ "nicheKeywords": ["knife accessories"], "marketCountry": "gb", "storesPerKeyword": 10, "maxStoresToProcess": 10 }
{ "storeUrls": ["https://kyliecosmetics.com/", "https://gymshark.com/"], "maxStoresToProcess": 2, "concurrency": 2 }
▶️ Want to try other Shopify scrapers?
| Scraper Name | What it extracts |
|---|---|
| Shopify Products Scraper With Variant & SKU Rows | Per-store product catalogues broken out to one row per variant/SKU |
| Shopify Scraper: Sales Channel & Product Templates Data | Sales-channel configuration and product-template data per store |
| Shopify Store Scraper — Markets, Currencies & Catalogs | Multi-market storefront data: markets, currencies, and catalogue structure |
| Amazon DE Sellers Leads Scraper — Product Price & Ratings | Seller-level lead rows from Amazon.de, with product price and rating data |
⚙️ How to extract Shopify data programmatically
This Actor runs as a standard Apify Actor: one API call starts the run, and the dataset comes back as structured JSON — no separate scraping infrastructure to host.
Python example
from apify_client import ApifyClientclient = ApifyClient("<APIFY_API_TOKEN>")run = client.actor("<username>/shopify-merchant-scraper-niche-and-keyword-store-search").call(run_input={"nicheKeywords": ["vegan skincare"],"storesPerKeyword": 10,"maxStoresToProcess": 50,})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item["domain"], item["email"], item["leadQuality"])
Export to spreadsheets or CRM
Export the dataset as CSV directly from the Output tab, or via the API, and map columns straight to a CRM import: merchantName/domain → company, email/phone → contact fields, instagram/facebook/twitter/tiktok/youtube/pinterest/linkedin → social links, and leadQuality → a lead-scoring or priority column.
⚖️ Is it legal to scrape Shopify stores?
Yes — this Actor collects only data that a storefront already publishes publicly: its homepage, its own contact pages, and its public /meta.json//products.json endpoints, none of which require a login to view. Records here are overwhelmingly business/product data — store name, theme, catalogue counts, currency, and shipping/payment configuration — so terms-of-service and database-rights framing applies rather than GDPR, which governs personal data about individuals, not a store's commerce configuration.
The email and phone fields are the exception worth noting: on a sole-proprietor storefront, a published contact address or number can also be that person's personal data, in which case GDPR/CCPA's requirements for a lawful basis to store and use that data apply to those two fields specifically. Consult legal counsel for commercial applications involving bulk storage of personal data.
❓ FAQ
How does the scraper know a store is closed or unreachable?
Every row carries a storefrontStatus field — open, password_protected, unreachable, or no_public_catalogue — instead of a silent, unexplained empty row. A password_protected row still returns storeName (from the page <title>) even though the rest of the record is empty, since nothing else on a password-gated page is publicly readable.
Can I get social profiles and tech-stack data along with each merchant lead?
Yes — every scraped store is checked for all 7 social platforms and its theme/app signals in the same pass, at no extra input or separate charge. They're part of the same row_result row as the contact fields.
How accurate is the contact data?
The Actor returns data exactly as it appears on the public storefront at request time. email/phone are null, never fabricated, when a merchant simply hasn't published one. Accuracy after that depends on whether the merchant keeps their own published contact info current — the standard downstream step is a validation pass (email/phone verification) before using the list for outreach at scale.
How many records can I get per run?
The overall run is capped by maxStoresToProcess (or the legacy maxItems), 1–10000, applied to discovered stores and storeUrls combined after dedup by domain. Within that, each individual keyword in nicheKeywords contributes at most storesPerKeyword new stores (1–50) before discovery moves to the next keyword. There is no separate pagination step — a run either finds enough candidates to fill the cap, or returns everything discovery and your known URLs together produced.
How does discovery find new stores from a keyword?
By running two targeted search queries per keyword — a "powered by shopify" <keyword> phrase search and a site:myshopify.com <keyword> search — and keeping the resulting store domains, deduplicated. It is not a Shopify API call; coverage depends on what a public search actually surfaces for that keyword and market, so a very narrow or unusual niche term can return fewer stores than storesPerKeyword allows for.
Does Shopify Merchant Scraper work with Claude, ChatGPT, and AI agent frameworks?
It's callable as a standard HTTP endpoint via the Apify API or the apify-client Python/JS SDK, so any agent framework that can call a REST API or wrap a Python function as a tool can drive it — pass nicheKeywords/storeUrls in, read typed JSON rows back.
How does this differ from other Shopify scrapers in this collection?
It's the only one built around discovery: turning a niche/keyword into a store list, rather than requiring you to already know the stores. Shopify Products Scraper With Variant & SKU Rows and Shopify Store Scraper — Markets, Currencies & Catalogs both expect a known store to enumerate its catalogue or markets in depth; this Actor finds the stores first, then returns one lead-focused row per store rather than a full product catalogue.
Can I use it without a Shopify API key or developer account?
Yes. No Shopify login, API key, Partner account, or app installation is needed — every field comes from public pages and public JSON endpoints any browser could reach. You only need an Apify account to run the Actor itself.
🏁 Conclusion
Shopify Merchant Scraper: Niche & Keyword Store Search turns a plain keyword into a structured, exportable list of real Shopify merchants — identity, contact, social, commerce, and tech-stack fields in one typed row per store, with no starting URL list and no Shopify login required. It's built for sales teams, agencies, and researchers who need to find who's selling in a niche, not just profile a store they already know. Start a run from the Apify Console or the API with a keyword or a storeUrls list, and leads land in the Output tab as each store finishes.