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

Find out what any website is built with (tech stack lookup): CMS, ecommerce, analytics, frameworks, CDN, hosting and email provider. 7,600+ technologies from open Wappalyzer-format fingerprints. Fast mode, or Deep scan in a real browser. Bulk lists, clean JSON.

- **URL**: https://apify.com/swiftkit/tech-stack.md
- **Developed by:** [SwiftKit](https://apify.com/swiftkit) (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 $5.00 / 1,000 website scanneds

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: CMS, Analytics, Ecommerce

Find out what any website is built with. Paste a list of domains, get back the technologies
behind each one: **CMS, ecommerce platform, analytics and ad tags, JavaScript frameworks, CDN,
hosting, payment providers, security tools, SSL issuer and email provider.**

It checks each site against **7,600+ technology fingerprints** from the open-source
[webappanalyzer](https://github.com/enthec/webappanalyzer) project.

### Who it's for

- **Sales and lead generation:** find every Shopify store, WordPress site or HubSpot user in your
  list, and personalize outreach by the tools they already use.
- **Agencies:** audit a prospect's site before the first call.
- **Market research:** count how many sites in a niche use each platform.
- **Competitor tracking:** see when a competitor switches analytics, CMS or hosting.
- **AI agents:** one call, clean JSON, the same fields every time.

### Input

| Field | What it does |
|---|---|
| **Websites** | One per line: `stripe.com` or `https://www.notion.so/pricing`. |
| Deep scan (real browser) | Opens each site in headless Chrome to also catch tools that load with JavaScript. In our tests it found about **2× more technologies** (e.g. 33 → 56 on hubspot.com). |
| Include details | Version, confidence, categories, vendor website, open source or SaaS, for each technology. |
| Check DNS and SSL | Also reads public DNS records and the SSL certificate. Finds the email provider (Google Workspace, Microsoft 365…), DNS host and more. |
| Respect robots.txt | Skips sites that ask all bots to stay away. Skipped sites are free. |

### Output

One row per website:

```json
{
  "domain": "wordpress.org",
  "status": "ok",
  "pageTitle": "Blog Tool, Publishing Platform, and CMS – WordPress.org",
  "technologyCount": 14,
  "technologies": ["WordPress", "PHP", "MySQL", "Nginx", "Google Tag Manager", "Let's Encrypt", "…"],
  "byCategory": {
    "CMS": ["WordPress"],
    "Programming languages": ["PHP"],
    "Databases": ["MySQL"],
    "Web servers": ["Nginx"],
    "Tag managers": ["Google Tag Manager"]
  },
  "emailProvider": "Google Workspace",
  "details": [
    { "name": "WordPress", "version": "6.8", "confidence": 100, "categories": ["CMS", "Blogs"], "openSource": true, "saas": false }
  ]
}
```

`status` is `ok`, `http_403` (the site refused the visit), `unreachable`, `invalid_url` or
`blocked_by_robots_txt`.

### Pricing

You pay **per website scanned successfully**: a fast scan or a deep scan (priced higher because it runs a real browser). Unreachable sites, refused visits and sites skipped
by robots.txt are free. See the Pricing tab.

### How it works, honestly

- It loads each homepage once (fast mode) or opens it in headless Chrome (deep scan), like a normal visitor, and reads the HTML, scripts, meta tags,
  response headers and cookies. With DNS on, it also reads public DNS records and the SSL issuer.
- Fast mode reads the page source without running JavaScript, so tools that only appear after
  JavaScript runs may be missed. Turn on **Deep scan** to catch those.
- Some large sites block automated visits (`http_403`); you're not charged for those.
- Detection is based on public fingerprints. Rare or custom tools may not be listed.

### Open source

This Actor's source code is public on [GitHub](https://github.com/swiftkit-dev/website-tech-stack-detector) under the GPL-3.0 license, as required by the fingerprint
data it uses. Technology fingerprints © webappanalyzer contributors.

### Questions or a wrong detection?

Open an issue on the Issues tab with the site and what you expected.

# Actor input Schema

## `websites` (type: `array`):

One per line. A domain (stripe.com) or a full URL (https://www.notion.so/pricing).

## `deepScan` (type: `boolean`):

Open each site in headless Chrome and also detect tools that load with JavaScript (analytics, chat widgets, A/B testing, frameworks). Finds many more technologies; slower and priced higher. Off = fast scan of the page source.

## `includeDetails` (type: `boolean`):

Adds version, confidence, categories, website and whether it's open source or SaaS for each technology.

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

Also look at public DNS records (email provider, DNS host, verification records) and the SSL issuer. Finds more technologies.

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

Skip sites whose robots.txt asks all bots to stay away. Skipped sites are free.

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

How many websites to scan in parallel.

## Actor input object example

```json
{
  "websites": [
    "stripe.com",
    "https://www.shopify.com",
    "wordpress.org"
  ],
  "deepScan": false,
  "includeDetails": true,
  "checkDns": true,
  "respectRobotsTxt": true,
  "maxConcurrency": 10
}
```

# Actor output Schema

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

One row per website with its technologies.

# 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 = {
    "websites": [
        "stripe.com",
        "https://www.shopify.com",
        "wordpress.org"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("swiftkit/tech-stack").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 = { "websites": [
        "stripe.com",
        "https://www.shopify.com",
        "wordpress.org",
    ] }

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

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,swiftkit/tech-stack"
        }
    }
}
```

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/SOj3o4f77Gaj8qX9j/builds/d2MQPIwQpojCleuqO/openapi.json
