# Website Technology Detector: Tech Stack Lookup | $1/1K (`one_dollar_store/website-technology-detector`) Actor

$1 per 1,000 results, platform usage included. Names the CMS, shop platform, frameworks, libraries, servers, CDN, hosting and security headers a website uses, read from its page, headers and cookies. One row per site, no login or API key.

- **URL**: https://apify.com/one_dollar_store/website-technology-detector.md
- **Developed by:** [One Dollar Store](https://apify.com/one_dollar_store) (community)
- **Categories:** Developer tools, SEO tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.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, frameworks, analytics and hosting for any site

**$1 per 1,000 websites. Platform usage included. No rental, no minimum.**

Give it a list of websites and get one row per site with the technologies it can see: CMS and shop platform, JavaScript frameworks and libraries, analytics and ad tags, web server, CDN, hosting and security headers. It reads the page source, the response headers and the cookies, the way a visitor's browser receives them.

[Open it in Apify Console](https://console.apify.com/actors/XVVhq9Nt5397EfA3a/input)

### What it costs

| Websites | Price |
|---|---|
| 1,000 | $1.00 |
| 10,000 | $10.00 |
| 100,000 | $100.00 |

Plus $0.001 per run. One flat price, platform usage included, so there is no separate compute or proxy bill. A daily run of 300 websites costs about $0.30, or about $9 a month. In our test runs the platform cost was under $0.05 per 1,000 rows, so the price covers it with room to spare.

### Why use it

- **One flat price.** The bill follows the number of websites and nothing else. There is no proxy or browser behind it, so a run of 24 sites took about 4 seconds in our test.
- **Two formats in one row.** `technologyNames` is a plain list for filters and spreadsheets. `technologies` carries the category, version and confidence for each one.
- **You can see how sure it is.** Each technology has a confidence: 100 when two kinds of evidence agree, 75 for one, 50 when it is only implied by another technology.
- **Sites it cannot read are not charged.** A site that blocks the actor, fails a robots.txt check or returns an error gives no row. It is listed in the run summary with the reason.

### Quick start

1. Open the actor, add one website per line, press **Start**.
2. Or paste this input:

```json
{ "urls": ["wordpress.org", "https://www.shopify.com"], "maxItems": 10 }
```

3. Download the results as JSON, CSV or Excel, or read them through the API.

### Use it from code

```bash
curl -X POST "https://api.apify.com/v2/acts/one_dollar_store~website-technology-detector/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"urls": ["wordpress.org", "https://www.shopify.com"], "maxItems": 10}'
```

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("one_dollar_store/website-technology-detector").call(
    run_input={"urls": ["wordpress.org", "https://www.shopify.com"], "maxItems": 10}
)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["domain"], item["technologyNames"])
```

### Use it from an AI assistant

Claude, ChatGPT, Cursor and other assistants can call this actor through Apify's MCP server. Add it with this server address:

```
https://mcp.apify.com?tools=one_dollar_store/website-technology-detector
```

Then ask, for example: "Which of these 20 competitor websites run Shopify, and which analytics tools do they load?"

### Switching from another tech stack actor

Most technology lookup actors take a list of domains or URLs. Here it is `urls` (a bare domain or a full address) and `maxItems`. The core fields are `domain`, `technologyNames`, `categories` and `technologies` (each with `name`, `categories`, `version` and `confidence`).

### Input

| Field | Type | Default | What it does |
|---|---|---|---|
| `urls` | list of text | none | Websites to look up, one per line. A bare domain such as `example.com` or a full address. The page you give is the page that is read. |
| `maxItems` | number | 100 | The run stops after this many results. Minimum 10. |

Only one page per website is read. If you give two addresses on the same site, the first one is used and the second is listed as skipped. A bare domain is tried over https first, then http, then with `www.` added.

### Output fields

| Field | Meaning |
|---|---|
| `url` | The address as you gave it. |
| `domain` | Host name without `www.`, after redirects. |
| `finalUrl`, `statusCode` | The page that was read and its HTTP status. |
| `title` | The page title. |
| `technologyCount` | Number of technologies found. |
| `technologyNames` | Plain list of the names, handy for filters. |
| `categories` | The categories those technologies belong to. |
| `technologies` | One object per technology: `name`, `categories`, `version` (only when the page states it) and `confidence` (100, 75 or 50). |
| `server`, `poweredBy` | The `Server` and `X-Powered-By` headers as sent. |
| `pageBytes`, `pageTruncated` | Size read. Pages are read up to 2 MB. |
| `certificateProblem` | `true` when the site's HTTPS certificate failed the check. The public page was still read. |
| `redirected` | Number of redirects followed (at most 5). |
| `scrapedAt` | Time of the lookup in UTC. |

Each technology sits in one or more of about 40 categories, for example CMS, Ecommerce, JavaScript frameworks, Analytics, Tag managers, CDN, Hosting and Security.

### Sample results

Real rows from a test run on 9 October 2026. For the two longer rows the `technologies` list is cut to its first entries here; the full row lists all of them.

```json
[
  {"url": "vuejs.org", "domain": "vuejs.org", "finalUrl": "https://vuejs.org/", "statusCode": 200, "title": "Vue.js - The Progressive JavaScript Framework | Vue.js", "technologyCount": 7, "technologyNames": ["Brotli", "Content Security Policy", "Fathom", "HSTS", "Netlify", "VitePress", "Vue.js"], "categories": ["Analytics", "Hosting", "JavaScript frameworks", "Performance", "Security", "Static site generators"], "technologies": [{"name": "Brotli", "categories": ["Performance"], "confidence": 75}, {"name": "Content Security Policy", "categories": ["Security"], "confidence": 75}, {"name": "Fathom", "categories": ["Analytics"], "confidence": 75}, {"name": "HSTS", "categories": ["Security"], "confidence": 75}, {"name": "Netlify", "categories": ["Hosting"], "confidence": 75}, {"name": "VitePress", "categories": ["Static site generators"], "version": "2.0.0", "confidence": 75}, {"name": "Vue.js", "categories": ["JavaScript frameworks"], "confidence": 75}], "server": "Netlify", "pageBytes": 83785, "scrapedAt": "2026-10-09T00:04:56.149Z"},
  {"url": "woocommerce.com", "domain": "woocommerce.com", "finalUrl": "https://woocommerce.com/", "statusCode": 200, "title": "WooCommerce", "technologyCount": 16, "technologyNames": ["Google Tag Manager", "WooCommerce", "WordPress", "Brotli", "Content Security Policy", "Font Awesome", "HSTS", "Jetpack", "jQuery", "Nginx", "React", "Wistia", "WordPress.com", "Yoast SEO", "MySQL", "PHP"], "categories": ["Blogs", "CMS", "Databases", "Ecommerce", "Fonts and icons", "Hosting", "JavaScript frameworks", "JavaScript libraries", "Other", "Performance", "Programming languages", "SEO", "Security", "Tag managers", "Video players", "Web servers"], "technologies": [{"name": "Google Tag Manager", "categories": ["Tag managers"], "confidence": 100}, {"name": "WooCommerce", "categories": ["Ecommerce"], "version": "11.3.0", "confidence": 100}, {"name": "WordPress", "categories": ["CMS", "Blogs"], "version": "7.1.3", "confidence": 100}, {"name": "Brotli", "categories": ["Performance"], "confidence": 75}], "server": "nginx", "poweredBy": "WordPress VIP <https://wpvip.com>", "pageBytes": 312399, "scrapedAt": "2026-10-09T00:04:55.795Z"},
  {"url": "laravel.com", "domain": "laravel.com", "finalUrl": "https://laravel.com/", "statusCode": 200, "title": "Laravel - The clean stack for Artisans and agents", "technologyCount": 8, "technologyNames": ["Cloudflare", "Fathom", "Google Tag Manager", "Laravel", "Radix UI", "Tailwind CSS", "PHP", "React"], "categories": ["Analytics", "CDN", "JavaScript frameworks", "Programming languages", "Tag managers", "UI frameworks", "Web frameworks"], "technologies": [{"name": "Cloudflare", "categories": ["CDN"], "confidence": 75}, {"name": "Fathom", "categories": ["Analytics"], "confidence": 75}, {"name": "Google Tag Manager", "categories": ["Tag managers"], "confidence": 75}], "server": "cloudflare", "poweredBy": "Statamic", "pageBytes": 537984, "scrapedAt": "2026-10-09T00:04:56.287Z"}
]
```

### Limits

- **One page per website, no JavaScript is run.** The actor reads the HTML the server sends. Technologies that only appear after scripts run are missed. For example, the Angular version marker and tags that Google Tag Manager loads later are not in the source. A site built as a single page app can show less than a browser would.
- **Rule based.** About 380 technologies are covered, each with rules written for this actor. A technology that is not in the rules is not reported, and a rule can occasionally match something else. Treat `confidence` 75 as likely and 50 as a guess from what usually goes with a platform. WordPress implies PHP and MySQL, for example, but the site could use MariaDB.
- **Versions** are returned only when the page or a header states them.
- **Header notes** such as HSTS, Brotli and HTTP/3 are listed as technologies because they show how the site is served. Filter on `categories` if you do not want them.
- **robots.txt is honoured.** If a site's robots.txt does not allow the page, no row is returned and the site is listed in the run summary. If robots.txt cannot be read because of a server error, the page is skipped too.
- **Sites that block cloud servers** or show a bot check page are skipped. The actor does not try to get past a check. In our tests a few well known sites answered with a bot check or HTTP 403.
- **Only HTML pages with a 2xx status** give a row. Redirects are followed, up to 5. Pages are read up to 2 MB.
- **Local and private addresses are refused**, as are addresses that are not http or https.
- A site with an invalid HTTPS certificate is still read, and `certificateProblem` is set.
- **Free plan runs** return the first 10 results.
- Every run writes a `RUN_SUMMARY` record with counts and the list of skipped websites and why.

### FAQ

**How much does it cost to check 10,000 websites?**
$10, plus $0.001 for each run.

**Do I pay for compute or proxy on top?**
No. Platform usage is included in the $1 per 1,000 price. The actor uses no proxy.

**Which technologies can it find?**
Content management systems, shop platforms, site builders, JavaScript frameworks and libraries, UI kits, analytics and tag managers, ad tags, web servers, CDNs, hosting platforms, security headers and more.

**Why does a site show fewer technologies than a browser extension?**
The actor does not run the page's scripts, so it sees what is in the HTML, headers and cookies only.

**Can I check a specific page, such as a product page?**
Yes. Give the full address. The page you give is the page that is read.

**Is it legal?**
The actor reads the public page a site sends to any visitor, with no login, and respects robots.txt. How you use the results is up to you: follow each site's terms and the law where you live.

**Is this an official product of any of these technologies?**
No. It is an independent tool and is not affiliated with or endorsed by any company named in the results.

**Do I need an Apify account?**
Yes. Actors run from an Apify account, and a free account is enough to start: it includes $5 of platform usage every month. You can [sign up here](https://www.apify.com?fpr=ymnoit). This is a referral link and it costs you nothing.

**Is there a limit on the free plan?**
Yes. A run started from a free plan account delivers the first 10 results, then ends with a message and a link to the plans. Any paid plan returns everything you ask for, up to your own limit. The price per result is the same on every plan.

### More from The One Dollar Store

Every actor here costs $1 per 1,000 results, platform usage included. See the whole store: https://apify.com/one_dollar_store

**Website tools**

- [Website to Markdown Converter](https://apify.com/one_dollar_store/website-to-markdown-converter): Clean Markdown text from any web page.
- [Website Contact Scraper](https://apify.com/one_dollar_store/website-emails-phones-scraper): Emails, phones and social links from company sites.
- [SEO Page Audit](https://apify.com/one_dollar_store/seo-page-audit-scraper): On-page SEO checks for any URL.
- [PDF Text Extractor](https://apify.com/one_dollar_store/pdf-text-extractor-scraper): Text and page data from PDF links.

### Changelog

- October 2026: first release.

# Actor input Schema

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

Websites to look up, one per line. A bare domain (example.com) or a full address (https://example.com/shop). The actor reads that one page, so a product or blog address shows what that page uses. Only one page per website is read, and pages that robots.txt does not allow are skipped. Local, private and non web addresses are refused.

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

The run stops after this many results. Minimum 10.

## Actor input object example

```json
{
  "urls": [
    "https://wordpress.org",
    "https://nextjs.org",
    "https://www.shopify.com",
    "https://apify.com",
    "https://www.bbc.com"
  ],
  "maxItems": 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 = {
    "urls": [
        "https://wordpress.org",
        "https://nextjs.org",
        "https://www.shopify.com",
        "https://apify.com",
        "https://www.bbc.com"
    ],
    "maxItems": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("one_dollar_store/website-technology-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://wordpress.org",
        "https://nextjs.org",
        "https://www.shopify.com",
        "https://apify.com",
        "https://www.bbc.com",
    ],
    "maxItems": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("one_dollar_store/website-technology-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://wordpress.org",
    "https://nextjs.org",
    "https://www.shopify.com",
    "https://apify.com",
    "https://www.bbc.com"
  ],
  "maxItems": 10
}' |
apify call one_dollar_store/website-technology-detector --silent --output-dataset

```

## MCP server setup

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