# Shopify Store Discovery - Apps, Revenue Estimate, Tech Stack (`seibs.co/shopify-store-discovery`) Actor

Find Shopify stores by domain list with full intel: 30+ app detection (Klaviyo/Recharge/Yotpo/Gorgias/etc), product count, revenue estimate range, theme, social links. Server-side filter by required/excluded apps + revenue range. For D2C SaaS sales teams.

- **URL**: https://apify.com/seibs.co/shopify-store-discovery.md
- **Developed by:** [Seibs.co](https://apify.com/seibs.co) (community)
- **Categories:** E-commerce, Lead generation, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $8.00 / 1,000 store records

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 a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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 Discovery

Find Shopify stores by domain and enrich each with app-stack detection (30+ apps), product / revenue stats, theme, social links, and contact info.

### What does Shopify Store Discovery do?

It verifies Shopify via the public `/products.json` endpoint (with Liquid HTML fallback), detects 30+ installed apps from script-tag footprints, and pulls product catalog stats, theme, social links, contact info, and a heuristic monthly revenue estimate. Server-side filters by required apps (AND), excluded apps (NOT), product count band, revenue band, country, and category keyword - filtered-out stores are not charged.

### Features

- Shopify verification - `GET /products.json?limit=1` first, Liquid template HTML fallback.
- 38+ app detection from script footprints, each tagged with confidence (low / medium / high).
- Server-side filters - required_apps (AND), excluded_apps (NOT), product band, revenue band, country, keyword.
- Heuristic monthly revenue estimate (`deep_analyze` mode) with Shopify Plus, subscription, B2B/wholesale, and enterprise-stack refinements; returns a `revenue_estimate_confidence` (low / medium / high) so buyers know how much to trust it.
- Shopify Plus + B2B/wholesale classification surfaced as their own boolean fields.
- Per-store progress logging - one info line per store with size, apps, revenue, and email so long runs are auditable.
- Contact enrichment (opt-in default true) - scrapes `/contact` `/pages/contact` `/about` and surfaces `best_contact_email` (founder/sales/owner ranked above generic info/support), all `contact_emails` with role classification, and `contact_phones`. Only charged when something is extracted.
- Founder + brand-story intel (opt-in) - `founder_names`, `founding_year`, and `brand_story_keywords` (vegan, sustainable, made in USA, woman-owned, B-corp, etc) for sales personalization.
- Last-product-published timestamp + `days_since_last_publish` so you can split fresh brands from abandoned ones.
- Visible review count + average rating when a review app (Yotpo / Loox / Judge.me / Okendo / Stamped / Reviews.io) is detected.
- Theme name + version detection.
- Social link parsing (IG, FB, TikTok, X, YouTube, Pinterest, LinkedIn).
- App-list unwind view - one row per (store, app) for downstream slicing.

### Use cases

D2C SaaS sales teams selling INTO the Shopify ecosystem - concrete buyers:

- Klaviyo competitors (Omnisend, Sendlane, Drip) - filter `excluded_apps: ["klaviyo"]` for non-Klaviyo Shopify stores.
- Recharge competitors (Bold, Loop, Awtomic, Stay AI) - `has_subscriptions: true` AND no Recharge.
- Yotpo / Stamped / Judge.me competitors (Okendo, Loox, Reviews.io).
- Gorgias competitors (Zendesk, Re:amaze, Help Scout).
- Postscript / Attentive competitors - segment by SMS app presence.
- Triple Whale / Northbeam / Polar Analytics - find stores with 5+ apps and $100K+ revenue.
- Shogun / PageFly / Replo / GemPages teams - find competitors' installed base.
- Headless agencies (Hydrogen / Storefront API) - find Plus-tier Shopify stores still on Liquid.

### FAQ

**Q: Is this legal?**
A: Yes - we hit Shopify's public `/products.json` endpoint, the public Liquid HTML, and public `/contact` / `/about` / `/pages/contact` pages. All publicly accessible to any browser. Use the data per Shopify's Terms of Service and applicable law.

**Q: Why might a run fail?**
A: (1) Cloudflare challenge - we use `curl_cffi` with Chrome 131 impersonation which handles most, but RESIDENTIAL proxies improve consistency. (2) Domain is not Shopify - row comes back `is_shopify: false` with the detection reason and is not charged. (3) `/products.json` is rate-limited at the store level - we self-throttle, but very high concurrency on a single brand's domain group can still trigger it.

**Q: How fresh is the data?**
A: Live at crawl time. Product counts, prices, theme, apps, contact info, social links, and `days_since_last_publish` are read directly from the store at run time - no internal cache.

**Q: Can I schedule this daily or weekly?**
A: Yes - weekly is typical for D2C-into-Shopify SaaS prospecting (find fresh installs of competitor apps, drop the new ones into outbound). Daily for very narrow watchlists. Use Apify Schedules.

**Q: How do I push results into a CRM?**
A: The output maps cleanly to standard lead schemas - `best_contact_email`, `contact_phones`, social links, store name, and the `apps_installed` array all forward to HubSpot, Salesforce, Pipedrive, Apollo, or Klaviyo via Zapier/Make/n8n. Webhook the full record on each run-complete for real-time CRM enrichment.

**Q: How accurate is the revenue estimate?**
A: It is a heuristic from `product_count x avg_price x estimated_orders/day multipliers` (with Shopify Plus, subscription, B2B/wholesale, and enterprise-stack refinements). Expect approximately +/-50% error on absolute MRR. The wedge is relative ranking - "under $10K/mo vs over $500K/mo" - not precision. Use it as a filter floor (`min_estimated_monthly_revenue_usd: 50000` to skip tiny stores), not ground truth for a financial model. `revenue_estimate_confidence` (low / medium / high) tells you how much to trust each estimate.

**Q: How does PPE pricing actually work here?**
A: Filtered-out and non-Shopify rows are NEVER charged. You only pay for stores that match your input criteria. Contact enrichment only bills when data is actually extracted. See the Pricing section for per-event rates.

### Related Actors

- [`b2b-sales-triggers`](../b2b-sales-triggers/) - score intent (hiring, funding, exec changes) on top of Shopify-store fit. Run this actor to find non-Klaviyo $50K+ MRR stores, then pipe the domain list into the triggers actor.
- [`google-maps-reviews-pro`](../google-maps-reviews-pro/) - layer review sentiment / topic analysis on Shopify brands with physical retail or showrooms.
- [`reddit-topic-watcher`](../reddit-topic-watcher/) - watch for `alternative_seek` and `complaint` posts mentioning Shopify apps your prospects are using (conquest signals).

### Integrations

- Zapier - push to HubSpot/Salesforce/Pipedrive/Apollo/Klaviyo
- Make.com - workflow automation
- n8n - self-hosted automation
- Apify webhooks - POST to your endpoint
- API + dataset export (JSON/CSV/Excel/XML)
- MCP / AI agents - call from Claude/GPT/LangChain

### App detection list (30+ apps)

Email + SMS: Klaviyo, Postscript, Privy, Justuno, Sumo, Drip.
Subscriptions: Recharge, Bold, Loop, Smile.io.
Reviews + UGC: Yotpo, Stamped.io, Judge.me, Okendo, Loox, Reviews.io, Trustpilot, Bazaarvoice.
Support + Chat: Gorgias, Tidio, Drift.
Search + Personalization: Klevu, Searchanise, Algolia, Nosto, Dynamic Yield, LimeSpot, Wiser.
Page Builders: Shogun, PageFly, Replo, GemPages, Zipify.
Upsell + CRO: ReConvert, Rebuy, Fomo, Octane AI.
Headless / Frontend: Hydrogen, Shogun Frontend.

### Modes

- `discover_by_domain_list` - run the full intel pass on every input domain.
- `detect_shopify_only` - lightweight is-Shopify boolean only (cheapest).
- `deep_analyze` - `discover_by_domain_list` plus full `/products.json` walk and revenue estimate.

### Input

See `.actor/INPUT_SCHEMA.json`. Sample - find non-Klaviyo Shopify stores doing 50-1000 products, $50K+ MRR:

```json
{
    "mode": "deep_analyze",
    "domains": ["allbirds.com", "rothys.com", "warbyparker.com"],
    "excluded_apps": ["klaviyo"],
    "min_product_count": 50,
    "max_product_count": 1000,
    "min_estimated_monthly_revenue_usd": 50000,
    "concurrency": 4,
    "use_apify_proxy": true,
    "apify_proxy_groups": ["RESIDENTIAL"]
}
````

### Output

**Sample output:** [`.actor/sample-output.json`](./.actor/sample-output.json) — copy-paste-ready preview of real-looking records.

First record inline:

```json
{
  "domain": "luminouswick.co",
  "store_url": "https://luminouswick.co",
  "is_shopify": true,
  "shopify_plan_hint": {
    "plan": "shopify",
    "source": "X-ShopId header pattern"
  },
  "store_name": "Luminous Wick \u2014 Hand-Poured Soy Candles",
  "homepage_title": "Luminous Wick | Small-Batch Soy Candles & Refills",
  "homepage_description": "Hand-poured in Brooklyn. Coconut-soy wax, cotton wicks, fragrance-loaded. Shop scents, refill kits, and gift sets.",
  "currency": "USD",
  "primary_country": "US",
  "total_product_count": 84,
  "total_collections_count": 12,
  "avg_product_price": 38.4,
  "min_product_price": 14.0,
  "max_product_price": 168.0,
  "top_categories": [
    "Candles",
    "Refill Kits",
    "Gift Sets",
    "Wax Melts",
    "Accessories"
  ],
  "recent_product_count_30d": 7,
  "has_subscriptions": true,
  "has_rewards_program": true,
  "has_quiz": true,
  "has_post_purchase_upsell": true,
  "apps_installed": [
    {
      "app_id": "klaviyo",
      "footprint_match": "static.klaviyo.com",
      "confidence": "high"
    },
    {
      "app_id": "recharge",
      "footprint_match": "rechargepayments.com/shopify",
      "confidence": "high"
    },
    {
      "app_id": "smile_io",
      "footprint_match": "cdn.smile.io",
      "confidence": "high"
    },
    {
      "app_id": "octane_ai",
      "footprint_match": "cdn.octaneai.com/quiz-widget",
      "confidence": "high"
    },
    {
      "app_id": "judgeme",
      "footprint_match": "judge.me/widget",
      "confidence": "high"
    },
    {
      "app_id": "yotpo",
      "footprint_match": "staticw2.yotpo.com",
      "confidence": "medium"
    },
    {
      "app_id": "rebuy",
      "footprint_match": "rebuyengine.com",
      "confidence": "high"
    },
    {
      "app_id": "gorgias",
      "footprint_match": "config.gorgias.chat",
      "confidence": "high"
    },
    {
      "app_id": "tapcart",
      "footprint_match": "open.tapcart.com",
      "confidence": "medium"
    }
  ],
  "apps_count": 9,
  "estimated_monthly_revenue_usd": {
    "low": 180000,
    "high": 320000,
    "midpoint": 250000
  },
  "revenue_estimate_method": "product_count * avg_price * estimated_orders/day band",
  "social_links": {
    "instagram": "https://www.instagram.com/luminouswickco",
    "facebook": "https://www.facebook.com/luminouswickco",
    "tiktok": "https://www.tiktok.com/@luminouswick",
    "twitter": null,
    "youtube": null,
    "pinterest": "https://www.pinterest.com/luminouswickco",
    "linkedin": null
  },
  "contact_email": "hello@luminouswick.co",
  "contact_phone": "(718) 555-0184",
  "theme_name": "Impulse",
  "theme_version": "7.4.2",
  "language": "en",
  "scraped_at": "2026-05-13T16:02:14Z",
  "mode": "domain_scan",
  "available": true,
  "reason": null
}
```

Sample record:

```json
{
    "domain": "example.com",
    "store_url": "https://example.com",
    "is_shopify": true,
    "shopify_plan_hint": {"plan": "shopify", "source": "headers"},
    "store_name": "Example Co",
    "currency": "USD", "primary_country": "US",
    "total_product_count": 187,
    "avg_product_price": 64.50,
    "apps_installed": [
        {"app_id": "klaviyo",  "footprint_match": "static.klaviyo.com", "confidence": "high"},
        {"app_id": "recharge", "footprint_match": "rechargepayments.com", "confidence": "high"}
    ],
    "apps_count": 6,
    "estimated_monthly_revenue_usd": {"low": 60000, "midpoint": 120000, "high": 240000},
    "theme_name": "Dawn",
    "available": true,
    "scraped_at": "2026-05-14T12:00:00Z"
}
```

Non-Shopify rows include `is_shopify: false` and the detection reason; filtered-out rows are not emitted.

### Pricing

Pay-per-event:

| Event | When | Price |
|---|---|---|
| `store_record` | Verified Shopify store with metadata | $0.008 |
| `app_enrichment` | 3+ apps detected | $0.005 |
| `contact_enrichment` | At least one email or phone extracted from /contact /about | $0.005 |
| `deep_analysis` | Surcharge in `deep_analyze` mode | $0.010 |

Worst case (deep\_analyze, 5+ apps, contact extracted): $0.028 per store. Cheapest (detect\_shopify\_only, <3 apps, no contact): $0.008. Contact enrichment is only billed when data is actually returned, so misses cost nothing.

### FAQ

**Q: Why is `shopify_plan_hint` often null?**
A: Shopify hides plan info. We can sometimes spot `shopify-plus` references in HTML or `Powered-By` headers; otherwise plan is null.

**Q: How accurate is the revenue estimate?**
A: A rough heuristic - expect +/- 50% error on absolute MRR. The wedge is relative ranking ("under $10K/mo or over $500K/mo"), not precision. Treat it as a defensible signal, not a financial figure.

**Q: Do I need a residential proxy?**
A: Recommended. Many Shopify stores are behind Cloudflare; we use `curl_cffi` with Chrome 131 impersonation, which gets through plain CF challenges, but RESIDENTIAL proxies improve consistency.

**Q: How do server-side filters affect billing?**
A: Filtered-out and non-Shopify rows are NEVER charged. You only pay for stores that match your input criteria.

### Support

Open an issue on the actor's GitHub or contact via Apify Store. Include the run ID and input config.

### Changelog

See [CHANGELOG.md](./CHANGELOG.md).

# Actor input Schema

## `mode` (type: `string`):

discover\_by\_domain\_list = check each provided domain. detect\_shopify\_only = cheapest path, just verify Shopify and return basic metadata. deep\_analyze = full /products.json walk + revenue estimate + collections + apps (most expensive, most thorough).

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

List of root domains or URLs to check (e.g. 'allbirds.com', 'https://www.warbyparker.com', 'fashionnova.com'). Strip 'www.' / scheme / paths — the actor will normalize.

## `discovery_seed_urls` (type: `array`):

URLs to crawl for outbound links — e.g. 'powered by Shopify' directory pages, niche listicles, awards lists. Outbound links become candidate domains.

## `required_apps` (type: `array`):

Only emit stores that have ALL of these apps detected. Leave empty to skip. Allowed values: klaviyo, recharge, yotpo, gorgias, postscript, loop, smile\_io, bold, stamped, judge\_me, okendo, octane\_ai, tidio, drift, klevu, searchanise, algolia, shogun, pagefly, replo, loox, reviews\_io, fomo, privy, justuno, nosto, rebuy, limespot, wiser, reconvert, zipify, gempages.

## `excluded_apps` (type: `array`):

Drop stores that have ANY of these apps installed. Useful to find non-customers (e.g. exclude 'klaviyo' to surface non-Klaviyo Shopify stores). Allowed values: same enum as required\_apps.

## `min_product_count` (type: `integer`):

Drop stores with fewer than N products. Set to 0 to disable.

## `max_product_count` (type: `integer`):

Drop stores with more than N products. Set to 0 to disable.

## `min_estimated_monthly_revenue_usd` (type: `integer`):

Drop stores whose estimated monthly revenue midpoint is below this. Rough heuristic - see README. Set to 0 to disable.

## `max_estimated_monthly_revenue_usd` (type: `integer`):

Drop stores whose estimated monthly revenue midpoint is above this. Set to 0 to disable.

## `country_codes` (type: `array`):

Restrict to stores whose detected primary country (from currency / shipping signals) is in this list. Empty = no filter. Example: \['US', 'CA', 'GB'].

## `category_keywords` (type: `array`):

Keyword filter on store homepage title + description. Case-insensitive substring match. Example: \['beauty', 'skincare', 'fashion'].

## `concurrency` (type: `integer`):

Parallel domain fetches. Shopify rate-limits aggressively; 6 is the recommended sweet spot.

## `use_apify_proxy` (type: `boolean`):

Route requests through Apify Proxy. RESIDENTIAL is strongly recommended - many Shopify stores sit behind Cloudflare.

## `apify_proxy_groups` (type: `array`):

Apify Proxy groups. RESIDENTIAL is the most reliable for Shopify.

## `apify_proxy_country` (type: `string`):

Two-letter country code for proxy egress. 'US' is a safe default since most Shopify stores ship to US.

## `max_results` (type: `integer`):

Cap on emitted records. Default 200. Increase for larger discovery runs.

## `include_contact_enrichment` (type: `boolean`):

Scrape /contact /pages/contact /about for email addresses (founder@, support@, hello@, sales@) and phone numbers. Adds the highest-impact field for D2C SaaS sales outreach. Charged $0.005 per store ONLY when at least one email or phone is actually extracted.

## `include_founder_intel` (type: `boolean`):

Scrape /about /pages/our-story for founder names, founding year, and brand-story keywords (vegan, sustainable, made in USA, woman-owned, etc). Useful for sales-outreach personalization. Slower because of extra page fetches; opt-in.

## Actor input object example

```json
{
  "mode": "discover_by_domain_list",
  "domains": [
    "allbirds.com",
    "warbyparker.com",
    "fashionnova.com",
    "gymshark.com",
    "bombas.com"
  ],
  "min_product_count": 0,
  "max_product_count": 0,
  "min_estimated_monthly_revenue_usd": 0,
  "max_estimated_monthly_revenue_usd": 0,
  "concurrency": 6,
  "use_apify_proxy": true,
  "apify_proxy_groups": [
    "RESIDENTIAL"
  ],
  "apify_proxy_country": "US",
  "max_results": 200,
  "include_contact_enrichment": true,
  "include_founder_intel": false
}
```

# Actor output Schema

## `datasetItems` (type: `string`):

Narrow, token-efficient slice of every record. Consumer: LLM agents (Claude, GPT, LangChain tools), MCP hosts, dashboards. Store fields: domain, Shopify Plus flag, store name, product count, app count, monthly revenue estimate, contact email.

## `datasetItemsDetailed` (type: `string`):

All fields for every record. Consumer: humans browsing the dataset in the Apify UI, RAG ingest pipelines, and full backups. Larger payload — not recommended as a direct LLM tool response.

## `datasetItemsUnwind` (type: `string`):

Same records, but each element of the `apps` array is promoted to its own row. Consumer: Zapier / Make / n8n / Google Sheets users who want one row per item, and LLM agents that prefer flat rows over nested arrays.

## `datasetItemsMcp` (type: `string`):

First 50 overview records as a clean JSON array. Wrap on the agent side in an MCP tool-call response envelope, e.g. `{ "ok": true, "data": <this array>, "meta": { "actor": "shopify-store-discovery", "count": <len>, "view": "overview" } }`. Consumer: MCP servers, Claude Desktop, Cursor, OpenAI Assistants tool calls.

## `datasetItemsCsv` (type: `string`):

Spreadsheet-friendly export of the overview view. Consumer: humans, sales-ops teams, Excel / Google Sheets users.

# 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 = {
    "mode": "discover_by_domain_list",
    "domains": [
        "allbirds.com",
        "warbyparker.com",
        "fashionnova.com",
        "gymshark.com",
        "bombas.com"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("seibs.co/shopify-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 = {
    "mode": "discover_by_domain_list",
    "domains": [
        "allbirds.com",
        "warbyparker.com",
        "fashionnova.com",
        "gymshark.com",
        "bombas.com",
    ],
}

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

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

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

```

## CLI example

```bash
echo '{
  "mode": "discover_by_domain_list",
  "domains": [
    "allbirds.com",
    "warbyparker.com",
    "fashionnova.com",
    "gymshark.com",
    "bombas.com"
  ]
}' |
apify call seibs.co/shopify-store-discovery --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=seibs.co/shopify-store-discovery",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Shopify Store Discovery - Apps, Revenue Estimate, Tech Stack",
        "description": "Find Shopify stores by domain list with full intel: 30+ app detection (Klaviyo/Recharge/Yotpo/Gorgias/etc), product count, revenue estimate range, theme, social links. Server-side filter by required/excluded apps + revenue range. For D2C SaaS sales teams.",
        "version": "0.3",
        "x-build-id": "ZXKf0GmaH7e4EAg9e"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/seibs.co~shopify-store-discovery/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-seibs.co-shopify-store-discovery",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/seibs.co~shopify-store-discovery/runs": {
            "post": {
                "operationId": "runs-sync-seibs.co-shopify-store-discovery",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/seibs.co~shopify-store-discovery/run-sync": {
            "post": {
                "operationId": "run-sync-seibs.co-shopify-store-discovery",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "mode"
                ],
                "properties": {
                    "mode": {
                        "title": "Mode",
                        "enum": [
                            "discover_by_domain_list",
                            "detect_shopify_only",
                            "deep_analyze"
                        ],
                        "type": "string",
                        "description": "discover_by_domain_list = check each provided domain. detect_shopify_only = cheapest path, just verify Shopify and return basic metadata. deep_analyze = full /products.json walk + revenue estimate + collections + apps (most expensive, most thorough).",
                        "default": "discover_by_domain_list"
                    },
                    "domains": {
                        "title": "Domains to check",
                        "type": "array",
                        "description": "List of root domains or URLs to check (e.g. 'allbirds.com', 'https://www.warbyparker.com', 'fashionnova.com'). Strip 'www.' / scheme / paths — the actor will normalize.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "discovery_seed_urls": {
                        "title": "Discovery seed URLs (optional)",
                        "type": "array",
                        "description": "URLs to crawl for outbound links — e.g. 'powered by Shopify' directory pages, niche listicles, awards lists. Outbound links become candidate domains.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "required_apps": {
                        "title": "Required apps (AND filter)",
                        "uniqueItems": true,
                        "type": "array",
                        "description": "Only emit stores that have ALL of these apps detected. Leave empty to skip. Allowed values: klaviyo, recharge, yotpo, gorgias, postscript, loop, smile_io, bold, stamped, judge_me, okendo, octane_ai, tidio, drift, klevu, searchanise, algolia, shogun, pagefly, replo, loox, reviews_io, fomo, privy, justuno, nosto, rebuy, limespot, wiser, reconvert, zipify, gempages.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "excluded_apps": {
                        "title": "Excluded apps (NOT filter)",
                        "uniqueItems": true,
                        "type": "array",
                        "description": "Drop stores that have ANY of these apps installed. Useful to find non-customers (e.g. exclude 'klaviyo' to surface non-Klaviyo Shopify stores). Allowed values: same enum as required_apps.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "min_product_count": {
                        "title": "Minimum product count",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Drop stores with fewer than N products. Set to 0 to disable.",
                        "default": 0
                    },
                    "max_product_count": {
                        "title": "Maximum product count",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Drop stores with more than N products. Set to 0 to disable.",
                        "default": 0
                    },
                    "min_estimated_monthly_revenue_usd": {
                        "title": "Minimum estimated monthly revenue (USD)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Drop stores whose estimated monthly revenue midpoint is below this. Rough heuristic - see README. Set to 0 to disable.",
                        "default": 0
                    },
                    "max_estimated_monthly_revenue_usd": {
                        "title": "Maximum estimated monthly revenue (USD)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Drop stores whose estimated monthly revenue midpoint is above this. Set to 0 to disable.",
                        "default": 0
                    },
                    "country_codes": {
                        "title": "Country codes (ISO 2-letter)",
                        "type": "array",
                        "description": "Restrict to stores whose detected primary country (from currency / shipping signals) is in this list. Empty = no filter. Example: ['US', 'CA', 'GB'].",
                        "items": {
                            "type": "string"
                        }
                    },
                    "category_keywords": {
                        "title": "Category keywords",
                        "type": "array",
                        "description": "Keyword filter on store homepage title + description. Case-insensitive substring match. Example: ['beauty', 'skincare', 'fashion'].",
                        "items": {
                            "type": "string"
                        }
                    },
                    "concurrency": {
                        "title": "Max concurrent fetches",
                        "minimum": 1,
                        "maximum": 8,
                        "type": "integer",
                        "description": "Parallel domain fetches. Shopify rate-limits aggressively; 6 is the recommended sweet spot.",
                        "default": 6
                    },
                    "use_apify_proxy": {
                        "title": "Use Apify Proxy",
                        "type": "boolean",
                        "description": "Route requests through Apify Proxy. RESIDENTIAL is strongly recommended - many Shopify stores sit behind Cloudflare.",
                        "default": true
                    },
                    "apify_proxy_groups": {
                        "title": "Proxy groups",
                        "type": "array",
                        "description": "Apify Proxy groups. RESIDENTIAL is the most reliable for Shopify.",
                        "default": [
                            "RESIDENTIAL"
                        ],
                        "items": {
                            "type": "string"
                        }
                    },
                    "apify_proxy_country": {
                        "title": "Proxy country (optional)",
                        "type": "string",
                        "description": "Two-letter country code for proxy egress. 'US' is a safe default since most Shopify stores ship to US.",
                        "default": "US"
                    },
                    "max_results": {
                        "title": "Max results",
                        "minimum": 1,
                        "maximum": 5000,
                        "type": "integer",
                        "description": "Cap on emitted records. Default 200. Increase for larger discovery runs.",
                        "default": 200
                    },
                    "include_contact_enrichment": {
                        "title": "Include contact enrichment (emails + phones)",
                        "type": "boolean",
                        "description": "Scrape /contact /pages/contact /about for email addresses (founder@, support@, hello@, sales@) and phone numbers. Adds the highest-impact field for D2C SaaS sales outreach. Charged $0.005 per store ONLY when at least one email or phone is actually extracted.",
                        "default": true
                    },
                    "include_founder_intel": {
                        "title": "Include founder + brand-story intel (slower)",
                        "type": "boolean",
                        "description": "Scrape /about /pages/our-story for founder names, founding year, and brand-story keywords (vegan, sustainable, made in USA, woman-owned, etc). Useful for sales-outreach personalization. Slower because of extra page fetches; opt-in.",
                        "default": false
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
