# Ecommerce Store Discovery (`mambalabs/ecommerce-store-discovery`) Actor

Find Shopify, WooCommerce, or BigCommerce stores that sell a product. Every store is confirmed on its own homepage, with platform evidence, payment methods, subscription apps, Shopify product count, Tranco rank, and public email and social links. No API key.

- **URL**: https://apify.com/mambalabs/ecommerce-store-discovery.md
- **Developed by:** [Mamba Labs](https://apify.com/mambalabs) (community)
- **Categories:** E-commerce, Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.68 / 1,000 store founds

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

## Ecommerce Store Discovery

Find online stores that sell a product, on the platform you sell into. Enter product keywords and a platform (Shopify, WooCommerce, BigCommerce, or any). You get one row per store, and every store is confirmed on its own homepage before it is returned: the platform with the evidence that proves it, payment methods, subscription apps, currencies, a Shopify product count, a Tranco top sites rank, and the public email, phone, and social links on the homepage. Rows are flat, so they export to CSV or drop into a Clay table.

### Features

- **Market in, stores out.** Product keywords in, a list of stores out. No list of domains needed.
- **Confirmed, not guessed.** A store is returned only when its own homepage carries the platform's marks: a vendor header, a cookie, a script host, or page code. The row names the evidence and a confidence.
- **Size signals.** Shopify product count from the store's public products feed, payment providers (Shop Pay, Klarna, Afterpay, PayPal, and more), subscription apps (Recharge, Skio, and more), currencies offered, and the Tranco rank band.
- **Contact links.** Emails in mailto links, a phone in a tel link, and the first Instagram, Facebook, and TikTok profile linked from the homepage.
- **Respects robots.txt.** A store whose robots.txt disallows its homepage is skipped, and the products feed is read only where robots.txt allows it.
- **Clay ready.** Every field also accepts text, as Clay sends it, and every row has the same columns.

### How it finds stores

Google result pages are read through the Apify Google SERP proxy, with searches that combine your keyword with a footprint each platform prints on its stores (for example "powered by shopify"). Marketplaces, social networks, and reference sites are dropped. Each remaining site's robots.txt and homepage are read, direct first and through the Apify proxy when a site refuses. No API key and no other developer's actor.

### Input

| Field | Type | Default | What it does |
|---|---|---|---|
| `keywords` | array | | What the stores sell, for example `coffee beans`. Up to 50 |
| `platform` | string | `shopify` | `shopify`, `woocommerce`, `bigcommerce`, or `any` |
| `max_stores` | integer | `25` | Stop after this many confirmed stores. Up to 500 |
| `country` | string | `US` | Google market searched |
| `location_term` | string | | A word added to every search, such as `Texas` or `Australia` |
| `language` | string | `en` | Google interface language |
| `include_product_count` | boolean | `true` | Shopify products feed count |
| `include_traffic_rank` | boolean | `true` | Tranco top sites rank |
| `include_unconfirmed` | boolean | `false` | Also return, free, the sites whose homepage did not show the platform |
| `exclude_domains` | array | | Domains to skip |
| `max_search_pages` | integer | set from `max_stores` | Cap on Google result pages read |
| `max_charge_usd` | string | | Stop before a store row would pass this amount |

### Output

One row per store. Key fields:

| Field | Example |
|---|---|
| `domain`, `store_url`, `store_name` | `goldenbean.com`, `https://goldenbean.com/`, `Golden Bean Coffee` |
| `platform`, `platform_confidence`, `platform_evidence` | `shopify`, `high`, `header: /^powered-by:\s*shopify/i` |
| `myshopify_domain`, `other_platforms` | `golden-bean.myshopify.com`, `[]` |
| `payment_methods`, `subscription_apps`, `currencies` | `["shop_pay", "apple_pay"]`, `["recharge"]`, `["USD"]` |
| `product_count`, `product_count_is_exact` | `38`, `true` |
| `tranco_rank`, `tranco_rank_band`, `tranco_trend` | `68980`, `top_100k`, `stable` |
| `contact_emails`, `phone`, `instagram_url`, `facebook_url`, `tiktok_url` | `["info@goldenbean.com"]` |
| `keyword`, `discovery_query`, `search_position`, `search_title`, `search_snippet` | `coffee beans`, `"coffee beans" "powered by shopify"`, `3` |
| `row_status`, `error_reason`, `billable_events_json` | `ok`, `null`, `{"store-found":1}` |

The run summary (key-value store record `RUN_SUMMARY`) lists stores confirmed, candidates read, Google pages read, sites skipped by robots.txt, and charged events.

### Pricing

Pay per event. You pay only these events; the Apify platform and proxy costs of your run, Google SERP proxy included, are paid by Mamba Labs.

| Event | Free plan | Bronze | Silver | Gold |
|---|---|---|---|---|
| Store found (`store-found`), one confirmed store | $0.0055 | $0.005225 | $0.00495 | $0.004675 |
| Search page (`search-page`), one Google result page read to find stores | $0.019 | $0.01805 | $0.0171 | $0.01615 |
| Actor start (`apify-actor-start`), once per run | $0.002 | $0.002 | $0.002 | $0.002 |

Store rows are charged only for confirmed stores. Sites that do not show the platform, sites that refuse or fail, and the no results row are free. Each Google result page read is charged once as it is read, whether it yields many stores or none; a page Google refuses is not charged. The run stops paging once Max stores is reached, and Max Google pages caps the page count. The run summary lists the pages read. On the Apify free plan the actor stops at 1.50 USD of evaluation a month, counted at the free plan prices (about 273 stores at store prices alone); any paid Apify plan removes that cap.

Example: a Shopify test run for 20 stores read 4 result pages, so it cost $0.188 at the free plan price (20 store rows, 4 pages, 1 start). Platforms whose stores print fewer footprints need more pages per store: a WooCommerce test run read 6 pages for 8 stores.

### Usage examples

#### Apify Console or API

```json
{ "keywords": ["coffee beans", "espresso"], "platform": "shopify", "max_stores": 50 }
```

```json
{ "keywords": ["dog treats"], "platform": "woocommerce", "country": "GB", "location_term": "UK", "max_stores": 25 }
```

#### Clay

Add an Apify column, send `keywords` and `platform`, and map `domain`, `platform`, `product_count`, `tranco_rank_band`, and `contact_emails` into your table.

#### MCP

The MCP server `@mambalabsdev/mcp-ecommerce-store-discovery` exposes this actor as a tool for Claude and other MCP clients.

### Error handling

| Situation | What you get |
|---|---|
| A site's homepage does not show the platform | Not returned and not charged; with Include unconfirmed sites on, a free `not_confirmed` row |
| A site refuses or fails, or robots.txt disallows its homepage | Skipped, not charged, counted in the run summary |
| Google refuses a result page | That search moves on to the next; the summary counts it |
| No store confirmed | One free row with `row_status` `no_results` |
| Max charge reached | The run stops before the next charged row and says why in the status message |

### Limitations

- Discovery reaches the stores Google shows for the footprint searches, a few pages deep per search. It is not a full census of a platform.
- The platform is read from one static homepage fetch. A store that reveals its platform only after JavaScript runs, or behind a headless front end, is not confirmed.
- The product count comes from Shopify's public products feed and stops at the first page of 250.
- A Tranco rank orders sites by popularity across several crawler rankings. It is not a visit count, and most small stores are not in the list.
- Country steers the Google market; stores in other countries can still appear. Add a `location_term` to narrow it.
- Emails and social links are only those printed on the homepage.

### More from Mamba Labs

| Actor | Actor ID |
|---|---|
| [Account Hiring Watch](https://apify.com/mambalabs/account-hiring-watch?fpr=mamba) | `gRAZA5WBi1r6L0gy7` |
| [Agent Accessibility Auditor](https://apify.com/mambalabs/agent-accessibility-auditor?fpr=mamba) | `anxbRv0lKrpQ1pnua` |
| [Agent to Brokerage Resolver](https://apify.com/mambalabs/agent-brokerage-resolver?fpr=mamba) | `ePRRGLxOGyaVHO4dI` |
| [AI Tooling Detector](https://apify.com/mambalabs/ai-tooling-detector?fpr=mamba) | `EwkHhmqiuJgRoVEbE` |
| [B2B Reddit Conversation Monitor](https://apify.com/mambalabs/b2b-reddit-conversation-monitor?fpr=mamba) | `SoDryzzsjmY3SsiyG` |
| [Bluesky Brand Presence Mapper](https://apify.com/mambalabs/bluesky-brand-presence-mapper?fpr=mamba) | `eLpxzP4IuXznlFVND` |
| [Career Change Signal Engine](https://apify.com/mambalabs/career-change-signal-engine?fpr=mamba) | `vX2Yga1a6wGaXaP14` |
| [Company Change Event Feed](https://apify.com/mambalabs/company-change-event-feed?fpr=mamba) | `oX44rS0fkEJ3rXLWe` |
| [Company Contact Details Extractor](https://apify.com/mambalabs/company-contact-details-extractor?fpr=mamba) | `4mMncKaJykiq94grz` |
| [Company Discovery List Builder](https://apify.com/mambalabs/company-discovery-list-builder?fpr=mamba) | `jch0HdaZnpbMqlcGS` |
| [Company Firmographic Enricher](https://apify.com/mambalabs/company-firmographic-enricher?fpr=mamba) | `YlUtLWjfPpqykmB8g` |
| [Company Funding Record](https://apify.com/mambalabs/funding-investor-record?fpr=mamba) | `OFS4Mt1gyYNtGfUbE` |
| [Company Identity Resolver](https://apify.com/mambalabs/company-identity-resolver?fpr=mamba) | `lr8fTRAmZCBZmuwwh` |
| [Company Social Presence Mapper](https://apify.com/mambalabs/company-social-presence-mapper?fpr=mamba) | `4k6CCemkgBDz18m2h` |
| [Contact Classifier](https://apify.com/mambalabs/contact-classifier?fpr=mamba) | `0lGSeYJmniXhGANnO` |
| [Cookie Consent Audit](https://apify.com/mambalabs/cookie-consent-audit?fpr=mamba) | `TrKyOS0KBoGC35nbr` |
| [Domain Deliverability Checker](https://apify.com/mambalabs/domain-deliverability-checker?fpr=mamba) | `0tVgxI7A6o9jMlxmc` |
| [Domain to LinkedIn URL Resolver](https://apify.com/mambalabs/domain-to-linkedin-url-resolver?fpr=mamba) | `3HtnSaqPHOg1Qg5gx` |
| [Ecommerce Platform Profiler](https://apify.com/mambalabs/ecommerce-platform-profiler?fpr=mamba) | `5G2NeYjBbQTjaTn9L` |
| [Event Presence Index](https://apify.com/mambalabs/event-presence-index?fpr=mamba) | `WLhMy8fMDgsxdYxv5` |
| [Expert Witness Directory](https://apify.com/mambalabs/expert-witness-directory?fpr=mamba) | `LIpwlgfE3LaQBaXd4` |
| [Funding and Press Signal Scanner](https://apify.com/mambalabs/funding-press-signal-scanner?fpr=mamba) | `FS13X6dhQVgX3XOM6` |
| [GitHub Organization Signal Scanner](https://apify.com/mambalabs/github-organization-signal-scanner?fpr=mamba) | `ahF8RRpv5mzPao5CN` |
| [Google Ads Transparency Monitor](https://apify.com/mambalabs/google-ads-transparency-monitor?fpr=mamba) | `1eOwxhBVxzvOXAm4s` |
| [Government Contract Award Monitor](https://apify.com/mambalabs/public-award-monitor?fpr=mamba) | `zhEtllASykOcx9hJ8` |
| [GTM Hiring Signal Scraper](https://apify.com/mambalabs/gtm-hiring-signal-scraper?fpr=mamba) | `D7O1SA2EqwHGsGr1P` |
| [GTM Signals Aggregator](https://apify.com/mambalabs/b2b-buying-signals-hiring-tech-stack-intent-for-clay?fpr=mamba) | `xKdRfnfFNkdMpFuNs` |
| [ICP Fit Scorer](https://apify.com/mambalabs/icp-account-lead-scoring-fit-scorer-0-100-for-clay?fpr=mamba) | `W161DT8W4kW55dMFh` |
| [Influencer Change Monitor](https://apify.com/mambalabs/creator-change-monitor?fpr=mamba) | `d2VVgahNL6UmcLkhg` |
| [Influencer Finder](https://apify.com/mambalabs/creator-finder?fpr=mamba) | `tpkedmloIIWtXx6sg` |
| [Influencer Lead List Builder](https://apify.com/mambalabs/creator-lead-list-all-in-one?fpr=mamba) | `KnmByszcv135yM30G` |
| [Influencer Profile Scraper](https://apify.com/mambalabs/creator-profile-reader?fpr=mamba) | `EqEnklDVMIcB1V499` |
| [Influencer Talent Agency Lookup](https://apify.com/mambalabs/talent-agency-lookup?fpr=mamba) | `zCuX4Mgyg6JvXgGzd` |
| [Instagram Facebook Brand Presence Mapper](https://apify.com/mambalabs/meta-brand-presence-mapper?fpr=mamba) | `HXh65I0JBjPsunbY8` |
| [Integration and Marketplace Presence Mapper](https://apify.com/mambalabs/integration-marketplace-presence-mapper?fpr=mamba) | `V0guNuvM85Q61f2gj` |
| [Job Board Keyword Signal Scanner](https://apify.com/mambalabs/job-board-keyword-signal-scanner?fpr=mamba) | `4DvqpvhMR74NLcDDY` |
| [Job Change Tracker](https://apify.com/mambalabs/job-change-tracker?fpr=mamba) | `L8UbEmMJC1XYPSZOb` |
| [Job Posting Monitor](https://apify.com/mambalabs/gtm-job-discovery?fpr=mamba) | `QCfICD9kOPiOdj5iI` |
| [Legal Entity Resolver](https://apify.com/mambalabs/legal-entity-resolver?fpr=mamba) | `KHFyPCDIx7CyqULYm` |
| [Link in Bio Scraper and Newsletter Detector](https://apify.com/mambalabs/link-in-bio-newsletter-checker?fpr=mamba) | `OorucdheTIgu7RFzK` |
| [LinkedIn Company Page Mapper](https://apify.com/mambalabs/linkedin-company-presence-mapper?fpr=mamba) | `zOPm6A9JEhUGcIdFW` |
| [LinkedIn Post Tracker](https://apify.com/mambalabs/linkedin-post-engager-capture?fpr=mamba) | `oiGLNPuaf5BRaz9K5` |
| [Meta Ad Library Monitor](https://apify.com/mambalabs/meta-ad-library-monitor?fpr=mamba) | `J1GWlSXfSGU3u8Wng` |
| [Mobile Phone Waterfall](https://apify.com/mambalabs/mobile-phone-waterfall-orchestrator?fpr=mamba) | `6OOgPktf7RIa5XCOP` |
| [New Hire Finder](https://apify.com/mambalabs/new-hire-finder?fpr=mamba) | `cKuc38p4nYHNF3IW8` |
| [Outbound Stack Detector](https://apify.com/mambalabs/outbound-infrastructure-fingerprint?fpr=mamba) | `v43UJC8r7qW7cBSTG` |
| [Page Finder and Extractor](https://apify.com/mambalabs/page-finder-extractor?fpr=mamba) | `TpurgcOZbVnknlaiC` |
| [People Finder & Email Verifier](https://apify.com/mambalabs/people-finder?fpr=mamba) | `LEgloG7tWgQl4o6TD` |
| [Person Social Footprint Mapper](https://apify.com/mambalabs/person-social-footprint-mapper?fpr=mamba) | `jfQXa2zW9FHCJot9K` |
| [Pinterest Brand Presence Mapper](https://apify.com/mambalabs/pinterest-brand-presence-mapper?fpr=mamba) | `d1HvjZfKhgvWsoEwn` |
| [Prospect Engine](https://apify.com/mambalabs/b2b-prospect-engine?fpr=mamba) | `q9rT6v64nUJdPexOQ` |
| [Publishing Frequency Tracker](https://apify.com/mambalabs/blog-publishing-frequency?fpr=mamba) | `TbLwaUUATdYb6wp4N` |
| [Reddit Brand Presence Mapper](https://apify.com/mambalabs/reddit-brand-presence-mapper?fpr=mamba) | `pKQZmDaT70SEb54bZ` |
| [Reporting Window Finder](https://apify.com/mambalabs/public-company-reporting-window-finder?fpr=mamba) | `uINxR7a1IW8qUTRUX` |
| [Sequencer Lead Push](https://apify.com/mambalabs/clay-to-instantly-smartlead-push?fpr=mamba) | `0Jv27VeWM5tSZQs9x` |
| [Team Page People Extractor](https://apify.com/mambalabs/team-page-people-extractor?fpr=mamba) | `j8a9zX0k4mNbvDbWK` |
| [Tech Stack Signal Detector](https://apify.com/mambalabs/gtm-tech-stack-signal-scraper?fpr=mamba) | `qyd7nNyqFPelQViBx` |
| [TikTok Brand Presence Mapper](https://apify.com/mambalabs/tiktok-brand-presence-mapper?fpr=mamba) | `fco8FvoJcSafbeyd1` |
| [Trustpilot Reputation Enricher](https://apify.com/mambalabs/review-platform-reputation-enricher?fpr=mamba) | `3lIqfCt61j4hqE1xz` |
| [WCAG Accessibility Audit](https://apify.com/mambalabs/wcag-accessibility-audit?fpr=mamba) | `P3jBj3FRghKEhX52z` |
| [Website Traffic Rank Estimator](https://apify.com/mambalabs/website-traffic-rank-estimator?fpr=mamba) | `GnOFUzlNVIoXgeJjH` |
| [Work Email Waterfall](https://apify.com/mambalabs/email-waterfall-orchestrator?fpr=mamba) | `OT6xqTFThC0Rjf7Zj` |
| [Workplace Program Detector](https://apify.com/mambalabs/workplace-program-detector?fpr=mamba) | `Li6pPDhqbdzFz3h7G` |
| [X Brand Presence Mapper](https://apify.com/mambalabs/x-brand-presence-mapper?fpr=mamba) | `oLOgadhHUkNAyDA3w` |
| [YouTube Channel Stats Extractor](https://apify.com/mambalabs/youtube-channel-transcript-extractor?fpr=mamba) | `6hSpD3kd2s2IQ4VSs` |

Built by [Mamba Labs](https://apify.com/mambalabs?fpr=mamba).

# Actor input Schema

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

What the stores sell, one per line, for example coffee beans or yoga mats. Up to 50.

## `platform` (type: `string`):

Which store platform to find. any returns stores on any platform the homepage reveals.

## `max_stores` (type: `integer`):

Stop after this many confirmed stores. Up to 500.

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

Two letter country code for the Google market searched, for example US, GB, CA, AU. Results lean to that market; stores elsewhere can still appear.

## `location_term` (type: `string`):

Optional word added to every search, such as a country, state, or city name (Texas, Australia).

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

Google interface language, for example en, de, fr.

## `include_product_count` (type: `boolean`):

Read the store's public products feed (Shopify only) for a product count, exact below 250.

## `include_traffic_rank` (type: `boolean`):

Look up the store in the Tranco top sites list (free). A rank orders sites by popularity; it is not a visit count.

## `include_unconfirmed` (type: `boolean`):

Also return, free, the sites whose homepage did not show the platform.

## `exclude_domains` (type: `array`):

Domains to skip, for example stores already in your CRM.

## `max_search_pages` (type: `integer`):

Cap on Google result pages read. Each page read is one search page event. Empty or 0: set from Max stores.

## `max_charge_usd` (type: `string`):

The run stops before a store row would take the total charge past this amount.

## `source_tag` (type: `string`):

Internal attribution tag set by Mamba Labs published tasks. Leave empty.

## Actor input object example

```json
{
  "keywords": [
    "coffee beans"
  ],
  "platform": "shopify",
  "max_stores": 5,
  "country": "US",
  "language": "en",
  "include_product_count": true,
  "include_traffic_rank": true,
  "include_unconfirmed": false
}
```

# Actor output Schema

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

No description

## `run_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": [
        "coffee beans"
    ],
    "max_stores": 5
};

// Run the Actor and wait for it to finish
const run = await client.actor("mambalabs/ecommerce-store-discovery").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": ["coffee beans"],
    "max_stores": 5,
}

# Run the Actor and wait for it to finish
run = client.actor("mambalabs/ecommerce-store-discovery").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": [
    "coffee beans"
  ],
  "max_stores": 5
}' |
apify call mambalabs/ecommerce-store-discovery --silent --output-dataset

```

## MCP server setup

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

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/PeHu4sLyFvQHXUUrX/builds/DDiel39bPcz3ujrWQ/openapi.json
