Tech Stack Detector - Wappalyzer & BuiltWith Alternative avatar

Tech Stack Detector - Wappalyzer & BuiltWith Alternative

Pricing

$20.00 / 1,000 site analyzeds

Go to Apify Store
Tech Stack Detector - Wappalyzer & BuiltWith Alternative

Tech Stack Detector - Wappalyzer & BuiltWith Alternative

Detect the CMS, ecommerce platform, analytics, tag managers, ad pixels, CRM/marketing automation, chat, payment, CDN, hosting and JS frameworks used by any list of websites, from their HTTP headers and HTML - no browser needed.

Pricing

$20.00 / 1,000 site analyzeds

Rating

0.0

(0)

Developer

TRUONG VAN HOA

TRUONG VAN HOA

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

12 hours ago

Last modified

Share

Tech Stack Detector — website technology checker, Wappalyzer & BuiltWith alternative

A website technology checker for any list of URLs: point it at a site and get back its CMS, ecommerce platform, analytics tools, tag managers, ad pixels, CRM/marketing-automation stack, live chat widget, payment processors, CDN, hosting, JavaScript frameworks and server software — as clean, flat JSON. It reads the same kind of HTTP-response, header and HTML fingerprints as Wappalyzer and BuiltWith, using the actively-maintained, GPL-licensed webappanalyzer fingerprint database (7,628 technologies across 109 categories), and is priced at a fraction of the incumbent's rate.

  • A real Wappalyzer/BuiltWith alternative, not a wrapper around one. Own detection engine (pattern matching, implies/excludes/requires chains, confidence scoring, a small DOM-subset selector matcher) reading the same fingerprint format, no scraping of either competitor.
  • No browser, so it's fast and cheap. Every site is one plain HTTP fetch plus in-memory pattern matching — no headless Chrome, no per-site compute spike.
  • Pay only for sites that were actually analyzed. Unreachable domains and network errors are saved as status: "error" and are never charged.
  • $0.02 per site — $20 per 1,000 URLs, vs. the market-leading Wappalyzer Lookup API at $0.10/URL ($100 per 1,000).

What it detects

7,628 technologies in 109 categories. The biggest categories (technology count from the current fingerprint database):

CategoryTechnologies tracked
Ecommerce803
Marketing automation548
CMS500
Analytics430
Live chat378
CRM314
Advertising240
Payment processors176
Security117
JavaScript frameworks90
Web servers95
CDN69
Hosting82
Tag managers13

Plus WordPress/Shopify plugin & theme/app ecosystems, page builders, personalisation, appointment scheduling, reviews, and dozens of smaller categories — the full list ships in data/categories.json.

Use cases

Use caseHow
B2B lead gen ("who uses tool X")Run with no filters to get every site's full stack, then filter the dataset downstream (Sheets/Make/n8n) for rows whose technologyNames contains the tool you sell against/integrate with. Or set technologies: ["Klaviyo"] + onlyMatchingSites: true to only save (and pay for) sites that use Klaviyo at all — note a filtered run's output only lists the technologies that passed the filter, not the site's full stack, so run once unfiltered if you also need to know what CMS/ecommerce platform each lead runs on
Agency prospectingScan a list of local-business or industry URLs, filter categories: ["CMS", "Ecommerce"] to spot sites on outdated or low-end platforms worth pitching a rebuild to
Competitor / market researchPoint it at every competitor's site, compare their categorySummary for analytics, ad pixels, CRM and marketing-automation stacks
Security / asset inventoryScan your own domain portfolio for unmanaged CMS installs, outdated JS libraries (version field) or forgotten third-party scripts
AI agentsFlat JSON in, flat JSON out, works through the Apify MCP server — an agent can ask "what does this site run" without parsing HTML itself

Input

FieldExampleNotes
urls["shopify.com", "wordpress.org", "stripe.com"]One website per line/entry. A bare domain is treated as https://domain/. Duplicates (after normalization) are removed automatically.
minConfidence501-100. Only keep a detected technology if its summed confidence score is at least this.
categories["Ecommerce", "Analytics"]Case-insensitive. Only keep technologies in one of these categories. Combines with technologies (see note above).
technologies["Shopify", "Klaviyo"]Case-insensitive, exact name. Only keep these specific technologies.
onlyMatchingSitesfalseWhen true, a successfully-fetched site is only saved (and charged) if at least one technology survived the categories/technologies filters. Failed fetches are always saved as status: "error" and never charged.
includeDnsfalseAlso resolve TXT/MX/NS/SOA/CNAME records for the handful of fingerprints only identifiable that way. Adds a DNS lookup per site.
includeRobotsfalseAlso fetch and scan /robots.txt. Adds one extra request per site.
outputFormat"site" (default) or "technology""site": one record per site with a nested technologies array. "technology": one dataset row per (site, technology, category) — easier to filter/pivot in Excel/Sheets. Either way you're charged once per site.
maxConcurrency101-50. Sites fetched in parallel (at most one in-flight request per host regardless of this setting).
proxyConfiguration{ "useApifyProxy": false }Optional. Route requests through an Apify proxy if a lot of your targets block datacenter IPs. Off by default.

