# Website Tech Stack Detector: CMS, Analytics, Ads (`digital_influx/tech-stack-detector`) Actor

Find the technologies behind any list of websites: CMS, e-commerce platform, analytics, ad pixels, marketing and chat tools, payments, CDN, hosting and frameworks, plus the email provider and SaaS tools seen in DNS. 270+ technologies, with the evidence for each. Bulk lists, no login.

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

## Pricing

from $3.00 / 1,000 website reads

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, Ads

Find out **what any list of websites is built with**: the CMS or e-commerce platform, analytics and ad pixels, marketing automation and chat tools, payments, cookie consent, A/B testing, CDN, hosting, web server and JavaScript framework, and even the careers platform they hire with. From DNS it adds the **email provider**, the **tools that send email as the company** and the **SaaS accounts it verified** (Atlassian, Stripe, Zoom, OpenAI and more).

- **270+ technologies in 30 categories**, each one with the **evidence** that gave it away (a script address, a header, a cookie name, a generator tag, a DNS record), so you can trust or check every finding.
- **Built for lists.** Paste hundreds or thousands of domains: one row per website, 10 at a time. In our test, 8 inputs took 3 seconds with DNS included.
- **Filter as you go.** *Only websites using* keeps just the sites on Shopify, HubSpot, Klaviyo, Google Workspace or whatever you sell to or against. The others are not saved and cost nothing.
- **Honest crawling.** One request per website (plus its robots.txt), with a User-Agent that names the Actor, and robots.txt respected. No proxies, no login.

### What you can use it for

