# Shopify Store Detector — Tech, Theme & App Detection API (`nexgendata/shopify-store-detector`) Actor

Reverse-engineer any Shopify store: detect theme, 55+ installed apps (Klaviyo, Judge.me, Yotpo, ReCharge), full tech stack & Shopify plan. BuiltWith alternative at 1/100th the cost. Essential for e-commerce agencies, app developers & competitive research.

- **URL**: https://apify.com/nexgendata/shopify-store-detector.md
- **Developed by:** [NexGenData](https://apify.com/nexgendata) (community)
- **Categories:** E-commerce, Lead generation, Marketing
- **Features:** Limited permissions
- **Stats:** 21 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $100.00 / 1,000 store detection 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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

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

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

## How to integrate an Actor?

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

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

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

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

# README

## Shopify Store Detector — Theme, Apps & Tech Stack Analysis

Shopify Store Detector is a NexGenData tool on Apify that returns a store's theme, installed apps, tech stack and Shopify plan from each Shopify store's public pages.

Analyze any Shopify store to uncover its **theme**, **installed apps**, and **technology
stack**. Built for competitive-intelligence analysts, e-commerce agencies building client
proposals, and SaaS teams prospecting Shopify merchants — a complete technical fingerprint
of a storefront from a single URL.

### 📊 Sample Output

![2 real rows delivered by Shopify Store Detector — Tech, Theme & App Detection API — run XaWt0CEADcUiuIHGX on build 0.0.14](https://api.apify.com/v2/key-value-stores/8gLgXMBveEI1tTz1z/records/shopify-store-detector-sample)

| `storeUrl` | `storeName` | `theme` | `detectedApps` | `techStack` | `estimatedPlan` |
|---|---|---|---|---|---|
| https://www.allbirds.com | weareallbirds | {'name': '\[DNAM Theme July 2026]', 'id': 130450260048, 'role': 'main'} | \[{'name': 'Google Analytics', 'category': 'analytics', 'confidence':… | \['Shopify', 'Google Tag Manager', 'Shopify Analytics', 'Shopify CDN',… | Advanced |
| https://www.kyliecosmetics.com | kylie-jenner-us | {'name': 'SYNC | HOLIDAY SETS | DO NOT DELETE', 'id': 165716590834, '… | \[{'name': 'Yotpo Reviews', 'category': 'reviews', 'confidence': 'medi… | \['Shopify', 'Google Tag Manager', 'Cloudflare', 'Shopify Analytics',… | Advanced |

Real rows from run `XaWt0CEADcUiuIHGX` on build 0.0.14 (2026-09-25), unedited apart from masked emails/phones and shortened long text; fields the source does not publish are empty.

### 🔧 Input reference

| Field | Type | Default | What it does |
|---|---|---|---|
| `storeUrls` | \['array', 'string'] | `["https://www.allbirds.com", "https://www.kyliecosmetics.co…` | List of Shopify store URLs to analyze. Provide full URLs like https://allbirds.com. Accepts a list of URLs OR a single URL string OR a comma/newline-separated list. Also accepts t… |
| `maxResults` | integer | `20` | Maximum number of store URLs to process from the input list. Use this to limit processing when providing large URL lists. |
| `outputMode` | string (raw, tracker) | `"tracker"` | Select 'raw' for basic detection data (theme, apps, tech stack). Select 'tracker' for advanced competitive intelligence including maturity scores, insights, and app combination an… |
| `urls` | \['array', 'string'] |  | Alternative name for `storeUrls`. Accepts a list OR a single string OR comma/newline-separated. |
| `startUrls` | \['array', 'string'] |  | Alternative name for `storeUrls`. Accepts a list OR a single string OR comma/newline-separated. |
| `domains` | \['array', 'string'] |  | Alternative name for `storeUrls`. Accepts a list OR a single string OR comma/newline-separated. |
| `shopifyStores` | \['array', 'string'] |  | Alternative name for `storeUrls`. Accepts a list OR a single string OR comma/newline-separated. |
| `storeUrl` | string |  | Alternative — a single value when you only need one. Comma-separated values are auto-split. |
| `url` | string |  | Alternative — a single value when you only need one. Comma-separated values are auto-split. |
| `domain` | string |  | Alternative — a single value when you only need one. Comma-separated values are auto-split. |

### 🧾 JSON sample record

One real record from run `XaWt0CEADcUiuIHGX` (emails/phones masked, long text shortened):

```json
{
  "storeUrl": "https://www.allbirds.com",
  "storeName": "weareallbirds",
  "theme": {
    "name": "[DNAM Theme July 2026]",
    "id": 130450260048,
    "role": "main"
  },
  "detectedApps": [
    {
      "name": "Google Analytics",
      "category": "analytics",
      "confidence": "high"
    },
    {
      "name": "Schema.org Markup",
      "category": "seo",
      "confidence": "medium"
    },
    {
      "name": "Back In Stock",
      "category": "marketing",
      "confidence": "medium"
    }
  ],
  "techStack": [
    "Shopify",
    "Google Tag Manager",
    "Shopify Analytics",
    "Shopify CDN",
    "Preconnect Optimization",
    "Lazy Loading",
    "Responsive Images",
    "WebP Images",
    "…"
  ],
  "currency": "USD",
  "country": "US",
  "productCount": 250,
  "collectionCount": 30,
  "hasPasswordPage": false,
  "isLive": true,
  "appCategoryBreakdown": {
    "analytics": [
      "Google Analytics"
    ],
    "seo": [
      "Schema.org Markup"
    ],
    "marketing": [
      "Back In Stock"
    ]
  },
  "techMaturityScore": 52,
  "competitiveInsights": [
    "Minimal app ecosystem detected — potential opportunity for growth."
  ],
  "commonAppCombinations": [],
  "estimatedPlan": "Advanced"
}
```

### 💰 Pricing

| Event | Price (USD) | When it is charged |
|---|---|---|
| Actor Start (`apify-actor-start`) | $0.01 | Charged when the Actor starts running. Number of events charged depends on Actor memory (one event per GB, minimum one event). |
| Store detection record (`apify-default-dataset-item`) | $0.1 | Charged for each store analyzed and added to the dataset. |

Pay-per-event: you pay only for what the run delivers. A run that delivers nothing bills no result events (only the actor-start event, when the actor defines one). Example: a run that delivers 100 results costs 100 × $0.1 = $10.00 plus the start fee.

### 🔗 Related Actors

More from the NexGenData **Leads, contacts & enrichment** family:

- [Shopify Revenue Estimator — Store Intel API](https://apify.com/nexgendata/shopify-analyzer?fpr=2ayu9b)
- [Shopify App Merchant Finder — Competitor App User Leads API](https://apify.com/nexgendata/shopify-app-merchant-finder?fpr=2ayu9b)
- [Shopify Store Analyzer — Catalog, Apps & Revenue Signals API](https://apify.com/nexgendata/shopify-store-analyzer?fpr=2ayu9b)
- [SSL Certificate Checker — Bulk Expiry & Chain Monitor](https://apify.com/nexgendata/ssl-certificate-checker?fpr=2ayu9b)
- [TikTok Creator Email Finder — Influencer Contact API](https://apify.com/nexgendata/tiktok-creator-email-finder?fpr=2ayu9b)
- [Tech Stack Detector — Wappalyzer & BuiltWith API Alternative](https://apify.com/nexgendata/wappalyzer-replacement?fpr=2ayu9b)

30 more in this family on the [NexGenData Store page](https://apify.com/nexgendata?fpr=2ayu9b).

### Key Features

- **Theme Detection** — active theme name, theme id and role, read from the `Shopify.theme`
  object, the `theme-name` meta tag, or stylesheet fingerprints.
- **App Detection** — 50+ app fingerprints across 12 categories: reviews, email marketing,
  loyalty, upsell/cross-sell, analytics, live chat, SEO, shipping, subscriptions, marketing,
  page builders and personalisation. Each hit carries a `high`/`medium` confidence.
- **Tech Stack Fingerprinting** — third-party scripts, payment gateways (Shopify Payments,
  Apple Pay, Google Pay), analytics, CDN and front-end optimisation signals.
- **Catalog Size** — product and collection counts from the store's public
  `/products.json` and `/collections.json` endpoints.
- **Tracker Mode** — adds an app category breakdown, a tech-maturity score, competitive
  insights, common app combinations and an estimated Shopify plan.
- **Bulk Analysis** — pass a list of store URLs and analyze many stores in one run, with a
  consistent per-store schema.

### Output Example

```json
{
  "storeUrl": "https://www.allbirds.com",
  "storeName": "weareallbirds",
  "theme": { "name": "[DNAM Theme July 2026]", "id": 130450260048, "role": "main" },
  "detectedApps": [
    { "name": "Google Analytics", "category": "analytics", "confidence": "high" }
  ],
  "techStack": ["Shopify", "Google Tag Manager", "Shopify Analytics", "Shopify CDN",
                "Lazy Loading", "Responsive Images", "WebP Images", "Shopify Payments",
                "Apple Pay"],
  "currency": "USD",
  "country": "US",
  "productCount": 250,
  "collectionCount": 30,
  "hasPasswordPage": false,
  "isLive": true,
  "appCategoryBreakdown": { "analytics": ["Google Analytics"] },
  "techMaturityScore": 52,
  "competitiveInsights": ["Minimal app ecosystem detected — potential opportunity for growth."],
  "commonAppCombinations": [],
  "estimatedPlan": "Advanced"
}
```

`appCategoryBreakdown`, `techMaturityScore`, `competitiveInsights`,
`commonAppCombinations` and `estimatedPlan` appear only in `tracker` output mode.
`estimatedPlan` is a heuristic estimate from public storefront signals, not a figure
published by Shopify.

### Input

```json
{
  "storeUrls": ["https://www.allbirds.com", "https://www.kyliecosmetics.com"],
  "outputMode": "tracker",
  "maxResults": 20
}
```

`storeUrls` also accepts a single URL string, a comma/newline-separated string, or any of
these alias field names: `urls`, `startUrls`, `domains`, `shopifyStores`, `storeUrl`,
`url`, `domain`.

### 💰 Pricing

Pay-per-event — you pay for stores actually analyzed.

| Metric | Cost |
|---|---|
| Actor start | $0.01 |
| Per store analyzed and returned | $0.10 |
| 100 stores | $10.01 |
| 1,000 stores | $100.01 |

Stores that cannot be fetched, that answer with a bot-check page, or that turn out not to
run Shopify are **skipped and not charged** — they are named in the run status message
instead. There is no free tier for this actor.

### ✅ What happens when there is no data

- No `storeUrls` supplied → the run **succeeds with 0 rows** and a message naming the
  missing field. Nothing is charged.
- A URL is reachable but not a Shopify store → skipped, named in the status message, not
  charged.
- Every requested store was blocked, challenged or unreachable → the run **fails loudly**
  with a message naming the cause, rather than finishing green and empty.
- The run hits its time limit → it stops cleanly and says "stopped early at the run time
  limit"; only stores actually analyzed are charged.

### ❓ FAQ

**How fresh is the data?** Every run fetches the target storefront live. No caching.

**What output formats are supported?** JSON, CSV, Excel and XML, plus the usual Apify
integrations (Google Sheets, Slack, webhooks).

**Can I access this via API?** Yes — the standard Apify REST API and the official Python
and JavaScript clients.

**Can I use the output commercially?** You own the output. Check the target site's Terms of
Service for restrictions on the underlying content.

### 🔗 Related NexGenData Actors

- [Shopify Product Extractor — Catalog & Prices](https://apify.com/nexgendata/shopify-store-analyzer)
- [Shopify App Store Scraper](https://apify.com/nexgendata/shopify-app-store-scraper)
- [Google Maps Lead Scraper](https://apify.com/nexgendata/google-maps-scraper)

***

*Analyzes publicly available storefront markup. Not affiliated with Shopify Inc.*

# Actor input Schema

## `storeUrls` (type: `array,string`):

List of Shopify store URLs to analyze. Provide full URLs like https://allbirds.com. Accepts a list of URLs OR a single URL string OR a comma/newline-separated list. Also accepts these alternative field names: urls, startUrls, domains, shopifyStores, storeUrl, url, domain.

## `maxResults` (type: `integer`):

Maximum number of store URLs to process from the input list. Use this to limit processing when providing large URL lists.

## `outputMode` (type: `string`):

Select 'raw' for basic detection data (theme, apps, tech stack). Select 'tracker' for advanced competitive intelligence including maturity scores, insights, and app combination analysis.

## `urls` (type: `array,string`):

Alternative name for `storeUrls`. Accepts a list OR a single string OR comma/newline-separated.

## `startUrls` (type: `array,string`):

Alternative name for `storeUrls`. Accepts a list OR a single string OR comma/newline-separated.

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

Alternative name for `storeUrls`. Accepts a list OR a single string OR comma/newline-separated.

## `shopifyStores` (type: `array,string`):

Alternative name for `storeUrls`. Accepts a list OR a single string OR comma/newline-separated.

## `storeUrl` (type: `string`):

Alternative — a single value when you only need one. Comma-separated values are auto-split.

## `url` (type: `string`):

Alternative — a single value when you only need one. Comma-separated values are auto-split.

## `domain` (type: `string`):

Alternative — a single value when you only need one. Comma-separated values are auto-split.

## Actor input object example

```json
{
  "storeUrls": [
    "https://www.allbirds.com",
    "https://www.gymshark.com"
  ],
  "maxResults": 20,
  "outputMode": "tracker"
}
```

# Actor output Schema

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

Default dataset of Shopify Store Detector — Tech, Theme & App Detection API records (16 fields per row: storeUrl, storeName, theme, detectedApps, techStack, currency, country, productCount, collectionCount, hasPasswordPage, isLive, appCategoryBreakdown…).

# 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 = {
    "storeUrls": [
        "https://www.allbirds.com",
        "https://www.gymshark.com"
    ],
    "maxResults": 20,
    "outputMode": "tracker"
};

// Run the Actor and wait for it to finish
const run = await client.actor("nexgendata/shopify-store-detector").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 = {
    "storeUrls": [
        "https://www.allbirds.com",
        "https://www.gymshark.com",
    ],
    "maxResults": 20,
    "outputMode": "tracker",
}

# Run the Actor and wait for it to finish
run = client.actor("nexgendata/shopify-store-detector").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 '{
  "storeUrls": [
    "https://www.allbirds.com",
    "https://www.gymshark.com"
  ],
  "maxResults": 20,
  "outputMode": "tracker"
}' |
apify call nexgendata/shopify-store-detector --silent --output-dataset

```

## MCP server setup

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

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/uBH59r7daFiMim0T0/builds/qYiqgeqpAxEXhUYoc/openapi.json
