# Shopify Store Finder: Store Leads with Email, Apps, Theme (`themineworks/shopify-store-finder`) Actor

Find Shopify stores by niche keyword or check a domain list. One verified row per store: country, currency, product count, price range, product types, theme, apps, Instagram, Facebook, TikTok, email and phone. Every store is checked live as Shopify. No login.

- **URL**: https://apify.com/themineworks/shopify-store-finder.md
- **Developed by:** [The Mine Works](https://apify.com/themineworks) (community)
- **Categories:** Lead generation, E-commerce, Marketing
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 stores

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Shopify Store Finder: Store Leads with Email, Apps, Theme

[![20 Shopify stores for one niche keyword in 22 seconds, each verified live, with email, socials, theme and apps](https://api.apify.com/v2/key-value-stores/cUXz95yxflDho41nn/records/shopify-store-finder-hero.png)](https://console.apify.com/actors/CrvqTDqtzwXtO5XNT/input?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

From **The Mine Works**, makers of [Shopify Store Scraper](https://apify.com/themineworks/shopify-store-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral) and [B2B Leads Finder](https://apify.com/themineworks/b2b-leads-finder?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral), with over 140,000 runs across 170+ public actors.

Updated 21 Oct 2026: first release. Niche keyword search, a domain checker, country, language and product count filters, and one flat row per verified Shopify store with contact details, social links, theme, apps and catalogue numbers. Bookmark this Actor on its Store page so it is one click away next time.

### Why choose this actor?

- **Stores that really sell what you typed.** Keywords are searched in the Shop catalog, the shopping app Shopify runs for its own merchants, so every hit is a Shopify store with a live product that matches. In our test, "kombucha scoby" returned 80 stores and "dog treats" 60, with the matching product named in each row.
- **Every store checked live, then read like a lead.** Each domain is verified on the spot from its public Shopify shop record, and the row brings the registered country and city, currency, exact published product count, price range, top product types and vendors, the theme and its version, the apps in the page source, Instagram, Facebook, TikTok, X, YouTube, Pinterest and LinkedIn links, and the email, phone, trade name and business address the merchant published. In the 60 store "dog treats" test, 57 rows had an email and 52 an Instagram link.
- **Pay only for verified Shopify stores.** Sites that are not Shopify, closed shops, stores your filters leave out, duplicates and the summary rows are never charged. No Shopify account, cookies or API key.

[![Run it on Apify](https://api.apify.com/v2/key-value-stores/cUXz95yxflDho41nn/records/button-run.png)](https://console.apify.com/actors/CrvqTDqtzwXtO5XNT/input?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Part of The Mine Works E-commerce and marketplaces family:** [Ozon.ru Scraper](https://apify.com/themineworks/ozon-product-search?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral), [⭐ Amazon Reviews Scraper](https://apify.com/themineworks/amazon-reviews?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral), [Amazon Product Scraper](https://apify.com/themineworks/amazon-products?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral), [Etsy Listings Scraper](https://apify.com/themineworks/etsy-search-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral), [AliExpress Scraper](https://apify.com/themineworks/aliexpress-products?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral), [Kleinanzeigen.de Scraper](https://apify.com/themineworks/kleinanzeigen-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral).

### Try it in one minute

Paste this into the input (JSON view) and press Start. It returns 20 Shopify stores that sell organic skincare. It took 22 seconds in our test run:

```json
{
  "keywords": ["organic skincare"],
  "maxStores": 20
}
```

Put several niches on separate lines to build one list from all of them, or paste domains into `domains` to check stores you already know. A store found by two keywords is delivered once.

Apify's free plan includes $5 of credit every month, which covers about 900 stores at this actor's price.

#### Copy to your AI assistant

```text
themineworks/shopify-store-finder on Apify. Finds Shopify stores by niche keyword (Shop catalog search, Google top up) or checks a list of domains, verifies each one runs Shopify, and returns one flat row per store with no login. Call ApifyClient("TOKEN").actor("themineworks/shopify-store-finder").call(run_input={"keywords": ["organic skincare"], "maxStores": 50}), then client.dataset(run["defaultDatasetId"]).list_items().items. Give keywords (list of niche words, up to 50) or domains (list of domains or store links, up to 5000) or both. Optional: maxStores (default 50, 1 to 1000, per keyword), country (two letter code; keeps stores whose Shopify profile is in that country), language (two letter code; storefront language), minProducts (default 0), productPagesPerStore (default 1, 250 products a page, 1 to 10), contactPage (default true), useGoogle (default true). Store rows have no _type field and carry domain, url, store_name, title, description, myshopify_domain, shop_id, country, province, city, currency, language, ships_to_countries_count, ships_worldwide, product_count, product_count_source, products_read, collection_count, price_min, price_max, price_median, products_on_sale, top_product_types (name, count), top_vendors (name, count), top_tags, first_product_date, first_product_date_exact, latest_product_date, sample_products (title, price, product_type, url), email, emails, phone, phones, trade_name, business_address, tax_id, registration_number, instagram, facebook, tiktok, x_twitter, youtube, pinterest, linkedin, theme_name, theme_custom_name, theme_version, theme_store_id, apps, app_categories, app_extension_handles, app_count, shop_pay_installments, card_brands, og_image, logo_url, shop_app_rating, shop_app_rating_count, shop_app_review_count, matched_product, matched_product_url, password_protected, shopify_signals, is_shopify, discovered_via (shop_catalog, google or input), keyword, input_domain, position, scraped_at. Each run also writes one row with _type "summary", one with _type "info" when stores were delivered, and a row with _type "error" for each domain that is not a live Shopify store; none of these is charged. Full spec: GET https://api.apify.com/v2/acts/themineworks~shopify-store-finder/builds/default (Bearer TOKEN), which returns inputSchema and readme. Token: https://console.apify.com/account/integrations?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral
```

### Key features

- **Niche search that goes deep.** Each keyword is read page after page in the Shop catalog, 30 matching products a page, and each new store on a page is verified and read. Popular niches keep going for hundreds of stores; "dog treats" gave 60 stores from 10 pages in our test.
- **Google top up.** When the catalog has no more new stores for a keyword, Google results for that keyword plus "powered by shopify" are checked too, and only verified Shopify stores are kept. In our test one Google page added 7 stores.
- **Domain checker.** Paste up to 5,000 domains, store links or `.myshopify.com` addresses. Each gets a full row when it is a live Shopify store, or a free error row that says why not (not Shopify, closed shop, no answer).
- **The merchant's own contact record.** Besides the homepage, the actor reads the store's Shopify "Contact information" page, a short record many merchants fill in with trade name, email, phone, business address and VAT or company number, then the privacy policy and the contact page when no email has turned up yet.
- **Theme and app stack.** The live theme (for example Dawn, Prestige, Broadcast), its version and Theme Store id, more than 70 known apps and pixels by their scripts (Klaviyo, Judge.me, Yotpo, ReCharge, Rebuy, Gorgias, Meta Pixel, TikTok Pixel and more), and the handles of every Shopify app extension the theme loads.
- **Catalogue numbers.** Exact published product and collection counts from the store's profile, plus price range, median price, products on sale, top product types, vendors and tags, and the oldest and newest product dates from the product feed.
- **Filters that cost nothing extra.** `country`, `language` and `minProducts` are applied as soon as the data for them is in, so a store that is left out costs one small request and no charge.

### How to use it

#### Basic: one niche

```json
{
  "keywords": ["dog treats"],
  "maxStores": 200
}
```

Sort by `product_count` to find established catalogues, or filter on `email` to keep stores you can write to.

#### Local market list

```json
{
  "keywords": ["handmade leather wallets"],
  "country": "GB",
  "maxStores": 50
}
```

Only stores whose Shopify profile is in the United Kingdom are kept, and the search favours stores that ship there. Keywords in the local language work best for non English markets, for example `naturkosmetik` with `"country": "DE"`.

#### App developers: stores without a given app

Run a few niches, then filter the rows on `apps` (for example no `Klaviyo` and no `Omnisend`) and `product_count` above 50. `theme_name` and `app_extension_handles` show what the store already runs.

#### Check a list you already have

```json
{
  "domains": ["allbirds.com", "https://www.greenpeople.co.uk", "colourpop.com"]
}
```

Every domain is checked; Shopify stores get the full row, other sites an error row with the reason. Filters do not apply to this list.

#### Bigger catalogues, more product fields

```json
{
  "keywords": ["soy candles"],
  "maxStores": 100,
  "minProducts": 20,
  "productPagesPerStore": 4
}
```

Up to 1,000 products per store are read for price range, product types, vendors and the first product date. The product count itself always comes from the store's profile.

### Input parameters

| Parameter | Type | Default | What it does |
|---|---|---|---|
| `keywords` | array of strings | empty | Niches, one search each, for example `organic skincare`. Up to 50. |
| `domains` | array of strings | empty | Domains or store links to check. Up to 5,000. |
| `maxStores` | integer | `50` | Most stores per keyword, 1 to 1,000. |
| `country` | string | empty | Two letter code. Keeps stores registered in that country (keyword searches). |
| `language` | string | empty | Two letter code. Keeps stores whose storefront is in that language (keyword searches). |
| `minProducts` | integer | `0` | Leaves out stores with fewer published products (keyword searches). |
| `productPagesPerStore` | integer | `1` | Product feed pages read per store, 250 products each, 1 to 10. |
| `contactPage` | boolean | `true` | Reads /pages/contact when no email was found elsewhere. |
| `useGoogle` | boolean | `true` | Tops a keyword up from Google when the catalog runs out. |

Give `keywords`, `domains` or both.

### What data do you get?

One row per verified Shopify store. Store rows have no `_type` field; the summary, info and error rows do, so a filter on `_type` separates them.

| Field | What it is |
|---|---|
| `domain`, `url` | Store domain without www, and the storefront link |
| `store_name`, `title`, `description` | Store name, homepage title and meta description |
| `myshopify_domain`, `shop_id` | The store's .myshopify.com address and Shopify shop id |
| `country`, `province`, `city` | Location on the store's Shopify profile |
| `currency`, `language` | Store currency and storefront language, e.g. `GBP`, `en-GB` |
| `ships_to_countries_count`, `ships_worldwide` | How many countries it ships to |
| `product_count`, `product_count_source`, `collection_count` | Published products and collections |
| `products_read` | Products read from the feed for the fields below |
| `price_min`, `price_max`, `price_median`, `products_on_sale` | Price range in the store currency |
| `top_product_types`, `top_vendors`, `top_tags` | What the store sells most, with counts |
| `first_product_date`, `first_product_date_exact`, `latest_product_date` | Oldest and newest product dates; exact when the whole catalogue was read |
| `sample_products` | First three products with title, price, type and link |
| `email`, `emails`, `phone`, `phones` | Contact details the store publishes (store domain emails first) |
| `trade_name`, `business_address`, `tax_id`, `registration_number` | From the store's Contact information page, when filled in |
| `instagram`, `facebook`, `tiktok`, `x_twitter`, `youtube`, `pinterest`, `linkedin` | Social profile links |
| `theme_name`, `theme_custom_name`, `theme_version`, `theme_store_id` | Live theme |
| `apps`, `app_categories`, `app_count`, `app_extension_handles` | Apps and pixels seen in the page source |
| `shop_pay_installments`, `card_brands` | Payment options from the store profile |
| `og_image`, `logo_url` | Sharing image and logo |
| `shop_app_rating`, `shop_app_rating_count`, `shop_app_review_count` | Product rating in the Shop app (catalog finds) |
| `matched_product`, `matched_product_url` | The product that matched your keyword |
| `password_protected`, `shopify_signals`, `is_shopify` | Storefront state and what proved it is Shopify |
| `discovered_via`, `keyword`, `input_domain`, `position` | How the store was found |
| `scraped_at` | When the row was written |

**Summary row** (`_type: "summary"`, never charged): `stores_checked`, `stores_delivered`, `charged_for`, `not_shopify`, `unreachable`, `filtered_country`, `filtered_language`, `filtered_min_products`, `duplicates_skipped`, `stores_with_email`, `stores_with_phone`, `stores_with_instagram`, `catalog_pages`, `google_pages`, `http_requests`, `ended_on_deadline`, `stopped_by_max_cost`, `shortfall_reason` when fewer stores came back than asked, and `per_keyword`, one entry per keyword with pages read, stores delivered and why it `stopped`. The same summary is saved as the `OUTPUT` record of the run.

**Error rows** (`_type: "error"`, never charged): one per domain in `domains` that is not a live Shopify store, with `error_type` (`invalid_domain`, `not_shopify`, `shop_unavailable`, `unreachable`), `identifier`, `reason` and `http_status`.

#### Stable fields for automations

These were present in every store row of our test runs (511 stores from 8 runs), and their names will not change:

| Field | What it is |
|---|---|
| `domain` | The key to store and join on |
| `url` | Storefront link |
| `store_name` | Store name |
| `myshopify_domain` | Shopify address |
| `country` | Registered country |
| `currency` | Store currency |
| `product_count` | Published products |
| `apps` | Apps found (may be empty) |
| `is_shopify` | Always true |
| `discovered_via` | Source |
| `scraped_at` | Row time |

Optional, present only when the store publishes a value. Fill rates from a 300 store test ("soy candles" and "pet supplements"): `email` 271, `instagram` 242, `facebook` 222, `apps` with at least one app 278, `theme_name` 291, `phone` 124, `tiktok` 90, `price_min` (stores with a public product feed) 289, `trade_name` 60, `business_address` (stores that filled in the Contact information page), `tax_id`, `theme_store_id` (themes from the Theme Store only) and the `shop_app_` fields (catalog finds only).

#### Output examples

One store from the "handmade leather wallets" search with `"country": "GB"` (test run, 21 Oct 2026, trimmed):

```json
{
  "domain": "harberlondon.com",
  "url": "https://www.harberlondon.com",
  "store_name": "Harber London",
  "myshopify_domain": "struendo.myshopify.com",
  "country": "GB",
  "city": "London",
  "currency": "GBP",
  "product_count": 125,
  "collection_count": 81,
  "price_min": 7.5,
  "price_max": 999,
  "price_median": 99,
  "top_product_types": [
    { "name": "Bags", "count": 38 },
    { "name": "Sleeves", "count": 37 },
    { "name": "Wallets", "count": 18 }
  ],
  "first_product_date": "2015-03-25",
  "first_product_date_exact": true,
  "email": "support@harberlondon.com",
  "trade_name": "Harber London",
  "business_address": "Harber London Ltd, Unit 104 The Light Box, 111 Power Road, London W4 5PY, United Kingdom",
  "tax_id": "GB260921613",
  "instagram": "https://www.instagram.com/harberlondon",
  "tiktok": "https://www.tiktok.com/@harber_london",
  "linkedin": "https://www.linkedin.com/company/10073151",
  "theme_name": "Harber Atelier",
  "apps": ["Klaviyo", "Judge.me", "Klarna"],
  "shop_pay_installments": true,
  "shop_app_rating": 4.36,
  "shop_app_review_count": 3258,
  "discovered_via": "shop_catalog",
  "keyword": "handmade leather wallets",
  "position": 1
}
```

A US store from the "dog treats" search (same day, trimmed):

```json
{
  "domain": "kingloupets.com",
  "store_name": "King Lou Pets",
  "country": "US",
  "province": "Indiana",
  "city": "Zionsville",
  "product_count": 97,
  "price_min": 6,
  "price_max": 899,
  "top_product_types": [{ "name": "Dog Treats", "count": 47 }, { "name": "Merch", "count": 30 }],
  "email": "hello@kingloupets.com",
  "phone": "(844) 546-4568",
  "instagram": "https://www.instagram.com/kingloupets",
  "facebook": "https://www.facebook.com/kingloupets",
  "theme_name": "Venue",
  "theme_version": "7.0.2",
  "theme_store_id": 836,
  "apps": ["Klaviyo", "Judge.me", "Rebuy", "Gorgias", "Microsoft Clarity", "Elevar", "Instafeed"],
  "matched_product": "whole chicken feet",
  "discovered_via": "shop_catalog",
  "keyword": "dog treats"
}
```

An error row for a domain that is not Shopify (nothing charged):

```json
{ "_type": "error", "error_type": "not_shopify", "identifier": "example.com", "reason": "No Shopify signal: /meta.json answered 404, the homepage 200 without Shopify scripts or headers.", "http_status": 200 }
```

### Pricing

Pay per event: you pay for the verified Shopify stores you receive, plus a flat $0.003 per run, whatever memory you choose. Reading more product pages, the contact page or Google costs nothing extra.

| Event | When it is charged | Free plan | Bronze (Starter) | Silver (Scale) | Gold (Business) |
|---|---|---|---|---|---|
| `store-found` | Once per verified Shopify store row stored in your dataset | $5.00 per 1,000 | $4.25 per 1,000 | $3.50 per 1,000 | $3.00 per 1,000 |
| `run-start` | Once per run, when the first verified store is delivered | $0.003 | $0.003 | $0.003 | $0.003 |

The price of one store is the price per 1,000 divided by 1,000.

Never charged:

- domains that are not Shopify, closed shops and sites that do not answer (each listed domain gets an error row);
- stores your `country`, `language` or `minProducts` filters leave out;
- a store that a second keyword of the same run finds again;
- stores past your `maxStores`;
- the summary, info and error rows;
- a run that delivers no store: the start fee is charged only when the first store is delivered;
- anything past your "Max cost per run". The actor checks the budget before each batch of rows and stops while the total is still below your limit, so the run ends SUCCEEDED with a partial result and a status message saying so.

### Run it on a schedule

1. Open the actor in Apify Console, set your input and click **Save as a new task**.
2. In the task, open **Schedules**, click **Add schedule** and pick how often (every Monday at 08:00, the first of the month and so on).
3. Compare runs on `domain` to see stores that are new in your niche, and on `apps` or `theme_name` to see who switched tools.
4. Optional: add an integration (Google Sheets, HubSpot through Make or Zapier, a webhook) so each run lands where your sales team works.

### FAQ

#### How does it find stores?

Each keyword is searched in the Shop catalog, the public product search of Shop, the shopping app Shopify runs for its merchants. Its results come only from Shopify stores, so the store behind each matching product is a real Shopify lead in that niche. When the catalog runs out of new stores, Google is asked for the keyword plus "powered by shopify". Every candidate is then checked on its own domain before it becomes a row.

#### How is a store verified as Shopify?

By the store's public Shopify shop record at `/meta.json` (it carries the shop id and the .myshopify.com address), or by the `Shopify.shop` script or Shopify's powered-by header on a live homepage. `shopify_signals` lists what was found. A .myshopify.com name with no live shop behind it is reported as `shop_unavailable` and not charged.

#### Why do some rows have no email or phone?

The actor only returns contact details the store itself publishes: on the homepage, in the Contact information page, in the privacy policy or on the contact page. Some stores show a contact form only. Emails are found, not tested for delivery.

#### Is the product count exact?

Yes when `product_count_source` is `meta.json`: that is the published product count on the store's own Shopify record, which nearly every store has. Price range, product types, vendors and product dates come from the first `productPagesPerStore` pages of the product feed (250 products a page); `first_product_date_exact` is true when the whole catalogue was read.

#### How many stores can I get?

Up to 1,000 per keyword and 50 keywords per run, plus up to 5,000 domains to check. Popular niches go deep; narrow ones end when the catalog and Google have no new stores, and the summary row says why. A store found by two keywords counts once.

#### How long does a run take?

In our tests: 22 seconds for the "Try it" input (20 stores), 89 seconds for 60 stores, 109 seconds for 80 stores, and 514 seconds for 300 stores from 2 keywords, so about 1.4 to 1.7 seconds per store. The default time limit is 3,600 seconds; the actor stops before it and keeps every row.

#### What does the country filter do?

It keeps stores whose Shopify profile lists that country, and asks the catalog for stores that ship there. Many stores ship worldwide, so with a filter on, the actor reads more pages to fill your list; stores it leaves out are not charged. Use keywords in the local language for the best yield.

#### Can it miss apps?

Yes. Apps are read from the homepage source. Some load only on product or cart pages, or after a click, so a missing app is not proof the store does not use it. `app_extension_handles` lists every Shopify app extension the theme loads, including apps not in the named list.

#### Do I need an account, cookies or a proxy?

No. The actor reads public pages and public JSON feeds, using Apify Proxy where a site asks for it, which is included. Nothing to set up.

#### Which actor should I use for a store's full product list?

[Shopify Store Scraper](https://apify.com/themineworks/shopify-store-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral) returns every product of a store with variants, prices and SKUs. For leads outside Shopify, [B2B Leads Finder](https://apify.com/themineworks/b2b-leads-finder?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral) and [Google Maps Email Scraper](https://apify.com/themineworks/maps-leads?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral).

#### Which formats can I download?

JSON, CSV, Excel, XML, RSS and HTML from the run's Storage tab or through the API. The dataset has three ready views: Stores, Contacts, and Theme and apps. In CSV and Excel, list fields are flattened into columns such as `apps/0` and `top_product_types/0/name`.

#### Can I use it from Claude, ChatGPT or Cursor (MCP)?

Yes, through Apify's MCP server. Connector URL: https://mcp.apify.com/?tools=themineworks/shopify-store-finder

- Claude: Settings > Connectors > Add custom connector, paste the URL, sign in with Apify.
- ChatGPT: turn on developer mode, add an MCP connector with the URL, sign in with Apify.
- Cursor or VS Code: add it as an HTTP MCP server with that URL.
- Claude Code: `claude mcp add -t http shopify-store-finder "https://mcp.apify.com/?tools=themineworks/shopify-store-finder"`

#### Is it legal to collect this data?

The actor reads only public pages and records that any visitor can open without logging in, mostly business information that stores publish to be found. You are responsible for how you use it, including the stores' terms, anti spam rules for outreach and data protection law such as GDPR and CCPA. This actor is not made or endorsed by Shopify. This is general information, not legal advice.

### Integrations

- **Google Sheets**: send each run's stores to a sheet with Apify's Google Sheets integration; one row per store fits a sheet as is.
- **Make, Zapier and n8n**: start a run and read its dataset with the Apify apps and nodes, for example "new stores in our niche every Monday to HubSpot".
- **Webhooks**: have Apify call your URL when a run succeeds, then fetch the dataset.
- **API and SDKs**: run it from Python or JavaScript with the Apify client, or with a plain HTTP call (see "Copy to your AI assistant" above).
- **MCP clients**: Claude, ChatGPT, Cursor and VS Code can run it as a tool through the connector URL in the FAQ.

### More from The Mine Works

**E-commerce and marketplaces**

- [Ozon.ru Scraper](https://apify.com/themineworks/ozon-product-search?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [⭐ Amazon Reviews Scraper](https://apify.com/themineworks/amazon-reviews?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Amazon Product Scraper](https://apify.com/themineworks/amazon-products?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Etsy Listings Scraper](https://apify.com/themineworks/etsy-search-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [AliExpress Scraper](https://apify.com/themineworks/aliexpress-products?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Kleinanzeigen.de Scraper](https://apify.com/themineworks/kleinanzeigen-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Carsales.com.au Scraper](https://apify.com/themineworks/carsales-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [eBay Product Listings Scraper](https://apify.com/themineworks/ebay-search-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Shopify Store Scraper](https://apify.com/themineworks/shopify-store-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [🛒 TikTok Shop Scraper](https://apify.com/themineworks/tiktok-shop-products?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Walmart Product & Price Scraper](https://apify.com/themineworks/walmart-product-price-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Vinted Scraper](https://apify.com/themineworks/vinted-listings-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Social media and video**

- [Threads Scraper](https://apify.com/themineworks/threads-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Reddit Scraper](https://apify.com/themineworks/reddit-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Threads Search Scraper](https://apify.com/themineworks/threads-search-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Instagram Profile Scraper](https://apify.com/themineworks/instagram-profile-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Leads and business directories**

- [B2B Leads Finder](https://apify.com/themineworks/b2b-leads-finder?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Skip Trace Lookup](https://apify.com/themineworks/skip-trace-lookup?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Google Maps Email Scraper](https://apify.com/themineworks/maps-leads?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [2GIS Places Scraper](https://apify.com/themineworks/2gis-places-search?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Marketing, SEO and reviews**

- [Facebook Ad Library Scraper](https://apify.com/themineworks/meta-ad-library-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Google Ads Transparency Scraper](https://apify.com/themineworks/google-ads-transparency?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Similarweb Scraper](https://apify.com/themineworks/similarweb-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Google News Scraper](https://apify.com/themineworks/google-news?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**LinkedIn**

- [LinkedIn Company Scraper](https://apify.com/themineworks/linkedin-company-details?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [LinkedIn Post Scraper](https://apify.com/themineworks/linkedin-post-search?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [LinkedIn Employees Scraper](https://apify.com/themineworks/linkedin-employees?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [LinkedIn Profile Scraper](https://apify.com/themineworks/linkedin-profile-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Real estate**

- [Zillow Rentals Scraper](https://apify.com/themineworks/zillow-rental-listings?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Zillow Sold Comps Scraper](https://apify.com/themineworks/zillow-recently-sold?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [India Real Estate MCP](https://apify.com/themineworks/india-real-estate-mcp?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Housing.com Scraper](https://apify.com/themineworks/housing-com-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Science, health and government data**

- [Academic Research MCP](https://apify.com/themineworks/academic-research-mcp?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [CourtListener Scraper](https://apify.com/themineworks/courtlistener-court-records?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Socrata Open Data Scraper](https://apify.com/themineworks/socrata-open-data?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [OpenAlex Scraper](https://apify.com/themineworks/openalex-scholarly-works?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Jobs and hiring**

- [Foundit Monster India Jobs](https://apify.com/themineworks/foundit-jobs-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Hirist Jobs Scraper](https://apify.com/themineworks/hirist-jobs-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [India Jobs MCP](https://apify.com/themineworks/india-jobs-mcp?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Naukri Jobs Scraper](https://apify.com/themineworks/naukri-jobs?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Company and business data**

- [Company Domain Finder](https://apify.com/themineworks/company-domain-finder?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [GST Taxpayer Lookup](https://apify.com/themineworks/gst-taxpayer-lookup?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Company KYB Resolver](https://apify.com/themineworks/company-identity-resolver?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [SEC EDGAR Filings Scraper](https://apify.com/themineworks/sec-edgar-filings?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Food and local services**

- [NoBroker Scraper](https://apify.com/themineworks/nobroker-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Swiggy Restaurant Scraper](https://apify.com/themineworks/swiggy-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Zomato Scraper](https://apify.com/themineworks/zomato-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Developer and AI tools**

- [Website to Markdown Crawler](https://apify.com/themineworks/rag-crawler?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [GitHub Skill Finder](https://apify.com/themineworks/github-skill-discovery?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [GitHub Repo Scraper](https://apify.com/themineworks/github-repo-intelligence?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [GitHub Trending Scraper](https://apify.com/themineworks/github-trending-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**More tools**

- [G2 Reviews Scraper](https://apify.com/themineworks/g2-reviews-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Naver Blog Scraper](https://apify.com/themineworks/naver-blog-posts-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [WeChat Article Scraper 微信公众号文章](https://apify.com/themineworks/wechat-article-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Taobao Products Scraper 淘宝 天猫](https://apify.com/themineworks/taobao-products-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

### Support

Found a niche that returns fewer stores than it should, or a field that comes back empty for a store that shows it? Open an issue in the Issues tab with the input and the run ID, and we will look at it. For a field you need, email dmineworks@gmail.com.

*Find Shopify stores by niche keyword, or check your own list, and get one verified row per store with country, product count, price range, theme, apps, social links, email and phone, no login.*

# Actor input Schema

## `keywords` (type: `array`):

What the stores sell, one keyword per line, the way a shopper would search: organic skincare, dog treats, yoga mats, candles. Each keyword is its own search and returns up to maxStores stores. Up to 50 keywords per run.

## `domains` (type: `array`):

Store domains or links to check, one per line, for example allbirds.com, https://www.gymshark.com or kylie-cosmetics.myshopify.com. Each one is checked for Shopify; Shopify stores get a full row, other sites get a free error row that says why. Up to 5,000 per run.

## `maxStores` (type: `integer`):

The most stores to return for each keyword, 1 to 1,000. Popular niches go deep; very narrow ones may end sooner, and the summary row says why. Domains you list are all checked, whatever this number.

## `country` (type: `string`):

Two letter country code, for example US, GB, DE, AU, IN. Only stores registered in that country (the country on the store's own Shopify profile) are returned, and the search favours stores that ship there. Leave empty for every country. Applies to keyword searches, not to the domains you list.

## `language` (type: `string`):

Two letter language code, for example en, de, fr, es. Only stores whose storefront is in that language are returned. Leave empty for every language. Applies to keyword searches, not to the domains you list.

## `minProducts` (type: `integer`):

Leave out stores with fewer published products than this, for example 10 to skip tiny or test stores. 0 keeps every store. Applies to keyword searches.

## `productPagesPerStore` (type: `integer`):

How many pages of the store's public product feed to read, 250 products a page, 1 to 10. Price range, product types, vendors and the first product date come from these pages. The product count comes from the store's own profile whatever this number. More pages is slower, same price.

## `contactPage` (type: `boolean`):

On: when the homepage shows no email address, the store's /pages/contact page is read too, for email, phone and social links. Same price either way.

## `useGoogle` (type: `boolean`):

On: when the Shop catalog has no more new stores for a keyword, Google results for that keyword plus "powered by shopify" are checked too, and only verified Shopify stores are kept. Same price either way.

## Actor input object example

```json
{
  "keywords": [
    "organic skincare"
  ],
  "maxStores": 20,
  "minProducts": 0,
  "productPagesPerStore": 1,
  "contactPage": true,
  "useGoogle": true
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `summary` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "keywords": [
        "organic skincare"
    ],
    "maxStores": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("themineworks/shopify-store-finder").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "keywords": ["organic skincare"],
    "maxStores": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("themineworks/shopify-store-finder").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "keywords": [
    "organic skincare"
  ],
  "maxStores": 20
}' |
apify call themineworks/shopify-store-finder --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,themineworks/shopify-store-finder"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/CrvqTDqtzwXtO5XNT/builds/emPitU6bCfxLS8wiP/openapi.json