Example 1: basic scan

{
"urls": ["shopify.com", "wordpress.org", "stripe.com"],
"minConfidence": 50
}

Example 2: lead-gen list — sites using a specific marketing tool

{
"urls": ["allbirds.com", "gymshark.com", "shopify.com"],
"technologies": ["Klaviyo"],
"onlyMatchingSites": true
}

Example 3: flat spreadsheet-friendly rows, one per detected technology

{
"urls": ["allbirds.com", "gymshark.com"],
"categories": ["Ecommerce", "Analytics", "CRM"],
"outputFormat": "technology"
}

Output

One record per site (outputFormat: "site", default). Real output from a live run against allbirds.com:

{
"url": "https://allbirds.com/",
"finalUrl": "https://www.allbirds.com/",
"domain": "www.allbirds.com",
"status": "ok",
"httpStatus": 200,
"title": "Allbirds: Comfortable, Sustainable Shoes & Apparel",
"metaDescription": "Allbirds: The world’s most comfortable shoes, flats, and clothing made with natural materials like merino wool and eucalyptus. FREE shipping & returns.",
"language": "en-US",
"technologies": [
{
"name": "Shopify",
"slug": "shopify",
"categories": ["Ecommerce"],
"confidence": 100,
"version": null,
"website": "https://shopify.com",
"cpe": null,
"detectedBy": ["cookies", "meta", "scriptSrc"]
},
{
"name": "Cloudflare",
"slug": "cloudflare",
"categories": ["CDN"],
"confidence": 100,
"version": null,
"website": "https://www.cloudflare.com",
"cpe": "cpe:2.3:a:cloudflare:cloudflare:*:*:*:*:*:*:*:*",
"detectedBy": ["headers"]
},
{
"name": "Google Tag Manager",
"slug": "google-tag-manager",
"categories": ["Tag managers"],
"confidence": 100,
"version": null,
"website": "https://www.google.com/tagmanager",
"cpe": null,
"detectedBy": ["html"]
},
{
"name": "Apple Pay",
"slug": "apple-pay",
"categories": ["Payment processors"],
"confidence": 100,
"version": null,
"website": "https://www.apple.com/apple-pay",
"cpe": null,
"detectedBy": ["dom"]
},
{
"name": "PayPal",
"slug": "paypal",
"categories": ["Payment processors"],
"confidence": 100,
"version": null,
"website": "https://paypal.com",
"cpe": "cpe:2.3:a:paypal:paypal:*:*:*:*:*:*:*:*",
"detectedBy": ["dom"]
},
{
"name": "Priority Hints",
"slug": "priority-hints",
"categories": ["Performance"],
"confidence": 100,
"version": null,
"website": "https://wicg.github.io/priority-hints/",
"cpe": null,
"detectedBy": ["dom"]
},
{
"name": "HSTS",
"slug": "hsts",
"categories": ["Security"],
"confidence": 100,
"version": null,
"website": "https://www.rfc-editor.org/rfc/rfc6797#section-6.1",
"cpe": null,
"detectedBy": ["headers"]
},
{
"name": "HTTP/3",
"slug": "http-3",
"categories": ["Miscellaneous"],
"confidence": 100,
"version": null,
"website": "https://httpwg.org/",
"cpe": null,
"detectedBy": ["headers"]
},
{
"name": "Open Graph",
"slug": "open-graph",
"categories": ["Miscellaneous"],
"confidence": 100,
"version": null,
"website": "https://ogp.me",
"cpe": null,
"detectedBy": ["dom"]
},
{
"name": "Swiper",
"slug": "swiper",
"categories": ["JavaScript libraries"],
"confidence": 100,
"version": null,
"website": "https://swiperjs.com",
"cpe": null,
"detectedBy": ["dom"]
}
],
"technologyNames": ["Apple Pay", "Cloudflare", "Google Tag Manager", "HSTS", "HTTP/3", "Open Graph", "PayPal", "Priority Hints", "Shopify", "Swiper"],
"categorySummary": {
"Payment processors": ["Apple Pay", "PayPal"],
"CDN": ["Cloudflare"],
"Tag managers": ["Google Tag Manager"],
"Security": ["HSTS"],
"Miscellaneous": ["HTTP/3", "Open Graph"],
"Performance": ["Priority Hints"],
"Ecommerce": ["Shopify"],
"JavaScript libraries": ["Swiper"]
},
"responseTimeMs": 8696,
"error": null,
"analyzedAt": "2026-09-18T12:40:58.254Z"
}

With outputFormat: "technology", the same detection becomes one row per (site, technology, category) — this first row is the real, unmodified output of that transform on the record above:

{
"url": "https://allbirds.com/",
"finalUrl": "https://www.allbirds.com/",
"domain": "www.allbirds.com",
"status": "ok",
"httpStatus": 200,
"title": "Allbirds: Comfortable, Sustainable Shoes & Apparel",
"responseTimeMs": 8696,
"error": null,
"analyzedAt": "2026-09-18T12:40:58.254Z",
"technology": "Apple Pay",
"category": "Payment processors",
"confidence": 100,
"version": null,
"detectedBy": "dom"
}

