# Website Technology Detector: CMS, Shopify, Analytics & More (`juicy_fillet/website-tech-detector`) Actor

Find out what any website is built with: CMS, e-commerce platform, analytics, tag managers, chat widgets, payments, CDN, hosting, JS frameworks and 7,000+ other technologies. Bulk lists, fast, no browser. A cheap Wappalyzer and BuiltWith alternative.

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

## Pricing

from $2.00 / 1,000 results

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 Technology Detector: CMS, Shopify, Analytics & More

Find out **what any website is built with**. Paste a list of URLs or domains and get one clean row per site with its CMS, e-commerce platform, analytics, tag managers, ad pixels, chat widgets, payment providers, CDN, hosting, web server, JavaScript frameworks, A/B testing and email marketing tools, chosen from **7,600+ technology fingerprints**.

It fetches each homepage once, like a normal visitor, and matches the HTML, script URLs, meta tags, HTTP headers and cookies against an open Wappalyzer-style fingerprint set. There's no browser, no proxies and no login, so it is **fast and cheap on big lists**: a good Wappalyzer or BuiltWith alternative for bulk checks.

### What you get

- **Full technology list:** every detected technology with its categories, version (when the site exposes it) and a confidence score.
- **Flat, spreadsheet-ready columns:** `cms`, `ecommerce`, `analytics`, `tagManagers`, `advertising`, `marketingAutomation`, `liveChat`, `crm`, `payments`, `abTesting`, `cdn`, `hosting`, `webServers`, `jsFrameworks`, `webFrameworks`, `programmingLanguages`, `cookieConsent`.
- **Yes/no flags for quick filters:** `hasShopify`, `hasWordPress`, `hasWooCommerce`, `hasGoogleAnalytics`, `hasGoogleTagManager`, `hasFacebookPixel`, `hasHubSpot`, `hasKlaviyo`, `hasStripe`, `hasHotjar`, `hasIntercom`, `hasCloudflare`.
- **Page basics:** final URL after redirects, HTTP status code, page title and domain.
- **An `error` column** instead of a crash when a site is down, times out or shows a bot-protection page.

### What people use it for

- **Lead generation and sales prospecting:** find every Shopify or WooCommerce store in a list, or every company still on an old CMS, and pitch the right product.
- **Lead enrichment:** add CMS, e-commerce platform and marketing stack to your CRM or prospect list before outreach.
- **Agencies:** audit a client's or competitor's stack (analytics, tag manager, pixels, chat, A/B testing) in seconds.
- **Market research:** measure the market share of platforms, payment providers or analytics tools across thousands of sites.
- **SaaS competitive intel:** see which sites use your competitor's widget or script.

### Input example

```json
{
  "urls": ["https://allbirds.com", "techcrunch.com", "https://nextjs.org"],
  "minConfidence": 0,
  "includeImplied": true,
  "maxConcurrency": 10
}
```

### Output example

```json
{
  "url": "https://techcrunch.com",
  "finalUrl": "https://techcrunch.com",
  "domain": "techcrunch.com",
  "statusCode": 200,
  "title": "TechCrunch | Startup and Technology News",
  "technologyCount": 16,
  "technologyNames": "Google Tag Manager, HSTS, MySQL, Nginx, Open Graph, PHP, reCAPTCHA, RSS, Sailthru, WordPress, WordPress VIP, Yoast SEO, ...",
  "cms": "WordPress",
  "cmsAll": ["WordPress"],
  "ecommerce": null,
  "analytics": [],
  "tagManagers": ["Google Tag Manager"],
  "marketingAutomation": ["Sailthru"],
  "hosting": ["WordPress VIP"],
  "webServers": ["Nginx"],
  "programmingLanguages": ["PHP"],
  "hasWordPress": true,
  "hasShopify": false,
  "hasGoogleTagManager": true,
  "technologies": [
    {"name": "WordPress", "categories": ["CMS", "Blogs"], "version": null, "confidence": 100, "website": "https://wordpress.org"},
    {"name": "PHP", "categories": ["Programming languages"], "version": null, "confidence": 100, "website": "http://php.net", "implied": true}
  ],
  "error": null,
  "scrapedAt": "2026-10-06T00:20:00Z"
}
```

A `SUMMARY` record in the run's key-value store shows how many sites were checked and how many had errors.

### Pricing

