# Tech Stack Detector: Wappalyzer & BuiltWith Alternative (`rod_analytics/tech-stack-detector`) Actor

Find the CMS, ecommerce platform, analytics, frameworks, CDN and hosting of any website. A Wappalyzer alternative and BuiltWith alternative with 7,600+ technologies. Bulk domain lists, $1.80 per 1,000 domains.

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

## Pricing

from $1.26 / 1,000 domain 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

**Tech Stack Detector** is a low-cost **Wappalyzer alternative and BuiltWith alternative**: paste a list of domains and see which **CMS, ecommerce platform, analytics, JavaScript frameworks, CDN and hosting** each website uses.
It checks **7,600+ technologies** live, returns one clean JSON or CSV row per domain, and costs **$1.80 per 1,000 domains**. No browser, no API key, no account with any other service.

### What you get

- **One row per website** with every detected technology, its category, its version when the site exposes it, and a confidence score.
- **7,600+ technologies in 100+ categories**: WordPress, Shopify, WooCommerce, Magento, Wix, Webflow, HubSpot, Google Analytics, Google Tag Manager, Meta Pixel, Hotjar, React, Next.js, Vue, Cloudflare, Vercel, AWS, Nginx, Stripe, Intercom and many more.
- **Bulk lists.** Thousands of domains in one run, 10 to 50 in parallel.
- **A spreadsheet view** with one row per technology, ready for CSV, Excel or Google Sheets.
- **Free failures.** Dead domains, timeouts and invalid URLs are listed with the reason and are not charged.

Typical uses:

- **Lead generation.** Find the Shopify, WooCommerce or HubSpot sites in a list of companies.
- **Lead enrichment.** Add CMS, ecommerce platform and hosting to CRM records.
- **Competitor research.** See which analytics, A/B testing, chat and CDN tools competitors use.
- **Market research.** Count platform share across thousands of domains.
- **IT and security checks.** Spot exposed server, CMS or library versions.

### Quick start

1. Press **Try for free** or **Start**. The prefilled example checks wordpress.org, shopify.com and github.com in a few seconds.
2. Replace the list in **Websites or domains** with your own domains, one per line. `example.com` is fine.
3. Optional: set **Only these categories**, for example `CMS`, `Ecommerce`, `Analytics`.
4. Open the **Output** tab. Download JSON, CSV, Excel or HTML, or read the results by API.

### How to find out what technology a website uses

You have three options:

1. **Look at the page source by hand.** Open the site, press `Ctrl+U` and search for hints such as `wp-content` (WordPress), `cdn.shopify.com` (Shopify), `gtag(` (Google Analytics) or `__NEXT_DATA__` (Next.js). Check the response headers in the browser developer tools for `server`, `x-powered-by` and CDN headers. This works for one site and takes a few minutes.
2. **Use a browser extension.** Good for the site you are looking at, but not for a list of 500 domains.
3. **Run this Actor on a list.** It downloads each page once and matches headers, cookies, meta tags, script and link URLs, inline HTML and known JavaScript global names against an open fingerprint database. It also applies rules such as "WooCommerce implies WordPress". You get the answer for every domain in one table.

### Input example

Only `urls` is needed. Everything else has a sensible default.

```json
{
    "urls": ["wordpress.org", "https://www.shopify.com", "github.com"],
    "includeCategories": ["CMS", "Ecommerce", "Analytics", "CDN"],
    "maxConcurrency": 10,
    "timeoutSecs": 15
}
```

| Field                | Default | What it does                                                                                    |
| -------------------- | ------- | ----------------------------------------------------------------------------------------------- |
| `urls`               |         | Domains or URLs, one per line. Duplicates are removed. Redirects are followed.                  |
| `includeCategories`  | `[]`    | Keep only these categories, for example `CMS` or `Ecommerce`. Case-insensitive.                 |
| `includeRawSignals`  | `false` | Add headers, cookie names, meta tags, script and link URLs, and the evidence for each match.    |
| `detectJsGlobals`    | `true`  | Match known JavaScript global names in inline scripts. These hits get 50% confidence.           |
| `maxConcurrency`     | `10`    | Websites fetched in parallel, 1 to 50.                                                          |
| `timeoutSecs`        | `15`    | Timeout per website, 3 to 60 seconds.                                                           |
| `proxyConfiguration` | off     | Optional. Apify datacenter proxy or your own proxy URLs. Residential proxies are not supported. |

