# Website Tech Stack Detector: CMS, Analytics, Pixels (`zerahdata/website-tech-stack-detector`) Actor

Detect the technologies behind any website - CMS, e-commerce platform, analytics, ad pixels, CDN, frameworks, payments, chat, email and DNS providers - with evidence, insights and change tracking.

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

## Pricing

$2.00 / 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.

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

## Website Tech Stack Detector: CMS, Analytics, Pixels

Find out what any website is built with - **CMS, e-commerce platform, analytics, tag managers, ad pixels, CDN, hosting, JavaScript frameworks, payment providers, chat widgets, consent tools, A/B testing, email marketing, review widgets, email provider and DNS host** - in one fast run, with the **evidence** behind every detection, **ready-made insights**, a **market-share summary** across all domains, and optional **change tracking**.

No browser, no API key. Paste domains, get a stack profile per domain.

### Why this actor

- **Evidence you can trust.** Every technology comes with a confidence score and the exact signal it was found by (for example `script src matches js.stripe.com`), so you can verify any result.
- **Insights, not only names.** Flags such as *ad pixels without a consent manager*, *outdated jQuery*, *online store without a reviews widget or email marketing tool*, *analytics hidden behind a tag manager*, plus a tooling tier per domain - handy for sales prospecting and audits.
- **DNS signals included.** Email provider (Google Workspace, Microsoft 365, ...), DNS host and verified SaaS services from MX/NS/TXT records - things a page scan alone cannot see.
- **Market-share summary.** One free summary row per run: top technologies and top tools per category with share %, across every domain you scanned.
- **Change tracking.** Schedule it and get TECH_ADDED, TECH_REMOVED and VERSION_CHANGED rows - spot a competitor switching platforms or a prospect adding a new tool.
- **Bot-protected sites handled honestly.** If a site answers with a challenge page, you get a free BLOCKED row with the header/DNS-level technologies that could still be identified - never a fake "nothing detected".
- **Low, flat price, no start fee.** One charge per successfully scanned domain; errors are free.

### What it detects

250+ technologies across: CMS (WordPress, Shopify, Wix, Squarespace, Webflow, Drupal, ...), e-commerce (Shopify, WooCommerce, Magento, BigCommerce, Salla, Zid, Tiendanube, VTEX, ...), analytics, tag managers, ad pixels (Meta, Google Ads, TikTok, LinkedIn, Pinterest, Snap, X, Microsoft, Reddit, Criteo, ...), CDN and hosting, web servers, JS and UI frameworks, payments (Stripe, PayPal, Adyen, Klarna, Afterpay, Mercado Pago, ...), chat and support widgets, consent management, A/B testing, marketing automation, review widgets, fonts, security (captcha), email providers, DNS hosts and verified services.

### Use cases

- **Sales prospecting:** find stores on a given platform or without a tool you sell.
- **Competitor research:** see which analytics, ad and payment tools competitors use - and when they change.
- **Agencies and audits:** quick privacy and tooling checks before a pitch.
- **Market research:** platform and tool share across a list of domains.

### How to use

1. Paste domains into **Domains** (bare domains are fine).
2. Optional: scan a few internal pages, filter categories, or enable change tracking.
3. Run and open the **Domains** or **Insights** view.

```json
{
  "domains": ["allbirds.com", "wordpress.org", "bbc.co.uk"],
  "extraPagesPerDomain": 0,
  "includeDns": true,
  "trackChanges": false
}
```

### Output example (`domain` row, shortened)

```json
{
  "type": "domain",
  "domain": "allbirds.com",
  "finalUrl": "https://www.allbirds.com/",
  "ecommercePlatform": "Shopify",
  "analytics": ["Microsoft Clarity"],
  "tagManagers": ["Google Tag Manager"],
  "cdn": "Cloudflare",
  "consentManagement": ["OneTrust"],
  "marketingAutomation": ["Attentive"],
  "techCount": 10,
  "technologies": [
    { "name": "Shopify", "categories": ["ecommerce"], "version": null, "confidence": 100, "evidence": "page HTML matches cdn.shopify.com" }
  ],
  "insights": [
    { "code": "NO_REVIEWS_WIDGET", "severity": "info", "message": "Online store with no product-reviews widget detected." }
  ],
  "estimatedToolingTier": "medium"
}
```

