Tech Stack Detector — BuiltWith & Wappalyzer Alternative avatar

Tech Stack Detector — BuiltWith & Wappalyzer Alternative

Pricing

$5.00 / 1,000 website analyzeds

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

Tech Stack Detector — BuiltWith & Wappalyzer Alternative

Find out what any website is built with. Bulk-detect CMS, ecommerce platform, analytics, payments, CDN and 7,000+ technologies from a list of URLs. You only pay for URLs where a technology is detected.

Pricing

$5.00 / 1,000 website analyzeds

Rating

0.0

(0)

Developer

Plainfetch Studio

Plainfetch Studio

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Share

Paste a list of websites, get back what each one is built with: CMS, ecommerce platform, analytics, payment processor, CDN, frameworks and 7,000+ other technologies — and you only pay for the sites where something is actually found. Tech Stack Detector is a BuiltWith and Wappalyzer API alternative built for bulk analysis: give it a list of URLs and get one dataset item back per site — ready to filter, sort, or feed into another tool.

What can you do with it?

  • Enrich lead lists. Upload a list of prospect domains and segment them by stack — for example, "all Shopify stores that also use Klaviyo" — then route each account to the right sales play.
  • Competitive analysis. Check what your competitors' sites actually run: their CMS, their analytics stack, their payment processor, their CDN.
  • Market research for a technology. Confirm and quantify adoption of a specific technology across a list of sites — how many use a given CMS, tag manager, or payment gateway.
  • Feed AI agents. Call this Actor from the Apify API, an integration, or an MCP-connected AI agent so it can look up a site's tech stack as one step in a larger workflow.

What data do you get?

Each input URL produces one dataset item:

FieldTypeDescription
urlstringThe URL you submitted, normalized (scheme added if you left it out).
finalUrlstring | nullThe URL after redirects, or null if the request failed.
statusinteger | nullThe HTTP status code, or null if the request failed.
technologiesarrayEvery detected technology: name, category, version (if found), confidence.
summaryobject | nullThe shortcuts below, or null if the request failed.
detectedAtstringISO timestamp of when this URL was analyzed.
errorobject | null{ category, message } if the URL failed, otherwise null.

Every requested URL gets exactly one row — never silently dropped. Even a URL skipped entirely, because your spending cap was already reached or because this Actor's own run-level timeout budget (see Limitations) had already tripped before it was ever attempted, still gets a row: status: null, technologies: [], and a clear error message. Neither case is ever charged.

summary is a set of shortcuts into the most commonly filtered categories, so you don't have to search the technologies array yourself:

FieldTypeExample
cmsstring | null"WordPress"
ecommercestring | null"Shopify"
analyticsstring[]["Google Analytics"]
tagManagersstring[]["Google Tag Manager"]
paymentsstring[]["PayPal", "Apple Pay"]
cdnstring[]["Cloudflare"]
hostingstring[]["AWS"]
frameworksstring[]["React"]
liveChatstring[]["Intercom"]
marketingAutomationstring[]["HubSpot"]

You can download the dataset in various formats such as JSON, HTML, CSV, or Excel. Here's real output from a run against wordpress.org and www.allbirds.com. Each technologies array below is trimmed for readability — showing 3 of the 15 technologies actually detected for wordpress.org, and 2 of the 12 for www.allbirds.com. summary is always computed from the full, untrimmed list, which is why entries such as Google Tag Manager and React appear there even though they were trimmed out of technologies above:

[
{
"url": "https://wordpress.org/",
"finalUrl": "https://wordpress.org/",
"status": 200,
"technologies": [
{
"name": "WordPress",
"slug": "wordpress",
"version": "7.2",
"confidence": 100,
"website": "https://wordpress.org",
"categories": [
{ "id": 1, "name": "CMS" },
{ "id": 11, "name": "Blogs" }
]
},
{
"name": "Nginx",
"slug": "nginx",
"version": null,
"confidence": 100,
"website": "https://nginx.org/en",
"categories": [
{ "id": 22, "name": "Web servers" },
{ "id": 64, "name": "Reverse proxies" }
]
},
{
"name": "PHP",
"slug": "php",
"version": null,
"confidence": 100,
"website": "https://php.net",
"categories": [{ "id": 27, "name": "Programming languages" }]
}
],
"summary": {
"cms": "WordPress",
"ecommerce": null,
"analytics": [],
"tagManagers": ["Google Tag Manager"],
"payments": [],
"cdn": [],
"hosting": [],
"frameworks": ["React"],
"liveChat": [],
"marketingAutomation": []
},
"detectedAt": "2026-09-20T06:12:53.052Z",
"error": null
},
{
"url": "https://www.allbirds.com/",
"finalUrl": "https://www.allbirds.com/",
"status": 200,
"technologies": [
{
"name": "Shopify",
"slug": "shopify",
"version": null,
"confidence": 100,
"website": "https://shopify.com",
"categories": [{ "id": 6, "name": "Ecommerce" }]
},
{
"name": "Cloudflare",
"slug": "cloudflare",
"version": null,
"confidence": 100,
"website": "https://www.cloudflare.com",
"categories": [{ "id": 31, "name": "CDN" }]
}
],
"summary": {
"cms": null,
"ecommerce": "Shopify",
"analytics": [],
"tagManagers": ["Google Tag Manager"],
"payments": ["Apple Pay", "PayPal"],
"cdn": ["Cloudflare"],
"hosting": [],
"frameworks": ["React"],
"liveChat": [],
"marketingAutomation": []
},
"detectedAt": "2026-09-20T06:12:53.063Z",
"error": null
}
]

How much does it cost?

You pay $0.005 per website where at least one technology is detected ($5 per 1,000). Failed URLs and pages where nothing is detected are free. No start fee.

Websites with a detectionCost
100$0.50
1,000$5
10,000$50

Input

See the Input tab for the full configuration. The minimal input is a list of URLs:

{
"urls": ["https://www.allbirds.com", "wordpress.org", "https://stripe.com"]
}
  • urls (required) — 1 to 5,000 URLs or bare domains. https:// is added automatically if you leave the scheme out. Duplicate entries are processed once: the list is reduced to each distinct site first, so the same URL listed twice is analyzed and billed once, not twice.
  • includeCategories (optional) — keep only technologies in these categories, e.g. "Ecommerce", "CMS", "Analytics", "Payment processors". Leave empty to get everything detected.
  • maxConcurrency (optional, default 10, 1 to 20) — how many websites to analyze in parallel.

Limitations — read this first

This Actor analyzes the HTML that the server actually sends, plus response headers and cookies. It does not execute JavaScript, so technologies that only reveal themselves through browser global variables set by client-side code may not be detected. Sites that block automated requests return error.category: "blocked" for that URL — and, per the pricing above, that item is not charged. That includes pages that answer with HTTP 200 but serve a bot challenge instead of their content. This Actor does not attempt to get around such blocks (no proxy rotation, no browser fingerprint spoofing, no CAPTCHA solving) — a block is treated as a legitimate answer, not an obstacle to defeat.

Limits. Each site gets an 8-second analysis budget; a page whose markup is crafted to be pathologically slow to analyze is abandoned with error.category: "parse" and, like every failure, is not charged. Only the first 2 MB of a response is read, and responses that are not text (a PDF, an image, an archive) are reported as an error rather than downloaded. URLs that point at private or internal addresses are refused. Separately, a run-level budget protects the whole run from an input of many pages all crafted to be slow: 25 consecutive detection timeouts in a row (across any URLs, not just one) stop the run from scheduling further requests, with a clear message in the log — every URL already analyzed stays in the dataset, and a URL that never got to start this way, or because your own spending cap was already reached, still leaves its own uncharged row instead of vanishing.

FAQ

Is this legal? We can't give you legal advice, but here is exactly what the Actor does: it makes one ordinary HTTP request to each public page you list — the same request a browser makes — and reads what the server sends back. It does not log in, does not get around blocks, and does not collect personal data. You are responsible for the URLs you submit and for how you use the results.

Where do the technology fingerprints come from? From enthec/webappanalyzer, an open-source database of 7,000+ technology signatures, licensed under GPL-3.0. Attribution (LICENSE-FINGERPRINTS.md) and the full GPL-3.0 text (COPYING) ship in the Actor's data/ directory.

How do I use this from the API or an AI agent (MCP)? Call it like any other Apify Actor: via the Apify API, the JavaScript or Python client, an integration, or an MCP-connected AI agent that has access to your Apify Actors. Pass the same urls input and read the results back from the default dataset.

What happens if I hit my spending cap? The run stops cleanly: it finishes the URLs already in flight, writes everything it has, and reports chargeLimitReached: true in the run summary. Nothing already produced is lost, and nothing beyond the cap is charged.

Changelog

0.1 — Initial release.