# Tech Stack Detector: 6,000+ Technologies (`labrat011/tech-stack-detector`) Actor

See what any website is built with: CMS, ecommerce, analytics, ad pixels, JS frameworks, CDN, hosting, payments, live chat and email provider. 6,000+ technology fingerprints plus DNS, with versions and evidence. BuiltWith-style lookups in bulk.

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

## Pricing

from $1.00 / 1,000 website analyzeds

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
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

<img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/wCP1WauwRX2Gr3Gir-actor-I4xMXL1D8vNEYot9A-weVfuBNWYe-tech-stack-detector.png" alt="Tech Stack Detector: 6,000+ Technologies logo" width="120">

## Tech Stack Detector: 6,000+ Technologies

Find out what any website is built with. For each site you get its CMS, ecommerce platform, analytics and ad pixels, tag manager, JavaScript frameworks, CDN, hosting, payment providers, live chat, marketing tools and **email provider**, with versions where the site reveals them and the evidence behind every detection. Like BuiltWith or Wappalyzer, for whole lists of websites.

| At a glance | |
|---|---|
| **You give it** | A list of websites or domains |
| **You get** | One row per website: CMS, ecommerce, analytics, ad pixels, frameworks, CDN, hosting, payments, email provider |
| **Price** | $0.005 per run + $0.002 per website (Free plan, lower on paid plans) |
| **Speed** | 8 websites in about 20 seconds, 30 in about 3 minutes |
| **Needs** | Nothing: no login, no API key, no proxy |

### What you get

