# Website Tech Stack Detector: Wappalyzer Alternative (`m_ctim/website-tech-stack-detector`) Actor

Enter website URLs and get each site's tech stack in one row: CMS, ecommerce platform, JS framework, analytics, CDN/hosting, payment and chat tools, plus server headers.

- **URL**: https://apify.com/m_ctim/website-tech-stack-detector.md
- **Developed by:** [Timothy Kelvin](https://apify.com/m_ctim) (community)
- **Categories:** Developer tools, SEO tools, Lead generation
- **Features:** Limited permissions
- **Stats:** 3 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.50 / 1,000 site 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/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: Wappalyzer Alternative

For sales teams, agencies and developers who need to know what a list of websites is built on: one row per URL with its CMS, ecommerce platform, framework, analytics, hosting, payment and chat tools.

### What you get

- `cms`, `ecommerce` and `jsFrameworks`: for example WordPress, Shopify or Next.js
- `analytics`, `payment` and `liveChat`: for example Google Analytics, Stripe or Intercom
- `cdnHosting` (for example Cloudflare or Vercel), plus the raw `server`, `poweredBy` and `generator` values the site reports, which can include the exact WordPress version
- `status` and `error` on every row: `"ok"`, or `"error"` with the reason a site couldn't be checked, so you always know which URLs failed and why

### Example output

Real output from a run on Apify (2026-10-19):

```json
{
  "rowType": "site",
  "url": "https://www.brooklinen.com/",
  "finalUrl": "https://www.brooklinen.com/",
  "status": "ok",
  "error": null,
  "cms": [],
  "ecommerce": ["Shopify"],
  "jsFrameworks": [],
  "analytics": ["Google Analytics"],
  "cdnHosting": ["Cloudflare"],
  "payment": [],
  "liveChat": [],
  "server": "cloudflare",
  "poweredBy": null,
  "generator": null,
  "analyzedAt": "2026-10-19T03:40:53.782Z"
}
```

In the same run, techcrunch.com came back as WordPress on Cloudflare with `"generator": "wordpress 6.9.10"`, and notion.com as Next.js on Vercel and Cloudflare. A domain that doesn't exist came back like this, and wasn't charged:

```json
{
  "rowType": "error",
  "url": "https://this-domain-does-not-exist-xyz123.com/",
  "finalUrl": null,
  "status": "error",
  "error": "The domain doesn't resolve (DNS lookup failed)."
}
```

(The empty technology fields are left out of this second example.)

### What it costs

$0.007 per site analyzed on the Free plan, and less on paid Apify plans ($0.0065 Bronze, $0.006 Silver, $0.0055 Gold and above). Nothing else is billed.

- 100 sites checked = $0.70
- 1,000 sites checked = $7.00

Only rows with `"status": "ok"` are charged. A URL that can't be checked gets an `"error"` row with the reason and costs nothing. A URL listed twice is checked, and charged, once.

### Use cases

- Before a sales call, find which leads run Shopify, WordPress or HubSpot.
- Before quoting a redesign or migration, check a prospect's CMS and hosting.
- Count how many sites in a list use a given analytics, payment or chat tool.

### Input

| Field | Type | Description |
|---|---|---|
| `startUrls` | array of URLs | The websites to check. Only the homepage of each is checked, not the whole site. If you leave it empty, it checks brooklinen.com, techcrunch.com and notion.com. |

```json
{
  "startUrls": [
    { "url": "https://www.brooklinen.com" },
    { "url": "https://techcrunch.com" },
    { "url": "https://www.notion.com" }
  ]
}
```

### Related tools

- [Tech Stack Lead Finder](https://apify.com/m_ctim/tech-stack-lead-finder): find sites that use a technology, for example Shopify stores without Klaviyo, across 120+ technologies
- [Website Gap Finder](https://apify.com/m_ctim/website-gap-finder): audit local businesses' websites and find the ones that need a new site, with the contact details of the ones you want to pitch

### Notes

- **What it recognises:** 36 technologies.
  - CMS: WordPress, Drupal, Joomla, Wix, Squarespace, Webflow, Ghost, HubSpot CMS
  - Ecommerce: Shopify, WooCommerce, Magento, BigCommerce
  - Frameworks: Next.js, Nuxt, React, Vue.js, Angular, jQuery
  - Analytics: Google Analytics, Google Tag Manager, Meta Pixel, Hotjar, Segment, Mixpanel, HubSpot Analytics
  - Hosting and CDN: Cloudflare, Vercel, Netlify, AWS CloudFront, Fastly, GitHub Pages
  - Payment: Stripe, PayPal
  - Chat: Intercom, Drift, Zendesk Chat
- **How it checks:** it reads the homepage's HTML and response headers from one plain HTTP request, with no browser. Tools that load later through JavaScript or a tag manager can be missed. For example, stripe.com shows only Next.js and an nginx server.
- **When a site blocks it:** sites that refuse automated requests come back as `"error"` with the HTTP status (for example 403), uncharged.
- **Freshness:** every run checks the live site. Nothing is cached.
- **Feedback and support:** open an issue in the Issues tab on this page. Missing technologies you'd like detected are welcome there too.

# Actor input Schema

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

Website URLs to analyze (the homepage is checked, not the whole site). Every URL gets a row: status "ok" with what was found, or "error" with the reason. Only "ok" rows are charged.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.brooklinen.com"
    },
    {
      "url": "https://techcrunch.com"
    },
    {
      "url": "https://www.notion.com"
    }
  ]
}
```

# Actor output Schema

## `results` (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 = {
    "startUrls": [
        {
            "url": "https://www.brooklinen.com"
        },
        {
            "url": "https://techcrunch.com"
        },
        {
            "url": "https://www.notion.com"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("m_ctim/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 = { "startUrls": [
        { "url": "https://www.brooklinen.com" },
        { "url": "https://techcrunch.com" },
        { "url": "https://www.notion.com" },
    ] }

# Run the Actor and wait for it to finish
run = client.actor("m_ctim/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 '{
  "startUrls": [
    {
      "url": "https://www.brooklinen.com"
    },
    {
      "url": "https://techcrunch.com"
    },
    {
      "url": "https://www.notion.com"
    }
  ]
}' |
apify call m_ctim/website-tech-stack-detector --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,m_ctim/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/1rp6Cr2tkLRB7Phc8/builds/kMHACQzbk4EXQgnq8/openapi.json
