# Tech Stack Detector: CMS, Shopify, Analytics, Hosting & Email (`henri_dewitte/tech-stack-detector`) Actor

Detect the tech stack of any website: CMS, ecommerce, frameworks, analytics, ad pixels, hosting and CDN, plus email provider, DNS tools and SSL. 330+ technologies, change alerts. $2 per 1,000 websites.

- **URL**: https://apify.com/henri_dewitte/tech-stack-detector.md
- **Developed by:** [Henri De Witte](https://apify.com/henri_dewitte) (community)
- **Categories:** Lead generation, Developer tools
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$2.00 / 1,000 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

## Tech Stack Detector: CMS, Shopify, Analytics, Hosting & Email

Find out **which technologies any website uses**: CMS, ecommerce platform, JavaScript frameworks, analytics, ad pixels, tag managers, marketing tools, live chat, cookie banners, payments, CDN, hosting and web server. On top of that it reads the **DNS** (email provider, email-sending tools, DNS provider, verified SaaS tools, SPF and DMARC) and the **SSL certificate**. Check thousands of websites per run and get alerts when a website **switches tools**.

- ✅ 330+ technologies in 46 categories, with **version** and **evidence** (why we think so)
- ✅ Email provider via MX (Google Workspace, Microsoft 365, Zoho, Proton ...)
- ✅ Email tools via SPF (Mailchimp, SendGrid, HubSpot, Klaviyo, Salesforce ...)
- ✅ SaaS tools verified in DNS (Stripe, Atlassian, Zoom, DocuSign, OpenAI ...): BuiltWith-level insights a page scan can't see
- ✅ DNS provider, DMARC policy, SPF record, IP addresses
- ✅ SSL issuer, expiry date and days left
- ✅ Security headers present/missing, company social profiles, response time
- ✅ **Change tracking**: added/removed technologies since the last run; "only changed" mode for alerts
- ✅ Fast: plain HTTP + DNS over HTTPS, 10 websites in parallel (about 1,000 websites in a few minutes)
- ✅ Handy flat columns for Excel/CSV: `cms`, `ecommerce`, `analytics`, `hosting`, `emailProvider` ...

### Who is it for?

- **Sales and lead generation**: find all Shopify stores using Klaviyo, or companies on Microsoft 365 without DMARC, and enrich your leads.
- **Agencies and freelancers**: find websites on old WordPress or Joomla versions, or without analytics, and offer your services.
- **SaaS companies**: see which competitors' tools your prospects use, and get alerted when they switch.
- **Market research**: measure the market share of platforms in a country or industry.
- **Security and IT teams**: check SSL expiry, missing security headers and email security (SPF/DMARC) across all your domains.

### How to use it

1. Paste your **websites** (domains or URLs, up to 50,000).
2. Leave DNS and SSL on for the full picture.
3. Click **Start**. Download as Excel, CSV or JSON, or use the API.
4. For alerts: turn on **Only websites that changed** and add a **schedule**.

### Input examples

```json
{ "urls": ["apify.com", "kith.com", "wordpress.org/news"] }
```

Weekly monitor of competitors:

```json
{
    "urls": ["competitor-one.com", "competitor-two.com", "competitor-three.com"],
    "onlyChanged": true
}
```

| Field            | Default | Meaning                                                              |
| ---------------- | ------- | -------------------------------------------------------------------- |
| `urls`           | –       | Domains or URLs (max 50,000)                                         |
| `includeDns`     | true    | Email provider, email tools, DNS provider, verifications, SPF, DMARC |
| `includeSsl`     | true    | SSL issuer and expiry                                                |
| `trackChanges`   | true    | Fill `addedTechnologies` / `removedTechnologies`                     |
| `onlyChanged`    | false   | Only websites that changed since the last run                        |
| `maxConcurrency` | 10      | Websites in parallel                                                 |
| `maxResults`     | 1000    | Maximum websites per run                                             |

### Output example

```json
{
    "url": "https://apify.com/",
    "domain": "apify.com",
    "statusCode": 200,
    "title": "Apify: Full-stack web scraping and data extraction platform",
    "technologies": [
        {
            "name": "Next.js",
            "categories": ["JavaScript framework", "Web framework"],
            "version": null,
            "website": "https://nextjs.org",
            "evidence": ["html \"<script id=\"__NEXT_DATA__\"\"", "html \"/_next/static/\""]
        }
    ],
    "technologyNames": [
        "Amazon CloudFront",
        "Bootstrap",
        "Google Tag Manager",
        "HubSpot",
        "Intercom",
        "Next.js",
        "Node.js",
        "OneTrust",
        "React"
    ],
    "cms": [],
    "jsFrameworks": ["Next.js", "React"],
    "tagManagers": ["Google Tag Manager"],
    "marketingAutomation": ["HubSpot"],
    "liveChat": ["Intercom"],
    "cookieConsent": ["OneTrust"],
    "cdn": ["Amazon CloudFront"],
    "emailProvider": "Google Workspace",
    "emailServices": ["Google Workspace", "Mailgun", "Amazon SES", "HubSpot"],
    "dnsProvider": "Amazon Route 53",
    "verifiedServices": ["Google Search Console", "Mixpanel", "Zapier", "OpenAI"],
    "dmarcPolicy": "reject",
    "sslIssuer": "Amazon",
    "sslDaysLeft": 212,
    "securityHeaders": [
        "strict-transport-security",
        "content-security-policy",
        "x-frame-options",
        "x-content-type-options"
    ],
    "socialProfiles": {
        "linkedin": "https://www.linkedin.com/company/apify",
        "x": "https://x.com/apify",
        "github": "https://github.com/apify"
    },
    "responseTimeMs": 718,
    "addedTechnologies": [],
    "removedTechnologies": [],
    "checkedAt": "2026-10-09T08:00:00.000Z"
}
```

### Pricing

**$2 per 1,000 websites** (pay per website checked, DNS and SSL included). With **Only websites that changed** you only pay for websites with changes. Apify's free plan: max 100 websites per run.

### Tips

- Use domains (`example.com`): the Actor tries `https://` and falls back to `http://`.
- Some big websites refuse automated visitors (HTTP 403/429). They are marked `blocked: true`; DNS, SSL and the response headers (often the CDN) are still reported.
- Technologies that only load after a click or a cookie consent cannot be seen in the first page load. DNS results (email, verifications) do not have this limit.
- The `evidence` field shows exactly why each technology was detected.

### Data and legal

The Actor only reads what every visitor and every DNS resolver can see: the public home page, its response headers, public DNS records and the SSL certificate. It does not log in, does not bypass blocks or captchas, and does not collect personal data such as e-mail addresses or names (social links are the company's own profiles found on its home page).

# Actor input Schema

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

Domains or URLs, e.g. apify.com or https://www.example.com. Max 50,000 per run.

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

Find the email provider (Google Workspace, Microsoft 365 ...), email-sending services (Mailchimp, SendGrid ...), the DNS provider, domain verifications (Stripe, Atlassian, Zoom ...) and the DMARC policy.

## `includeSsl` (type: `boolean`):

Certificate issuer, expiry date and days left.

## `trackChanges` (type: `boolean`):

Remember the stack of every website, so each run shows which technologies were added or removed since the last run.

## `onlyChanged` (type: `boolean`):

Only return websites whose technologies, email or DNS provider changed since the last run. Schedule it to get alerts when a competitor or lead switches tools. The first run returns all websites.

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

How many websites are checked in parallel.

## `maxResults` (type: `integer`):

Maximum number of websites this run saves (and you pay for).

## Actor input object example

```json
{
  "urls": [
    "apify.com",
    "kith.com",
    "wordpress.org/news"
  ],
  "includeDns": true,
  "includeSsl": true,
  "trackChanges": true,
  "onlyChanged": false,
  "maxConcurrency": 10,
  "maxResults": 1000
}
```

# Actor output Schema

## `results` (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",
        "kith.com",
        "wordpress.org/news"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("henri_dewitte/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",
        "kith.com",
        "wordpress.org/news",
    ] }

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

```

## MCP server setup

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