# Techstack Detector (`cerridwen/techstack-detector`) Actor

Detect 7500+ technologies on any website. Identifies CMS, frameworks, CDNs, analytics, payment processors & more. Includes DNS/TLS analysis, security scoring, cost estimation & stack comparison. Powered by Wappalyzer + custom multi-layer detection.

- **URL**: https://apify.com/cerridwen/techstack-detector.md
- **Developed by:** [Cerridwen](https://apify.com/cerridwen) (community)
- **Categories:** SEO tools, Lead generation, Developer tools
- **Features:** Limited permissions
- **Stats:** 95 total users, 7 monthly users, 100.0% runs succeeded, 2 bookmarks
- **User rating**: No ratings yet

## Pricing

$10.00 / 1,000 url analyses

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

## Tech Stack Detector API

Detect the **complete technology stack** of any website — frameworks, CMS, CDN, hosting, analytics, payment systems, email providers, and 7000+ more technologies.

### What it does

Given one or more URLs, this actor analyzes:

1. **Technology Fingerprinting** — Powered by the [Wappalyzer](https://github.com/AliasIO/wappalyzer) engine with 7500+ technology signatures. Detects frameworks, libraries, CMS, CDN, analytics, payment processors, and more from HTTP headers, HTML, cookies, script sources, DNS records, and meta tags.
2. **DNS Intelligence** — CNAME/A record analysis for CDN and hosting detection, MX records for email provider, TXT records for 30+ third-party service verifications (Stripe, Klaviyo, Zendesk, etc.), NS records for DNS provider.
3. **TLS Certificate Analysis** — Certificate issuer reveals CDN/hosting provider, protocol version, and certificate validity.
4. **Security Score** — Grades security headers (HSTS, CSP, X-Frame-Options, etc.) on a 0-100 scale and flags known vulnerable library versions.
5. **Cost Estimation** — Estimates monthly hosting/platform cost based on the detected stack.

### Use Cases

- **Sales prospecting**: Know what tech a prospect uses before reaching out
- **Competitive analysis**: Compare your stack vs competitors side-by-side
- **Security audits**: Quick security header assessment for any website
- **Lead generation**: Find companies using specific technologies
- **Market research**: Understand technology adoption in your industry

### Input

| Field | Type | Default | Description |
|-------|------|---------|-------------|
| `urls` | string\[] | *required* | URLs to analyze (max 10) |
| `enableDns` | boolean | `true` | Run DNS analysis (CDN, hosting, email, verifications) |
| `enableTls` | boolean | `true` | Run TLS certificate analysis |
| `enableSecurityScore` | boolean | `true` | Calculate security score (0-100) |
| `enableCostEstimate` | boolean | `true` | Estimate monthly cost |
| `compareMode` | boolean | `false` | Compare stacks across multiple URLs |
| `maxUrls` | integer | `10` | Max URLs per run |

#### Example Input

```json
{
    "urls": ["https://shopify.com", "https://notion.so"],
    "enableDns": true,
    "enableTls": true,
    "enableSecurityScore": true,
    "enableCostEstimate": true,
    "compareMode": true
}
```

### Output

Each URL produces a detailed result:

```json
{
    "url": "https://www.shopify.com/",
    "technologies": [
        {
            "name": "Shopify",
            "category": "Ecommerce",
            "version": null,
            "confidence": 100,
            "source": "wappalyzer"
        },
        {
            "name": "Cloudflare",
            "category": "CDN",
            "version": null,
            "confidence": 100,
            "source": "wappalyzer"
        },
        {
            "name": "Stripe",
            "category": "Payment processors",
            "version": null,
            "confidence": 100,
            "source": "wappalyzer"
        },
        {
            "name": "Google Workspace",
            "category": "Webmail",
            "version": null,
            "confidence": 100,
            "source": "wappalyzer"
        },
        {
            "name": "Zendesk",
            "category": "Documentation",
        }
    ],
    "totalTechnologies": 14,
    "robotsTxt": {
        "exists": true,
        "sitemaps": ["https://www.shopify.com/sitemap.xml"]
    },
    "pwa": {
        "isPwa": false
    },
    "securityTxt": {
        "exists": true,
        "contact": "mailto:security@shopify.com",
        "expires": "2026-12-31T23:59:59z"
    },
    "waf": {
        "firewalls": ["Cloudflare WAF"]
    },
    "httpProtocols": {
        "http2": true,
        "http3": true
    },
    "dns": {
        "cdn": "Cloudflare",
        "emailProvider": "Google Workspace",
        "hosting": "Shopify",
        "nameserver": "Shopify DNS",
        "verifications": [
            "Adobe", "Amazon SES", "Apple", "Atlassian", "DocuSign",
            "Facebook/Meta", "Google Search Console", "Klaviyo",
            "Microsoft 365", "OpenAI", "SendGrid", "Stripe",
            "Twilio", "Zapier", "Zendesk", "DKIM"
        ],
        "dmarcPolicy": "reject",
        "caa": [
            "issue=globalsign.com",
            "issue=letsencrypt.org",
            "issue=sectigo.com"
        ]
    },
    "tls": {
        "issuer": "Google Trust Services",
        "protocol": "TLSv1.3",
        "subject": "shopify.com",
        "validFrom": "Feb 14 16:30:43 2026 GMT",
        "validTo": "May 15 17:30:36 2026 GMT",
        "cipher": "TLS_AES_128_GCM_SHA256",
        "cipherStrength": "adequate",
        "cipherBits": 128,
        "daysUntilExpiry": 67,
        "expiryWarning": null
    },
    "securityScore": {
        "score": 35,
        "grade": "D",
        "headers": {
            "HSTS": true,
            "CSP": true,
            "X-Frame-Options": false,
            "X-Content-Type-Options": false,
            "X-XSS-Protection": false,
            "Referrer-Policy": false,
            "Permissions-Policy": false,
            "COOP": false,
            "CORP": false,
            "COEP": false
        },
        "headersPresent": 2,
        "headersTotal": 10,
        "vulnerabilities": [],
        "cspIssues": ["CSP allows unsafe-inline", "CSP allows unsafe-eval"],
        "cookieSecurity": {
            "totalCookies": 2,
            "secureCookies": 2,
            "httpOnlyCookies": 1,
            "sameSiteCookies": 1
        },
        "informationDisclosure": ["Server header leaks info"]
    },
    "costEstimate": {
        "currency": "USD",
        "monthly": "$54-412/mo",
        "breakdown": {
            "cdn": { "services": [{ "name": "Cloudflare", "min": 0, "max": 200 }], "min": 0, "max": 200 },
            "email": { "services": [{ "name": "Google Workspace", "min": 6, "max": 18 }], "min": 6, "max": 18 },
            "platform": { "services": [{ "name": "Shopify", "min": 29, "max": 79 }], "min": 29, "max": 79 },
            "payment": { "services": [{ "name": "Stripe", "min": 0, "max": 0, "note": "2.9% + $0.30/txn" }], "min": 0, "max": 0 },
            "support": { "services": [{ "name": "Zendesk", "min": 19, "max": 115 }], "min": 19, "max": 115 }
        }
    },
    "scannedAt": "2026-03-15T21:15:36.210952+00:00"
}
```

#### Compare Mode

When `compareMode` is enabled with multiple URLs, each result also includes:

```json
{
    "comparison": {
        "common": ["Cloudflare", "Open Graph", "React"],
        "unique": {
            "https://shopify.com": ["Shopify", "Stripe", "Zendesk"],
            "https://notion.so": ["Next.js", "Vercel", "hCaptcha"]
        },
        "totalUrls": 2
    }
}
```

### What Makes This Different

| Feature | This Actor | BuiltWith | Wappalyzer |
|---------|-----------|-----------|------------|
| Technology detection | 7500+ fingerprints | ✅ | ✅ |
| DNS intelligence | ✅ 30+ services | ❌ | ❌ |
| Email & TXT verification | ✅ Stripe, DKIM, DMARC, etc. | ❌ | ❌ |
| TLS analysis | ✅ Expiry warnings, Cipher suite | ❌ | ❌ |
| Security scoring | ✅ 0-100 grade (CSP, Cookies, Vulns) | ❌ | ❌ |
| Cost estimation | ✅ 30+ SaaS tool pricing | ❌ | ❌ |
| Deep probes | ✅ PWA, WAF, robots.txt, HTTP/2-3 | ❌ | ❌ |
| Stack comparison | ✅ | ❌ | ❌ |
| Price | Pay per use | $295/mo | $450/mo |

### Technology

- **Detection engine**: [wappalyzer-next](https://github.com/s0md3v/wappalyzer-next) with up-to-date fingerprints
- **HTTP client**: `curl_cffi` with Chrome impersonation (bypasses Cloudflare and bot protection)
- **Session management**: Automatic connection reuse and exponential backoff retry logic
- **DNS analysis**: Custom multi-record analysis (A, CNAME, MX, TXT, NS, CAA)
- **Async processing**: Concurrent URL analysis for fast batch scans

# Actor input Schema

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

List of website URLs to detect technology stacks. Max 10 URLs per run.

## `enableDns` (type: `boolean`):

Analyze DNS records (CNAME, MX, TXT) to detect CDN, email provider, and hosting.

## `enableTls` (type: `boolean`):

Analyze TLS certificate to detect certificate issuer and CDN provider.

## `enableSecurityScore` (type: `boolean`):

Calculate a security score (0-100) based on HTTP security headers and known vulnerabilities.

## `enableCostEstimate` (type: `boolean`):

Estimate monthly hosting/platform cost based on detected technologies.

## `compareMode` (type: `boolean`):

When analyzing multiple URLs, show common and unique technologies across all sites.

## `maxUrls` (type: `integer`):

Maximum number of URLs to analyze in a single run.

## Actor input object example

```json
{
  "urls": [
    "https://shopify.com"
  ],
  "enableDns": true,
  "enableTls": true,
  "enableSecurityScore": true,
  "enableCostEstimate": true,
  "compareMode": false,
  "maxUrls": 10
}
```

# Actor output Schema

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

Dataset containing detected technologies, DNS analysis, TLS certificate info, security score, and cost estimate for each URL.

# 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://shopify.com"
    ]
};

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

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

```

## MCP server setup

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