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

Detect the technologies a website runs — CMS, ecommerce platform, analytics, marketing/CRM, JS framework, hosting/CDN, chat and payments — straight from its public HTML and HTTP headers. No browser, no proxies, no login. Built for sales targeting and competitive research.

- **URL**: https://apify.com/zinin/tech-stack-detector.md
- **Developed by:** [Tim Zinin](https://apify.com/zinin) (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

from $4.25 / 1,000 site 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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Tech Stack Detector — CMS, Ecommerce & Marketing Stack Lookup

Point this Actor at a list of websites and find out exactly what each one runs — CMS,
ecommerce platform, analytics, marketing/CRM, chat widget, JS framework, payment provider
and hosting/CDN — read straight from the public HTML and HTTP headers. No browser, no
proxies, no login, nothing to configure.

### What you get

- **CMS** — WordPress, Webflow, Shopify, Wix, Squarespace, Drupal, Joomla, Ghost, Tilda,
  Framer.
- **Ecommerce platform** — Shopify, WooCommerce, Magento, BigCommerce, Salesforce
  Commerce, PrestaShop.
- **Analytics & tags** — GA4, Universal Analytics, Google Tag Manager, Meta Pixel, Hotjar,
  Segment, Mixpanel, Amplitude, Plausible, Microsoft Clarity.
- **Marketing / CRM** — HubSpot, Marketo, Salesforce Pardot, Mailchimp, Klaviyo.
- **Chat & support** — Intercom, Drift, Zendesk, Crisp, Tawk.to, Calendly.
- **Framework** — Next.js, Nuxt, Gatsby, Angular, jQuery.
- **Payments** — Stripe, PayPal.
- **Hosting / CDN** — Cloudflare, Vercel, Netlify, AWS CloudFront, Fastly, GitHub Pages,
  Nginx, Apache.
- **Sales signals** — plain-English cues such as *"runs an online store (Shopify)"*,
  *"invests in marketing automation (HubSpot)"*, *"SaaS with customer-success budget
  (Intercom)"*.
- Runs on Apify: schedule it, monitor it, call it from the API, export to JSON/CSV/Excel
  or push straight into your own pipeline.

### Who is this for

- **Sales & SDR teams** — qualify and segment leads by the tools they already run
- **Agencies** — find prospects on a platform you specialize in, or audit a client's stack
- **Competitive & market research** — see what a set of competitors is built on
- **Recruiters & analysts** — infer a company's engineering choices from the outside

### Why it matters

Technographic data behind tools like BuiltWith ($295–995/mo) and Wappalyzer ($250–450/mo,
with credits that expire) is derived from the same public source: a page's own HTML and
headers. This Actor reads that directly and charges per website checked — no monthly
seat, no expiring credits.

### Accuracy

Detection is signature-based over the homepage HTML and response headers. Path-based
fingerprints (e.g. `wp-content/`) are matched only when they belong to the site itself, so
a third-party widget hosted on someone else's WordPress CDN will not misflag the page.
Detections are conservative: it reports what it can confirm, not guesses — a technology
that leaves no public trace on the homepage won't show up.

### How to run it

1. Click **Try for free** — no card needed on the free plan.
2. Paste your websites into **Websites**, one per line.
3. Press **Start**. Results land in the dataset — read them in the UI, pull them from the
   API, or have a webhook push them onward.

### Pricing

Pay-per-event: **$0.005 per run start + $0.005 per result**. No monthly seat, no minimum.
100 websites cost about **$0.51**; 1,000 websites about **$5.01**.

A website that could not be fingerprinted is still returned, with `found: false` and the
reason — and it is **not** charged for. You pay for answers, not for attempts.

### Input

| Field | Required | What it does |
|---|---|---|
| `websites` | yes | Websites to fingerprint. Up to 100 per run. |
| `maxConcurrency` | no | How many to check at once, 1–50 (default 10). |

```json
{
    "websites": ["shopify.com", "wordpress.org", "vercel.com"],
    "maxConcurrency": 10
}
```

### Output

One row per website. This is a real row from a real run:

```json
{
    "url": "https://wordpress.org/",
    "checkedAt": "2026-07-26T13:28:51.658Z",
    "found": true,
    "httpStatus": 200,
    "technologiesCount": 4,
    "technologies": ["WordPress", "Google Tag Manager", "Nginx", "Google Fonts"],
    "byCategory": {
        "CMS": ["WordPress"],
        "Tag Manager": ["Google Tag Manager"],
        "Hosting/CDN": ["Nginx"],
        "Fonts": ["Google Fonts"]
    },
    "cms": "WordPress",
    "ecommerce": null,
    "hosting": "Nginx",
    "salesSignals": [],
    "summary": "https://wordpress.org/ — WordPress, Nginx. 4 technologies detected."
}
```

| Field | What it means |
|---|---|
| `technologies` / `technologiesCount` | Full flat list and its length |
| `byCategory` | Same technologies grouped — CMS, Ecommerce, Analytics, Tag Manager, Marketing/CRM, Chat/Support, Framework, Payments, Hosting/CDN, Fonts |
| `salesSignals` | Plain-English cues, empty when the stack has none worth flagging |
| `found` | `false` means fingerprinting failed; the row says why and is not billed |

#### Related tools

Related tools for adjacent workflows in B2B lead generation and data enrichment.

| Actor | What it does |
|---|---|
| [Tech Stack Change Detector](https://apify.com/zinin/tech-stack-change-detector) | Pair it in the B2B lead generation and data enrichment workflow: Detect a website's current technologies (CMS, ecommerce, analytics, marketing/CRM, framework, hosting/CDN,... |
| [B2B Lead Enricher](https://apify.com/zinin/b2b-lead-enricher) | Pair it in the B2B lead generation and data enrichment workflow: Turn a list of company websites into sales-qualified lead cards: detected tech stack, a rough revenue... |
| [Company Profile Lookup](https://apify.com/zinin/company-lookup) | Pair it in the B2B lead generation and data enrichment workflow: Turn a domain or company name into one unified company card: website tech stack (CMS, ecommerce, key tech)... |
| [Company Hiring Radar](https://apify.com/zinin/company-hiring-radar) | Pair it in the B2B lead generation and data enrichment workflow: Pull every open role a company is hiring for from its public job board (Greenhouse, Lever, Ashby) and turn... |
| [Intent Signal Aggregator](https://apify.com/zinin/intent-signal-aggregator) | Pair it in the B2B lead generation and data enrichment workflow: Is this company in-market right now? Combines public hiring activity (Greenhouse, Lever, Ashby) and recent... |

### FAQ

**Does it render JavaScript?** No — it reads the served HTML and headers. That's fast,
cheap and enough for the fingerprints above. Technology injected only after heavy
client-side rendering may not appear.

**Is it accurate?** It reports confirmed signatures and avoids the common false positive
of a foreign CDN asset mislabeling the whole site. It won't detect a technology that
leaves no public trace on the homepage.

**Is this legal?** Yes — it reads publicly served HTML and standard HTTP headers, the same
data any browser receives.

**Can I filter by technology?** Every result lists `technologies` and `byCategory`; filter
the dataset downstream, e.g. keep only rows where `ecommerce == "Shopify"`.

**Can I call it from an AI agent?** Yes — standard Apify Actor, callable from the Apify
API, the SDK, or the Apify MCP server.

**What this is NOT.** It does not render pages, detect technology hidden behind heavy
client-side JavaScript, or replace a full technographic database. It reads what the
homepage's HTML and headers actually expose.

Found a wrong result, or need a technology we don't detect? Open an issue on this Actor's
page.

***

Built by [zinin](https://apify.com/zinin). Questions? Telegram [@timzinin](https://t.me/timzinin).

# Actor input Schema

## `websites` (type: `array`):

List of websites to fingerprint (e.g. `shopify.com` or `https://example.com`). One row per site.

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

How many websites to fingerprint in parallel.

## Actor input object example

```json
{
  "websites": [
    "shopify.com",
    "wordpress.org",
    "vercel.com"
  ],
  "maxConcurrency": 10
}
```

# Actor output Schema

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

API URL for the default dataset items produced by this run.

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

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

# Run the Actor and wait for it to finish
run = client.actor("zinin/tech-stack-detector").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "websites": [
    "shopify.com",
    "wordpress.org",
    "vercel.com"
  ]
}' |
apify call zinin/tech-stack-detector --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=zinin/tech-stack-detector",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/c9ijPzGt9sazpKvJu/builds/RPqjLpdLSYHHpSu7T/openapi.json
