# Tech Stack Detector (`proffera/tech-stack-detector`) Actor

Find what any website is built with, in bulk: CMS, ecommerce platform, analytics, ad pixels, email provider and 7,600+ tools. $5 per 1,000 sites. Unreachable sites are free.

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

## Pricing

Pay per event

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

## Tech Stack Detector – BuiltWith & Wappalyzer Alternative

Find out what any website is built with — in bulk, for **$5 per 1,000 websites**. Paste a list of domains and get back the CMS, ecommerce platform, analytics, advertising pixels, payment providers, hosting, CDN, email provider and SaaS tools behind each one. **7,600+ technologies** across 100+ categories.

- 💸 **~20× cheaper** than per-lookup tech-stack APIs that charge $0.10 per domain.
- ✅ **You only pay for websites we actually reach.** Dead domains, DNS errors and timeouts are free.
- 📬 **Sees what the page can't show:** DNS records reveal the email provider (Google Workspace, Microsoft 365, Proofpoint, Mimecast…) and SaaS tools the company has verified its domain with (Atlassian, HubSpot, DocuSign, Salesforce, OpenAI, Zoom and more).
- ⚡ **Fast:** plain HTTP, no browser — thousands of domains per run.
- 🔓 **No login, no API key, no rate limits to manage.**

### What can I use it for?

| Use case | Example |
|---|---|
| **Lead generation** | Filter a list of 50,000 domains down to the Shopify stores, or the WordPress sites running WooCommerce. |
| **Sales prospecting** | Find companies using a competitor's product (e.g. Intercom, HubSpot, Klaviyo) and pitch your alternative. |
| **Lead enrichment** | Add "CMS", "ecommerce platform" and "email provider" columns to your CRM or spreadsheet. |
| **Agencies** | Audit a prospect's site before a pitch: outdated CMS versions, missing analytics, no consent banner. |
| **Market research** | Measure platform market share in a niche, country or industry list. |
| **Home-services prospecting** | Find HVAC, plumbing and roofing companies running ServiceTitan, Housecall Pro, Jobber, CallRail or an answering-service widget. |
| **Security & IT inventory** | Spot exposed server software and versions across your own portfolio of sites. |
| **AI agents** | Give your agent a cheap "what is this site built with?" tool via the Apify API or MCP. |

### How to use

1. Paste your domains (or full URLs) into **Domains or URLs** — one per line. Duplicates are removed for you.
2. Click **Start**.
3. Download results as **CSV, Excel, JSON** or pull them via API. Two ready-made views: one row per website, or one row per technology.

### Input example

```json
{
    "domains": ["shopify.com", "allbirds.com", "https://techcrunch.com/"],
    "minConfidence": 50,
    "includeDns": true
}
```

### Output example

```json
{
    "input": "techcrunch.com",
    "domain": "techcrunch.com",
    "ok": true,
    "statusCode": 200,
    "url": "https://techcrunch.com/",
    "title": "TechCrunch | Startup and Technology News",
    "technologyCount": 31,
    "technologyNames": ["WordPress", "WordPress Block Editor", "WordPress Site Editor", "Google Tag Manager", "HubSpot", "Sailthru", "Zendesk", "Microsoft 365", "WordPress VIP", "Cloudflare DNS", "Cloudflare", "…"],
    "technologies": [
        {
            "name": "WordPress",
            "version": "6.9.9",
            "confidence": 100,
            "categories": ["CMS", "Blogs"],
            "website": "https://wordpress.org",
            "saas": true,
            "openSource": true,
            "pricing": ["low", "recurring", "freemium"]
        }
    ],
    "byCategory": {
        "CMS": ["WordPress"],
        "Marketing automation": ["HubSpot", "Sailthru"],
        "Tag managers": ["Google Tag Manager"],
        "Artificial Intelligence": ["Anthropic", "OpenAI"],
        "SEO": ["Yoast SEO", "Yoast SEO Premium"],
        "Web servers": ["Nginx"]
    },
    "socialLinks": {
        "linkedin": "https://linkedin.com/company/techcrunch",
        "x": "https://x.com/TechCrunch",
        "youtube": "https://youtube.com/user/techcrunch"
    },
    "dns": {
        "mx": ["usb-smtp-inbound-1.mimecast.com", "usb-smtp-inbound-2.mimecast.com"],
        "ns": ["elly.ns.cloudflare.com", "gordon.ns.cloudflare.com"],
        "spf": "v=spf1 a mx include:usb._netblocks.mimecast.com include:spf.protection.outlook.com include:aspmx.sailthru.com include:mail.zendesk.com …"
    },
    "scannedAt": "2026-09-25T23:05:21.655Z"
}
```