Field notes:

  • detectedBy lists which signal(s) matched: headers, cookies, meta, html, scriptSrc, scripts (inline script text), url, css, dom, and (opt-in) robots/dns.
  • confidence is the sum of every matching pattern's own confidence, capped at 100.
  • version is null when no pattern captured a version string, not a failure.
  • error and httpStatus are populated (and technologies is empty) on status: "error" rows — unreachable domains, timeouts, DNS failures, or a target the SSRF guard refused to fetch.

Pricing

Pay per event — $0.02 per site, charged once a site has been successfully fetched, analyzed, and saved:

EventWhen
url-analyzedOnce per site, only when status: "ok" and the record was actually saved to the dataset
  • Failed fetches (status: "error") are always saved for visibility, but never charged.
  • With onlyMatchingSites: true, a successful site that has zero technologies surviving the categories/technologies filters is not saved at all — so it is not charged either.
  • outputFormat: "technology" can turn one site into several dataset rows, but the charge is still once per site, not per row.
  • Set Max total charge on the run to cap spend; the Actor stops cleanly (finishes in-flight fetches, no partial charges) when the cap is reached.

$20 per 1,000 sites vs. the Wappalyzer Lookup API's $100 per 1,000 (5x cheaper for the same class of HTTP-based fingerprint).

Accuracy & limits

Live-validated against 28 well-known sites with independently-known tech stacks (Shopify stores, wordpress.org, a WooCommerce store, a Magento store, HubSpot, Intercom, Cloudflare-fronted sites, vercel.com, a Nuxt site, a Drupal site, a Ghost blog, plus several JS-framework and government sites) — 16 of 20 sites with an unambiguous known platform had it correctly identified, 137 unit tests pass, and engine time is ~1.1 s/page after an indexed-DOM-matching optimization (down from 4.0 s), with peak memory 285 MB for the run.

  • This is HTTP-based detection, not a browser. It reads the HTML, headers and cookies of the first response — technologies that only appear after JavaScript executes (client-side chat widgets injected by a tag manager, some JS-rendered React apps, single-page apps that hydrate content client-side) are not detected. That's the confirmed cause of every known miss in validation: Intercom's own site (its chat widget is JS-injected), react.dev (its own React usage isn't in the initial HTML), and drupal.org (only a CDN/cache header signature was visible in the raw response). ghost.org was correctly identified as not running Ghost — it actually runs Hugo on Netlify.
  • One record per URL, home page only. No crawling of internal pages — pass every URL you want analyzed.
  • Sites that block non-browser clients (aggressive bot detection) will return few or no signals; the Actor uses a standard desktop Chrome user agent but does not solve CAPTCHAs or render JS to get past such blocks.
  • dom selector matching is a subset of Wappalyzer's dom field: tag, #id, .class, [attr], [attr="v"], [attr*="v"], [attr^="v"] and combinations of those on a single element, with exists/attributes/text checks. Multi-element combinators and JS-properties checks (which need a live DOM) are recognized and skipped, not silently guessed.
  • js and xhr fingerprint fields (Wappalyzer signals that need a running browser to evaluate) are not supported — by design, since this Actor never launches a browser.

Code example

A runnable Python script (only requests needed) that calls this Actor and writes a CSV: tech-stack/find_shopify_klaviyo.py — find which sites in a list run Shopify and Klaviyo, saved to CSV.

FAQ

Is this affiliated with Wappalyzer or BuiltWith? No. This is an independent tool built on the open-source webappanalyzer fingerprint database (the maintained fork of the technologies Wappalyzer itself was originally built from), with its own detection engine.

Why didn't it detect the CMS I know a site uses? Most likely the signal only appears after JavaScript runs — see Accuracy & limits above. Try includeDns/includeRobots if the technology you're after has a DNS- or robots.txt-based fingerprint.

Why is version empty for a technology I can see the version of on the page? Only some fingerprints include a version-extracting pattern; many technologies (most CDNs, analytics tools) don't expose a version in headers/HTML at all.

Can I run this against my own internal/staging URLs? Only if they resolve to a public IP. A built-in SSRF guard refuses private, loopback, link-local, unique-local and CGNAT addresses (and re-checks on every redirect hop) so the Actor can't be pointed at internal infrastructure.

Something wrong or missing? Open an issue on the Actor's Issues tab.

License & attribution

Technology fingerprints are from enthec/webappanalyzer (GPL-3.0), the actively-maintained continuation of the original Wappalyzer fingerprint database. This Actor's fingerprint data and detection logic are distributed under GPL-3.0-only — see LICENSE. The complete corresponding source code is available to any user on request: open an issue on the Actor's Issues tab and it will be shared. Not affiliated with, endorsed by, or sponsored by Wappalyzer or BuiltWith; both names are used only to describe compatibility/comparison.