### Output sample

One item per domain. The **Tech stack per domain** view shows `technologyDetails`. The **One row per technology** view flattens the list for spreadsheets.

```json
{
    "url": "wordpress.org",
    "finalUrl": "https://wordpress.org/",
    "statusCode": 200,
    "title": "Blog Tool, Publishing Platform, and CMS – WordPress.org",
    "technologies": [
        {
            "name": "WordPress",
            "categories": ["CMS", "Blogs"],
            "version": "7.2",
            "confidence": 100,
            "website": "https://wordpress.org"
        },
        {
            "name": "Gutenberg",
            "categories": ["WordPress plugins", "Editors"],
            "version": "24.1.0",
            "confidence": 100,
            "website": "https://github.com/WordPress/gutenberg"
        },
        {
            "name": "Nginx",
            "categories": ["Web servers", "Reverse proxies"],
            "version": null,
            "confidence": 100,
            "website": "http://nginx.org/en"
        }
    ],
    "technologyNames": ["WordPress", "Gutenberg", "Nginx"],
    "technologyDetails": ["WordPress 7.2", "Gutenberg 24.1.0", "Nginx"],
    "technologyCount": 3,
    "categoriesSummary": {
        "CMS": ["WordPress"],
        "Blogs": ["WordPress"],
        "WordPress plugins": ["Gutenberg"],
        "Editors": ["Gutenberg"],
        "Web servers": ["Nginx"],
        "Reverse proxies": ["Nginx"]
    },
    "detectedAt": "2026-10-05T10:11:46.836Z",
    "error": null
}
```

The sample is shortened. A real wordpress.org result lists about 13 technologies.

| Field                   | Meaning                                                                      |
| ----------------------- | ---------------------------------------------------------------------------- |
| `url`                   | Domain or URL as you entered it                                              |
| `finalUrl`              | URL after redirects                                                          |
| `statusCode`            | HTTP status of the final response                                            |
| `title`                 | Page title                                                                   |
| `technologies[]`        | Name, categories, version (or `null`), confidence 1 to 100, vendor website   |
| `technologyNames`       | Names only, handy for filters                                                |
| `technologyDetails`     | `Name version (confidence%)`, the version and confidence only when they help |
| `categoriesSummary`     | Category to technology names                                                 |
| `error`                 | Why the site could not be checked, or `null`                                 |
| `errorCode`, `howToFix` | Only on help rows for input problems, such as an invalid URL                 |
| `rawSignals`            | Only with `includeRawSignals`                                                |

### Example: filter Shopify stores from a domain list

1. Paste your company domains into `urls`, for example 2,000 domains from a CRM export.
2. Set `includeCategories` to `["Ecommerce"]`. Each row then lists only the shop platform.
3. Run it. In the **Output** tab, export CSV and filter `technologyNames` for `Shopify`, or read only the fields you need by API:

```text
https://api.apify.com/v2/datasets/<datasetId>/items?format=csv&fields=url,finalUrl,technologyNames
```

The same works for WordPress (`CMS`), HubSpot (`Marketing automation`), Stripe (`Payment processors`) or any other technology. 2,000 domains cost about $3.60.

### Wappalyzer vs BuiltWith vs this Actor

An honest comparison. Each tool is good at something different.

|                           | Wappalyzer                    | BuiltWith                    | This Actor                               |
| ------------------------- | ----------------------------- | ---------------------------- | ---------------------------------------- |
| How it detects            | Live check, browser extension | Large historical crawl index | Live check of the page you give it       |
| Bulk lists                | Paid plans and API            | Paid plans and API           | Yes, pay per domain                      |
| "All sites using X" lists | Paid feature                  | Its main strength            | No. You bring the domain list            |
| Technology history        | Not its focus                 | Yes, years of history        | No, only today's state                   |
| JavaScript execution      | Yes in the browser extension  | Not relevant, index based    | No. Inline scripts are scanned instead   |
| Fingerprint data          | Proprietary since 2023        | Proprietary                  | Open, community maintained (GPL-3.0)     |
| Price model               | Subscription or credits       | Subscription                 | $1.80 per 1,000 domains, no subscription |