- **Lead generation:** find the stores on Shopify that use Klaviyo but no reviews app, or the B2B sites with HubSpot and Intercom.
- **Sales intelligence:** know a prospect's stack before the call: CMS, analytics, marketing automation, chat, payments, email provider.
- **Competitive research:** see which tools the leaders in a market use, and how many sites use each one (the run's OUTPUT record counts them).
- **Agencies and consultants:** audit a client's site, or spot the ones still on an old platform.
- **AI agents:** plain JSON, one row per site. Agents can call this Actor through the Apify MCP server.

### Input

| Field | What it does |
|---|---|
| **Websites** (required) | One per line: a domain (`shopify.com`) or a full address. The home page is read, or the page you give. |
| Only websites using (optional) | Keep only the websites that use at least one of these technologies, by name (`Shopify`, `Klaviyo`, `HubSpot`, `Google Workspace`). DNS findings count too. The others are not saved and cost nothing. |
| Include DNS findings | On by default: email provider (MX), email senders (SPF) and verified services (TXT). Three DNS queries per domain, no extra cost. |
| Respect robots.txt | On by default. A page that robots.txt closes to this Actor is not read; its DNS findings are still saved, free. |
| Websites in parallel | 1 to 20 (default 10). |

A list of prospects:

```json
{
  "websites": ["glossier.com", "allbirds.com", "zapier.com", "techcrunch.com", "gitlab.com"]
}
```

Only the Shopify stores that use Klaviyo or Attentive, from a big list:

```json
{
  "websites": ["glossier.com", "allbirds.com", "brooklinen.com", "everlane.com", "colourpop.com"],
  "onlyWithTechnologies": ["Klaviyo", "Attentive"]
}
```

### Output

One row per website. This is glossier.com on 2026-09-30, with 7 of its 21 technologies shown (the page gave 10; DNS gave 11). Every row also has one column per category; the empty ones are left out here:

```json
{
  "input": "glossier.com",
  "domain": "glossier.com",
  "url": "https://www.glossier.com/",
  "status": "ok",
  "statusCode": 200,
  "error": null,
  "technologyCount": 21,
  "technologies": [
    { "name": "Shopify", "category": "ecommerce", "version": null, "evidence": "header shopify-complexity-score" },
    { "name": "Recharge", "category": "payments", "version": null, "evidence": "page rechargecdn.com" },
    { "name": "Klaviyo", "category": "marketing", "version": null, "evidence": "page static.klaviyo.com" },
    { "name": "Gorgias", "category": "chat", "version": null, "evidence": "page config.gorgias.chat" },
    { "name": "Yotpo", "category": "reviews", "version": null, "evidence": "page staticw2.yotpo.com" },
    { "name": "Google Workspace", "category": "email", "version": null, "evidence": "DNS MX alt1.aspmx.l.google.com" },
    { "name": "Stripe", "category": "saas", "version": null, "evidence": "DNS TXT verification record" }
  ],
  "ecommerce": ["Shopify"],
  "marketing": ["Klaviyo"],
  "chat": ["Gorgias"],
  "payments": ["Recharge"],
  "consent": ["OneTrust"],
  "abTesting": ["Optimizely"],
  "cdn": ["Cloudflare"],
  "video": ["Vimeo"],
  "reviews": ["Yotpo"],
  "media": ["imgix"],
  "email": ["Google Workspace"],
  "saas": ["Amazon SES", "Anthropic (Claude)", "Apple", "Atlassian", "DocuSign", "Dropbox", "Google Search Console", "Miro", "Stripe", "Zoom"],
  "emailProvider": "Google Workspace",
  "dnsHost": "Cloudflare",
  "checkedAt": "2026-09-30T20:54:14.777Z"
}
```

Field notes:

- `technologies`: every finding with its category, the version when the site shows it (a generator tag, a script file name, a server header) and the `evidence`. `implied by WordPress` means the technology was not seen but the other one needs it (WordPress runs on PHP).
- Category columns, one per category: `cms`, `ecommerce`, `analytics`, `tagManager`, `advertising`, `marketing`, `chat`, `payments`, `consent`, `abTesting`, `cdn`, `hosting`, `webServer`, `backend`, `framework`, `ui`, `fonts`, `video`, `forms`, `reviews`, `search`, `security`, `monitoring`, `jobs` (the careers platform the site links to), `maps`, `media`, `accessibility`, `other`, and from DNS `email` (the mail provider and the services in the SPF record) and `saas` (the services the domain verified with a TXT record).
- `emailProvider` is who hosts the company's mailboxes (or the filtering gateway in front of them), from the MX records. `dnsHost` is who runs its DNS.
- `status`: `ok` (page read), `blocked` (the site refused the request, 403 or 429 for example: the row still has what the response headers and DNS show), `blocked_by_robots`, `unreachable`, `not_html` (some sites answer robots with Markdown) or `invalid`.
- The run's **OUTPUT** record has the totals and how many of the saved websites use each technology.

### Pricing

Pay per event: **one `site` event per website whose page was read**. Websites that refuse the request, block this Actor in robots.txt, cannot be reached or are not valid are saved **free**, with whatever their headers and DNS show. With *Only websites using*, the websites left out are not saved and not charged. Set a maximum cost for a run and the Actor stops cleanly when it is reached.

### Use it from AI agents (MCP)

Claude, ChatGPT, Cursor and any other MCP client can run this Actor as a tool: add `https://mcp.apify.com?tools=digital_influx/tech-stack-detector` as a remote MCP server and sign in with your Apify account. It is also one of the tools of Company Research MCP (`digital_influx/company-research-mcp`) and Marketing & SEO Research MCP (`digital_influx/marketing-research-mcp`), by the same author, made for agents.

### Good to know

- The Actor reads the page as it arrives from the server, without running its JavaScript. Tools that a tag manager loads later (common for Google Analytics behind Google Tag Manager) do not show: you see the tag manager itself. A single-page app that builds everything in the browser shows less.
- Some sites refuse automated requests (403) or answer with a challenge. Those rows are free and still carry the CDN, bot protection and DNS findings.
- The technology rules are our own and are checked on real sites. If a technology you need is missing, or a finding looks wrong, open an issue with the website: new rules are added regularly.
- **Also from us:** **Website Contact Scraper** (emails, phones and people from the same websites) and **Domain Lookup** (the full DNS picture: SPF, DMARC, SSL certificate).

### Support

Found a wrong or missing technology? Open an issue on the Actor's Issues tab with the website. Issues get an answer within a few days.

# Actor input Schema

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

One per line: a domain (shopify.com) or a full address. The home page is read, or the page you give.

## `onlyWithTechnologies` (type: `array`):

Keep only the websites that use at least one of these technologies, by name: Shopify, Klaviyo, HubSpot, Stripe, Google Workspace... The others are not saved and cost nothing. Empty = every website.

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

Also look up the domain's DNS: the email provider (MX), the tools that send email as the domain (SPF) and the services it verified (TXT records, e.g. Atlassian, Stripe, Zoom). Three DNS queries per domain, no extra cost.

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

On: a page that the site's robots.txt closes to this Actor is not read (its DNS findings are still saved, free).

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

1 to 20.

## Actor input object example

```json
{
  "websites": [
    "allbirds.com",
    "zapier.com",
    "techcrunch.com"
  ],
  "includeDns": true,
  "respectRobotsTxt": true,
  "maxConcurrency": 10
}
```

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

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

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

```

## MCP server setup

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