Website Tech Stack Detector: BuiltWith & Wappalyzer Alternative avatar

Website Tech Stack Detector: BuiltWith & Wappalyzer Alternative

Pricing

from $1.50 / 1,000 domain analyzeds

Go to Apify Store
Website Tech Stack Detector: BuiltWith & Wappalyzer Alternative

Website Tech Stack Detector: BuiltWith & Wappalyzer Alternative

Find out what a website runs on. Give it domains or URLs and get the CMS, ecommerce platform, analytics, CDN, server, email provider and 6,000+ other technologies, with the evidence for each and a link to the page it came from.

Pricing

from $1.50 / 1,000 domain analyzeds

Rating

0.0

(0)

Developer

Ground Truth

Ground Truth

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

6 days ago

Last modified

Share

Website Tech Stack Detector

Give it a list of domains or URLs. For each one it fetches the homepage once and tells you what the site runs on: CMS, ecommerce platform, analytics, tag manager, CDN, web server, hosting, frameworks, payment processors and the email provider, from a rule set of more than 6,700 technologies. Every record shows the evidence for each detection and links to the page it came from.

Use cases

  • Sales and lead qualification. Find every company in a list that runs Shopify, WordPress or a given analytics tool, then sort by what they use.
  • Competitive and market research. See which platforms a set of competitor or customer sites are built on.
  • Agency and migration prospecting. Spot outdated versions, sites without a CDN, or stores on a platform you replace.
  • Data enrichment. Add a technology column to a spreadsheet of domains. Flat fields (cms, ecommerce, analytics, cdn, email_provider and others) drop straight into a CSV.
  • AI agents. An agent that is asked "what does this company use?" can call this with a domain and get a structured, checkable answer in about a second, with no browser to drive.

What it does not do

  • It does not run a browser or JavaScript. Technologies that can only be seen by executing JavaScript in a page (for example a library found only as a global variable) are not detected, and a site that builds its whole page with JavaScript shows only what is in its response headers, its static markup and its DNS.
  • It reads one page per domain, the one you give it. It does not crawl, log in, or get around bot protection. If a site answers with an error or a challenge page, that response is analyzed as it is, fetch_status says http_error, and the result may be incomplete.
  • It does not collect or output emails, phone numbers, names or any page text. Page content is read only to match technology signatures and is never copied into the output.
  • Detection is evidence-based, not certain. A confidence score is given for each technology and the evidence type is listed so you can judge it. A technology that does not leave a trace in the page, headers or DNS cannot be seen.
  • DNS TXT records show that a domain verified itself with a service (for example a mail or collaboration tool). Those appear in technologies with evidence: ["dns:TXT"] and are kept out of the flat fields.

Sample output

Input:

{ "domains": ["nginx.org"] }

One record (shortened to two technologies):

{
"input": "nginx.org",
"domain": "nginx.org",
"final_url": "https://nginx.org/",
"status": 200,
"fetch_status": "ok",
"fetch_note": "",
"technologies": [
{ "name": "Nginx", "categories": ["Web servers", "Reverse proxies"], "version": "1.31.3",
"confidence": 100, "evidence": ["headers"], "website": "https://nginx.org/en" },
{ "name": "HSTS", "categories": ["Security"], "version": null,
"confidence": 100, "evidence": ["headers"], "website": "https://www.rfc-editor.org/rfc/rfc6797#section-6.1" }
],
"technology_count": 2,
"cms": [], "ecommerce": [], "analytics": [], "tag_managers": [], "cdn": [],
"web_server": ["Nginx"], "hosting": [], "email_provider": [],
"javascript_frameworks": [], "web_frameworks": [], "programming_languages": [],
"payment_processors": [], "mx_hosts": [],
"fetched_at": "2026-10-18T09:00:00Z",
"verify_url": "https://nginx.org/",
"fingerprints": "692e0ec"
}

How to check it yourself. Open the verify_url, or run curl -I https://nginx.org/ and read the Server header: it prints nginx and a version number, which is the evidence behind the Nginx entry and its version. The nginx documentation says nginx puts its version in that header. For a Shopify store, view the page source and search for cdn.shopify.com. For email, look up the domain's MX records with any DNS tool and compare to mx_hosts.

A site that cannot be reached returns a clean record and is not charged:

{ "input": "nonexistent-domain-abc123xyz987.com", "domain": "nonexistent-domain-abc123xyz987.com",
"final_url": null, "status": null, "fetch_status": "unreachable",
"fetch_note": "the domain name does not resolve", "technologies": [], "technology_count": 0,
"verify_url": "https://nonexistent-domain-abc123xyz987.com/" }

(The real record also carries the empty flat fields shown above.)

Configuration

InputTypeRequiredDefaultDescription
domainslist of textyes["wordpress.org"]Domains or page URLs. A bare domain is fetched over https, and over http if https is not available. Up to 1000 per run. Repeats are fetched once.
minConfidenceinteger 0 to 100no50Only report technologies at or above this confidence. Weak single signals score under 50. Use 0 to see everything.
includeDnstrue or falsenotrueLook up MX, TXT and NS records. This is how the email provider is found. Turn off for the fastest run.

Only the default web ports (80 and 443) are fetched. IP addresses, internal hostnames, URLs with a username or password, and non-web schemes are refused with a message, and are not charged.

Output fields

FieldMeaning
input, domainWhat you gave, and the domain in ASCII form with a leading www. removed
final_url, statusThe page that answered after redirects, and its HTTP status (null if nothing answered)
fetch_statusok, http_error (the site answered with an error status, analyzed anyway), not_html, or unreachable
fetch_notePlain-language note when something limited the result
technologiesList of name, categories, version (if found), confidence (0 to 100), evidence (url, html, text, css, scripts, scriptSrc, meta, headers, cookies, dom, dns:MX, dns:TXT, dns:NS, implied) and website
technology_countLength of technologies
cms, ecommerce, analytics, tag_managers, cdn, web_server, hosting, email_provider, javascript_frameworks, web_frameworks, programming_languages, payment_processorsFlat lists of technology names, for spreadsheets. email_provider comes from MX records only
mx_hostsUp to 5 mail server hostnames, lowest preference first
fetched_atUTC time of the fetch
verify_urlThe page that was fetched, or attempted if it failed
fingerprintsShort id of the rule-set version used

What can go wrong

fetch_status or messageWhat it meansWhat to do
unreachable, "the domain name does not resolve"The name has no addressCheck the spelling
unreachable, "did not answer within 15 seconds"The site is down or blockingTry again later
http_error with status 403 or 429The site refused the request or showed a bot checkResults come from headers and DNS only. Do not rely on a short list
not_htmlThe address is a file, not a pageGive the page URL
"certificate could not be verified" in fetch_noteThe page was read anyway; its TLS certificate is invalidTreat the site as misconfigured
Entry skipped in the run logThe entry was not a valid public domain or URLFix it. It is not charged

Pricing

Pay per event: $0.0015 per domain analyzed, about $1.50 per 1,000 domains, plus Apify's small start fee per run. A domain is charged only if the site answered over HTTP, including an error page that was still analyzed. Unreachable sites, duplicates and invalid entries are free.

Where the rules come from

Detection uses the community-maintained Wappalyzer rule set, enthec/webappanalyzer, licensed GPL-3.0, vendored at commit 692e0ec (2026-10-16), with a few documented additions. See SOURCES.md for the license, the list of what is and is not included, and where each test value came from.