Unreachable domains are still listed (with `ok: false` and an `error` such as `ENOTFOUND` or `HTTP 403`) so you can see what happened — but they are **not charged**.

### Pricing

**$0.005 per website analyzed** ($5 per 1,000). Pay-per-event: no monthly rental, no charge for failed domains. Platform usage is included. Set a maximum charge per run in the run options and the Actor stops cleanly when it's reached.

### What gets detected?

CMS (WordPress, Drupal, Joomla, Webflow, Wix, Squarespace, Ghost, HubSpot CMS…), ecommerce (Shopify, WooCommerce, Magento, BigCommerce, PrestaShop…), analytics (Google Analytics, Mixpanel, Hotjar, Plausible…), advertising pixels (Meta, TikTok, LinkedIn Insight…), marketing automation (HubSpot, Klaviyo, Mailchimp, Marketo…), live chat (Intercom, Zendesk, Drift…), payment (Stripe, PayPal, Apple Pay, Klarna…), JavaScript frameworks and libraries (React, Next.js, Vue, jQuery…), CDN and hosting (Cloudflare, Fastly, AWS, Vercel, Netlify…), web servers, cookie-consent tools, A/B testing, reviews widgets, home-service software (ServiceTitan, Housecall Pro, Jobber, CallRail, HighLevel, Podium, Broadly, Ruby), email providers, DNS providers, and thousands more. Versions are reported when the site exposes them.

### How it works (and its limits)

Each website's homepage is fetched once over HTTP. Its HTML, headers, cookies, meta tags, script URLs, inline scripts and DNS records are matched against the open-source [webappanalyzer](https://github.com/enthec/webappanalyzer) fingerprint database (7,600+ technologies, updated regularly).

The page is **not** rendered in a browser, which is what keeps it fast and cheap. The trade-off: technologies that only appear after JavaScript runs (some single-page apps, tags injected by a tag manager) can be missed. Sites behind aggressive bot protection may return `HTTP 403`; try enabling Apify datacenter proxies in **Advanced** for those. Residential proxies aren't supported.

### Integrations and API

Run it from the Apify API, the JavaScript or Python client, or connect it to Make, Zapier, n8n, Google Sheets, Slack and more.

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("proffera/tech-stack-detector").call(run_input={"domains": ["shopify.com", "allbirds.com"]})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["domain"], item["technologyNames"])
```

### FAQ

**Is this legal?** It reads the same public homepage and DNS records any browser or mail server sees. It does not log in, bypass paywalls, or collect personal data.

**How accurate is it?** Detection uses the same community fingerprints as the Wappalyzer family of tools. Each technology comes with a confidence score; raise **Minimum confidence** for fewer false positives.

**Can I scan internal pages, not just the homepage?** Pass the full URL (e.g. `https://example.com/checkout`) and that page is analyzed instead.

**Found a wrong or missing detection?** Open an issue on the Actor's **Issues** tab with the domain and what you expected — fixes usually ship within a day.

### Open source

This Actor is licensed under GPL-3.0. Technology fingerprints © the [webappanalyzer](https://github.com/enthec/webappanalyzer) contributors, GPL-3.0.

# Actor input Schema

## `domains` (type: `array`):

Websites to analyze. Bare domains (shopify.com) or full URLs both work. Duplicates are removed automatically.

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

Only report technologies detected with at least this confidence. Lower it to see weaker signals, raise it for fewer false positives.

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

Look up MX, TXT and NS records to detect the email provider (Google Workspace, Microsoft 365...), DNS host and SaaS tools verified on the domain (e.g. Atlassian, DocuSign, OpenAI, HubSpot).

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

How many websites to fetch in parallel (5–100).

## `timeoutSecs` (type: `integer`):

Give up on a website after this many seconds (5–30). Timed-out websites are not charged.

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

Optional. Most websites work without a proxy. Turn on Apify datacenter proxies if many of your domains block data-center traffic. Residential proxies aren't supported.

## Actor input object example

```json
{
  "domains": [
    "shopify.com",
    "techcrunch.com",
    "allbirds.com"
  ],
  "minConfidence": 50,
  "includeDns": true,
  "maxConcurrency": 25,
  "timeoutSecs": 15,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

Domain, reachability, page title, technology count, technologies, technologies by category, DNS and social links.

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

One row per detected technology, with version, categories, confidence and vendor website.

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

Every field for every website, including detailed technology data.

# 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 = {
    "domains": [
        "shopify.com",
        "techcrunch.com",
        "allbirds.com"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("proffera/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 = { "domains": [
        "shopify.com",
        "techcrunch.com",
        "allbirds.com",
    ] }

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

```

## MCP server setup

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