# Website Tech Stack Detector – CMS & Framework Lookup (`logiover/website-tech-stack-detector`) Actor

Detect the technologies behind any website in bulk: CMS (WordPress, Shopify, Wix), JS frameworks, analytics, marketing/CRM, payments, CDN & hosting. BuiltWith-style fingerprinting for competitive intel and B2B prospecting. Domains in, tech stack out.

- **URL**: https://apify.com/logiover/website-tech-stack-detector.md
- **Developed by:** [Logiover](https://apify.com/logiover) (community)
- **Categories:** Developer tools, Lead generation, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.50 / 1,000 results

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 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

## 🔎 Website Tech Stack Detector – CMS & Framework Lookup

**Find out what any website is built with — in bulk.**
Drop in a list of domains and get back the **CMS**, **ecommerce platform**, **JavaScript framework**, **analytics**, **marketing/CRM tools**, **payment widgets**, **CDN**, **hosting**, and **web server** behind each one.

A fast, **BuiltWith-style technology lookup** and **CMS detector** for **competitive intelligence**, **lead generation**, and **market research**. Domains in → tech stack out, as clean JSON, CSV, or Excel.

> Need to **detect a website's tech stack**, **check what CMS a site uses**, find **all Shopify stores**, or build a list of **WordPress sites running WooCommerce** for prospecting? This Actor does it at scale, with no browser and no monthly subscription.

---

### ✅ What it detects

| Category | Examples |
|---|---|
| **CMS** | WordPress, Shopify, Wix, Squarespace, Webflow, Framer, Drupal, Joomla, Ghost, HubSpot CMS, Contentful, Sitecore |
| **Ecommerce** | Shopify, WooCommerce, Magento, BigCommerce, PrestaShop, Salesforce Commerce, Ecwid |
| **JS frameworks** | Next.js, Nuxt, React, Vue, Angular, Svelte, Gatsby, Astro, jQuery |
| **Analytics** | Google Analytics, GTM, Meta Pixel, Hotjar, Segment, Mixpanel, Plausible, Matomo, Amplitude |
| **Marketing / CRM** | HubSpot, Mailchimp, Klaviyo, Intercom, Drift, Zendesk, Tawk.to, Crisp |
| **Payments** | Stripe, PayPal, Klarna |
| **CDN / hosting** | Cloudflare, Fastly, Akamai, Vercel, Netlify, CloudFront, GitHub Pages, S3 |
| **Web server** | Nginx, Apache, IIS, LiteSpeed, OpenResty, Caddy |

---

### 🎯 Best for

- **B2B prospecting** — build target lists by technology: "all Shopify + Klaviyo stores", "Magento merchants", "sites on HubSpot", "WooCommerce shops"
- **Competitive intelligence** — see what stack competitors and their customers run
- **Agencies & SaaS sales** — find sites using (or missing) a specific tool you replace, integrate with, or migrate from
- **Market research** — measure technology adoption across an industry, niche, or country
- **Lead enrichment** — append tech-stack signals to your CRM records for sharper targeting and messaging
- **Recruiting & sourcing** — find companies running the stack you hire for

---

### ⚡ Why this detector

- **Bulk-first** — hundreds of domains per run, parallelized for speed
- **Header + cookie + HTML fingerprinting** — reads response headers, set-cookies, and page markup, so it catches signals single-source scrapers miss
- **Precision-tuned** — detection patterns are kept specific to avoid the false positives that plague naive keyword matching (this is a paid tool: accuracy over guesses)
- **Grouped output** — technologies organized by category **plus** a flat list, so you can filter prospect lists in one click
- **HTTP-only & cheap** — no browser needed, low cost per result
- **Optional proxy** — datacenter proxy is enough for most sites

---

### 🛠 How to use

1. Add domains to **Domains** (`shopify.com`, `https://www.bbc.com` — with or without `https://`). You can also pipe a big list via **Start URLs**.
2. Adjust **Concurrency** for speed.
3. Run and export to **CSV / Excel / JSON**, or fetch via the **Apify API**.
4. Filter the dataset by `cms`, `ecommerce`, or any value in `technologies` to build a laser-targeted prospect list.

#### Example input
```json
{ "domains": ["shopify.com", "techcrunch.com", "gatsbyjs.com"], "concurrency": 10 }
````

***

### 📤 Output

```json
{
  "domain": "techcrunch.com",
  "statusCode": 200,
  "title": "TechCrunch | Startup and Technology News",
  "cms": "WordPress",
  "ecommerce": null,
  "server": "Nginx",
  "generator": "WordPress 6.x",
  "technologies": ["WordPress", "HubSpot", "Google Tag Manager", "Cloudflare"],
  "byCategory": {
    "CMS": ["WordPress"],
    "Analytics": ["Google Tag Manager"],
    "Marketing": ["HubSpot"],
    "CDN/Hosting": ["Cloudflare"]
  },
  "technologyCount": 4
}
```

***

### 💡 Example prospecting recipes

- **Find Shopify stores to pitch an app/agency** → run your domain list, filter `ecommerce = Shopify`.
- **Target WordPress sites for a plugin/migration offer** → filter `cms = WordPress`.
- **Sell a Klaviyo/HubSpot competitor** → filter `technologies` contains `Klaviyo` or `HubSpot`.
- **Find sites with NO analytics** → filter rows where `byCategory.Analytics` is empty (an easy upsell).
- **Map a competitor's customer base** → scrape their "customers" page for domains, then detect each one's stack.

***

### 🆚 How this compares

**vs. BuiltWith / Wappalyzer** — Same idea (identify a site's technologies), but built for **bulk runs on Apify** with clean CSV/Excel/JSON export and full API access, at pay-per-result pricing — no monthly seat fees or per-lookup credits.

**vs. a browser-based scraper** — It fingerprints the served HTML, headers, and cookies, which exposes the vast majority of stacks (CMS, ecommerce, frameworks, analytics, hosting) without paying for a full headless browser per page.

**vs. manual checks** — Inspecting source code site-by-site doesn't scale. This Actor processes large lists and outputs a structured, filterable dataset.

***

### ❓ FAQ

**Does it render JavaScript?**
It fingerprints the served HTML, headers, and cookies, which reveals the vast majority of stacks without the cost of a full browser. For most prospecting and intelligence use cases this is both faster and cheaper.

**How accurate is it?**
Detection patterns are deliberately specific to minimize false positives. When a signal is ambiguous, the Actor prefers to omit it rather than guess.

**Can I feed it a big domain list?**
Yes — paste hundreds of domains, or pipe them from another Actor or an uploaded file via `startUrls`.

**Can I run it on a schedule?**
Yes — schedule periodic runs to track when target sites adopt or drop technologies (a strong buying/selling signal).

***

### 🔁 Pairs well with

- **Website Contact Scraper** → add emails, phones & socials to each domain you detect
- **Bulk Email Verifier** → clean those contacts before outreach
- Any directory/marketplace scraper → produce the domain list, then enrich it with tech signals

***

#### Keywords

website tech stack detector, what technology a website uses, cms detector, detect website cms, builtwith alternative, wappalyzer alternative, technology lookup, find shopify stores, wordpress site finder, woocommerce store list, ecommerce platform detector, framework detector, web server lookup, tech stack lead generation, competitive intelligence scraper, website technology checker, bulk cms detection, find sites using hubspot, klaviyo store finder.

***

### Changelog

- **2026-06-01** — Maintenance & reliability pass: pulled the latest source and rebuilt the Actor on the current base image; build verified.

*Last reviewed: 2026-06-01.*

# Actor input Schema

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

Domains or URLs to analyze (e.g. shopify.com, https://www.bbc.com). With or without https://.

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

Alternative URL list input (e.g. from another Actor or an uploaded file).

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

Parallel requests (1-30).

## `proxyConfiguration` (type: `object`):

Optional proxy. Datacenter is enough for most sites.

## Actor input object example

```json
{
  "domains": [
    "shopify.com",
    "wordpress.org",
    "vercel.com",
    "stripe.com"
  ],
  "concurrency": 10,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

Dataset with detected CMS, frameworks, analytics, hosting and more per domain.

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

// Run the Actor and wait for it to finish
const run = await client.actor("logiover/website-tech-stack-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 = { "domains": [
        "shopify.com",
        "wordpress.org",
        "vercel.com",
        "stripe.com",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("logiover/website-tech-stack-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 '{
  "domains": [
    "shopify.com",
    "wordpress.org",
    "vercel.com",
    "stripe.com"
  ]
}' |
apify call logiover/website-tech-stack-detector --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Website Tech Stack Detector – CMS & Framework Lookup",
        "description": "Detect the technologies behind any website in bulk: CMS (WordPress, Shopify, Wix), JS frameworks, analytics, marketing/CRM, payments, CDN & hosting. BuiltWith-style fingerprinting for competitive intel and B2B prospecting. Domains in, tech stack out.",
        "version": "1.0",
        "x-build-id": "cHOOPIMcmfJWElKAT"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/logiover~website-tech-stack-detector/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-logiover-website-tech-stack-detector",
                "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/logiover~website-tech-stack-detector/runs": {
            "post": {
                "operationId": "runs-sync-logiover-website-tech-stack-detector",
                "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/logiover~website-tech-stack-detector/run-sync": {
            "post": {
                "operationId": "run-sync-logiover-website-tech-stack-detector",
                "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",
                "properties": {
                    "domains": {
                        "title": "Domains",
                        "type": "array",
                        "description": "Domains or URLs to analyze (e.g. shopify.com, https://www.bbc.com). With or without https://.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "startUrls": {
                        "title": "Start URLs (optional)",
                        "type": "array",
                        "description": "Alternative URL list input (e.g. from another Actor or an uploaded file).",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "concurrency": {
                        "title": "Concurrency",
                        "minimum": 1,
                        "maximum": 30,
                        "type": "integer",
                        "description": "Parallel requests (1-30).",
                        "default": 10
                    },
                    "proxyConfiguration": {
                        "title": "Proxy",
                        "type": "object",
                        "description": "Optional proxy. Datacenter is enough for most sites.",
                        "default": {
                            "useApifyProxy": true
                        }
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
