# Website Tech Stack Detector - CMS, Analytics, Pixels & Hosting (`cancap/tech-stack-detector`) Actor

Find the technologies behind any list of websites: CMS, ecommerce platform, analytics, ad pixels, live chat, payments, hosting, CDN, email provider and DNS. About 400 technologies, one row per website. Pay only for websites analyzed.

- **URL**: https://apify.com/cancap/tech-stack-detector.md
- **Developed by:** [CANCAP](https://apify.com/cancap) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 analyzed websites

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 Tech Stack Detector: CMS, Analytics, Ad Pixels, Hosting & Email Provider

Paste a list of websites and see **which technologies each one uses**: CMS or website builder, ecommerce platform, JavaScript framework, analytics, ad pixels, marketing automation, live chat, payments, reviews, cookie consent, CDN, hosting, web server, **email provider** and **DNS provider**. One clean row per website, and **you pay only for websites that could be analyzed**.

No coding, no login and no API keys. Paste your websites and click Start.

### What you get for each website

- **CMS / website builder**: WordPress, Shopify, Webflow, Wix, Squarespace, Drupal, HubSpot CMS, Framer and more
- **Ecommerce**: Shopify, WooCommerce, Magento, BigCommerce, Salesforce Commerce Cloud, PrestaShop...
- **Frameworks**: Next.js, Nuxt, Gatsby, Astro, React, Vue.js, Angular, SvelteKit...
- **Analytics & session recording**: Google Analytics, Tag Manager, Segment, Mixpanel, PostHog, Hotjar, Clarity...
- **Ad pixels**: Meta, Google Ads, LinkedIn, TikTok, Pinterest, X, Reddit, Bing...
- **Marketing, CRM & email marketing**: HubSpot, Marketo, Pardot, Klaviyo, Mailchimp, ActiveCampaign...
- **Live chat & support**: Intercom, Zendesk, Drift, Crisp, Tidio, LiveChat, Gorgias...
- **Payments**: Stripe, PayPal, Klarna, Afterpay, Affirm, Paddle...
- **Hosting, CDN & web server**: Cloudflare, Vercel, Netlify, AWS, Fastly, Akamai, WP Engine, Nginx, Apache...
- **From DNS records**: email provider (Google Workspace, Microsoft 365, Zoho...), DNS provider, email sending services (SendGrid, Mailgun, Amazon SES...) and verified business tools (Slack, Atlassian, Zoom, Facebook Business...)
- **Versions** where the website shows them (for example WordPress 6.5, jQuery 3.6)

About 400 technologies in 30+ categories.

### Who uses this

- **Sales teams and agencies**: find prospects that use (or do not use) a tool. "Shopify stores without a review app", "WordPress sites without analytics", "companies on Microsoft 365".
- **SaaS companies**: list the websites that use a competitor and build a switching campaign.
- **Lead enrichment**: add a tech stack column to a list of company websites before outreach.
- **Market research**: count how many sites in a niche use each platform. The run summary lists the most common technologies across your list.

### How to use

1. Paste your websites, one per line. `https://www.example.com` and `example.com` both work.
2. Click **Start**.
3. Export to CSV, Excel or JSON, or send the results to Google Sheets, your CRM, Make, Zapier or n8n.

```json
{
    "websites": ["https://www.python.org", "allbirds.com", "wordpress.org"],
    "checkDns": true
}
```

### Output example

```json
{
    "inputUrl": "allbirds.com",
    "website": "https://www.allbirds.com",
    "domain": "allbirds.com",
    "status": "ok",
    "title": "Allbirds | Sustainable Shoes and Clothing",
    "technologyCount": 14,
    "cms": null,
    "ecommerce": "Shopify",
    "frameworks": [],
    "analytics": ["Google Tag Manager", "Microsoft Clarity"],
    "advertising": [],
    "marketing": ["Attentive"],
    "chat": [],
    "payments": [],
    "hosting": ["Cloudflare"],
    "webServer": null,
    "emailProvider": "Microsoft 365",
    "dnsProvider": null,
    "emailSendingServices": [],
    "technologies": ["Shopify", "Swiper", "Google Tag Manager", "Microsoft Clarity", "Attentive", "OneTrust", "Cloudflare", "hCaptcha", "Microsoft 365", "Google Search Console", "..."],
    "byCategory": { "Ecommerce": ["Shopify"], "Tag manager": ["Google Tag Manager"], "Cookie consent": ["OneTrust"], "...": [] },
    "technologyDetails": [
        { "name": "Shopify", "category": "Ecommerce", "version": null, "evidence": "html" },
        { "name": "Cloudflare", "category": "CDN", "version": null, "evidence": "header server" },
        { "name": "Microsoft 365", "category": "Email hosting", "version": null, "evidence": "dns mx" }
    ],
    "language": "en",
    "httpStatus": 200,
    "analyzedAt": "2026-10-12T17:40:26.000Z"
}
```

`evidence` tells you how each technology was found: page code, a response header, a cookie, a meta generator tag, a DNS record, or "implied by" another technology (Next.js implies React).

### Status column

| Status | Meaning | Charged |
| --- | --- | --- |
| `ok` | The website was read and analyzed | Yes |
| `unreachable` | The website does not exist or did not answer | No |
| `blocked` | The website refuses automated visitors (technologies seen in headers and DNS are still listed) | No |
| `robots_disallowed` | robots.txt asks robots not to read the page | No |
| `invalid_url` | The input line is not a website address | No |

### Pricing: pay only for results

- **Analyzed website**: charged once per website whose page was read.
- Unreachable, blocked, invalid and duplicate websites are **free**.

Set a **maximum cost per run** in the run options and the Actor stops cleanly at your limit.

### Good to know

- **First page only, plain HTML**: the Actor reads each website's first page without running a browser. This makes it fast and cheap (thousands of websites per run), but tools that a website loads only after a click or only through a tag manager may be missed.
- **Fingerprints are our own**: detection rules are written and tested for this Actor. If a technology you need is missing, open an issue and we will add it.
- **Large lists**: thousands of websites per run are fine. If a long run is restarted by the platform, it continues where it stopped and nothing is charged twice.

### Responsible use

This Actor reads only the public first page, public response headers and public DNS records. It respects robots.txt by default, uses no logins and bypasses no protection.

# Actor input Schema

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

One website per line. Full addresses (https://www.example.com) and plain domains (example.com) both work. Use Bulk edit to paste a long list. Duplicate lines are skipped.

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

Reads the domain's MX, NS and TXT records to find the email provider (Google Workspace, Microsoft 365...), the DNS provider, email sending services (SendGrid, Mailgun...) and verified business tools (Slack, Atlassian, Zoom...). Recommended.

## `saveOnlyAnalyzed` (type: `boolean`):

Leave off to get one row for every website, including the ones that could not be reached (these rows are free and show the reason in the status column).

## `respectRobotsTxt` (type: `boolean`):

Skip websites whose robots.txt asks robots not to read the first page. Recommended.

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

Websites are read directly first. The proxy is only used as a second try when a website does not answer.

## Actor input object example

```json
{
  "websites": [
    "https://www.python.org",
    "https://www.allbirds.com",
    "https://wordpress.org",
    "https://www.mozilla.org"
  ],
  "checkDns": true,
  "saveOnlyAnalyzed": false,
  "respectRobotsTxt": true,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

One row per website: CMS, ecommerce platform, analytics, ad pixels, chat, payments, hosting, email provider.

## `allFields` (type: `string`):

No description

## `summary` (type: `string`):

How many websites were analyzed and the most common technologies across your list.

# 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": [
        "https://www.python.org",
        "https://www.allbirds.com",
        "https://wordpress.org",
        "https://www.mozilla.org"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("cancap/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": [
        "https://www.python.org",
        "https://www.allbirds.com",
        "https://wordpress.org",
        "https://www.mozilla.org",
    ],
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("cancap/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 '{
  "websites": [
    "https://www.python.org",
    "https://www.allbirds.com",
    "https://wordpress.org",
    "https://www.mozilla.org"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call cancap/tech-stack-detector --silent --output-dataset

```

## MCP server setup

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