# Website Tech Stack Detector: BuiltWith Alternative (`fernandosord/website-tech-stack-detector`) Actor

Find the technologies behind a list of websites: CMS, ecommerce platform, JavaScript frameworks, analytics and ad tags, CDN, hosting and email provider. Each technology comes with a confidence score and the evidence it was found from. Failed and blocked sites are free.

- **URL**: https://apify.com/fernandosord/website-tech-stack-detector.md
- **Developed by:** [Plainsource](https://apify.com/fernandosord) (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 $3.00 / 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.

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 is a BuiltWith alternative and Wappalyzer alternative that answers "what CMS is this site using?" for a whole list of websites at once. It fetches each homepage and reports the technologies behind it: CMS or site builder, ecommerce platform, JavaScript frameworks, analytics and ad tags, CDN, hosting and web server. It also reads the domain's DNS records to find the email provider, the DNS host and the SaaS tools the domain has verified.

Each technology comes with a category, a version when the site exposes one, a confidence score from 0 to 100 and the evidence it was found from. Sites that fail or show no technologies are not charged.

### What data can Website Tech Stack Detector extract?

One row per website.

| Field | Meaning |
|---|---|
| `input`, `url`, `domain` | The entry as you typed it, the URL that was requested, and the registered domain used for the DNS lookups. |
| `status` | `ok`, `failed`, `site_blocked`, `not_allowed`, `invalid_input` or `skipped`. |
| `finalUrl`, `httpStatus` | Where redirects ended, and the HTTP status of that page. |
| `title`, `description`, `language` | From the page's `<title>`, meta description and `<html lang>`. |
| `cms`, `ecommercePlatform` | The CMS, site builder or ecommerce platform found on the page with the highest confidence, or `null`. |
| `hostingProvider`, `cdnProvider` | Hosting and CDN names, from headers, CNAMEs and published IP ranges. |
| `emailProvider` | From the MX records, for example `Google Workspace` or `Microsoft 365`. |
| `technologyCount`, `technologyNames` | How many technologies were found, and their names (handy for CSV and spreadsheets). |
| `technologies` | One object per technology: `name`, `category`, `version`, `confidence`, `evidence` (up to 3 strings) and `source` (`page` or `dns`). |
| `checkedAt`, `error` | When the site was checked, and why it could not be analysed, or a note such as "No technologies were detected". |

A row with `site_blocked`, `failed` or `not_allowed` can still list technologies found in DNS.

#### What it detects

The Actor has 312 page fingerprints in 63 categories, plus DNS rules for 41 mail providers, 40 DNS hosts and 66 services that leave a TXT verification record. Some examples:

| Category | Examples |
|---|---|
| CMS and site builders | WordPress, Drupal, Joomla, Ghost, Webflow, Wix, Squarespace, Framer, HubSpot CMS, Adobe Experience Manager, Contentful, Sanity |
| Ecommerce and payments | Shopify, WooCommerce, BigCommerce, Magento, PrestaShop, Salesforce Commerce Cloud, Stripe, PayPal, Klarna, Afterpay |
| Frameworks | Next.js, Nuxt, React, Vue.js, Angular, SvelteKit, Astro, Gatsby, Remix, Hugo, Docusaurus, Laravel, Django, Ruby on Rails |
| Analytics and ads | Google Analytics, Google Tag Manager, Meta Pixel, LinkedIn Insight Tag, Hotjar, Microsoft Clarity, Mixpanel, Segment, PostHog |
| Marketing and chat | HubSpot, Marketo, Klaviyo, Mailchimp, Intercom, Drift, Zendesk, Crisp |
| Infrastructure | Cloudflare, Fastly, Akamai, Amazon CloudFront, Vercel, Netlify, WP Engine, Nginx, Apache, LiteSpeed |
| From DNS | Google Workspace, Microsoft 365, Proofpoint, Mimecast, Amazon Route 53, SendGrid, Mailgun, Atlassian, DocuSign, Zoom |

### How to use Website Tech Stack Detector

1. Open the Actor on Apify and paste your websites into **Websites**. Use bare domains (`example.com`, opened as `https://example.com/`) or full URLs (`https://shop.example.com/`). Up to 5,000 per run.
2. Leave **Also detect from DNS records** on to add the email provider, DNS host and verified SaaS tools. Turn it off if you only want what the page shows.
3. Optional: change **Minimum confidence** (default 50). Lower it to 0 to see weaker matches.
4. Click **Start**.
5. Open the Output tab, or download the dataset as JSON, CSV or Excel. The run's key-value store also has an `OUTPUT` record with counts per status and the 50 most common technologies in the run.

### How much does it cost?

The Actor uses pay-per-event pricing.

| Event | Price |
|---|---|
| Run start | $0.002 per GB of memory, charged once per run (the Actor runs on 256 MB, so one event, $0.002) |
| Website analysed | $0.003 per website |

You are charged for a website only when its homepage was fetched and at least one technology was found. Sites that fail, block automated visitors, answer with a bot-check page, are disallowed by robots.txt, or show no technologies are free.

Worked examples: 1,000 websites cost $0.002 + 1,000 x $0.003 = $3.002. If 80 of them block the request, you pay for 920: $2.762. If a run reaches the maximum cost you set, the remaining websites are returned with status `skipped`.

### Input example

```json
{
    "urls": ["vercel.com", "wordpress.org", "www.python.org"]
}
```

| Field | Default | What it does |
|---|---|---|
| `urls` | | Domains or full URLs. Up to 5,000 per run. |
| `detectFromDns` | on | Adds the email provider, DNS host, email-sending services and verified SaaS tools from DNS. |
| `minConfidence` | 50 | Leaves out technologies scored below this. |
| `respectRobotsTxt` | on | Skips sites whose robots.txt disallows the homepage. |
| `maxConcurrency` | 5 | 1 to 20 websites at once. Requests to the same host are always at least 1 second apart. |
| `timeoutSecs` | 20 | 5 to 60 seconds. A failed page is retried once. |

### Output example

This is the row for `vercel.com` from a real run on 2026-10-28 with the input above. The `technologies` list is cut to six of its 20 entries; `technologyNames` still lists all 20, and every value shown is as returned.

```json
{
    "input": "vercel.com",
    "url": "https://vercel.com/",
    "domain": "vercel.com",
    "status": "ok",
    "finalUrl": "https://vercel.com/",
    "httpStatus": 200,
    "title": "Agentic Infrastructure - Vercel",
    "description": "The autonomous stack for every app and agent.",
    "language": "en",
    "cms": null,
    "ecommercePlatform": null,
    "hostingProvider": "Vercel",
    "cdnProvider": null,
    "emailProvider": "Google Workspace",
    "technologyCount": 20,
    "technologyNames": ["Next.js", "React", "Anthropic", "OpenAI", "Mixpanel", "Zoom", "Vercel DNS", "DocuSign", "Amazon SES", "Marketo", "Postmark", "Salesforce", "SendGrid", "Google Workspace", "Vercel", "Stripe", "Apple Business", "Microsoft 365", "Ahrefs", "Google Search Console"],
    "technologies": [
        { "name": "Next.js", "category": "Web framework", "version": null, "confidence": 100, "evidence": ["header x-powered-by: Next.js, Payload", "header x-nextjs-prerender: 1", "header x-nextjs-stale-time: 300"], "source": "page" },
        { "name": "React", "category": "JavaScript framework", "version": null, "confidence": 100, "evidence": ["implied by Next.js"], "source": "page" },
        { "name": "Vercel DNS", "category": "DNS hosting", "version": null, "confidence": 100, "evidence": ["NS ns1.vercel-dns.com", "NS ns2.vercel-dns.com"], "source": "dns" },
        { "name": "Amazon SES", "category": "Email delivery", "version": null, "confidence": 100, "evidence": ["SPF include:amazonses.com"], "source": "dns" },
        { "name": "Google Workspace", "category": "Email hosting", "version": null, "confidence": 100, "evidence": ["MX aspmx.l.google.com", "MX alt1.aspmx.l.google.com", "MX alt2.aspmx.l.google.com"], "source": "dns" },
        { "name": "Vercel", "category": "Hosting", "version": null, "confidence": 100, "evidence": ["header server: Vercel", "header x-vercel-id: iad1::wp6qd-1793225382384-584fc0aecf99", "header x-vercel-cache: HIT"], "source": "page" }
    ],
    "checkedAt": "2026-10-28T22:09:42.314Z",
    "error": null
}
```

In the same run `wordpress.org` was reported with `cms` set to `WordPress` and 7 technologies, and `python.org` with Fastly as `cdnProvider` and 15 technologies. All three rows had the status `ok`.

### Use cases

- Add "uses Shopify, WordPress or HubSpot" to a lead list.
- Find which competitors use a given analytics, chat or ecommerce tool.
- Check what a prospect's website is built with before a sales call.
- Audit your own sites for old jQuery versions or forgotten tags.
- Build a list of every site on a given CMS or framework from a list of domains you already have.
- Find out which email provider and DNS host a company uses.

### FAQ

#### How does it compare with BuiltWith and Wappalyzer?

It answers the same question, "what is this website built with?", for a list you provide. It reads one page per site as the server sends it, so it will not match the depth of a full crawl or of a browser extension that runs the page's JavaScript. Each technology comes with the evidence it was found from, so you can judge a result yourself. The fingerprints were written for this Actor from what each product publicly exposes: the headers it sets, its cookie names, its `<meta generator>` value and the hosts its scripts load from. They are not copied from Wappalyzer's data.

#### Why is a tool I know the site uses missing?

The page is read as the server sends it, without running JavaScript in a browser. Tags added later by Google Tag Manager, and content built only in the browser, are not visible this way. Lowering **Minimum confidence** to 0 also shows weaker matches.

#### What does the confidence score mean?

A response header, cookie name, meta tag or script URL scores 90 to 100. A generic HTML pattern scores 40 to 70; distinctive markup, such as the `__NEXT_DATA__` script of Next.js, scores higher. Several weak signals for the same technology add up, capped at 100. Implied technologies (PHP for WordPress, React for Next.js) take the score of the one that implied them.

#### Why does a row say `site_blocked`?

The site answered with HTTP 401, 403, 429 or 503, or with a bot-check page. This Actor does not try to get around that, and the row is free. There are no proxies, logins or bot-check workarounds.

#### What are the limits?

Only the homepage (or the URL you give) and `robots.txt` are fetched, with one plain HTTP request per site. Pages larger than 3 MB are read up to 3 MB. Up to 5,000 websites per run. Robots.txt is respected by default, and requests to the same host are at least 1 second apart, or further if the site sets a `Crawl-delay`. The Actor identifies itself as `PlainsourceTechDetector`. LinkedIn, Facebook, Instagram, X and TikTok are not supported, because their terms forbid automated access. `localhost`, private IP addresses and hostnames that resolve to them are not fetched, including through redirects.

#### How fast is it?

The 3-site run above finished in about 3 seconds from start to finish, including the DNS lookups.

#### Can I use the API, Make, Zapier, n8n, a schedule or an AI agent?

Yes. Every Apify Actor has an API, and the Make, Zapier and n8n integrations can start it and read the dataset. You can run it on a schedule with Apify's Schedules to track changes in a competitor's stack. AI agents can call it through the Apify MCP server with the same input. With the API client: `client.actor("fernandosord/website-tech-stack-detector").call({ urls: ["example.com"] })`.

#### Do you also have registration, DNS and email security data?

The Domain Profile Actor by the same developer uses the same detection engine and adds RDAP registration data, domain age, an email authentication audit and the TLS certificate.

#### Something is detected wrongly. Where do I report it?

Open an issue on this Actor's Issues tab with the website and the technology.

### Other Actors by this developer

- [Domain Profile, WHOIS and DNS](https://apify.com/fernandosord/domain-profile-whois-dns): registration, domain age, DNS and email security for a domain.
- [Website Screenshot & URL to PDF](https://apify.com/fernandosord/website-screenshot-pdf): full-page screenshots and PDFs of a list of URLs.
- [Website Change Monitor](https://apify.com/fernandosord/website-change-monitor): watch pages and get the exact lines or links that were added or removed.
- [Open Places Leads](https://apify.com/fernandosord/open-places-leads): business lists by city or country from Overture Maps open data.
- [Career Site Jobs](https://apify.com/fernandosord/career-site-jobs): open jobs from Greenhouse, Lever, Ashby and other career sites.

# Actor input Schema

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

Domains (<code>example.com</code>) or full URLs (<code>https://shop.example.com/</code>). A bare domain is opened as <code>https://domain/</code>. One row is returned per website. Up to 5,000 per run.

## `detectFromDns` (type: `boolean`):

Look up the domain's MX, NS, TXT and SPF records too. This finds the email provider, the DNS host, email-sending services and SaaS tools that verified the domain (for example Google Workspace, Microsoft 365, HubSpot, Atlassian, Stripe). DNS lookups are free and add about a second.

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

Technologies scored below this are left out. A header, cookie, meta tag or script URL scores 90 to 100. A single weak HTML pattern scores 40 to 70.

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

Skip pages that the site's robots.txt asks automated visitors not to open (the row status is <code>not_allowed</code> and it is free). Turn off only for sites you own or have permission to check.

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

Requests to the same host are always spaced at least 1 s apart, or by the site's Crawl-delay.

## `timeoutSecs` (type: `integer`):

How long to wait for each homepage before reporting it as failed. A failed page is retried once.

## Actor input object example

```json
{
  "urls": [
    "vercel.com",
    "wordpress.org",
    "www.python.org"
  ],
  "detectFromDns": true,
  "minConfidence": 50,
  "respectRobotsTxt": true,
  "maxConcurrency": 5,
  "timeoutSecs": 20
}
```

# Actor output Schema

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

One row per website: the technologies found, with confidence and evidence, or the reason the site could not be analysed.

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

Counts per status and the most common technologies across the 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 = {
    "urls": [
        "vercel.com",
        "wordpress.org",
        "www.python.org"
    ]
};

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

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

```

## MCP server setup

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