# Tech Stack Detector (`fagundes_victor/tech-stack-detector`) Actor

Find what any website is built with: CMS, ecommerce platform, frameworks, analytics, CDN and hosting. 7,600+ technology fingerprints with versions and evidence, plus company tools from DNS. Pay only for websites actually analyzed.

- **URL**: https://apify.com/fagundes\_victor/tech-stack-detector.md
- **Developed by:** [Victor Fagundes](https://apify.com/fagundes_victor) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $10.00 / 1,000 websites

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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Tech Stack Detector — 7,600+ Technologies

Find out what any website is built with: CMS, ecommerce platform, JavaScript frameworks, analytics, marketing tools, CDN, hosting and security layers. Paste a list of domains and get one clean row per website, with versions, confidence and the exact evidence behind every detection.

### What you get for each website

- **Website stack** — technologies running on the site itself, detected from its HTML, scripts, headers, cookies, meta tags and TLS certificate.
- **Company tools** — services the company behind the domain uses, found in its DNS records: email provider (Google Workspace, Microsoft 365), and SaaS verification records (Stripe, HubSpot, Notion, Zoom, DocuSign and more). Kept in a separate list so they never get mixed up with the site's own stack.
- **Version** when the site exposes it (for example `WordPress 7.2`).
- **Confidence** from 0 to 100.
- **Evidence** — the header, script URL, meta tag or HTML snippet that triggered the detection, so you can check any result yourself.

### Why this one

- **7,613 technology fingerprints**, maintained by the open-source community that continued the Wappalyzer rules after they went closed in 2023.
- **You only pay for websites that were actually analyzed.** Unreachable domains, timeouts and bot-protection challenge pages are reported but not charged.
- **No browser needed.** One HTTP request per website plus DNS and certificate lookups, so runs are fast and cheap: 40 websites analyzed in about 12 seconds in our tests.
- **Honest output.** When a site answers with a bot challenge instead of its real page, the row says so in the `blocked` field instead of returning an empty or misleading stack.

### Use cases

- Build lead lists of stores on Shopify, WooCommerce, VTEX or any platform: paste your domains, set **Only websites using** to `Shopify`, and get back only the Shopify stores.
- Qualify prospects by the tools they already pay for.
- Track competitors' tech changes over time.
- Enrich a CRM with CMS, analytics and email provider.
- Audit agency client portfolios for outdated software versions.

### Use it from AI agents

Ask Claude, Cursor or VS Code "what is example.com built with?" and let the agent run this Actor for you. Connect your AI client to the official Apify MCP server at `https://mcp.apify.com`: agents can find this Actor in Apify Store and run it, and the result comes back as structured data the agent can reason about.

### Input

| Field | Description |
| --- | --- |
| `urls` | Websites to analyze. `example.com` works; `https://` is added for you. `domains`, `startUrls` and `url` are accepted too. |
| `technologies` | Optional filter. Keep only websites using at least one of these technologies or categories, like `Shopify`, `HubSpot` or `Ecommerce`. Matching websites get a `matchedTechnologies` field. |
| `includeEvidence` | Add the snippet that triggered each detection. Default `true`. |
| `checkDns` | Look up MX and TXT records to find company tools. Default `true`. |
| `timeoutSecs` | Seconds to wait for each website. Default `20`. |
| `maxConcurrency` | Websites analyzed in parallel. Default `10`. |

### Output example

A real result for wordpress.org, abridged to one technology:

```json
{
  "url": "https://wordpress.org/",
  "finalUrl": "https://wordpress.org/",
  "statusCode": 200,
  "blocked": null,
  "techCount": 14,
  "techNames": [
    "Google Font API", "Google Tag Manager", "Gutenberg", "HSTS", "Let's Encrypt", "MySQL", "Nginx",
    "Open Graph", "PHP", "Priority Hints", "RSS", "WordPress", "WordPress Block Editor", "WordPress Site Editor"
  ],
  "technologies": [
    {
      "name": "WordPress",
      "version": "7.2",
      "confidence": 100,
      "categories": ["CMS", "Blogs"],
      "website": "https://wordpress.org",
      "implied": false,
      "evidence": [
        { "type": "meta", "name": "generator", "value": "WordPress 7.2-alpha-63605" },
        { "type": "scriptSrc", "value": "https://wordpress.org/wp-content/mu-plugins/pub-sync/blocks/language-suggest/build/front.js?ver=415cd060560d9af45f39" }
      ]
    }
  ],
  "companyToolNames": [],
  "companyTools": [],
  "scanTimeMs": 2495,
  "error": null
}
```

### Limitations

- **Technologies that only appear after JavaScript runs are not detected.** About 12% of the fingerprints (for example some React, Angular and VitePress checks) need a real browser. Server-rendered markers are detected normally.
- Websites behind aggressive bot protection may serve a challenge page. These rows are flagged in `blocked` and are not charged.
- If you set a **maximum cost per run**, the run stops starting new websites once that budget is used up. The run's status message tells you how many websites were left out, so you can raise the limit and analyze the rest.
- With **Only websites using**, websites that don't match are left out of the results but still charged, since they were analyzed. Unreachable and blocked websites are left out and not charged; the run's status message counts both.
- Company tools come from public DNS records. They show what a company has set up, not necessarily what it actively uses today.

### Credits and license

Technology fingerprints come from [webappanalyzer](https://github.com/enthec/webappanalyzer), a community continuation of the Wappalyzer rules, licensed under GPL-3.0.

# Actor input Schema

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

Websites to analyze. A bare domain like example.com works; https:// is added for you.

## `technologies` (type: `array`):

Keep only websites that use at least one of these technologies or categories, for example Shopify, WordPress, HubSpot or Ecommerce. Names are matched as they appear in the results, ignoring case. Leave empty to get every website. Every analyzed website is charged, whether it matches or not.

## `includeEvidence` (type: `boolean`):

Add the exact header, meta tag, script or HTML snippet that triggered each detection.

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

Look up MX and TXT records to detect email and verification services (Google Workspace, Microsoft 365, SPF providers).

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

How long to wait for each website before giving up.

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

How many websites to analyze at the same time.

## Actor input object example

```json
{
  "urls": [
    "https://wordpress.org",
    "https://www.shopify.com"
  ],
  "includeEvidence": true,
  "checkDns": true,
  "timeoutSecs": 20,
  "maxConcurrency": 10
}
```

# Actor output Schema

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

One row per website with technology names, company tools, blocked status and scan time.

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

Every field for every website, including version, confidence, categories and evidence for each technology.

# 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"
    ]
};

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

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

```

## MCP server setup

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