# Shopify Store Leads Scraper — Emails, Phones & Socials (`memo23/shopify-store-leads-scraper`) Actor

Discover Shopify stores by product keyword or category on the Shop marketplace — no store URL needed. Extract emails, phones, addresses, ratings, socials and a sample product per store. Optional enrichment scrapes each store's own site for more contacts. Filter by location & price.

- **URL**: https://apify.com/memo23/shopify-store-leads-scraper.md
- **Developed by:** [Muhamed Didovic](https://apify.com/memo23) (community)
- **Categories:** Lead generation, E-commerce, AI
- **Stats:** 1 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.99 / 1,000 store scrapeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Shopify Store Leads Scraper — Emails, Phones, Socials & Ratings

Discover Shopify stores by product **keyword** or **category** and pull back structured store leads — website, emails, phone numbers, business address, star rating, social profiles and a sample product — with no store URL needed. Optional email enrichment fetches each store's own site to surface contacts the marketplace never lists.

Built for B2B outreach, supplier sourcing, agency prospecting and e-commerce market research.

![How the Shopify Store Leads Scraper works](https://raw.githubusercontent.com/muhamed-didovic/muhamed-didovic.github.io/main/assets/how-it-works-shopify-store-leads.png)

### Why use this Shopify Store Leads Scraper?

- **No store URLs required** — search by what stores *sell* ("organic coffee", "serum", "yoga mat") or browse a whole category. The scraper finds the stores for you.
- **Real contact leads** — emails, phones, and Facebook / Instagram / Pinterest / YouTube / TikTok / Twitter / LinkedIn profiles, plus the store's own website and `.myshopify.com` domain.
- **Optional email enrichment** — turn it on and the actor visits each store's own website and reads its contact / about pages to find emails, phones and socials the marketplace does not expose. This is the difference between a website and an actual address to email.
- **Ratings & social proof** — average product rating, total ratings and total reviews for every store, so you can prioritise established merchants.
- **Location & price filters** — target a country or region, or filter by the store's sample-product price and on-sale status.
- **One row per store, billed per store** — clean, deduplicated output. Export to JSON, CSV, Excel or HTML, or pull it over the API.

### What does the Shopify Store Leads Scraper do?

It searches the **Shop by Shopify marketplace** ([shop.app](https://shop.app)) — the consumer marketplace that indexes hundreds of thousands of real Shopify stores — to discover merchants that match your keyword or category, then enriches each one with contact and profile data.

- 🔍 **Search by keyword** — find stores that sell a specific product.
- 📂 **Browse by category** — 14 top-level categories (Beauty, Electronics, Home, Food & drinks, Pet supplies…), alone or combined with a keyword.
- 🌍 **Filter by location** — a single country (US, GB, DE…) or a named region (Europe, North America, English-speaking, UK & Ireland, Nordics, Oceania, Worldwide).
- 📧 **Extract contacts** — emails, phones and seven social networks straight from the marketplace, merged with anything found on the store's own site when enrichment is on.
- ⭐ **Ratings & reviews** — average rating, total ratings, total review count.
- 🛍️ **Sample product** — a representative product per store (title, price, currency, on-sale flag) when discovered via category / price search.
- 💳 **Payment detection** *(optional)* — flags whether the store's site exposes a real checkout / payment processor (Stripe, Shopify Payments…), qualifying it as a business that transacts online.

### Supported inputs

| Input | What it does |
|-------|--------------|
| **Search query** | Product keyword to find stores that sell it. Optional if a category is set. |
| **Category** | One of 14 product categories to browse. Optional if a query is set. |
| **Store location** | Restrict to a country or a named region. |
| **Min / Max price** | Keep stores whose sample product falls in a price band. |
| **On sale only** | Keep stores whose sample product is currently discounted. |
| **Max stores** | Cap on unique stores returned (one billable row each). |
| **Enrich with store website emails** | Fetch each store's own site for extra emails / phones / socials. |
| **Detect payment stack** | During enrichment, flag the store's payment / checkout processor. |

> You must provide **at least one** of *Search query* or *Category*.

### Use cases

**B2B lead generation** — Build targeted prospect lists of Shopify store owners by niche and location, with direct contact details for cold outreach. Turn on enrichment to get real inboxes, not just homepages.

**Supplier & wholesale discovery** — Find every store selling a given product across the Shopify ecosystem, compare ratings and price points, and shortlist suppliers or partners.

**Agency prospecting** — Discover stores in a vertical and build outreach lists for design, marketing, fulfilment, CRO or Shopify-app services. Payment detection tells you which ones already sell online.

**Market & competitor research** — Map how many stores operate in a category, where they're based, and how they're rated — a fast read on any niche's competitive landscape.

**CRM enrichment** — Feed a keyword or category and export straight to CSV / Excel to append emails, phones and socials onto an existing account list.

### How it works

1. **You enter** a product keyword, a category, or both — plus any location / price filters.
2. The actor discovers matching Shopify stores from the Shop marketplace. Keyword-only searches use the store index directly; category or price searches use product discovery and derive the store behind each product.
3. Each unique store is mapped to a clean lead row — website (tracking parameters stripped), `.myshopify.com` domain, emails, phones, socials, address, rating and reviews.
4. **If email enrichment is on**, the store's own website is fetched and its contact / about pages are scanned for additional emails, phones and social links, which are merged into the row.
5. Each store is written to the dataset as **one row**, ready to export or pull over the API.

### Input configuration

Run it from the Apify Console UI, or via the API / SDK. Example input:

```json
{
    "query": "organic coffee",
    "storeLocation": "US",
    "maxItems": 200,
    "enrichEmails": true,
    "detectPayment": true
}
```

Category browse with a price floor:

```json
{
    "category": "Beauty",
    "query": "serum",
    "priceMin": 20,
    "maxItems": 100
}
```

### Output overview

Every store is one dataset row. Below is a real, lightly-trimmed example (`enrichEmails: true`):

```json
{
    "id": "4521218",
    "shopifyId": "55854628923",
    "name": "IncaFé Organic Coffee",
    "website": "https://www.incafe.co.nz/",
    "myshopifyDomain": "incafe-organic-coffee.myshopify.com",
    "shopUrl": "https://shop.app/m/incafe-organic-coffee",
    "email": "coffee@incafe.co.nz",
    "emails": ["coffee@incafe.co.nz"],
    "phone": "06 759 1680",
    "phones": ["06 759 1680"],
    "socials": {
        "facebook": "https://facebook.com/incafeorganic",
        "instagram": "https://instagram.com/incafeorganic"
    },
    "address": {
        "address1": "6 Cody Place",
        "city": "New Plymouth",
        "state": "Taranaki",
        "stateCode": null,
        "country": "NZ",
        "postalCode": null,
        "company": null,
        "formatted": ["6 Cody Place", "Fitzroy", "Taranaki", "New Plymouth 4312", "New Zealand"]
    },
    "rating": 4.9016,
    "totalRatings": 61,
    "totalReviews": 20,
    "sampleProduct": {
        "title": "Organic House Blend",
        "price": 18.5,
        "currency": "NZD",
        "originalPrice": null,
        "onSale": false,
        "url": "https://www.incafe.co.nz/products/organic-house-blend"
    },
    "contacts": [
        { "method": "website", "target": "https://www.incafe.co.nz/" },
        { "method": "email", "target": "coffee@incafe.co.nz" },
        { "method": "phone", "target": "06 759 1680" },
        { "method": "facebook", "target": "https://facebook.com/incafeorganic" },
        { "method": "instagram", "target": "https://instagram.com/incafeorganic" }
    ],
    "emailEnrichment": {
        "website": "https://www.incafe.co.nz",
        "emails": ["coffee@incafe.co.nz"],
        "source": "site-scrape",
        "confidence": "high",
        "phones": ["06 759 1680"],
        "payment": { "takesPayments": true, "processors": ["shopify"], "confidence": "medium" }
    },
    "scrapedAt": "2026-08-08T13:21:43.220Z"
}
```

Download as **JSON, CSV, Excel or HTML** from the dataset tab, or fetch via the API.

### Key output fields

| Field | Type | Description |
|-------|------|-------------|
| `id` | string | Shop marketplace store id |
| `shopifyId` | string | Underlying Shopify shop id |
| `name` | string | Store name |
| `website` | string | Store's own website (tracking params stripped) |
| `myshopifyDomain` | string | `store.myshopify.com` domain |
| `shopUrl` | string | Shop marketplace profile URL |
| `email` / `emails` | string / array | Primary email and all emails found |
| `phone` / `phones` | string / array | Primary phone and all phones found |
| `socials` | object | Facebook, Instagram, Pinterest, YouTube, TikTok, Twitter, LinkedIn |
| `address` | object | address1/2, city, state, stateCode, country, postalCode, company, formatted\[] |
| `rating` | number | Average product rating (out of 5) |
| `totalRatings` | number | Number of ratings |
| `totalReviews` | number | Number of written reviews |
| `sampleProduct` | object | Representative product (title, price, currency, originalPrice, onSale, url) |
| `contacts` | array | Every contact method as `{ method, target }` |
| `emailEnrichment` | object | Present when enrichment is on — website, emails, phones, socials, source, confidence, payment |
| `scrapedAt` | string | ISO timestamp |

### FAQ

**Do I need a store URL?** No. You search by keyword or category; the scraper discovers the stores.

**Where does the data come from?** The public Shop by Shopify marketplace (shop.app), which indexes real Shopify merchants and their storefront metadata.

**Why is `email` empty for some stores?** Not every store publishes an email on the marketplace. Turn on **Enrich with store website emails** to fetch the store's own site and find one — it's best-effort and skews toward stores that run a full website. `phone` and `address` are likewise present only when the store exposes them.

**Why is the sample-product currency sometimes different from the store's country?** Marketplace prices are returned in the currency inferred for the run's location, so amounts and currency codes can vary between rows. Treat `sampleProduct.price` as an indicative figure, not a billing-exact quote.

**How does the location filter behave for stores with no address?** Stores that publish no country are *kept* rather than dropped, so you don't lose leads to missing metadata. Stores that do publish a country are filtered strictly.

**Can I get more stores per run?** Yes — raise **Max stores**. The marketplace routinely returns hundreds to thousands of stores for a broad keyword.

**Is this affiliated with Shopify?** No. It reads publicly available marketplace data and is not endorsed by or affiliated with Shopify Inc.

### Support

Found a bug or need a field added? Open an issue on the actor's **Issues** tab in the Apify Console and it'll be looked at.

### Additional services

Turn on **email enrichment** to convert store websites into real, mailable contacts — the single biggest lift for outbound campaigns. Pair with payment detection to prioritise stores that already transact online.

### Explore more scrapers

This actor pairs well with product-level and storefront scrapers for building a full e-commerce dataset — discover the stores here, then drill into their catalogs.

### 🤖 For AI Agents & LLM Apps

This actor is a clean tool call for agentic workflows — deterministic JSON in, structured leads out.

```
Shopify Store Leads Scraper (memo23/shopify-store-leads-scraper) discovers Shopify stores on the Shop marketplace and extracts contact leads.
Call via ApifyClient: client.actor("memo23/shopify-store-leads-scraper").call(run_input={"query": "organic coffee", "maxItems": 50, "enrichEmails": true}).
Inputs: query (string keyword), category (string — one of Women, Men, Accessories, Beauty, Home, Electronics, "Luggage & bags", "Toys & games", "Pet supplies", "Fitness & nutrition", "Baby & toddler", "Food & drinks", "Sporting goods", "Arts & crafts"; at least one of query/category required), storeLocation (country code like "US"/"GB" or region "EUROPE"/"NORTH_AMERICA"/"ENGLISH_SPEAKING"/"UK_IRELAND"/"NORDICS"/"OCEANIA"/"GLOBAL"), priceMin (int), priceMax (int), onSale (bool), maxItems (int 1–10000, default 50), enrichEmails (bool — fetch each store's own site for extra emails/phones/socials), detectPayment (bool), maxConcurrency (int, default 10).
Output per store: id, shopifyId, name, website, myshopifyDomain, shopUrl, email, emails[], phone, phones[], socials{facebook,instagram,pinterest,youtube,tiktok,twitter,linkedin}, address{address1,city,state,country,postalCode,formatted[]}, rating, totalRatings, totalReviews, sampleProduct{title,price,currency,onSale,url}, contacts[{method,target}], emailEnrichment{emails,phones,source,confidence,payment}, scrapedAt.
Get an API token: https://console.apify.com/account#/integrations
```

### ⚠️ Disclaimer

This actor extracts only publicly available information from the Shop by Shopify marketplace and public store websites. It does not access private, gated, or authenticated data, and it is not affiliated with, endorsed by, or sponsored by Shopify Inc. or Shop. Use the data in compliance with the Shopify and Shop terms of service, applicable data-protection laws (including GDPR/CCPA where relevant), and anti-spam regulations (such as CAN-SPAM and GDPR) when contacting the businesses you discover. You are responsible for how you use the exported data.

### SEO Keywords

Shopify store scraper, Shopify leads scraper, Shopify store leads, Shopify email scraper, Shopify store finder, Shop app scraper, shop.app scraper, Shopify store directory, ecommerce leads scraper, Shopify merchant list, Shopify store emails, Shopify B2B leads, DTC brand discovery, Shopify prospecting, find Shopify stores by product, Shopify store contacts, Shopify store database, ecommerce email finder, Shopify niche research, Shopify supplier discovery.

# Actor input Schema

## `query` (type: `string`):

Product keyword to find stores that sell it, e.g. "organic coffee", "yoga mat", "wireless earbuds". Leave empty to browse a whole category instead.

## `category` (type: `string`):

Browse every store in a product category. Works alone, or with a search query to narrow it. API users may also pass a raw Shopify ProductCategory GID.

## `storeLocation` (type: `string`):

Only keep stores based in a country or region. Choose a named region or a single country. Leave empty for any location. Applied to each store's business address.

## `priceMin` (type: `integer`):

Only keep stores whose sample product costs at least this much. Based on the representative sample product returned for each store.

## `priceMax` (type: `integer`):

Only keep stores whose sample product costs at most this much. Based on the representative sample product returned for each store.

## `onSale` (type: `boolean`):

Only keep stores whose sample product is currently discounted (original price higher than the current price).

## `maxItems` (type: `integer`):

Maximum number of unique stores to return. Each store is one output row and one billable result.

## `enrichEmails` (type: `boolean`):

When enabled, each store's own website is fetched and its contact/about pages are scanned for emails, phone numbers and social profiles not exposed on the marketplace. Adds an `emailEnrichment` object and merges any discovered emails into the row. Best-effort; adds one site fetch per store.

## `detectPayment` (type: `boolean`):

Only used when email enrichment is on. Flags whether the store's site exposes a payment processor or checkout (Stripe, Shopify Payments, etc.) — a signal the business actually transacts online.

## `maxConcurrency` (type: `integer`):

How many stores to enrich in parallel. Higher is faster but heavier on the target sites.

## Actor input object example

```json
{
  "query": "organic coffee",
  "onSale": false,
  "maxItems": 50,
  "enrichEmails": false,
  "detectPayment": false,
  "maxConcurrency": 10
}
```

# 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 = {
    "query": "organic coffee"
};

// Run the Actor and wait for it to finish
const run = await client.actor("memo23/shopify-store-leads-scraper").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 = { "query": "organic coffee" }

# Run the Actor and wait for it to finish
run = client.actor("memo23/shopify-store-leads-scraper").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 '{
  "query": "organic coffee"
}' |
apify call memo23/shopify-store-leads-scraper --silent --output-dataset

```

## MCP server setup

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

```

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/JjVNd8FSIOhZl5MZh/builds/LsZS5dZQOqi3bKMlW/openapi.json
