Website Tech Stack Detector - CMS & Frameworks avatar

Website Tech Stack Detector - CMS & Frameworks

Pricing

$8.00 / 1,000 domain analyzeds

Go to Apify Store
Website Tech Stack Detector - CMS & Frameworks

Website Tech Stack Detector - CMS & Frameworks

Detect the tech stack of one website or a list of up to 1,000 domains: CMS, frameworks, analytics, CDN and server, from public headers and HTML. One structured record per site; failures are not charged.

Pricing

$8.00 / 1,000 domain analyzeds

Rating

0.0

(0)

Developer

Billy Zouz

Billy Zouz

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a month ago

Last modified

Security

Limited permissions

Share

Tech Stack Fingerprint Detector

Find out which CMS, JavaScript framework, analytics tool, CDN or server a website runs on — for one site or for a whole list of domains in a single run. The Actor fetches each site, inspects its HTTP response headers and HTML markup against a set of known signatures, and returns the matches together with the evidence that triggered each one.

What it does

  1. Fetches each website (one HTTP request per site, following redirects).
  2. Reads the response headers (Server, X-Powered-By, CF-RAY, Via, ...).
  3. Parses the HTML for generator meta tags, framework-specific markers (__NEXT_DATA__, ng-version, data-v-*, ...) and known script/CDN references.
  4. Returns one structured record per website: the technologies recognized, each with a category, a confidence level and the exact piece of evidence that was matched.

Typical uses: enrich a list of leads or prospects with their CMS/e-commerce platform, check competitors' stacks, qualify agency clients before a migration, or audit a portfolio of sites.

Input

FieldTypeRequiredDescription
urlstringone of url / urlsA single public website URL to analyze.
urlsarray of stringsone of url / urlsBatch mode: a list of websites, as full URLs (https://example.com) or bare domains (example.com). Up to 1,000 per run; duplicates are removed.
timeoutSecondsintegernoMaximum time to wait for each HTTP request, in seconds (1–60, default 10).
maxConcurrencyintegernoHow many websites are analyzed in parallel (1–10, default 5).

Single website:

{ "url": "https://wordpress.org" }

Batch of domains:

{ "urls": ["wordpress.org", "https://vercel.com", "shopify.com"] }

Output

One dataset record per website:

{
"url": "https://wordpress.org",
"statusCode": 200,
"detectedTechnologies": [
{ "name": "WordPress", "category": "CMS", "confidence": "high", "evidence": "meta generator=\"WordPress 6.4\"" },
{ "name": "Nginx", "category": "Server", "confidence": "high", "evidence": "header Server=\"nginx\"" }
],
"serverHeader": "nginx",
"poweredByHeader": null,
"fetchedAt": "2024-01-01T12:00:00.000Z"
}

Errors are isolated per website: if one site cannot be reached, the others are still analyzed. A failed website gets a record with error (message) and errorType (TIMEOUT, FETCH_FAILED or INVALID_INPUT), and is never charged.

Use in your workflow

Replace <APIFY_TOKEN> with your token from Apify Console → Settings → API & Integrations.

HTTP API (curl) — run the Actor and get the results in one call:

curl -X POST "https://api.apify.com/v2/acts/devoted_laureate_r8f~d-tection-de-stack-technique-d-un-site/run-sync-get-dataset-items" \
-H "Authorization: Bearer <APIFY_TOKEN>" -H "Content-Type: application/json" \
-d '{"urls": ["wordpress.org", "vercel.com"]}'

JavaScript (npm install apify-client):

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('devoted_laureate_r8f/d-tection-de-stack-technique-d-un-site')
.call({ urls: ['wordpress.org', 'vercel.com'] });
const { items } = await client.dataset(run.defaultDatasetId).listItems();
for (const site of items) console.log(site.url, site.detectedTechnologies.map((t) => t.name));

Python (pip install apify-client):

import os
from apify_client import ApifyClient
client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("devoted_laureate_r8f/d-tection-de-stack-technique-d-un-site").call(
run_input={"urls": ["wordpress.org", "vercel.com"]}
)
for site in client.dataset(run.default_dataset_id).iterate_items():
print(site["url"], [t["name"] for t in site["detectedTechnologies"]])

AI agents (MCP) — expose only this Actor as a tool through the Apify MCP server:

{
"mcpServers": {
"tech-stack": {
"url": "https://mcp.apify.com?tools=devoted_laureate_r8f/d-tection-de-stack-technique-d-un-site",
"headers": { "Authorization": "Bearer <APIFY_TOKEN>" }
}
}
}

For agents: call it when you need to know what a website is built with. Input: url (one site) or urls (list). Output: one record per site with detectedTechnologies[] (name, category, confidence, evidence). Cost: $0.008 per website successfully analyzed; failures are free.

Pricing

Pay per event: $0.008 per domain analyzed. One website fetched and its technology stack detected (charged once per site, whatever the number of technologies found).

You only pay for these events: the platform usage of the run is covered by the Actor. Failed fetches are not charged. You can cap the cost of a run with the maximum charge setting of your run.

Limits

  • Up to 1,000 websites per run (split larger lists into several runs).
  • Analyzes the page returned by a single HTTP request (no JavaScript rendering, no headless browser) — technologies that are only injected client-side after the page loads may be missed.
  • Detects a curated list of popular CMSs, JS frameworks, analytics tools, CDNs, caches, servers and backend languages/frameworks; niche or custom stacks may go unidentified.
  • Public pages only — no login, no personal data is collected or stored.
  • timeoutSeconds is capped at 60 seconds per website.

FAQ

How are technologies detected?

From public signals only: response headers, HTML markup, script and stylesheet URLs and meta generator tags. No login and no browser are used.

Why might a technology be missing?

Technologies that leave no public trace (server-side only, or loaded after user interaction) cannot be seen without a browser.

Can I analyze a list of domains?

Yes: put up to 1,000 URLs or bare domains in 'urls'. Each site is analyzed separately; a site that cannot be reached gets an error record and is not charged.