Choose BuiltWith when you need lists of every site using a technology or years of history. Choose this Actor when you already have the domains and want today's tech stack cheaply, in bulk, inside Apify with its API, schedules and integrations.

"Wappalyzer" and "BuiltWith" are trademarks of their owners. This Actor is not affiliated with, endorsed by or connected to either of them.

### Pricing

Pay per result. A domain is charged only when its page was fetched and analysed. Failed domains are free.

| Apify plan | Price per domain | Per 1,000 domains |
| ---------- | ---------------- | ----------------- |
| Free       | $0.0018          | $1.80             |
| Bronze     | $0.00162         | $1.62             |
| Silver     | $0.00144         | $1.44             |
| Gold       | $0.00126         | $1.26             |

Plus $0.001 per run for the start. Apify's $5 free monthly credit covers about 2,700 domains. You can cap the cost of any run with **Maximum cost per run**. The run then stops cleanly when the cap is reached.

### FAQ

#### How do I find out what CMS a website uses?

Put the domain in `urls` and set `includeCategories` to `["CMS"]`. The row shows the CMS, for example WordPress, Drupal, Joomla, Wix, Webflow or HubSpot CMS Hub, and the version when the site shows it.

#### How do I check many websites at once?

Paste the whole list into `urls`, one domain per line. Thousands are fine. Raise `maxConcurrency` to 20 or 30 for big lists.

#### How accurate is it?

100% confidence means a clear fingerprint, such as a `generator` meta tag or a `cdn.shopify.com` script. Weaker evidence gets less:

- 50%: a JavaScript global name seen in an inline script, because no browser runs the code.
- 50%: a domain seen only in the `Content-Security-Policy` header. A CSP allows a service, it does not prove the page uses it.
- 50%: a single generic hint, such as a link to `/cart`. Two hints give 100%.
- Implied technologies, for example PHP from WordPress, take the confidence of the technology that implies them.

Filter on `confidence >= 100` if you only want strong matches.

#### What can it not detect?

Technologies that only appear after JavaScript runs in a browser, on other pages than the one you give it, or only in DNS and TLS records. Versions show only when the site exposes them. Sites behind a bot challenge (Cloudflare, DataDome) still show their CDN and WAF, but not the CMS.

#### Can I use it from an AI agent or my own app?

