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

What is this website built with? Bulk tech stack lookup: domains in; CMS, ecommerce platform, analytics, marketing and sales tools, frameworks, CDN, hosting and email provider out. 7,600+ technologies plus DNS records. A BuiltWith and Wappalyzer alternative at $1.50 per 1,000 sites.

- **URL**: https://apify.com/redfoxscout/tech-stack-detector.md
- **Developed by:** [Red Fox Scout](https://apify.com/redfoxscout) (community)
- **Features:** Limited permissions
- **Stats:** 4 total users, 1 monthly users, 96.8% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.13 / 1,000 sites

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?

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

**What is this website built with?** A bulk tech stack lookup and BuiltWith/Wappalyzer alternative for sales teams, agencies and AI agents, at **$1.50 per 1,000 sites**. Give it a list of domains and get back the **CMS, ecommerce platform, analytics, marketing and sales tools, JavaScript frameworks, CDN, hosting and email provider** of each one, as clean JSON, CSV or Excel.

**Find who uses a tool in your list.** Set **Only sites using these technologies** to HubSpot, Salesforce or any other name, and the results keep just the sites that use it. Sites that don't are left out and not charged, so you pay for the matches only.

It checks **7,600+ technologies** using the open-source Wappalyzer fingerprint database, and it also reads public **DNS records**. Those records show things a homepage can't, such as which email provider a company uses (Google Workspace, Microsoft 365) and which SaaS tools it has verified its domain with (HubSpot, Atlassian, Salesforce, Zoom, OpenAI, Stripe, DocuSign...).

**Price: $1.50 per 1,000 websites.** Failed sites, sites that block the visit, and sites left out by the technology filter are all free. Apify's free plan ($5 monthly credit) covers about 3,300 websites a month.

[![Which of these websites use HubSpot or Salesforce: real output preview (Only sites using HubSpot or Salesforce are returned (and charged))](https://raw.githubusercontent.com/TikTop-Data/apify-store-assets/main/images/tech-stack-detector-output.png)](https://console.apify.com/actors/WgqPAhpbXnetZWtcl)

### Questions it answers

- What technology is this website built with?
- Which of these websites use HubSpot, Salesforce or Shopify?
- Which email provider (Google Workspace, Microsoft 365) does this domain use?
- Which of my prospects use a competitor's product?
- Which of these sites run Cloudflare bot protection or a Facebook pixel?

### Who uses this

- 🎯 **Lead generation:** build lists of every Shopify store, WordPress site, or HubSpot customer in a list of domains.
- 💼 **Sales teams:** qualify accounts by stack ("uses Salesforce + Zendesk + Google Workspace") before outreach.
- 🔍 **SaaS competitive analysis:** see which of your prospects use a competitor.
- 🏢 **Agencies:** audit client and prospect sites in bulk.
- 📊 **Market research:** measure adoption of a technology across thousands of sites.

### Why this Tech Stack Detector

- 🎯 **Find who uses a tool:** keep only the sites that use HubSpot, Salesforce or any other technology you name; sites without it are not charged.
- 🧬 **7,600+ technologies** from the open-source Wappalyzer fingerprint database, grouped by category, with confidence and evidence.
- 📮 **DNS signals page scanners miss:** email provider (Google Workspace, Microsoft 365) and SaaS verification records.
- 📄 **More than the homepage:** up to 3 pages per site, for tools that load only on pricing, contact or cart pages.
- 🔔 **Change alerts:** name a list and see which sites added or dropped a tool since the last run.
- 💰 **$1.50 per 1,000 sites**, sites that fail to load are free.

### How to use the Tech Stack Detector

1. Click **Try for free** (a free Apify account is enough).
2. Paste domains or URLs into **Websites**, one per line.
3. Optional: set **Only sites using these technologies**, **Pages per website** or **Check DNS records**.
4. Click **Start**, then download CSV, Excel or JSON, or send the results to Google Sheets, Clay or your CRM.

### Input

| Field | Default | What it does |
|---|---|---|
| `urls` | required | Domains or URLs, one per line. `example.com` works. |
| `startUrls` | empty | Same as `urls`, for tools that send `startUrls`. Both lists are scanned together, each site once. |
| `onlyWithTechnologies` | empty | Keep only sites that use at least one of these technologies (exact names, no case). Other sites are free and left out. |
| `maxPagesPerDomain` | `1` | Pages read per site: the homepage, plus up to two linked pricing, contact or cart pages when set to 2 or 3. |
| `checkDns` | `true` | Look up MX/TXT/NS/SOA records. |
| `minConfidence` | `50` | Hide weak detections. `0` shows everything. |
| `categoryFilter` | empty | Return only some categories, e.g. `Ecommerce`, `CMS`, `Analytics`, `Live chat`. |
| `includeEvidence` | `true` | Show which signal triggered each detection. |
| `maxConcurrency` | `20` | Sites fetched in parallel. |
| `requestTimeoutSecs` | `30` | Per-site timeout. |
| `proxyConfiguration` | off | Optional proxy for sites that return HTTP 403. |

Example (the input behind the table above):

```json
{
  "urls": ["wordpress.org", "allbirds.com", "hubspot.com", "stripe.com", "notion.so", "gymshark.com", "apify.com", "bbc.com"],
  "checkDns": true,
  "minConfidence": 50
}
```

### Output

One row per website. A real row from that run, shortened:

```json
{
  "inputUrl": "allbirds.com",
  "url": "https://www.allbirds.com/",
  "domain": "allbirds.com",
  "httpStatus": 200,
  "title": "Allbirds: Comfortable, Sustainable Shoes & Apparel",
  "cms": null,
  "ecommerce": "Shopify",
  "analytics": null,
  "cdn": "Cloudflare",
  "hosting": null,
  "server": "cloudflare",
  "pagesScanned": 1,
  "technologyCount": 14,
  "technologyNames": [
    "Apple Pay",
    "Cloudflare",
    "Cursor",
    "DocuSign",
    "Google Tag Manager",
    "HSTS",
    "HTTP/3",
    "Microsoft 365",
    "Miro",
    "Open Graph",
    "PayPal",
    "Priority Hints",
    "Shopify",
    "Swiper"
  ],
  "categories": {
    "Payment processors": [
      "Apple Pay",
      "PayPal"
    ],
    "CDN": [
      "Cloudflare"
    ],
    "Artificial Intelligence": [
      "Cursor"
    ]
  },
  "technologies": [
    {
      "name": "Apple Pay",
      "slug": "apple-pay",
      "categories": [
        "Payment processors"
      ],
      "version": null,
      "confidence": 100,
      "website": "https://www.apple.com/apple-pay",
      "saas": null,
      "oss": null,
      "pricing": [],
      "cpe": null,
      "evidence": [
        "dom:script#apple-pay-shop-capabilities"
      ]
    }
  ],
  "error": null,
  "scannedAt": "2026-10-25T16:30:22.648Z"
}
```

`technologyNames` is the easiest column for spreadsheets. `technologies` has the detail: categories, version, confidence (0-100), vendor website, SaaS/open-source flags, pricing tier, CPE identifier, and evidence.

Flat columns for the common questions, so you don't have to search `technologies`:

| Field | Meaning |
|---|---|
| `cms`, `ecommerce`, `analytics`, `cdn`, `hosting` | The highest-confidence technology in each group, or null. The full list is in `technologies`. |
| `server` | The `Server` response header as sent, e.g. `cloudflare`. |
| `poweredBy` | The `X-Powered-By` header, when the site sends one. |
| `generator` | The page's meta generator tag, e.g. `WordPress 6.5.2`. |
| `versions` | Version per technology where the fingerprint gives one, e.g. `{"WordPress": "6.5.2"}`. |
| `finalUrl`, `statusCode` | The same as `url` and `httpStatus`, under the names other tools use. |
| `pagesScanned` | Pages read for the site (1 unless Pages per website is 2 or 3). |
| `matchedTechnologies` | Only with the technology filter: the names from your list that the site uses. Null otherwise. |

Sites that fail to load still get a row, with `error` filled in and no charge.

### Example tasks

Ready-made inputs you can open, change and run:

- [Which of these websites use HubSpot or Salesforce](https://apify.com/redfoxscout/tech-stack-detector/examples/hubspot-or-salesforce-users)
- [Find out if a site uses WordPress, Wix, Webflow or Squarespace](https://apify.com/redfoxscout/tech-stack-detector/examples/cms-detector-wordpress-wix-webflow)
- [Company email provider: Google Workspace or Microsoft 365?](https://apify.com/redfoxscout/tech-stack-detector/examples/company-email-provider-lookup)
- [Find where a site is hosted: AWS, Cloudflare, Vercel, Netlify](https://apify.com/redfoxscout/tech-stack-detector/examples/website-hosting-cdn-checker)
- [Weekly tech stack change alerts for your accounts](https://apify.com/redfoxscout/tech-stack-detector/examples/weekly-tech-stack-change-alerts)

### Find who uses a tool in your list

Set **Only sites using these technologies** (`onlyWithTechnologies`) to the tools you sell against or sell into. The Actor checks every site, then keeps the ones that use at least one of them.

- Names match without case and must be the exact name shown in `technologyNames`, such as `HubSpot`, `Salesforce`, `Klaviyo` or `Cloudflare Bot Management`. A name the fingerprint list doesn't know is flagged in the run log and matches nothing.
- Each matching row has `matchedTechnologies`: the names from your list that the site uses, spelled as detected.
- Sites that use none of them are still scanned, but they're free and left out of the dataset, so the results contain only matches.
- Sites that fail to load stay in the results with `error` set, free of charge, so you can retry them.
- The filter checks every technology the site uses, including ones outside `categoryFilter`.

A real run, with these inputs:

```json
{
  "urls": ["hubspot.com", "shopify.com", "apify.com", "wordpress.org"],
  "startUrls": [{ "url": "https://www.salesforce.com" }],
  "onlyWithTechnologies": ["hubspot", "Salesforce", "Klaviyo"],
  "maxPagesPerDomain": 2
}
```

Five sites were checked, three use HubSpot or Salesforce and were charged: `hubspot.com` (HubSpot), `salesforce.com` (HubSpot, Salesforce) and `apify.com` (HubSpot, found in its DNS records). `shopify.com` and `wordpress.org` were left out for free. The run log says: `Done: 3 sites scanned, 2 without hubspot, Salesforce, Klaviyo (free, left out).`

### Read more than the homepage

**Pages per website** (`maxPagesPerDomain`, 1 to 3) controls how much of each site is read. 1 (the default) reads the homepage only. 2 or 3 also read one or two internal pages linked from the homepage, in this order: pricing, contact, cart, shop or products, then about. The technologies from all the pages are merged into one row per site, and each site is still charged once.

Use it to catch tools that only appear on a pricing or contact page, such as live chat widgets or checkout buttons. Only pages linked in the homepage HTML are read; the Actor doesn't guess URLs.

### Use in Clay

Add the tech stack to every company row in a Clay table:

1. In Clay, open **Settings**, then **Connections**, then **Add Connection**, pick **Apify** and paste your Apify API token (Apify Console, **Settings**, **API & Integrations**).
2. In your table, select **Add enrichment**, search for **Apify** and pick **Run Apify Actor**.
3. Choose this Actor (`redfoxscout/tech-stack-detector`, ID `WgqPAhpbXnetZWtcl`) and paste this as the input, inserting your domain column where it says `/Domain` (Clay's rule: quotes around the key, none around the column token):

```json
{ "urls": [/Domain], "includeEvidence": false }
```

4. Map the output fields you need to columns: `technologyNames` (one list, easiest), `categories` (grouped, e.g. CRM, Analytics, Email), `technologyCount` and `error`.

Clay runs the Actor once per row, so each row costs one Actor start plus one result. For thousands of rows, export the column and run the Actor once on the whole list instead: same price per site, one start.

### Check websites from another Actor (Google Maps leads, lead lists)

Have a list from Google Maps Scraper or any other Actor? Pick its dataset under **Websites from another Actor**. This Actor reads the `website` field (or the field you name, e.g. `url`, `domain` or `contact.website`) and checks every site. No copy and paste.

To run it automatically after every scrape, add an Actor-to-Actor integration to the source Actor or task with this input:

```json
{ "datasetId": "{{resource.defaultDatasetId}}", "datasetUrlField": "website" }
```

### Change alerts

Give the run a **Change alert name** (e.g. `clients-weekly`) and put it on an Apify schedule. Each row then gets `changeStatus` (`new`, `changed` or `unchanged`) and `changedFields`, compared with the previous run of the same name, so you see when a site adds or drops a technology. Turn on **Only new and changed sites** and each run's dataset is just the change report; unchanged sites are still checked and charged as usual. Add Apify's Slack or email integration to get the report delivered.

### How it works

For each site it makes one HTTP request to the page you give (usually the homepage) and matches response headers, cookies, meta tags, script URLs, inline scripts, styles, HTML and DOM elements against the fingerprint database. If DNS checks are on, it also matches the domain's MX, TXT, NS, SOA and CNAME records. With Pages per website set to 2 or 3, it reads the linked pricing, contact or cart pages the same way and merges the results. Implied technologies are added (WordPress implies PHP and MySQL) and conflicts are resolved the same way Wappalyzer does.

### Limitations

- It doesn't run JavaScript. Tools that only show up as JS variables set at runtime can be missed. Most popular tools are still found through script URLs, cookies, headers and DNS.
- Pages per website reads only pages linked from the homepage, up to two extra pages. The rest of a large site is not read.
- Sites behind aggressive bot protection may return HTTP 403. You still get what the headers reveal (e.g. Cloudflare), free of charge. Enabling a proxy can help.

### What this Actor does not do

It doesn't log in, use cookies or saved sessions, solve CAPTCHAs, or read pages behind a login. It doesn't collect personal details such as staff names or personal emails: it reads only which technologies a site runs.

### How much does it cost?

Pay per event:

- **Site scanned:** $0.0015 per website that loads successfully ($1.50 per 1,000). With Pages per website at 2 or 3 it's still one charge per site.
- **Actor start:** $0.00005 per GB of memory (default 2 GB = $0.0001 per run).
- Sites that fail, don't resolve, return HTTP 4xx/5xx, or don't use the technologies in your filter: free.

| Websites | Cost |
|---|---|
| 100 | about $0.15 |
| 1,000 | about $1.50 |
| 10,000 | about $15 |

Apify's free plan includes $5 of credit every month, enough for about 3,300 websites. Paid Apify plans get Store discounts of up to 25%. You can set a maximum cost per run in the run options; the Actor stops cleanly when it's reached.

### FAQ

**Is this legal?** It visits each public homepage once, like a browser would, and reads public DNS records. It collects information about software, not about people.

**How fresh is the fingerprint database?** It's the community-maintained [webappanalyzer](https://github.com/enthec/webappanalyzer) database and is refreshed when the Actor is updated.

**Can I run it on a schedule or via API?** Yes. Use Apify schedules, the API, or integrations (Zapier, Make, Google Sheets, webhooks).

**Why is a tool I know a site uses missing?** It probably loads only through JavaScript, or on a page other than the one you gave. Try the exact page URL, set `minConfidence` to `0`, or set Pages per website to 2 or 3.

**Why is a site missing from my filtered results?** It doesn't use any of the technologies in **Only sites using these technologies**, so it was left out and not charged. Sites that failed to load are still listed, with `error` set.

### Related Actors

- [Shopify Store Detector](https://apify.com/redfoxscout/shopify-store-detector): is it Shopify, which theme and apps, and what the store sells.
- [ATS Jobs Scraper](https://apify.com/redfoxscout/ats-jobs-scraper): every open job at companies whose sites use Greenhouse, Lever, Workable and more.
- [SEO Meta Tag & Schema Checker](https://apify.com/redfoxscout/seo-meta-checker): titles, meta tags and schema for the same sites.
- [Bulk URL Status & SSL Checker](https://apify.com/redfoxscout/url-status-ssl-checker): status codes, redirects and SSL expiry.

### License and credits

Technology fingerprints and categories come from [enthec/webappanalyzer](https://github.com/enthec/webappanalyzer) (GPL-3.0), a maintained fork of the original Wappalyzer database. This Actor's source code is licensed GPL-3.0 accordingly. Not affiliated with Wappalyzer or BuiltWith.

# Actor input Schema

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

Domains or URLs to scan, one per line. Bare domains like <code>example.com</code> are fine; <code>https://</code> is added automatically. The homepage (or the exact URL you give) is analysed. Or use "Websites from another Actor" below.

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

Same as Websites above, for tools that send startUrls. Both lists are scanned together, each site once. Accepts plain domains or {"url": "..."} objects.

## `onlyWithTechnologies` (type: `array`):

Optional. Keep only the sites that use at least one of these technologies, e.g. <code>HubSpot</code> or <code>Salesforce</code>. Names match without case and must be the exact name shown in technologyNames. Sites that use none are still scanned, but they are free and left out of the results. Sites that fail to load are still listed (free).

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

Check the websites in another Actor run's results, e.g. Google Maps Scraper or any lead list. Pick the dataset here, or in an Actor-to-Actor integration set it to {{resource.defaultDatasetId}}. Its websites are added to the list above.

## `datasetUrlField` (type: `string`):

The dataset field that holds the website or URL, e.g. website (Google Maps Scraper), url or domain. Dot paths like contact.website work. If it is empty, website, url and domain are tried.

## `maxDatasetItems` (type: `integer`):

Read at most this many rows from that dataset.

## `monitorName` (type: `string`):

Name this list (e.g. "clients-weekly") to compare each run with the previous run of the same name. Every row then gets changeStatus (new, changed or unchanged) and changedFields. Best on an Apify schedule.

## `onlyChanges` (type: `boolean`):

Needs a change alert name. Unchanged sites are still checked and charged as usual, but left out of the results, so each run's dataset is your change report.

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

Look up MX, TXT, NS and SOA records to detect email providers (Google Workspace, Microsoft 365), DNS hosts, and verified SaaS tools (HubSpot, Atlassian, etc.). Adds about 0.2 s per site.

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

Hide detections below this confidence. 50 removes weak single-signal guesses. Use 0 to see everything.

## `categoryFilter` (type: `array`):

Optional. Return only technologies in these categories, e.g. <code>Ecommerce</code>, <code>CMS</code>, <code>Analytics</code>, <code>Marketing automation</code>, <code>Live chat</code>, <code>Payment processors</code>, <code>Email</code>. Case-insensitive. Leave empty for all.

## `maxPagesPerDomain` (type: `integer`):

1 reads the homepage only (default, fastest). 2 or 3 also read up to 1 or 2 internal pages linked from the homepage, preferring pricing, contact and cart pages, and merge what they reveal into one row. Still one charge per website.

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

Add which signal triggered each detection (header, script URL, meta tag, cookie, DNS record...).

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

How many sites to fetch in parallel.

## `requestTimeoutSecs` (type: `integer`):

Give up on a site that takes longer than this to respond.

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

Optional. Most sites don't need a proxy. Enable if many sites return HTTP 403.

## Actor input object example

```json
{
  "urls": [
    "apify.com",
    "shopify.com",
    "wordpress.org"
  ],
  "datasetUrlField": "website",
  "maxDatasetItems": 10000,
  "onlyChanges": false,
  "checkDns": true,
  "minConfidence": 50,
  "maxPagesPerDomain": 1,
  "includeEvidence": true,
  "maxConcurrency": 20,
  "requestTimeoutSecs": 30,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `results` (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",
        "shopify.com",
        "wordpress.org"
    ],
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

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

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

```

## MCP server setup

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