- **6,000+ technologies.** Fingerprints from the open-source webappanalyzer database, plus DNS checks and static signatures for popular tools. On the same 5 websites, this actor reported **111 technologies; a popular alternative that advertises 45+ technologies reported 27**.
- **Evidence for every detection:** which header, cookie, meta tag, script, HTML pattern, DOM element or DNS record matched. No guessing from loose words: a CSS class named `ghost-sm` is not the Ghost CMS.
- **Versions** when the site exposes them (for example WordPress 7.2, PHP 8.2.1).
- **Email provider from MX records:** Google Workspace, Microsoft 365, Zoho and others. Useful for sales targeting.
- **SSL certificate:** who issued it (`sslIssuer`, for example Let's Encrypt or DigiCert) and when it expires (`sslValidUntil`). Handy for agencies looking for certificates about to run out.
- **Only the categories you need:** set `onlyCategories` to `["cms", "ecommerce"]` or `["Payment processors"]` and every other technology is left out.
- **Deeper scan on request:** `scanScriptFiles` also reads the site's JavaScript files and finds libraries and widgets that leave no trace in the HTML.
- **Ready-to-filter columns:** `cms`, `ecommerce`, `analytics`, `advertising`, `tagManagers`, `marketingAutomation`, `liveChat`, `payments`, `javascriptFrameworks`, `webFrameworks`, `programmingLanguages`, `webServers`, `cdn`, `hosting`, `security`, `emailProvider`.
- **Every category** in a `categories` map, and the full technology list with confidence and website link.
- **Gets past basic bot walls:** a website that turns away plain requests is retried once with a browser-like connection before it counts as failed.
- **Fair billing:** websites that do not answer get a diagnostic row and are not charged. The same website entered twice (`stripe.com`, `https://www.Stripe.com/`) is analyzed and charged once.

### Use cases

- **Lead generation by technology.** All Shopify stores in a list, every site on WordPress, companies using HubSpot or Intercom.
- **Sales qualification.** Know a prospect's stack before the call.
- **Competitive research.** What analytics, ad pixels and frameworks competitors run.
- **Agency prospecting.** Find sites on outdated versions or without analytics.
- **Market research.** Technology adoption across an industry list.

### Example inputs

#### A list of websites

```json
{ "urls": ["shopify.com", "wordpress.org", "apify.com", "allbirds.com", "stripe.com"] }
```

#### Only confident detections, no DNS

```json
{ "urls": ["..."], "minConfidence": 75, "checkDns": false }
```

#### Only the platform and payment stack, with a deeper scan

```json
{ "urls": ["allbirds.com", "gymshark.com"], "onlyCategories": ["cms", "ecommerce", "payments"], "scanScriptFiles": true }
```

### Output

One row per website. A real row from a test run on 2026-09-29 (lists shortened here):

```json
{
  "url": "https://apify.com",
  "domain": "apify.com",
  "status": "succeeded",
  "error": null,
  "finalUrl": "https://apify.com",
  "httpStatus": 200,
  "title": "Apify: Marketplace of ready-to-run tools for AI",
  "sslIssuer": "Amazon",
  "sslValidUntil": "2027-01-16",
  "technologyCount": 25,
  "technologyNames": [
    "AWS Certificate Manager",
    "Algolia",
    "Amazon CloudFront",
    "Amazon Route 53",
    "Amazon S3",
    "Amazon SES",
    "Amazon Web Services",
    "Google Workspace",
    "HSTS",
    "HTTP/3",
    "HubSpot",
    "Leadfeeder",
    "..."
  ],
  "cms": [
    "Next.js"
  ],
  "ecommerce": [],
  "analytics": [
    "Leadfeeder",
    "Linkedin Insight Tag"
  ],
  "advertising": [],
  "tagManagers": [
    "Google Tag Manager"
  ],
  "marketingAutomation": [
    "Intercom"
  ],
  "liveChat": [
    "Intercom"
  ],
  "payments": [],
  "javascriptFrameworks": [
    "Next.js",
    "React",
    "styled-components"
  ],
  "webFrameworks": [
    "Next.js"
  ],
  "programmingLanguages": [],
  "webServers": [
    "Next.js"
  ],
  "cdn": [
    "Amazon CloudFront",
    "Amazon S3"
  ],
  "hosting": [
    "Amazon Route 53",
    "Amazon Web Services"
  ],
  "security": [
    "HSTS"
  ],
  "emailProvider": [
    "Google Workspace"
  ],
  "technologies": [
    {
      "name": "AWS Certificate Manager",
      "categories": [
        "SSL/TLS certificate authorities"
      ],
      "version": null,
      "confidence": 100,
      "evidence": [
        "tls certificate"
      ],
      "website": "https://aws.amazon.com/certificate-manager/"
    },
    {
      "name": "Amazon CloudFront",
      "categories": [
        "CDN"
      ],
      "version": null,
      "confidence": 100,
      "evidence": [
        "header via",
        "header x-amz-cf-id"
      ],
      "website": "https://aws.amazon.com/cloudfront/"
    },
    {
      "name": "Google Workspace",
      "categories": [
        "Webmail",
        "Email"
      ],
      "version": null,
      "confidence": 100,
      "evidence": [
        "dns MX"
      ],
      "website": "https://workspace.google.com/"
    },
    {
      "name": "Next.js",
      "categories": [
        "JavaScript frameworks",
        "Web frameworks",
        "Web servers",
        "Static site generator"
      ],
      "version": null,
      "confidence": 75,
      "evidence": [
        "static signature"
      ],
      "website": "https://nextjs.org"
    }
  ],
  "categories": {
    "Analytics": [
      "Leadfeeder",
      "Linkedin Insight Tag",
      "Mixpanel"
    ],
    "Artificial Intelligence": [
      "OpenAI"
    ],
    "CDN": [
      "Amazon CloudFront",
      "Amazon S3"
    ],
    "CRM": [
      "Intercom"
    ],
    "Development": [
      "Zapier",
      "styled-components"
    ]
  }
}
```

### Pricing

Pay per event:

- **$0.005** per run start
- **$0.002** per website analyzed on the Free plan (lower on higher Apify plans)

Websites that do not answer are not charged. Apify platform usage is billed separately to your account and is small: 30 websites used about $0.01.

| Websites | Actor cost |
|---|---|
| 10 | about $0.025 |
| 100 | about $0.21 |
| 1,000 | about $2.01 |

### Automate it with n8n

Each workflow uses n8n's official **Apify** node, operation **Run actor and get dataset**, actor `labrat011/tech-stack-detector`.

#### 1. Enrich new CRM companies with their stack

```
HubSpot Trigger (company created)
  > Apify: Run actor and get dataset   { "urls": ["{{ $json.domain }}"] }
  > HubSpot: update company properties cms, ecommerce, emailProvider, analytics
```

Switch **Input JSON** to Expression so the domain is filled in.

#### 2. Find every Shopify store in a list

```
Google Sheets: read a column of domains
  > Aggregate: into one list
  > Apify: Run actor and get dataset   { "urls": {{ JSON.stringify($json.domain) }} }
  > Filter: ecommerce contains "Shopify"
  > Google Sheets: write the matches to a new tab
```

#### 3. Competitor stack change alerts

```
Schedule Trigger (weekly)
  > Apify: Run actor and get dataset   (competitor domains)
  > Compare with last week's technologyNames (stored in a Sheet or Data Table)
  > Slack: "Competitor X added Intercom, removed Drift"
```

#### 4. Outreach for agencies

```
Manual Trigger
  > Apify: Run actor and get dataset   (prospect list)
  > Filter: analytics is empty, or cms contains "WordPress" and the version is old
  > Google Sheets: prospects with the reason to reach out
```

#### 5. Email provider segmentation

```
Manual Trigger
  > Apify: Run actor and get dataset   (company domains, checkDns true)
  > Switch: emailProvider contains "Google Workspace" / "Microsoft 365" / other
  > Your outreach tool: tag each list for tailored messaging
```

### For AI agents

- **Actor:** `labrat011/tech-stack-detector`
- **Smallest input:** `{ "urls": ["shopify.com"] }`
- **Also accepted:** `url`, `domains`, `websites`, `startUrls` (strings or `{ "url": ... }` objects) and `targetUrls`, as a list or as one string separated by commas or new lines. `{ "url": "shopify.com, stripe.com" }` works.
- **One row = one website, with technologies grouped by category and the evidence for each.** Key fields: `domain`, `status`, `technologyNames`, `cms`, `ecommerce`, `analytics`, `cdn`.
- **Billing:** `apify-actor-start` once per run, `url-analyzed` per website that answers. Cap spend with the number of `urls` or a maximum cost per run.
- **Run it:** `POST https://api.apify.com/v2/acts/labrat011~tech-stack-detector/run-sync-get-dataset-items` with the input as the JSON body, or call it from the Apify MCP server.
- **Done signal:** the run's status message reads `Analyzed N websites (F did not answer).`

### FAQ

**Why can it miss a technology that a browser extension shows?** Some tools only appear after the page's JavaScript runs. This actor reads the page without running a browser, which keeps it fast and cheap, and adds static signatures for the most popular of those tools (Google Tag Manager, Next.js, Intercom, HubSpot, Hotjar, Facebook Pixel and more).

**What does "Read script files" add?** Many libraries only show up inside a site's JavaScript files. With `scanScriptFiles` on, the actor reads the start of up to 5 of them per website. A match found only there is reported at confidence 50, because large script bundles also contain names of tools the site does not run. Use `minConfidence: 75` to leave those out.

**Why is Google Analytics not reported when Google Tag Manager is?** Tag Manager can load Analytics, but the page itself does not prove it. Only direct evidence is reported.

**Why did a website fail with HTTP 403?** Some large retail and news sites block automated visitors, even after the browser-like retry. Turn on **Proxy** in the input (residential works best) and run those sites again. Failed websites are not charged.

**Where do the fingerprints come from?** From [webappanalyzer](https://github.com/enthec/webappanalyzer) (GPL-3.0), the community-maintained successor of the Wappalyzer database, pinned to a tested version.

### Support

Open an issue on the actor's Issues tab with the run ID and it will be looked at.

# Changelog

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

# Actor input Schema

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

Domains or URLs, one per line. The same website entered twice (with or without www., https or a trailing slash) is analyzed and charged once.

## `onlyCategories` (type: `array`):

Leave empty for everything. Otherwise only technologies in these categories are returned, for example CMS, Ecommerce, Analytics, Payment processors, or the column names cms, ecommerce, analytics, cdn, hosting, payments, emailProvider.

## `checkDns` (type: `boolean`):

Reads MX, TXT, NS and SOA records to detect the email provider (Google Workspace, Microsoft 365...), DNS host and verified SaaS accounts.

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

0 to 100. Raise it to keep only the surest detections.

## `scanScriptFiles` (type: `boolean`):

Also reads the start of up to 5 of each website's JavaScript files, the site's own files first. Finds more libraries and widgets, at confidence 50, and makes each website take a few seconds longer.

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

How many websites are fetched in parallel.

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

How long to wait for a website to answer before it counts as failed. Failed websites are not charged.

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

Sites that turn the actor away are already retried once with a browser-like connection. Add a proxy (residential works best) only for large retail and news sites that still block. Proxy traffic is billed to your account by Apify.

## Actor input object example

```json
{
  "urls": [
    "shopify.com",
    "wordpress.org",
    "apify.com"
  ],
  "checkDns": true,
  "minConfidence": 0,
  "scanScriptFiles": false,
  "maxConcurrency": 8,
  "timeoutSecs": 20,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

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

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

```

## MCP server setup

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