# Website Tech Stack Detector — CMS & Ecommerce (`maximedupre/cms-detector`) Actor

Check website landing pages for CMS, ecommerce tools, frameworks, analytics, hosting, and more. Get confidence scores, public page details, and one clear row per website.

- **URL**: https://apify.com/maximedupre/cms-detector.md
- **Developed by:** [Maxime Dupré](https://apify.com/maximedupre) (community)
- **Categories:** Developer tools, Marketing, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.10 / 1,000 website analyzeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

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

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

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

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

# README

### 🔎 Find the CMS behind each website

CMS Detector helps sales teams, agencies, and developers check a list of website domains. It returns the CMS, related public technologies, confidence scores, versions, ecommerce signals, and page details in a clean dataset.

- Check an **[Ecommerce Platform Detector](https://apify.com/maximedupre/cms-detector/examples/ecommerce-platform-detector)** list to find sites that show ecommerce tools.
- Use the **[Website Analyzer](https://apify.com/maximedupre/cms-detector/examples/website-analyzer)** to collect public page and HTTP details.
- Run the **[Technology Detector](https://apify.com/maximedupre/cms-detector/examples/technology-detector)** to find public tools by category.
- Use the **[Website Technology Detector](https://apify.com/maximedupre/cms-detector/examples/website-technology-detector)** to check frameworks, analytics, hosting, and more.
- Run the **[CMS Detector](https://apify.com/maximedupre/cms-detector/examples/cms-detector)** to find the CMS and any public version details.

#### 📦 What data does it return?

Each saved row describes one website that was analyzed. You get the final URL, HTTP status, page title and description, exposed server and generator details, CMS data, related technologies, and an ecommerce flag.

The Actor checks public landing-page fingerprints. It does not render steps that need user actions, crawl the whole site, or see private server tools.

#### 🚀 How do I run the Actor?

1. Add one website domain per line. Do not add a page path.
2. Click **Start**.
3. Open the default dataset to view or export the saved rows.

A blocked or failed website does not stop the other websites. Only successful analyses are saved.

#### 📥 Input

| Field | Type | What it does |
|---|---|---|
| `websites` | string array | Lists the website domains to check, one per line. Use a domain like `example.com` or `shop.example.com`, with no page path. |

This is the public input used by the successful default-input QA run:

```json
{
  "websites": [
    "wordpress.org",
    "shopify.com"
  ]
}
```

#### 📤 Output

| Field | Type | What it does |
|---|---|---|
| `website` | string | Submitted website domain. |
| `resolvedUrl` | string | Final public URL after redirects. |
| `statusCode` | integer | HTTP status from the final page. |
| `pageTitle` | string or null | Public page title, when found. |
| `pageDescription` | string or null | Public page description, when found. |
| `server` | string or null | Server detail shown by the website, when found. |
| `generator` | string or null | Generator detail shown by the page, when found. |
| `cms` | object or null | Detected CMS, or `null` when no CMS is found. |
| `cms.name` | string | CMS name. |
| `cms.version` | string or null | Public CMS version, when found. |
| `cms.confidence` | integer | CMS confidence from 0 to 100. A higher number means a stronger match. |
| `technologies` | object array | Other public technologies found on the page. |
| `technologies[].name` | string | Technology name. |
| `technologies[].categories` | string array | Jobs done by the technology. |
| `technologies[].version` | string or null | Public technology version, when found. |
| `technologies[].confidence` | integer | Technology confidence from 0 to 100. A higher number means a stronger match. |
| `isEcommerce` | boolean | Says whether the findings show ecommerce support. |

A full row from the current beta build:

```json
{
  "website": "wordpress.org",
  "resolvedUrl": "https://wordpress.org/",
  "statusCode": 200,
  "server": "nginx",
  "pageTitle": "Blog Tool, Publishing Platform, and CMS – WordPress.org",
  "pageDescription": "Open source software which you can use to easily create a beautiful website, blog, or app.",
  "generator": "WordPress 7.1-beta3-62853",
  "cms": {
    "name": "WordPress",
    "version": "7.1",
    "confidence": 100
  },
  "technologies": [
    {
      "name": "Google Tag Manager",
      "categories": [
        "Tag manager"
      ],
      "version": null,
      "confidence": 85
    },
    {
      "name": "nginx",
      "categories": [
        "Web server"
      ],
      "version": null,
      "confidence": 100
    }
  ],
  "isEcommerce": false
}
```

#### 💳 Pricing

This Actor uses pay-per-event pricing. You are charged for each submitted website that is successfully analyzed and saved. A blocked or failed website is not saved as a paid analysis. See the **Pricing** tab for the current rates.

#### 🔌 Integrations

Send dataset rows to Google Sheets, Make, Zapier, Slack, webhooks, or your own app with Apify integrations and API tools.

https://www.youtube.com/watch?v=bNACk1\_S\_6w\&list=PLObrtcm1Kw6MUrlLNDbK9QRg8VDJg0gOW\&index=4

#### ❓ FAQ

**Can it detect a Shopify or WordPress theme?**

No. It can detect public CMS and ecommerce fingerprints, but it does not name a site's theme.

**Why is the CMS null?**

The landing page may not show a known CMS fingerprint. A `null` value means no CMS was identified; it is not a CMS match.

**What happens when a website blocks the request?**

That website is not saved as a successful analysis. Other submitted websites can still finish.

**Does it scan every page on a website?**

No. It checks the public landing page and its response details.

**Can it find private or server-side tools?**

Only when a website exposes a public fingerprint. It cannot see private tools that leave no public sign.

### 📝 Changelog

#### 0.0: Initial release

- Detect CMS, ecommerce platforms, frameworks, analytics, hosting, and other public website technologies in bulk.
- Return confidence scores, exposed versions, page details, and HTTP status in one dataset row per successful website.

### 🆘 Support

For issues, questions, or feature requests, [file a ticket](https://console.apify.com/actors/maximedupre~cms-detector/issues) and I'll fix or implement it in less than 24h 🫡

### 🔗 Related Actors

- [Schema Markup Validator](https://apify.com/maximedupre/schema-markup-validator) — check JSON-LD, Microdata, RDFa, and page metadata after you identify a site's platform.
- [Webpage Text Extractor](https://apify.com/maximedupre/webpage-text-extractor) — collect clean text, headings, links, and metadata from public pages.
- [Sitemap Sniffer](https://apify.com/maximedupre/sitemap-sniffer) — find sitemap files and optional URL lists for a website.
- [SSL Certificate Checker](https://apify.com/maximedupre/ssl-certificate-checker) — check certificate, TLS, redirect, and HSTS details for the same domains.
- [Website Change Monitor & Diff Checker](https://apify.com/maximedupre/webpage-diff-checker) — compare saved website baselines and find page changes.

**Made with ❤️ by Maxime Dupré**

# Actor input Schema

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

Add one website domain per line, such as example.com or shop.example.com. Do not add page paths.

## Actor input object example

```json
{
  "websites": [
    "wordpress.org",
    "shopify.com"
  ]
}
```

# Actor output Schema

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

Open the website URLs, page details, CMS findings, technologies, and qualification signals.

# 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": [
        "wordpress.org",
        "shopify.com"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("maximedupre/cms-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 = { "websites": [
        "wordpress.org",
        "shopify.com",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("maximedupre/cms-detector").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": [
    "wordpress.org",
    "shopify.com"
  ]
}' |
apify call maximedupre/cms-detector --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/fi67yjF7KzAhj7nqC/builds/llIU5vxpnnnsMtO3S/openapi.json