Pay per result: **$0.05 per website checked** (half the price of the most-used Wappalyzer replacement) (plus a tiny per-run start fee). Rows for sites that fail to load are still saved so you can see why; set **Max results** to cap your spend.

### FAQ

**How accurate is it?** It uses the same open fingerprint rules as the Wappalyzer browser extension for everything visible in the page source, headers and cookies. Technologies that only show up after JavaScript runs in a real browser (some tag-manager-loaded pixels, some single-page-app frameworks) can be missed. Versions are reported only when the site exposes them.

**Which page is checked?** The URL you give, after redirects. For a bare domain that's the homepage. You can pass a deeper URL (a product or blog page) if the homepage is minimal.

**Why does a site show an error or only a few technologies?** Some sites block automated visitors with a bot-protection page (Cloudflare, Akamai, DataDome), and Shopify rate-limits requests from cloud servers. Every site is fetched directly. Rate-limited sites are retried politely after the wait they ask for. If a site is still blocked, the row is saved with an `error` note and the technologies that were visible. A rate-limited Shopify store is still reported as Shopify.

**Does it check DNS or email providers?** Not yet. It looks at what the website itself serves.

**Where do the fingerprints come from?** From the open [webappanalyzer](https://github.com/enthec/webappanalyzer) data set (the community-maintained fork of Wappalyzer's rules), as bundled in the npm package [simple-wappalyzer](https://www.npmjs.com/package/simple-wappalyzer) version 1.1.106 (September 2026). simple-wappalyzer's code is MIT-licensed (© Kiko Beats); the fingerprint data itself is published by the webappanalyzer project under the GPL-3.0 licence. A handful of extra rules for modern frameworks (Next.js, Nuxt, Gatsby, Remix, Astro, SvelteKit, Angular, Vue) were added on top.

### Use it with n8n, Make or Zapier

Run the actor from the Apify integration in n8n, Make or Zapier: send in a list of domains from Google Sheets, your CRM or a webhook, and write the CMS, e-commerce platform and flags back to each record. Schedule it monthly to catch sites that switch platforms.

### More scrapers from this developer

- [Company Jobs Scraper](https://apify.com/juicy_fillet/ats-jobs-scraper): every open job from Greenhouse, Lever, Ashby and more
- [Website Contact Extractor](https://apify.com/juicy_fillet/website-contact-extractor): emails, phones and social links from any list of websites
- [Shopify Store Scraper](https://apify.com/juicy_fillet/shopify-store-scraper): products, prices, variants and stock from any Shopify store
- [Email Verifier Lite](https://apify.com/juicy_fillet/email-verifier-lite): check whether email addresses are deliverable before you send

# Actor input Schema

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

Website URLs or bare domains, one per line, e.g. 'https://allbirds.com' or 'techcrunch.com'. Each one becomes one result row. Paste thousands at once.

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

Hide technologies detected with a confidence below this value (0-100). Most detections are 100. Set to 50 or more to drop weak, partial matches.

## `includeImplied` (type: `boolean`):

Also list technologies implied by a detection, e.g. WordPress implies PHP and MySQL. Implied entries are marked with "implied": true.

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

How many websites to fetch at the same time. 10 is a good balance between speed and politeness.

## `requestTimeoutSecs` (type: `integer`):

Give up on a website that has not answered within this many seconds. The row is still saved, with an error.

## `retryRateLimited` (type: `boolean`):

If a site answers HTTP 429 (Too Many Requests), wait as long as it asks (up to about a minute) and try again, twice at most. Rate-limited Shopify stores are recognised as Shopify either way.

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

Off by default: every site is fetched directly. If you turn a proxy on, sites that answer HTTP 403/429 are retried once through it. Proxy traffic is billed to your Apify account.

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

Stop after this many websites. Leave empty to check every URL in the list. You only pay for rows you get.

## Actor input object example

```json
{
  "urls": [
    "https://allbirds.com",
    "techcrunch.com",
    "https://nextjs.org"
  ],
  "minConfidence": 0,
  "includeImplied": true,
  "maxConcurrency": 10,
  "requestTimeoutSecs": 30,
  "retryRateLimited": true,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

All results saved by this run, in the default dataset.

# 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": [
        "https://allbirds.com",
        "techcrunch.com",
        "https://nextjs.org"
    ]
};

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

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

```

## MCP server setup

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