# Website Tech Stack Detector (Wappalyzer alternative) (`pythonistic/tech-stack-detector`) Actor

Detect 7,600+ technologies on any website: CMS, e-commerce, analytics, frameworks, CDN, hosting, email provider. Fast HTTP-only scan, $3 per 1,000 sites, failed sites free.

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

## Pricing

from $3.00 / 1,000 website analyzeds

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 — cheap Wappalyzer alternative

Find out what any website is built with: **CMS, e‑commerce platform, analytics and marketing tags, JavaScript frameworks, CDN, hosting, web server, email provider and TLS certificate authority**. Paste a list of domains, get a clean JSON/CSV/Excel table back.

- **7,600+ technologies** from the open-source WebAppAnalyzer fingerprint database (the community-maintained fork of Wappalyzer's rules)
- **$3 per 1,000 websites** — you pay only for sites that were successfully analyzed. Failed, unreachable and robots.txt‑blocked sites are free.
- **Fast:** plain HTTP requests, no headless browser. Thousands of domains per run.
- **Extra signals other detectors miss:** DNS (MX, TXT, NS) and TLS issuer reveal Google Workspace vs Microsoft 365, Cloudflare/Route 53 DNS, Let's Encrypt and more.
- **Company SaaS from DNS:** domain-verification TXT records reveal tools the company uses beyond the website (Atlassian, Zendesk, Salesforce, DocuSign, Stripe, OpenAI…) — returned in a separate `companySaas` list, great for B2B lead qualification.
- **Polite by default:** fetches only the page you give it (plus `robots.txt`), respects `robots.txt`, and makes a few public DNS queries and one TLS handshake per domain (can be switched off).

### Use cases

- **Lead generation & sales prospecting:** filter a list of domains to the ones running Shopify, WooCommerce, HubSpot, Salesforce, Klaviyo…
- **Competitor research:** see which analytics, A/B testing, chat and payment tools competitors use.
- **Market sizing:** count technology adoption across thousands of sites.
- **Agencies & security audits:** spot outdated CMS or library versions (version is reported when detectable).
- **Data enrichment:** add a "tech stack" column to your CRM or spreadsheet via the Apify API, Zapier or Make.

### Input

| Field | Description | Default |
|---|---|---|
| `urls` | Domains or URLs (`example.com`, `https://example.com/shop`) | — |
| `checkDnsAndTls` | Look up MX/TXT/NS records and TLS certificate issuer | `true` |
| `minConfidence` | Hide detections below this confidence (0–100) | `50` |
| `respectRobotsTxt` | Skip pages disallowed by robots.txt (not charged) | `true` |
| `maxConcurrency` | Sites analyzed in parallel | `10` |
| `timeoutSecs` | Per-request timeout | `20` |

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

### Output

One dataset item per website:

```json
{
  "url": "https://wordpress.org",
  "finalUrl": "https://wordpress.org/",
  "statusCode": 200,
  "technologyCount": 13,
  "technologies": [
    {"name": "WordPress", "version": "7.2", "confidence": 100,
     "categories": ["CMS", "Blogs"], "website": "https://wordpress.org", "implied": false,
     "detectedVia": ["dom", "headers", "html", "meta", "scripts"]},
    {"name": "Nginx", "version": null, "confidence": 100,
     "categories": ["Web servers", "Reverse proxies"], "website": "http://nginx.org/en", "implied": false, "detectedVia": ["headers"]},
    {"name": "PHP", "version": null, "confidence": 100,
     "categories": ["Programming languages"], "website": "http://php.net", "implied": true, "detectedVia": ["implied"]}
  ],
  "companySaas": [
    {"name": "Atlassian Cloud", "categories": ["..."], "website": "https://www.atlassian.com"}
  ],
  "categories": {"CMS": ["WordPress"], "Web servers": ["Nginx"]},
  "dns": {"mx": ["..."], "ns": ["..."]},
  "tlsIssuer": "Let's Encrypt",
  "error": null,
  "durationMs": 1361
}
```

Download as JSON, CSV, Excel or HTML table, or fetch via API.

### Pricing

Pay-per-event: **$0.003 per successfully analyzed website** ($3 per 1,000). No monthly rental. Sites that fail to load, return an HTTP error, show a bot-protection challenge page or are blocked by robots.txt are **not charged**. Invalid input lines are reported as free error items. Set *Maximum cost per run* in run options to cap spending — the Actor stops cleanly at the limit.

### How it works and limitations

The Actor downloads the HTML of the given page and matches headers, cookies, meta tags, script URLs, inline scripts, HTML/DOM patterns, DNS records and the TLS certificate against the fingerprint database, then applies `implies`/`excludes` rules (e.g. WooCommerce ⇒ WordPress ⇒ PHP).

Because no browser is used, technologies that are only visible after JavaScript runs (some single-page-app frameworks, tags injected by a tag manager) may be missed. Sites behind aggressive bot protection may return an error or a challenge page — those are detected and free. `robots.txt` is parsed with Python's standard parser (no `*`/`$` wildcards). `companySaas`, `dns` and `tlsIssuer` are present only when *Check DNS and TLS* is on. Duplicate URLs (`example.com`, `EXAMPLE.com/`) are analyzed once. Only the URL you provide is fetched; the Actor does not crawl or collect personal data.

### FAQ

**Is it legal?** The Actor reads publicly served page source and public DNS records — the same thing your browser does — and honours robots.txt. You are responsible for how you use the results.

**How accurate is it?** Detection quality equals the open WebAppAnalyzer rules used by many security and SEO tools. Each match has a confidence score; raise `minConfidence` for stricter results.

**Can I integrate it?** Yes — call it from the Apify API, Python/JS clients, Zapier, Make, n8n or schedule it to monitor a list of sites.

Fingerprints: [enthec/webappanalyzer](https://github.com/enthec/webappanalyzer), GPL‑3.0.

# Actor input Schema

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

Domains or full URLs to analyze, e.g. `shopify.com` or `https://example.com/`. Only the given page is fetched (plus robots.txt).

## `checkDnsAndTls` (type: `boolean`):

Look up MX/TXT/NS records and the TLS issuer. Detects email providers (Google Workspace, Microsoft 365), DNS hosts and certificate authorities.

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

Hide technologies detected with lower confidence (0–100).

## `respectRobotsTxt` (type: `boolean`):

Skip pages that robots.txt disallows. Skipped sites are not charged.

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

How many sites to analyze in parallel.

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

Timeout for each HTTP request.

## Actor input object example

```json
{
  "urls": [
    "apify.com",
    "wordpress.org",
    "shopify.com"
  ],
  "checkDnsAndTls": true,
  "minConfidence": 50,
  "respectRobotsTxt": true,
  "maxConcurrency": 10,
  "timeoutSecs": 20
}
```

# Actor output Schema

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

One item per website: technologies, categories, DNS/TLS signals and errors.

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

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

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

```

## MCP server setup

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