# Website Technology Detector: Tech Stack Lookup (`wish.tools/website-tech-stack-detector`) Actor

Find out what a website is built with: CMS, ecommerce, analytics, CDN, frameworks, marketing tools, email provider and SaaS tools from DNS. 7,600+ open fingerprints, robots.txt-respecting, $5 per 1,000 sites.

- **URL**: https://apify.com/wish.tools/website-tech-stack-detector.md
- **Developed by:** [Wish Tools](https://apify.com/wish.tools) (community)
- **Security:** Limited permissions
- **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 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: tech stack lookup for any website

Find out **what any website is built with**, for **$5 per 1,000 websites**. Paste domains and get back the CMS, ecommerce platform, analytics and tag managers, CDN and hosting, JavaScript frameworks, marketing and consent tools, and even the **email provider and SaaS tools a company uses** (from public DNS records).

- **7,600+ technologies** from the GPL-3.0 webappanalyzer fingerprint ruleset (Wappalyzer format)
- **Fast and cheap:** plain HTTP, no browser, about 1 second per site
- **Versions and confidence** where the site reveals them (e.g. WordPress 6.6.2, nginx 1.25.3)
- **DNS intelligence:** MX, SPF/TXT verification records and NS reveal Google Workspace vs Microsoft 365, Cloudflare, HubSpot, Slack, Zoom, Atlassian, Stripe and many more
- **Polite by design:** fetches only the public page you give, **respects robots.txt** (RFC 9309), and identifies itself as `TechStackDetector`. No logins, no bypassing bot protection.
- **You only pay for real results:** sites that block us, error out or forbid crawling in robots.txt are listed for free

### Who it's for

- **Sales and lead generation:** find every prospect on Shopify, HubSpot or Microsoft 365; prioritise accounts by stack
- **Agencies and freelancers:** spot outdated CMS versions and missing analytics before a pitch
- **Market research:** measure technology adoption across a list of domains
- **Investors and M\&A:** a quick technical due-diligence snapshot

### Input

```json
{
  "urls": ["pleo.io", "https://www.hubspot.com", "wordpress.org"],
  "dnsLookups": true,
  "includeDnsVerifiedSaas": true,
  "includeImplied": true,
  "minConfidence": 0,
  "maxConcurrency": 5
}
```

### Output

One item per website:

```json
{
  "input": "https://wordpress.org/",
  "status": "ok",
  "domain": "wordpress.org",
  "finalUrl": "https://wordpress.org/",
  "httpStatus": 200,
  "title": "Blog Tool, Publishing Platform, and CMS - WordPress.org",
  "technologyCount": 13,
  "technologyNames": ["Google Tag Manager", "Nginx", "PHP", "WordPress", "MySQL", "..."],
  "websiteTechnologies": ["..."],
  "dnsDetectedServices": ["..."],
  "byCategory": { "CMS": ["WordPress"], "Web servers": ["Nginx"], "Tag managers": ["Google Tag Manager"] },
  "technologies": [
    { "name": "WordPress", "version": null, "confidence": 100, "categories": ["CMS", "Blogs"],
      "website": "https://wordpress.org", "cpe": "cpe:2.3:a:wordpress:wordpress:*:*:*:*:*:*:*:*",
      "saas": true, "openSource": true, "pricing": ["low", "recurring", "freemium"],
      "implied": false, "detectedVia": ["html", "scripts"] }
  ],
  "rulesetVersion": "enthec/webappanalyzer <commit> <date>"
}
```

`status` is one of `ok` (charged), `blocked-by-robots-txt`, `http-error`, `unreachable`, `invalid-url` (all free). `detectedVia` shows the evidence: `url`, `headers`, `cookies`, `meta`, `html`, `scripts`, `dns` or `implied`. See `sample_output.json`.

### Pricing

**$0.005 per successfully analyzed website ($5 per 1,000)**, plus the tiny standard Actor start fee. Failed, blocked and invalid inputs are free.

### Limitations

- The Actor reads HTML, headers, cookies, meta tags, scripts and DNS. It does **not** run a browser, so technologies that can only be seen in JavaScript at runtime may be missed. On the other hand, it's far cheaper and faster than browser-based tools.
- Sites behind aggressive bot protection may answer with 403. They are reported as `http-error` and not charged.
- `dnsDetectedServices` come from public DNS verification records. They mean the company signed up for or verified the service at some point, not necessarily that it uses it today.

### Licence

Source available on request (GPL-3.0 components; licence and NOTICE included). This Actor is licensed under **GPL-3.0** and bundles the GPL-3.0 webappanalyzer ruleset (https://github.com/enthec/webappanalyzer); the licence texts and NOTICE.md ship with every build. To receive the complete source, contact us via the Actor's Issues tab.

### Privacy: personal contact data is removed

Every output item is passed through a sanitiser before it is saved. Email addresses and phone numbers anywhere in any text field (title, description, HTML, location, URLs, errors…) are replaced with `[redacted]`, and contact-person, recruiter and hiring-manager fields are dropped. Names introduced as a contact ("Your contact: …", "Ansprechpartnerin: …") are also redacted. The output contains organisation-level data only and is not meant for contacting individuals.

# Actor input Schema

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

Domains or URLs to analyze, e.g. <code>pleo.io</code> or <code>https://www.example.com/</code>. One result per website; only the public page you give (usually the homepage) is fetched.

## `dnsLookups` (type: `boolean`):

Also read public DNS records (MX, TXT, NS, SOA, CNAME) to detect email provider, DNS/CDN host and SaaS tools that verify domains via TXT records.

## `includeDnsVerifiedSaas` (type: `boolean`):

TXT verification records (e.g. for Slack, HubSpot, Zoom) show which tools a company signed up for. Great for sales intelligence; turn off if you only want what runs on the website itself.

## `includeImplied` (type: `boolean`):

E.g. WordPress implies PHP and MySQL. Implied items are flagged with implied: true.

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

Drop detections below this confidence.

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

How many different websites are analyzed at the same time. Each website gets at most a few requests (robots.txt, the page and its redirects).

## Actor input object example

```json
{
  "urls": [
    "pleo.io",
    "https://www.hubspot.com",
    "wordpress.org"
  ],
  "dnsLookups": true,
  "includeDnsVerifiedSaas": true,
  "includeImplied": true,
  "minConfidence": 0,
  "maxConcurrency": 5
}
```

# Actor output Schema

## `reports` (type: `string`):

All website reports in the default dataset (table view).

# 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": [
        "pleo.io",
        "https://www.hubspot.com",
        "wordpress.org"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("wish.tools/website-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": [
        "pleo.io",
        "https://www.hubspot.com",
        "wordpress.org",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("wish.tools/website-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": [
    "pleo.io",
    "https://www.hubspot.com",
    "wordpress.org"
  ]
}' |
apify call wish.tools/website-tech-stack-detector --silent --output-dataset

```

## MCP server setup

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