# Website Tech Stack Detector – BuiltWith Alternative (`dbsimpjr28/website-tech-detector`) Actor

Find the tech stack of any website: CMS, ecommerce platform, analytics, CDN, hosting, frameworks and 7,600+ tools. Scan thousands of sites or a Google Maps dataset. Unreachable sites are free.

- **URL**: https://apify.com/dbsimpjr28/website-tech-detector.md
- **Developed by:** [David Simpkins Jr.](https://apify.com/dbsimpjr28) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.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 Technology Detector – BuiltWith & Wappalyzer Alternative

Find out what any website is built with. Paste a list of websites (or a Google Maps / Google Search dataset) and get back each site's CMS, ecommerce platform, analytics and ad tags, CDN, hosting, web server, programming language, JavaScript frameworks, payment providers, chat widgets and more, from a library of **7,600+ technology fingerprints**.

Built for:

- **Sales and lead generation:** build lists like "Shopify stores using Klaviyo" or "WordPress sites without Google Analytics", then add emails and socials in the same run.
- **Agencies:** check a prospect's stack before the first call, or find every site in a city still on an old CMS.
- **SaaS market research:** measure adoption of your product and your competitors' across thousands of domains.
- **Security and IT:** inventory web servers, frameworks and versions across a domain portfolio.

### Features

- **7,600+ technologies in 109 categories**, using the open-source Wappalyzer-format fingerprint database (see Credits).
- Reads everything a server sends: HTTP headers, cookies, HTML, script URLs, inline scripts, meta tags, CSS and static page elements.
- **DNS checks** (on by default): DNS hosting (Route 53, Cloudflare DNS…), email provider (Google Workspace, Microsoft 365) and SaaS domain verifications (Atlassian, Stripe, HubSpot, Zoom…) that a page scan can't see.
- **Versions** where the site reveals them (e.g. WordPress 6.9, jQuery 3.5.1, Yoast SEO 25.1).
- **Confidence score** per technology, plus implied technologies (WordPress → PHP, MySQL; Next.js → React).
- Ready-made columns: `cms`, `ecommerce`, `analytics`, `tagManagers`, `cdn`, `hosting`, `paas`, `server`, `programmingLanguages`, `javascriptFrameworks`, `webFrameworks`, `paymentProcessors`, `liveChat`, `crm`, `marketingAutomation`, `email`, and a full `byCategory` map.
- **Filters that save money:** output only sites in a category (e.g. Ecommerce) or using a named technology (e.g. Shopify). Filtered-out sites are not charged.
- **Optional contacts:** emails, phone numbers and social profiles from the same pages, at no extra cost.
- Chains with other Actors: give it a dataset ID and the column name with the website URL; the source row is kept in `source`.
- Fast: a plain HTTP scan takes about 0.5 seconds per site, so 10,000 sites finish in well under an hour.

### Input

| Field | What it does |
|---|---|
| Websites | URLs or bare domains (`example.com`). Duplicates are removed. |
| Or: Apify dataset ID + website field | Scan every row of another run's dataset, e.g. a Google Maps scraper (`website`). |
| Pages per site | 1 = homepage (default). 2–3 also scans a shop, pricing, blog or about page. |
| Only output sites using these categories | e.g. `Ecommerce`, `CMS`, `Live chat`. |
| Only output sites using any of these technologies | e.g. `Shopify`, `WordPress`, `HubSpot`. |
| Minimum confidence | Default 50. Set 0 to see weak hints too. |
| Check DNS records | Default on. |
| Include contacts | Default off. |
| Include detection evidence | Adds the matched rule and text for each detection. |

### Output example

Data below is made up for illustration.

```json
{
  "inputUrl": "examplestore.com",
  "url": "https://www.examplestore.com/",
  "domain": "examplestore.com",
  "status": "ok",
  "title": "Example Store – Wool Sneakers",
  "technologyCount": 14,
  "technologies": [
    {
      "name": "Shopify",
      "version": null,
      "categories": ["Ecommerce"],
      "confidence": 100,
      "website": "https://shopify.com",
      "icon": "https://raw.githubusercontent.com/enthec/webappanalyzer/main/src/images/icons/Shopify.svg",
      "detectedVia": ["headers", "scriptSrc", "meta"]
    },
    {
      "name": "jQuery",
      "version": "3.5.1",
      "categories": ["JavaScript libraries"],
      "confidence": 100,
      "website": "https://jquery.com",
      "icon": "https://raw.githubusercontent.com/enthec/webappanalyzer/main/src/images/icons/jQuery.svg",
      "detectedVia": ["scriptSrc"]
    }
  ],
  "byCategory": {
    "Ecommerce": ["Shopify"],
    "CDN": ["Cloudflare"],
    "Email": ["Klaviyo"],
    "Payment processors": ["PayPal", "Apple Pay"],
    "Tag managers": ["Google Tag Manager"]
  },
  "cms": [],
  "ecommerce": ["Shopify"],
  "analytics": [],
  "tagManagers": ["Google Tag Manager"],
  "cdn": ["Cloudflare"],
  "hosting": [],
  "paas": [],
  "server": [],
  "programmingLanguages": [],
  "javascriptFrameworks": [],
  "paymentProcessors": ["PayPal", "Apple Pay"],
  "domainVerifications": ["Atlassian Cloud", "DocuSign", "Zoom"],
  "pagesScanned": ["https://www.examplestore.com/"],
  "scannedAt": "2026-10-21T14:00:00.000Z"
}
```

`domainVerifications` lists services found only through DNS TXT verification records. They tell you which SaaS accounts the company has (useful for sales), but they are kept out of `technologies` because the website itself doesn't run them.

Sites that can't be reached come back as `{"status": "error", "error": "http-403"}` (or `unreachable: ENOTFOUND`, `http-404`, …) and are free.

### Pricing

**$0.002 per website analyzed** ($2 per 1,000 sites), no start fee. You are not charged for:

- sites that are down, don't exist or block the request,
- sites removed by your category or technology filters.

Contacts and DNS checks are included in the same price.

### Limits

- This Actor reads what the server sends; it does not run a browser. Fingerprint rules that need JavaScript to execute (`js` globals, network requests made after load) are skipped. We added static rules for the most common cases (Next.js, Nuxt, Remix, SvelteKit, Squarespace, Framer, Google Ads, Klaviyo and others), so popular stacks are still detected. A site that renders everything client-side may show fewer tools than a browser extension would find.
- Some large sites block automated requests (`http-403`). Turn on Apify Proxy and run those again. Sites behind an interactive bot challenge may stay blocked.
- Versions only appear when the site exposes them (in a header, generator tag or file name).

### Tips

- For lead lists, combine a Google Maps scraper (e.g. "dentists in Austin") with this Actor via **dataset ID**, then filter by category.
- Keep **Pages per site** at 1 for large lists; use 2–3 for deeper audits of fewer sites.
- Turn on **Include detection evidence** if you want to see exactly why a technology was reported.

### Credits and license

Technology fingerprints come from [webappanalyzer](https://github.com/enthec/webappanalyzer) by Enthec, the community continuation of Wappalyzer's open-source rules, licensed under **GPL-3.0**. The rules file and its license ship with this Actor (`src/fingerprints/`). We fixed a few rules that caused false positives and added static rules for browser-only fingerprints; those changes are listed in `src/supplements.js`. Icons link to the same project.

Questions, or a technology we miss? Open an issue on the Actor page.

# Actor input Schema

## `startUrls` (type: `array`):

Website URLs or bare domains (e.g. example.com). One row per site; duplicates are removed.

## `datasetId` (type: `string`):

Analyze every website in an existing dataset, for example the output of a Google Maps or Google Search scraper run. Each source row is copied into the result under "source".

## `websiteField` (type: `string`):

Column holding the URL. Google Maps scrapers use "website". Dot paths like "company.url" work.

## `maxSites` (type: `integer`):

Stop after this many websites.

## `maxPagesPerSite` (type: `integer`):

1 = homepage only (fastest). 2–3 also scans a shop/pricing/blog/about page, which finds a few more tools.

## `categories` (type: `array`):

Leave empty for all sites. Example: pick "Ecommerce" to get only online stores. Sites filtered out are not charged.

## `technologyFilter` (type: `array`):

Technology names as they appear in the output, e.g. Shopify, WordPress, HubSpot, Klaviyo. Case-insensitive. Sites filtered out are not charged.

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

Hide detections below this confidence (0–100). Most detections are 100; weak single hints score 25–50.

## `includeDns` (type: `boolean`):

Look up NS, MX, SOA, CNAME and TXT records to detect DNS hosting, email providers and SaaS domain verifications. Adds about 0.1 s per site.

## `includeContacts` (type: `boolean`):

Also extract emails, phone numbers and social profile links from the scanned pages. No extra charge.

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

Adds the matched rule and snippet for each technology. Useful for auditing results.

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

How many websites to scan at the same time.

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

Not needed for most websites. Turn on Apify Proxy if many sites return http-403.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://wordpress.org/news/"
    },
    {
      "url": "https://www.allbirds.com"
    },
    {
      "url": "https://nextjs.org"
    }
  ],
  "websiteField": "website",
  "maxSites": 10000,
  "maxPagesPerSite": 1,
  "minConfidence": 50,
  "includeDns": true,
  "includeContacts": false,
  "includeEvidence": false,
  "maxConcurrency": 10,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

All items the run produced, in the default dataset.

# 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 = {
    "startUrls": [
        {
            "url": "https://wordpress.org/news/"
        },
        {
            "url": "https://www.allbirds.com"
        },
        {
            "url": "https://nextjs.org"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("dbsimpjr28/website-tech-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 = { "startUrls": [
        { "url": "https://wordpress.org/news/" },
        { "url": "https://www.allbirds.com" },
        { "url": "https://nextjs.org" },
    ] }

# Run the Actor and wait for it to finish
run = client.actor("dbsimpjr28/website-tech-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 '{
  "startUrls": [
    {
      "url": "https://wordpress.org/news/"
    },
    {
      "url": "https://www.allbirds.com"
    },
    {
      "url": "https://nextjs.org"
    }
  ]
}' |
apify call dbsimpjr28/website-tech-detector --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,dbsimpjr28/website-tech-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/xRVHTSitgO00gNk12/builds/9qiu1xg0WrsRu7dJK/openapi.json
