# Shopify Store Intelligence (`zinin/shopify-store-intelligence`) Actor

Confirm a site runs on Shopify and pull store intelligence from its public feeds — product count, price range, top vendors/categories, newest listing and a rough revenue-band heuristic. No login, no Shopify API key.

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

## Pricing

from $6.00 / 1,000 store analyzeds

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.

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

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

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.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/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 Intelligence — Catalog, Pricing & Revenue Signals

**Is this site a Shopify store — and what's actually in it?** Point this Actor at a list
of websites and get back confirmed Shopify detection plus real store intelligence pulled
from Shopify's own public feeds: product count, price range, top vendors/categories,
newest listing date and a rough revenue-band signal — with an explicit flag whenever the
catalog scan didn't finish, instead of quietly passing off partial data as the whole
picture.

### What you get

- **Confirmed Shopify detection**, not a guess — the same signature engine as
  `tech-stack-detector`.
- **Real catalog intelligence for confirmed stores** — product count, price range, top
  vendors/product-types, newest product date, a rough revenue band — read straight from
  Shopify's own public `/products.json` and `/collections.json` feeds.
- **`catalogComplete` and `catalogTruncatedReason` on every scanned row.** If the product
  feed cuts off mid-pagination — a page errors out, or the store simply has more
  products than the scan limit covers — the row says so explicitly instead of quietly
  presenting a partial catalog as a finished one.
- **Revenue estimates flagged as truncated when they are.** A revenue band built from a
  cut-off catalog scan carries a `note` saying the real catalog — and the estimate — may
  be larger, so a partial read is never mistaken for a confident number.
- No login, no Shopify API key, no browser needed to run any of it.
- Runs on Apify: schedule it, monitor it, call it from the API or the MCP server, export
  to JSON, CSV or Excel, or push results straight into your own pipeline.

### How to run it

1. Click **Try for free** — no card needed on the free plan.
2. Paste websites into **Websites**, one per line (e.g. `allbirds.com` or a full URL).
3. Press **Start**. Results appear in the dataset — read them in the UI, pull them from
   the API, or push them onward with a webhook.

### Pricing

Pay-per-event: **$0.005 per run start + $0.006 per site checked**. No monthly seat.
100 sites cost about **$0.61**; 1,000 sites about **$6.01**.

A site that could not be reached is still returned, with `found: false` and the reason,
and it is **not** charged. Non-Shopify sites and Shopify sites with a disabled product
feed are billed the same as any other result: you pay for the check, not for a specific
answer.

### Input

| Field | Type | Description |
|-------|------|-------------|
| `websites` | array of strings | Sites to check (e.g. `allbirds.com` or a full URL). One row per site. Up to 100. |
| `maxConcurrency` | integer | Parallelism (1–20, default 5) |