Yes. Call it through the [Apify MCP server](https://mcp.apify.com/) or the Apify API. For a few domains, the `run-sync-get-dataset-items` API endpoint returns the rows in one HTTP call.

#### Which proxies can I use?

No proxy is needed for most sites. You can use Apify datacenter proxy or your own proxy URLs. Residential and SERP proxies are not supported, and a run that asks for them stops at once with a free help row.

#### Is it legal?

It fetches one public page per domain, like a browser, and reads only public technical signals. It collects no personal data. Check a site's terms if you plan heavy use.

#### Is the source code open?

Yes. The Actor and its fingerprint data are licensed under GPL-3.0 and the full source is public on the **Source code** tab. The fingerprints are a filtered snapshot of the community database [enthec/webappanalyzer](https://github.com/enthec/webappanalyzer), with a few local false-positive fixes listed in `src/overrides.ts`.

#### Something is missing or wrong

Open an issue on the **Issues** tab with the domain and what you expected. Missing technologies and false positives get fixed.

### Related Actors

More tools from the same developer, built with the same pricing and output style.

| Actor                                                                                                               | What it does                                                                   |
| ------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------ |
| [Website Content Crawler to Markdown for RAG & LLMs](https://apify.com/rod_analytics/website-to-markdown)           | Crawl whole websites into clean Markdown, RAG chunks and llms.txt              |
| [PDF to Markdown & Text Extractor with OCR](https://apify.com/rod_analytics/doc-to-markdown)                        | PDF, Word, Excel and PowerPoint files to Markdown and text, with OCR           |
| [SEO Audit Tool: Site Crawler, Broken Links & Score](https://apify.com/rod_analytics/seo-site-audit)                | Crawl a site and find broken links and on-page SEO issues                      |
| [PageSpeed Insights & Lighthouse Bulk Checker](https://apify.com/rod_analytics/lighthouse-audit)                    | Lighthouse scores and Core Web Vitals for many URLs at once                    |
| [Bulk Domain Lookup: DNS, WHOIS, SPF, DMARC & SSL](https://apify.com/rod_analytics/domain-security-audit)           | DNS, email security and SSL checks for a list of domains                       |
| [Speech to Text: Audio, Video & Podcast Transcriber](https://apify.com/rod_analytics/media-transcriber)             | Whisper transcripts, SRT and VTT subtitles from audio, video and podcast feeds |
| [Email Validator & Verifier: Bulk MX & Disposable Check](https://apify.com/rod_analytics/bulk-email-verifier)       | Check email lists for syntax, MX records and disposable domains                |
| [Website Contact Scraper: Emails, Phones & Social Links](https://apify.com/rod_analytics/company-contact-extractor) | Find emails, phone numbers and social profiles on company websites             |
| [VIES VAT Checker & EU Company Registry Lookup](https://apify.com/rod_analytics/eu-company-lookup)                  | Validate EU VAT numbers and look up company registry data                      |
| [Companies House Scraper: UK Company Search & Officers](https://apify.com/rod_analytics/uk-companies-house)         | Search UK companies and get profiles and officers                              |
| [EU TED Tenders Scraper & Alerts: Public Procurement](https://apify.com/rod_analytics/ted-tenders)                  | EU public tenders and contract awards from TED, with daily alerts              |
| [Greenhouse, Lever & Ashby Job Scraper: 7 ATS in One Feed](https://apify.com/rod_analytics/multi-ats-jobs-api)      | Job postings from 7 applicant tracking systems in one schema                   |
| [GitHub Scraper: Repo Stats, Stars, Trending & Search](https://apify.com/rod_analytics/github-repo-stats)           | Repository stats, stars, trending repos and search results                     |

# Changelog

This Actor's version history is a separate document: https://apify.com/rod_analytics/tech-stack-detector/changelog.md

# Actor input Schema

## `urls` (type: `array`):

Domains or URLs to check, one per line. Example: shopify.com, https://www.example.com/pricing. Only the given page is fetched (redirects are followed). Duplicates are removed.

## `includeCategories` (type: `array`):

Optional. Return only technologies in these categories, for example CMS, Ecommerce, Analytics, JavaScript frameworks, CDN, PaaS, Web servers. Case-insensitive. Leave empty for everything.

## `includeRawSignals` (type: `boolean`):

Adds response headers, cookie names, meta tags, script and link URLs to each item, plus the evidence behind every detection. Useful for debugging. Makes items larger.

## `detectJsGlobals` (type: `boolean`):

Also match known JavaScript global names found in inline scripts (for example Shopify.theme). No browser is used, so these hits get 50% confidence.

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

How many websites to fetch in parallel.

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

Maximum time to wait for each website to respond, including redirects. A site that times out is retried once, then reported with an error and not charged.

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

Optional. Most websites work without a proxy. Use Apify datacenter proxy or your own proxy URLs only if many sites block you. Residential and SERP proxies are not supported.

## Actor input object example

```json
{
  "urls": [
    "https://wordpress.org",
    "https://www.shopify.com",
    "https://github.com"
  ],
  "includeCategories": [],
  "includeRawSignals": false,
  "detectJsGlobals": true,
  "maxConcurrency": 10,
  "timeoutSecs": 15,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

No description

## `technologies` (type: `string`):

No description

## `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 = {
    "urls": [
        "https://wordpress.org",
        "https://www.shopify.com",
        "https://github.com"
    ],
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("rod_analytics/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 = {
    "urls": [
        "https://wordpress.org",
        "https://www.shopify.com",
        "https://github.com",
    ],
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("rod_analytics/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 '{
  "urls": [
    "https://wordpress.org",
    "https://www.shopify.com",
    "https://github.com"
  ],
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call rod_analytics/tech-stack-detector --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,rod_analytics/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/6xuONbPnuZEttUiwN/builds/4g68BEchHOOpbhS4e/openapi.json
