Shopify Merchant Scraper: Niche & Keyword Store Search avatar

Shopify Merchant Scraper: Niche & Keyword Store Search

Pricing

from $2.99 / 1,000 results

Go to Apify Store
Shopify Merchant Scraper: Niche & Keyword Store Search

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

SimpleAPI

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

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.


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.com domain, 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).

FieldExample ValueUse 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
tiktoknullLinked TikTok profile
youtubenullLinked YouTube channel
pinterestnullLinked Pinterest profile
linkedinnullLinked LinkedIn page
socialPlatformCount3Count of the 7 social platforms found on this store
leadQuality"high"Derived high / medium / low score
productCount238Published product count
publishedCollectionsCount226Published 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
offersShopPayInstallmentstrueWhether 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
appCount2len(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
hasEmailtrueBoolean flag mirroring email
hasPhonetrueBoolean 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

ParameterRequiredTypeDescriptionExample Value
nicheKeywordsarrayOne 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"]
marketCountrystringOptionally 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"
storesPerKeywordintegerHow many unique storefronts to discover per keyword before moving to the next one. Min 1, max 50. Default 10.10
storeUrlsarraySpecific Shopify storefront URLs you already know, scraped alongside anything discovered by keyword.["https://kyliecosmetics.com/"]
maxStoresToProcessintegerHard cap on the total number of stores (discovered + known) processed in this run. Min 1, max 10000.100
concurrencyintegerHow many stores to process in parallel. Min 1, max 50. Default 10.10
requestDelaynumberPause (seconds) between requests to the same storefront, to keep crawling polite. Min 0, max 10. Default 0.5.0.5
startUrlsarrayLegacy alias of storeUrls, kept so inputs built for the base actor keep working unchanged.[]
maxItemsintegerLegacy alias of maxStoresToProcess. Min 1, max 10000. Default 100.100
proxyConfigurationobjectApify 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 NameWhat it extracts
Shopify Products Scraper With Variant & SKU RowsPer-store product catalogues broken out to one row per variant/SKU
Shopify Scraper: Sales Channel & Product Templates DataSales-channel configuration and product-template data per store
Shopify Store Scraper — Markets, Currencies & CatalogsMulti-market storefront data: markets, currencies, and catalogue structure
Amazon DE Sellers Leads Scraper — Product Price & RatingsSeller-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 ApifyClient
client = 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.


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.