```json
{
    "websites": [
        "allbirds.com",
        "gymshark.com",
        "stripe.com"
    ]
}
````

### Output (one item per website)

This is a real row from a real run:

```json
{
    "url": "https://www.allbirds.com/",
    "found": true,
    "httpStatus": 200,
    "isShopify": true,
    "productsAccessible": true,
    "productCount": 750,
    "collectionsCount": 250,
    "priceRange": {
        "min": 3,
        "max": 160,
        "currency": "USD"
    },
    "topProductTypes": [
        "Shoes",
        "Socks",
        "Apparel",
        "Underwear"
    ],
    "topVendors": [
        "Allbirds"
    ],
    "newestProductAt": "2026-02-04T17:38:18-08:00",
    "catalogComplete": false,
    "catalogTruncatedReason": "scan limit reached (3 pages / 750 products cap)",
    "revenueEstimate": {
        "band": "$10M+",
        "confidence": "low",
        "note": "based on a truncated catalog scan — the real catalog (and this estimate) may be larger"
    },
    "salesSignals": [
        "runs an online store (Shopify)",
        "large catalog (750+ products, capped at scan limit)"
    ],
    "summary": "https://www.allbirds.com/ — Shopify store, 750 products scanned (truncated scan — see catalogTruncatedReason), price range USD3–160, ~$10M+ (confidence low). Top category: Shoes.",
    "checkedAt": "2026-07-26T15:29:08.593Z"
}
```

| Field | Description |
|---|---|
| `found` | The site was reachable (even if it's not Shopify) |
| `isShopify` | Confirmed Shopify signature match |
| `productsAccessible` | Whether `/products.json` returned usable data (some stores disable it) |
| `productCount` | Products scanned, capped at 750 (3 pages of 250 — a signal, not a full export) |
| `collectionsCount` | Collections seen on a single `/collections.json` page, capped at 250 (Shopify's own `?limit` hard cap) — not a guaranteed total |
| `priceRange` | Min/max variant price across scanned products, with currency read from the storefront |
| `topProductTypes` / `topVendors` | Most common values across scanned products |
| `catalogComplete` | `true` if the scan reached the real end of the catalog (a short/empty page); `false` if it stopped early — a page failed mid-scan, or the store simply has more products than the 750-item scan cap covers |
| `catalogTruncatedReason` | Plain-English reason when `catalogComplete` is `false`; `null` otherwise |
| `revenueEstimate` | Rough band from catalog size + average price only. **Not actual sales data** — always `confidence: "low"`, and carries a `note` when built from a truncated scan |
| `salesSignals` | Plain-English qualification cues |

Non-Shopify sites return `isShopify: false` with the rest of the intelligence fields
empty. Unreachable sites return `found: false`.

For the sample row above, `productCount: 750` is exactly the 3-page scan cap — this
store's real catalog runs larger than what got scanned, which is precisely the case
`catalogComplete: false` exists to flag.

#### Need the rest of the picture?

These run on the same account, take the same shape of input and bill the same way, so they slot into an existing pipeline without new plumbing.

| Actor | What it does |
|---|---|
| [AI Crawler Access Checker](https://apify.com/zinin/ai-crawler-access-checker) | Check which AI crawlers (GPTBot, ClaudeBot, PerplexityBot, Google-Extended & more) can access your website |
| [B2B Lead Enricher](https://apify.com/zinin/b2b-lead-enricher) | Turn a list of company websites into sales-qualified lead cards: detected tech stack, a rough revenue… |
| [Clinical Trials Monitor](https://apify.com/zinin/clinical-trials-monitor) | Watch conditions, drugs or sponsors for new and updated clinical trials |
| [Company Hiring Radar](https://apify.com/zinin/company-hiring-radar) | Pull every open role a company is hiring for from its public job board (Greenhouse, Lever, Ashby) and turn… |
| [Company Profile Lookup](https://apify.com/zinin/company-lookup) | Turn a domain or company name into one unified company card: website tech stack (CMS, ecommerce, key tech)… |

### FAQ

**Does it need a Shopify API key or login?** No. It reads the same `/products.json` and
`/collections.json` feeds Shopify serves publicly to any visitor's browser — many
storefronts disable this, in which case you get `isShopify: true, productsAccessible:
false`.

**Is the revenue band real?** No — it's a rough heuristic from catalog size and average
price, not actual sales figures. Confidence is always reported as `low`; use it to
sort/qualify, not to forecast. When the catalog scan itself was cut short, the estimate
carries an explicit `note` saying the real number could be higher.

**How many products does it scan?** Up to 750 per store (3 pages of Shopify's own
250-item page cap). If the store has more, `catalogComplete: false` and
`catalogTruncatedReason` say so — the row never claims to be a full export.

**Can I call it from an AI agent?** Yes — it's a standard Apify Actor, callable via the
Apify API or the Apify MCP server.

**What this is NOT.** It is not a full product-catalog export and not real sales or
revenue data. It answers "is this Shopify, and roughly how big" from what the storefront
publishes for free, and says exactly when that answer is partial.

Found a wrong result, or need a check we don't run? Open an issue on this Actor's page.

***

Built by [zinin](https://apify.com/zinin). Questions? Telegram [@timzinin](https://t.me/timzinin).

# Actor input Schema

## `websites` (type: `array`):

List of websites to check (e.g. `allbirds.com` or `https://example.com`). One row per site.

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

How many websites to check in parallel.

## Actor input object example

```json
{
  "websites": [
    "allbirds.com",
    "gymshark.com",
    "stripe.com"
  ],
  "maxConcurrency": 5
}
```

# 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 = {
    "websites": [
        "allbirds.com",
        "gymshark.com",
        "stripe.com"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("zinin/shopify-store-intelligence").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 = { "websites": [
        "allbirds.com",
        "gymshark.com",
        "stripe.com",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("zinin/shopify-store-intelligence").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 '{
  "websites": [
    "allbirds.com",
    "gymshark.com",
    "stripe.com"
  ]
}' |
apify call zinin/shopify-store-intelligence --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Shopify Store Intelligence",
        "description": "Confirm a site runs on Shopify and pull store intelligence from its public feeds — product count, price range, top vendors/categories, newest listing and a rough revenue-band heuristic. No login, no Shopify API key.",
        "version": "0.1",
        "x-build-id": "1PzMQ7nlPkkKuNOff"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/zinin~shopify-store-intelligence/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-zinin-shopify-store-intelligence",
                "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/zinin~shopify-store-intelligence/runs": {
            "post": {
                "operationId": "runs-sync-zinin-shopify-store-intelligence",
                "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/zinin~shopify-store-intelligence/run-sync": {
            "post": {
                "operationId": "run-sync-zinin-shopify-store-intelligence",
                "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": [
                    "websites"
                ],
                "properties": {
                    "websites": {
                        "title": "Websites",
                        "maxItems": 100,
                        "type": "array",
                        "description": "List of websites to check (e.g. `allbirds.com` or `https://example.com`). One row per site.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxConcurrency": {
                        "title": "Max concurrency",
                        "minimum": 1,
                        "maximum": 20,
                        "type": "integer",
                        "description": "How many websites to check in parallel.",
                        "default": 5
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