Other row types: `summary` (one per run, free), `change` (monitoring, free) and `error` (INVALID_INPUT, DNS_FAILED, FETCH_FAILED, BLOCKED - free).

### Pricing

**$2.00 per 1,000 domains** ($0.002 per successfully scanned domain), **no start fee**. Summary rows, change rows and **error rows are never charged**. Extra internal pages do not cost extra. The run stops cleanly when your spending limit is reached.

### FAQ

**Does it run a browser?** No. It reads the HTML, scripts, headers, cookie names and DNS records. Tools injected only at runtime through a tag manager may not appear; the actor tells you when that is likely.

**Does it collect personal data?** No. It never outputs emails, phone numbers or names, and reads only cookie names, never cookie values.

**How accurate is it?** Each detection has a confidence score and evidence. Use `minConfidence` to hide weaker signals.

### Limits

- Up to 10 extra internal pages per domain.
- Sites behind strong bot protection return a BLOCKED row with partial results.

# Actor input Schema

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

Domains to scan, e.g. allbirds.com. Bare domains are fine - https:// is added automatically. Duplicates are removed.

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

Full URLs to scan instead of (or in addition to) domains. Useful when the homepage is not the page you want analysed.

## `extraPagesPerDomain` (type: `integer`):

Also scan up to this many internal pages linked from the homepage (max 10). Finds tools that only load on some pages. Still one charge per domain.

## `includeDns` (type: `boolean`):

Look up MX, NS and TXT records to identify the email provider, DNS host and verified SaaS services (service names only).

## `categoriesFilter` (type: `array`):

Limit technologies to these categories, e.g. analytics, adPixel, ecommerce, cms, paymentProvider, chatWidget, consentManagement, cdn, hosting, emailProvider, dnsProvider. Leave empty for all.

## `minConfidence` (type: `integer`):

Hide detections below this confidence.

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

Domains scanned in parallel.

## `timeoutSecs` (type: `integer`):

Per-request timeout. Each request is retried once.

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

Optional proxy. Usually not needed.

## `trackChanges` (type: `boolean`):

Save each domain's stack and output TECH_ADDED, TECH_REMOVED and VERSION_CHANGED rows compared with the previous run that used the same monitor name.

## `monitorName` (type: `string`):

Name of the saved baseline used for change tracking. Use the same name on every scheduled run.

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

'All' outputs domain, summary and change rows. 'Changes only' outputs only the summary and change rows (useful for scheduled monitoring). Pricing is per scanned domain in both modes.

## Actor input object example

```json
{
  "domains": [
    "allbirds.com",
    "wordpress.org",
    "bbc.co.uk"
  ],
  "extraPagesPerDomain": 0,
  "includeDns": true,
  "minConfidence": 50,
  "concurrency": 10,
  "timeoutSecs": 20,
  "proxyConfiguration": {
    "useApifyProxy": false
  },
  "trackChanges": false,
  "monitorName": "",
  "outputMode": "all"
}
```

# Actor output Schema

## `overview` (type: `string`):

Domain, summary, change and error rows.

## `insights` (type: `string`):

Rule-based insights per domain.

## `changes` (type: `string`):

Technologies added, removed or upgraded since the last monitored run.

## `runReport` (type: `string`):

No description

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

// Run the Actor and wait for it to finish
const run = await client.actor("zerahdata/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": [
        "allbirds.com",
        "wordpress.org",
        "bbc.co.uk",
    ] }

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

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,zerahdata/website-tech-stack-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/JCXZmLYfBLnRvgdPg/builds/c1937SpwdGwFecOkh/openapi.json
