Website Tech Stack Detector - CMS & Frameworks
Pricing
$8.00 / 1,000 domain analyzeds
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
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a month ago
Last modified
Categories
Security
Limited permissionsShare
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
- Fetches each website (one HTTP request per site, following redirects).
- Reads the response headers (
Server,X-Powered-By,CF-RAY,Via, ...). - Parses the HTML for generator meta tags, framework-specific markers (
__NEXT_DATA__,ng-version,data-v-*, ...) and known script/CDN references. - 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
| Field | Type | Required | Description |
|---|---|---|---|
url | string | one of url / urls | A single public website URL to analyze. |
urls | array of strings | one of url / urls | Batch 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. |
timeoutSeconds | integer | no | Maximum time to wait for each HTTP request, in seconds (1–60, default 10). |
maxConcurrency | integer | no | How 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 osfrom apify_client import ApifyClientclient = 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.
timeoutSecondsis 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.
Related tools
- HTTP Security Headers Checker - Grade & Fixes — check the security headers of the sites you just profiled