Tech Stack & Framework Detector (CMS, Next.js, React)
Pricing
from $3.50 / 1,000 results
Tech Stack & Framework Detector (CMS, Next.js, React)
Detect the exact frontend framework (Next.js, React, Nuxt, Vue) and CMS (Shopify, WordPress, Headless) powering any website. Bulk-analyze thousands of domains to build B2B lead lists based on tech stacks.
Pricing
from $3.50 / 1,000 results
Rating
0.0
(0)
Developer
Thodor
Maintained by CommunityActor stats
2
Bookmarked
3
Total users
2
Monthly active users
2 days ago
Last modified
Categories
Share
A tech stack and framework detector tool. Paste a list of domains, get back the exact frontend framework and CMS each one runs, plus the CDN, analytics, and marketing stack, one row per domain, as CSV, Excel, or JSON. One domain or 100,000 in a single run, and it works as a single-site CMS checker too.
- ⚛️ Frontend frameworks: React, Next.js, Vue, Nuxt, Svelte, SvelteKit, Astro, Remix, Gatsby, Angular
- 🎨 CSS and styling: Tailwind CSS, Bootstrap, Material UI
- 🛍️ CMS and commerce: WordPress, Shopify (standard and headless), Webflow, Wix, Ghost, Magento
A Wappalyzer alternative and BuiltWith alternative without the subscription: no monthly minimum, no 2-technology filter cap, no API credits that expire after 60 days. Detection runs on the actively maintained open-source successor to Wappalyzer's database, about 7,500 technologies, not the frozen pre-2023 copy most alternatives still ship, plus a dedicated heuristic layer for frameworks that strip their markers in production builds.
📋 How to check the tech stack of a whole list of domains
- Paste your domains into Start URLs or domains, one per line.
- Click Start.
- Open the Output tab and click Export for CSV, Excel, JSON, or HTML.
1,000 domains take 5 to 10 minutes, 10,000 about an hour and a half, 100,000 run overnight.
🎁 So what do you get?
| 🏷️ Type: CMS, shop, builder, framework | ⚛️ Framework: Next.js, React, Astro | 🧱 CMS: WordPress 6.9.4, Shopify, Wix |
| 🌐 CDN: Cloudflare, Fastly, Akamai | 📊 Analytics: GA4, Plausible, Mixpanel | 📣 Marketing: Klaviyo, HubSpot, GTM |
| 🧾 Full breakdown: every technology found | 💸 Pricing per tech: low / mid / high / freemium | #️⃣ Tech count: 18 on techcrunch.com |
⚖️ Compared to BuiltWith, Wappalyzer, and WhatCMS
| This actor | Wappalyzer Pro | BuiltWith Basic | WhatCMS | |
|---|---|---|---|---|
| 🆓 Free tier | ✅ ~1,200 analyses per month, Apify's $5 free credit | ⚠️ Browser extension only | ⚠️ Single lookups | ⚠️ Single lookups |
| 💰 Billing | ✅ Pay per result | ❌ Subscription | ❌ Subscription | ⚠️ Per lookup or subscription |
| ⚛️ Modern frameworks (Next.js, Astro, SvelteKit) | ✅ Dedicated heuristic layer | ⚠️ Partial | ⚠️ Partial | ❌ CMS only |
| ⏳ Credit expiration | ✅ None | ❌ 60 days | n/a | n/a |
| 🔎 Technologies you can filter on | ✅ Unlimited | ✅ Unlimited | ❌ Capped at 2 | ❌ CMS only |
| 🗄️ Database | ✅ Maintained fork, updated weekly | ⚠️ Closed since 2023 | ⚠️ Closed | ⚠️ Closed |
🎯 Three things people run this for
| How | |
|---|---|
| 🛍️ Headless commerce detection | A headless store leaks both layers into one row: cms says Shopify while the breakdown lists Next.js and Tailwind CSS. Filter for both and you have the stores with real engineering budgets, the exact list performance and dev-tool vendors want |
| 🏗️ Agency migration lead gen | Every site on a legacy stack in your market is a modernization pitch: Joomla, Drupal 7, and Magento 1 by CMS name and version, AngularJS and Gatsby by framework. Then pull contacts with the Email Scraper |
| 📇 SaaS lead qualification | Feed inbound domains through the API and route them by stack: enterprise-priced tools (high, poa pricing tags) to sales, Shopify stores to the commerce team, freemium stacks to self-serve |
📥 Input
{"start_urls": [{ "url": "shopify.com" },{ "url": "https://www.nytimes.com" },{ "url": "techcrunch.com" }]}
start_urls: 1 to 100,000 domains. Everything is normalized to the homepage, lowercased,www.stripped, sowww.x.comandx.combecome one row. Subdomains stay distinct:docs.example.comandexample.comare two rows
That is the whole input.
📤 Output
One row per domain that returned a result. Failed fetches (DNS error, 4xx, 5xx, timeout) push no row and are not billed.

