# Website Tech Stack Detector (Wappalyzer Alternative) (`tiktop/tech-stack-detector`) Actor

Detect 7,600+ technologies on any website: CMS, ecommerce platform, analytics, marketing tools, frameworks, CDN, hosting and email provider. Bulk domains in, clean JSON out.

- **URL**: https://apify.com/tiktop/tech-stack-detector.md
- **Developed by:** [Khaled](https://apify.com/tiktop) (community)
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.13 / 1,000 site scanneds

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

Find out what any website is built with. 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.

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 and sites that block the visit are free. Apify's free plan ($5 monthly credit) covers about 3,300 websites a month.

[![Website Tech Stack Detector output: CMS, analytics, CRM, email provider and technology count per website](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 companies use Shopify, HubSpot, Salesforce or WordPress?
- Which email provider (Google Workspace, Microsoft 365) does this domain use?
- Which of my prospects use a competitor's product?

### 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 Actor

| | This Actor | Typical alternatives |
|---|---|---|
| Technologies covered | 7,600+ | 45 to a few thousand |
| DNS-based detection (email provider, verified SaaS) | Yes | Rarely |
| Price per 1,000 sites | $1.50 | $2 to $100 |
| Charged for failed/blocked sites | No | Often |
| Version numbers and evidence | Yes | Sometimes |

### How to use the Website Tech Stack Detector

1. Click **Try for free** (a free Apify account is enough).
2. Paste your domains or URLs, one per line. `example.com` works.
3. Optional: limit the output to some categories (`Ecommerce`, `CMS`, `Analytics`...) or raise the confidence threshold.
4. Click **Start**. A few hundred sites take a couple of minutes.
5. Download the results as JSON, CSV or Excel, or send them to Google Sheets, Zapier, Make or your own app through the API.

### Input

| Field | Default | What it does |
|---|---|---|
| `urls` | required | Domains or URLs, one per line. `example.com` works. |
| `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": "wordpress.org",
  "url": "https://wordpress.org/",
  "domain": "wordpress.org",
  "httpStatus": 200,
  "title": "Blog Tool, Publishing Platform, and CMS – WordPress.org",
  "technologyCount": 13,
  "technologyNames": ["Google Font API", "Google Tag Manager", "Gutenberg", "HSTS", "..."],
  "categories": {
    "Font scripts": ["Google Font API"],
    "Tag managers": ["Google Tag Manager"],
    "WordPress plugins": ["Gutenberg"],
    "Editors": ["Gutenberg"]
  },
  "technologies": [
    {
      "name": "Google Font API",
      "slug": "google-font-api",
      "categories": ["Font scripts"],
      "version": null,
      "confidence": 100,
      "website": "https://fonts.google.com/",
      "saas": null,
      "oss": null,
      "pricing": [],
      "cpe": null,
      "evidence": ["dom:link[href*='fonts.g'][href]"]
    }
  ],
  "error": null,
  "scannedAt": "2026-10-06T11:37:08.564Z"
}
```

`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.

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

### Example tasks

Ready-made inputs you can open and run:

- [Check which websites run on Shopify](https://apify.com/tiktop/tech-stack-detector/examples/shopify-store-checker)
- [Find out if a site uses WordPress, Wix, Webflow or Squarespace](https://apify.com/tiktop/tech-stack-detector/examples/cms-detector-wordpress-wix-webflow)
- [Find companies using HubSpot, Salesforce, Marketo or Intercom](https://apify.com/tiktop/tech-stack-detector/examples/marketing-crm-stack-finder)
- [Company email provider: Google Workspace or Microsoft 365?](https://apify.com/tiktop/tech-stack-detector/examples/company-email-provider-lookup)
- [Find where a site is hosted: AWS, Cloudflare, Vercel, Netlify](https://apify.com/tiktop/tech-stack-detector/examples/website-hosting-cdn-checker)
- [Weekly tech stack change alerts for your accounts](https://apify.com/tiktop/tech-stack-detector/examples/weekly-tech-stack-change-alerts)

### 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. 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.
- Only the URL you give is analysed, not every page of the site.
- 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.

### How much does it cost?

Pay per event:

- **Site scanned:** $0.0015 per website that loads successfully ($1.50 per 1,000).
- **Actor start:** $0.00005 per GB of memory (default 2 GB = $0.0001 per run).
- Sites that fail, don't resolve, or return HTTP 4xx/5xx: 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, or set `minConfidence` to `0`.

### Related Actors

- [Shopify Store Detector](https://apify.com/tiktop/shopify-store-detector): is it Shopify, which theme and apps.
- [ATS Jobs Scraper](https://apify.com/tiktop/ats-jobs-scraper): every open job at companies whose sites use Greenhouse, Lever, Workable and more.
- [SEO Meta Tag & Schema Checker](https://apify.com/tiktop/seo-meta-checker): titles, meta tags and schema for the same sites.
- [Bulk URL Status & SSL Checker](https://apify.com/tiktop/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.

## `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.

## `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,
  "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("tiktop/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("tiktop/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 tiktop/tech-stack-detector --silent --output-dataset

```

## MCP server setup

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