Tech Stack & Framework Detector (CMS, Next.js, React) avatar

Tech Stack & Framework Detector (CMS, Next.js, React)

Pricing

from $3.50 / 1,000 results

Go to Apify Store
Tech Stack & Framework Detector (CMS, Next.js, React)

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

Thodor

Maintained by Community

Actor stats

2

Bookmarked

3

Total users

2

Monthly active users

2 days ago

Last modified

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

  1. Paste your domains into Start URLs or domains, one per line.
  2. Click Start.
  3. 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 actorWappalyzer ProBuiltWith BasicWhatCMS
🆓 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 daysn/an/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 detectionA 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 genEvery 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 qualificationFeed 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, so www.x.com and x.com become one row. Subdomains stay distinct: docs.example.com and example.com are 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.

Tech stack detector output example: dataset table with one row per domain showing type, CMS, framework, CDN, analytics, marketing tools and full tech breakdown

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 you type: "Framework" with the right name.

Fields

FieldMeaning
domain, url_checkedCanonical hostname and the exact homepage fetched
typeCMS, 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
frameworkPlain-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, marketingThree ready-to-filter lists
breakdownEvery technology found: name, version, categories, pricing. This is where you filter for React, Tailwind CSS, or Sanity
breakdown[].pricingCost 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_countUnique 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__, and data-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 marketing instead 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 requests
resp = 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 stack
print(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