A real row, from a live run on TechCrunch:
{"domain": "techcrunch.com","url_checked": "https://techcrunch.com/","type": "CMS","cms": { "name": "WordPress", "version": "6.9.4" },"framework": "WordPress","cdn": [],"analytics": [],"marketing": ["Google Tag Manager", "Sailthru"],"breakdown": [{ "name": "MySQL", "version": null, "categories": ["Databases"], "pricing": [] },{ "name": "React", "version": null, "categories": ["JavaScript frameworks"], "pricing": [] },{ "name": "Sailthru", "version": null, "categories": ["Marketing automation"], "pricing": ["poa"] },{ "name": "WordPress", "version": "6.9.4", "categories": ["CMS", "Blogs"], "pricing": ["low", "recurring", "freemium"] }],"tech_count": 18// HIDDEN: 14 more breakdown entries (Nginx, PHP, Yoast SEO Premium, ...)}
A pure framework site (no CMS on top) comes back as type: "Framework" with the framework named. A site where nothing matches is type: "Unknown" with an empty breakdown; hand-built static pages and heavily stripped SPAs land there.
⚠️ No JavaScript is run. Pages are read the way a search engine reads them, which is what keeps a run fast and cheap, and on ~95% of sites the platform shows up in the source anyway. Tools that only exist after JavaScript executes (the Adobe enterprise stack, Drift, Cloudflare Zaraz) are invisible, and JS-rendered sites may return
Unknown, though framework traces like/_next/usually still give youtype: "Framework"with the right name.
Fields
| Field | Meaning |
|---|---|
domain, url_checked | Canonical hostname and the exact homepage fetched |
type | CMS, Ecommerce, Website builder, Blog, Framework, or Unknown (site reached, nothing in the HTML matched). Always set when the fetch succeeded |
cms | { name, version }, or null when no CMS-tier match. version is null when the site strips it |
framework | Plain-string "what runs this site". When a CMS is detected it names the CMS; on headless builds the frontend framework sits in breakdown |
cdn, analytics, marketing | Three ready-to-filter lists |
breakdown | Every technology found: name, version, categories, pricing. This is where you filter for React, Tailwind CSS, or Sanity |
breakdown[].pricing | Cost tier (low under $100/mo, mid, high over $1k/mo, poa) and billing model (freemium, recurring, onetime, payg). About 60% of technologies carry pricing data |
tech_count | Unique technologies detected. Sort on it to find the most stack-rich domains |
🧬 The technology database
In August 2023, Wappalyzer closed its open-source rules. The enthec/webappanalyzer project picked up where it left off: open, public, roughly weekly updates, about 7,500 technologies. Most "Wappalyzer alternative" tools still ship the frozen pre-2023 database, which misses Next.js App Router, modern Shopify themes, and everything added since. This actor reads the maintained database directly.
On top of it sits a curation pass, because the raw data has known quirks (source is public):
- A heuristic layer catches Next.js, Nuxt, React, Vue, Svelte, Astro, Remix, and Gatsby on production builds that strip the standard markers, via traces like
/_next/,__NUXT__, anddata-astro- - The generic "Cart Functionality" fingerprint no longer steals the CMS slot from Shopify and Stripe
- Post-2023 category renumbering is remapped, so marketing tools land in
marketinginstead of wrong buckets - Some 25 label fixes: Amazon S3 is object storage, not a CDN; Leadfeeder is B2B retargeting, not analytics; Datadog is APM
- Sites that cloak (paywall for browsers, clean page for crawlers) are refetched with a search-engine user agent
Independent testing across ~2,000 sites puts every major tool's CMS accuracy at 87 to 93%; this actor sits in that band, and the database freshness is what wins the modern-stack edge cases.
⚙️ Use it as a tech stack detection API
Every run is an HTTP endpoint: POST the same JSON as the form and the rows come back in the response body.
Python
import requestsresp = requests.post("https://api.apify.com/v2/acts/thodor~tech-stack-detector/run-sync-get-dataset-items",params={"token": "YOUR_APIFY_TOKEN"},json={"start_urls": [{"url": "shopify.com"}, {"url": "techcrunch.com"}]},)for row in resp.json():stack = {t["name"] for t in row["breakdown"]}headless = row["cms"] and "Next.js" in stackprint(row["domain"], row["type"], "headless!" if headless else "")
Node.js
import axios from "axios";const { data } = await axios.post("https://api.apify.com/v2/acts/thodor~tech-stack-detector/run-sync-get-dataset-items",{ start_urls: [{ url: "shopify.com" }] },{ params: { token: process.env.APIFY_TOKEN } });console.log(data[0].domain, data[0].type, data[0].tech_count);
curl
curl -X POST "https://api.apify.com/v2/acts/thodor~tech-stack-detector/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"start_urls":[{"url":"shopify.com"}]}'
Clay, n8n, Make, Zapier
For tools that only send GET requests, like a Clay HTTP enrichment column, Apify's ?method=POST trick turns the same endpoint into a GET URL:
GET https://api.apify.com/v2/acts/thodor~tech-stack-detector/run-sync-get-dataset-items?token=APIFY_TOKEN&method=POST&start_urls[0][url]={{Domain}}
That appends cms, framework, cdn, and marketing to every row of a domain list without Clay's Explorer tier. n8n, Make, and Zapier take the plain POST from the examples above.
💡 Tip: no need to write the JSON by hand. Fill in the form on the Input tab, switch the editor from Form to JSON, and copy the result into your code.
💰 How much does bulk tech stack detection cost?
Billing is per successful detection, at the rate on the price card on this page: one row pushed, one result billed. Failed fetches are free, and maxItems on a run is respected, so you are never charged for more than you asked for.
❓ FAQ
What about Cloudflare-protected sites?
Most work. Sites behind the hardest JavaScript challenges sometimes return Unknown.
Why is cms null for a site?
The site either has no CMS (check breakdown for the framework) or hides it. If another tool sees a CMS this one misses, open a ticket with the URL.
Why wasn't a tool detected even though I can see it on the site? A technology is only reported when detection is certain: strong signals fire alone, weak ones need a second confirmation. A few misses on obscure tools, far fewer false positives.
Why does a re-platformed site still show its old platform? Migrations rarely strip every legacy marker. Old paths and tags linger, and typically fade over 6 to 18 months.
Can a site fake its tech stack? Yes, every detection signal is public and can be faked; one researcher tricked Wappalyzer into reporting 1,929 technologies on one page. Treat the data as a signal, not gospel.
Does it detect headless CMSes like Contentful, Sanity, or Strapi? When they leak their CDN domains or API endpoints, yes. A fully proxied backend shows only the frontend framework.
🛟 Support
A detection that's wrong, or a field missing? Message me in the Issues tab with the URL and what you expected; both false positives and false negatives usually turn into a one-line fingerprint or curation fix in the next build. I'm a solo dev, so don't hesitate.
Need contacts for the domains you just classified? The Email Scraper pulls email addresses off the same list.
- Thodor