# Tech Stack Lookup: Website Technology & CMS Detector (`api-co/tech-stack-detector`) Actor

Bulk tech stack lookup for any website: CMS detector, ecommerce platform, frameworks, analytics, ad pixels, CDN and hosting, plus SaaS tools from DNS (Google Workspace, HubSpot, Salesforce). A Wappalyzer and BuiltWith alternative for lead generation and technology lookup.

- **URL**: https://apify.com/api-co/tech-stack-detector.md
- **Developed by:** [Emilio Cisneros](https://apify.com/api-co) (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

from $2.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.
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

## Tech Stack Lookup: Website Technology & CMS Detector

Find out **what any website is built with** — in bulk. For each URL or domain you get the detected **CMS, ecommerce platform, JavaScript frameworks, analytics, tag managers, advertising & marketing pixels, CDN, hosting, web server, security and payment tools**, with versions and categories. On top of the page itself, the Actor reads **DNS records** to reveal the **SaaS tools a company uses** (Google Workspace vs Microsoft 365, Salesforce, HubSpot, Atlassian, Zendesk, DocuSign, Stripe, OpenAI…), which no page-only detector can see.

### How to use

1. Paste website URLs or bare domains into **URLs** (one per line, hundreds at once are fine).
2. Keep the DNS, TLS and robots.txt checks on to also detect SaaS tools such as Google Workspace, HubSpot or Salesforce.
3. Click **Start** and download one row per website with every technology, its category and confidence.

### Why this Actor

- **7,600+ Wappalyzer-compatible fingerprints** (community-maintained webappanalyzer dataset), with version detection, confidence scores, implied technologies (e.g. WordPress ⇒ PHP + MySQL) and exclusions.
- **DNS-based SaaS detection**: MX, TXT (domain-verification records), NS, CNAME, SOA.
- **TLS issuer and robots.txt signals** included.
- **Fast & cheap**: plain HTTP, no headless browser — hundreds of sites per minute.
- **Lead-gen ready output**: `technologyNames` list and a `categories` map (e.g. `{"Ecommerce": ["Shopify"], "Analytics": ["Google Analytics"]}`) for easy filtering in Sheets/CRM.
- **Fair**: unreachable sites produce free error records; you pay only for analyzed websites.

### Input

```json
{ "urls": ["stripe.com", "https://wordpress.org", "vercel.com"], "minConfidence": 50, "includeDns": true }
```

### Output example (trimmed)

```json
{
  "url": "https://stripe.com/", "finalUrl": "https://stripe.com/", "domain": "stripe.com", "statusCode": 200, "title": "Stripe | Financial Infrastructure…",
  "technologyCount": 27,
  "technologyNames": ["Amazon Web Services", "Google Workspace", "Microsoft 365", "Salesforce", "Atlassian Cloud", "Nginx", "DigiCert", "HSTS", "…"],
  "categories": { "Email": ["Google Workspace", "Microsoft 365"], "CRM": ["Salesforce"], "Web servers": ["Nginx"], "SSL/TLS certificate authorities": ["DigiCert"] },
  "technologies": [{ "name": "Nginx", "version": null, "confidence": 100, "categories": ["Web servers", "Reverse proxies"], "website": "http://nginx.org/en", "saas": null, "oss": true, "evidence": ["headers"] }]
}
```

### Use cases

B2B lead generation and sales prospecting (find Shopify stores, WordPress sites, companies on HubSpot or Salesforce), competitor and market research, technographic enrichment for CRMs, agency audits, security inventory, and AI agents that need to know what a site runs.

### Pricing

**$2.50 per 1,000 websites analyzed.** Error records are free.

### How much does it cost?

You only pay for results, never for compute time:

| You get | You pay (Starter/Bronze plan price) |
|---|---|
| 100 websites | $0.25 |
| 1,000 websites | $2.50 |
| 10,000 websites | $25.00 |

Apify's **free plan includes $5 of usage every month**, and free-plan users pay **half price** on this Actor, so that covers about **4,000 websites** at no cost. Paid plans get volume discounts (Silver -10%, Gold -20%). Set a *maximum cost per run* and the Actor stops cleanly at your limit.

### Limitations

Detection is HTTP-based (no JavaScript execution), so technologies that only reveal themselves at runtime may be missed; sites behind aggressive bot protection may return limited results (flagged with a `warning`).

### License & credits

Fingerprints from [enthec/webappanalyzer](https://github.com/enthec/webappanalyzer) (GPL-3.0). This Actor's source code is licensed GPL-3.0.

### Run it from code (API, Python, JavaScript)

```bash
curl -X POST "https://api.apify.com/v2/acts/api-co~tech-stack-detector/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" -d '{"urls": ["stripe.com", "vercel.com"]}'
```

```python
from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("api-co/tech-stack-detector").call(run_input={"urls": ["stripe.com", "vercel.com"]})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)
```

```javascript
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });
const run = await client.actor('api-co/tech-stack-detector').call({"urls": ["stripe.com", "vercel.com"]});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
```

It also works from **AI agents through the Apify MCP server**, and with Zapier, Make, n8n, Google Sheets and webhooks. You can schedule it in the Apify Console.

### FAQ

**How is this different from BuiltWith or Wappalyzer?**
It uses the open Wappalyzer-compatible fingerprint set (7,600+ technologies) plus DNS records (MX, TXT, CNAME) to reveal SaaS tools like Google Workspace, Microsoft 365, HubSpot and Salesforce. It's billed per site, with no subscription.

**Can I check thousands of domains?**
Yes. Pass a list of domains or URLs. It's a fast HTTP-based check with no browser, so bulk lists are cheap.

**Use cases?**
Lead generation (find Shopify or WordPress sites), competitor research, sales prospecting by tech, and security inventory.

**Does it detect versions?**
Yes, when the version is exposed in headers, scripts or meta tags.

# Actor input Schema

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

One per line, e.g. stripe.com or https://www.example.com/shop. Up to tens of thousands per run.

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

Minimum confidence (0-100).

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

Reveals email provider, verified SaaS tools and DNS/CDN providers.

## `includeTls` (type: `boolean`):

Detect TLS certificate issuer.

## `includeRobots` (type: `boolean`):

Use robots.txt signals.

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

Include details (website, pricing, SaaS/OSS flags, CPE, evidence).

## `maxItems` (type: `integer`):

Max websites.

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

Max concurrency.

## Actor input object example

```json
{
  "urls": [
    "stripe.com",
    "wordpress.org",
    "vercel.com"
  ],
  "minConfidence": 50,
  "includeDns": true,
  "includeTls": true,
  "includeRobots": true,
  "includeDetails": true,
  "maxItems": 1000,
  "maxConcurrency": 10
}
```

# Actor output Schema

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

One item per website with detected technologies, categories, versions and DNS-based SaaS signals.

# 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": [
        "stripe.com",
        "wordpress.org",
        "vercel.com"
    ]
};

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

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

```

## MCP server setup

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