# Tech Stack Detector: Website Technology Lookup, 3,600+ Techs (`atesen-software/website-tech-stack-detector`) Actor

Find out what any website is built with: CMS, ecommerce platform, analytics, tag managers, frameworks, CDN, hosting, email provider, payments, chat and 3,600+ more technologies. Bulk domain lists, DNS/TLS checks, CSV export, no browser. $1.50 per 1,000 sites; sites with nothing detected are free.

- **URL**: https://apify.com/atesen-software/website-tech-stack-detector.md
- **Developed by:** [Atesen Software](https://apify.com/atesen-software) (community)
- **Categories:** Lead generation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$1.50 / 1,000 results

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

Find out **what any website is built with**. Paste a list of domains and get the CMS, ecommerce platform, analytics and tag managers, JavaScript frameworks, web server, CDN, hosting, payment providers, live chat, marketing tools and **3,600+ other technologies**, with versions where they can be read. It costs **$1.50 per 1,000 websites**.

It uses no browser and no proxy, so it is fast and cheap for large lead lists. Sites where nothing is found are free.

### What can it detect?

More than 3,600 technologies in 108 categories, for example:

- **CMS & site builders**: WordPress, Drupal, Joomla, Webflow, Wix, Squarespace, Ghost, HubSpot CMS, Framer, Docusaurus
- **Ecommerce**: Shopify, WooCommerce, Magento, BigCommerce, PrestaShop, Shopware, Salesforce Commerce Cloud, and Turkish platforms like **Ikas, Ticimax, IdeaSoft, T-Soft and Akinon**
- **Analytics & tag managers**: Google Analytics, Google Tag Manager, Matomo, Hotjar, Microsoft Clarity, Mixpanel, Segment, PostHog, Plausible
- **Frameworks**: React, Next.js, Vue.js, Nuxt.js, Angular, Svelte, Laravel, Ruby on Rails, Django
- **Infrastructure**: Nginx, Apache, Cloudflare, Fastly, Akamai, Amazon Web Services, Vercel, Netlify, and the TLS certificate issuer
- **Email & DNS** (from DNS records): Google Workspace, Microsoft 365, Zoho Mail, Mailgun, Amazon SES, SendGrid
- **Marketing, payments & support**: HubSpot, Klaviyo, Mailchimp, Stripe, PayPal, Klarna, iyzico, Intercom, Zendesk, Tawk.to, OneTrust, Cookiebot

### How does it work?

For each website the actor:

1. Downloads the homepage (and optionally up to 5 more internal pages) with a browser-like HTTP client.
2. Matches the HTML, script URLs, inline scripts, meta tags, HTTP headers, cookies, DOM selectors and robots.txt against the fingerprint database.
3. Looks up DNS records (MX, TXT, NS, SOA, CNAME) and the TLS certificate issuer.
4. Adds technologies implied by others (for example WordPress → PHP and MySQL) and returns versions and confidence scores.

### Why use this technology lookup?

| | **This actor** | Typical tech-lookup actor |
|---|---|---|
| Price | **$1.50 per 1,000 sites** | $2+ per 1,000 |
| Sites with nothing detected | **free** | charged |
| Unreachable, blocked or invalid URLs | free status row | charged or the run fails |
| DNS-based detection (email provider, DNS host) | ✅ | rarely |
| Multiple pages per site | ✅ up to 6, same price | homepage only |
| CSV export | ✅ SITES.csv and TECHNOLOGIES.csv | JSON only |
| Memory | 256–512 MB | 1–4 GB |

### How much does it cost?

You pay per website where at least one technology was detected:

| Plan | Price per site | Per 1,000 sites |
|---|---|---|
| Free / Starter | $0.001 | $1.00 |
| Scale | $0.0009 | $0.90 |
| Business and above | $0.0008 | $0.80 |

These are **never charged**:

- invalid or duplicate inputs
- unreachable sites
- sites that answer with a bot challenge or an HTTP error
- non-HTML URLs
- sites where nothing (or only generic web standards such as HTTP/3 or Open Graph) was detected

Extra pages per site, DNS and TLS checks cost nothing extra.

### Input

| Field | Default | Description |
|---|---|---|
| `urls` | – | Domains or URLs, one per line. Thousands per run are fine. |
| `extraPagesPerSite` | 0 | Also scan up to 5 internal pages per site. |
| `checkDns` | true | MX/TXT/NS/SOA lookups (email provider, DNS host, verified services). |
| `checkTls` | true | Read the TLS certificate issuer. |
| `checkRobotsTxt` | true | Download robots.txt. |
| `minConfidence` | 0 | Drop detections with a lower confidence (0–100). |
| `onlyCategories` | – | Keep only some categories or technologies, e.g. `Ecommerce`, `CMS`, `Shopify`. |
| `includeDetails` | true | Add description, website, pricing model, CPE, SaaS/open-source flags. |
| `maxConcurrency` | 10 | Sites analysed in parallel. |

```json
{
  "urls": ["apify.com", "shopify.com", "wordpress.org", "https://www.example.com/shop"],
  "extraPagesPerSite": 1
}
```

### Output

One `site` row per website. It has flat, spreadsheet-friendly columns (`cms`, `ecommerce`, `analytics`, `tagManagers`, `jsFrameworks`, `webFrameworks`, `webServers`, `cdn`, `hosting`, `payments`, `marketing`, `advertising`, `liveChat`, `security`, …) plus the full `technologies` array:

```json
{
  "type": "site",
  "domain": "wordpress.org",
  "url": "https://wordpress.org/",
  "statusCode": 200,
  "detected": true,
  "technologyCount": 13,
  "cms": "WordPress, Gutenberg",
  "webServers": "Nginx",
  "languages": "PHP",
  "tagManagers": "Google Tag Manager",
  "technologyNames": "WordPress, MySQL, PHP, Gutenberg, Nginx, Google Tag Manager, Let's Encrypt, …",
  "technologies": [
    { "name": "WordPress", "version": null, "confidence": 100, "categories": ["CMS", "Blogs"], "website": "https://wordpress.org" }
  ],
  "server": "nginx",
  "tlsIssuer": "Let's Encrypt",
  "mxRecords": ["smtp1-dca.wordpress.org"],
  "charged": true
}
```

When nothing is detected you still get a row with `detected: false` and a short note, and it is **not charged**. Problems such as invalid input or unreachable sites get `status` rows.

The key-value store also contains:

- `SITES.csv`: one line per site with the main columns.
- `TECHNOLOGIES.csv`: one line per site and technology (domain, technology, version, categories, confidence). Ready for pivot tables.
- `RUN_SUMMARY`: totals for the run.

### Use cases

- **Lead generation**: find every Shopify or WooCommerce store in a list, or every company that uses HubSpot or a competitor's tool.
- **Sales intelligence**: enrich a CRM export with the tech stack of each account.
- **Market research**: measure the market share of CMSs, analytics tools or payment providers in a country or niche.
- **Security & IT**: inventory web servers, frameworks and versions across your own domains.

Tip: combine it with a scheduled task to watch competitors' stacks every month.

### Limitations

- The actor reads HTML, headers, cookies, DNS and TLS. It does not run JavaScript, so a few technologies that can only be seen in the browser at runtime (about 350 of the 3,600) are not detected.
- Results depend on what the site exposes publicly. Some sites hide their server or framework.

### Credits and license

The fingerprint database and matching engine come from **Wappalyzer 6.10.54**, the last release published under the **MIT License** (© Elbert Alias / Wappalyzer). We added our own supplemental fingerprints. Later Wappalyzer versions and GPL-licensed forks are not used. This actor is not affiliated with Wappalyzer.

Questions or a missing technology? Open an issue on the **Issues** tab.

### Pricing

Pay per event: **$0.0015 per result** ($1.50 per 1,000 saved rows). Each saved data row is one `result` event. Status rows, error rows and empty lookups are not charged. The run stops when it reaches the maximum cost per run. No Apify proxy and no login.

# Actor input Schema

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

Domains or URLs to analyse, one per line (e.g. <code>shopify.com</code> or <code>https://www.example.com/shop</code>). Thousands per run are fine.

## `extraPagesPerSite` (type: `integer`):

Also scan up to this many internal pages (picked from the homepage links) to catch tools that are not on the homepage. 0 = homepage only. Same price per site.

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

Look up MX, TXT, NS and SOA records to detect email providers (Google Workspace, Microsoft 365...), DNS hosts and verified services.

## `checkTls` (type: `boolean`):

Read the HTTPS certificate issuer (Let's Encrypt, Cloudflare, Sectigo...).

## `checkRobotsTxt` (type: `boolean`):

Download robots.txt; some platforms are recognised by it.

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

Drop detections with a lower confidence score. 0 keeps everything.

## `onlyCategories` (type: `array`):

Optional filter, e.g. <code>Ecommerce</code>, <code>CMS</code>, <code>Analytics</code>, <code>Payment processors</code> or a technology name like <code>Shopify</code>. Leave empty to return everything.

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

Add description, website, pricing model, CPE and SaaS/open-source flags to each technology.

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

Sites analysed in parallel.

## Actor input object example

```json
{
  "urls": [
    "apify.com",
    "shopify.com",
    "wordpress.org"
  ],
  "extraPagesPerSite": 0,
  "checkDns": true,
  "checkTls": true,
  "checkRobotsTxt": true,
  "minConfidence": 0,
  "includeDetails": true,
  "maxConcurrency": 8
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

## `technologies` (type: `string`):

No description

## `sitesCsv` (type: `string`):

No description

## `technologiesCsv` (type: `string`):

No description

## `summary` (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"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("atesen-software/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": [
        "apify.com",
        "shopify.com",
        "wordpress.org",
    ] }

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

```

## MCP server setup

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