Website Technology Lookup & Tech Stack Detector avatar

Website Technology Lookup & Tech Stack Detector

Pricing

from $2.00 / 1,000 website analyzeds

Go to Apify Store
Website Technology Lookup & Tech Stack Detector

Website Technology Lookup & Tech Stack Detector

Find out what any website is built with: CMS, ecommerce platform, frameworks, analytics, CDN, payments, email provider and 7,600+ more technologies, with version and confidence. Bulk URLs, any page (not just the homepage). $2 per 1,000 sites; failed sites are free.

Pricing

from $2.00 / 1,000 website analyzeds

Rating

0.0

(0)

Developer

Post Atelier

Post Atelier

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

4 days ago

Last modified

Share

What does Website Technology Lookup do?

Give it a list of websites and get back what each one is built with: CMS, ecommerce platform, JavaScript frameworks, analytics and ad tags, CDN and hosting, payment providers, email provider, and more. There is one row per technology, with its category, version (when the site reveals it), a confidence score and the evidence it was detected by.

It uses a fingerprint set of 7,647 technologies in 109 categories, in the Wappalyzer format (the open webappanalyzer fork, updated regularly). It checks any page you give it, not just the homepage, so https://shop.example.com/checkout is checked as that page.

  • Bulk: up to 10,000 URLs per run.
  • Fast HTTP mode by default. Browser mode (renderJs) also reads JavaScript globals and background requests.
  • Monitoring: with one row per technology, reports only the technologies a site added or dropped since the last run.
  • Failed sites are free. You pay only for sites where at least one technology was found on the website itself. DNS-only results are free.

What you get

FieldExampleNotes
technologyWordPressName as in the fingerprint set
version6.9.10null when the site doesn't reveal it
category, categoriesCMS, ["CMS", "Blogs"]Primary category first
confidence1000–100. Weak, single-hint matches are below 50 and are dropped by default
detectedBy["meta:generator", "scriptSrc"]The evidence: headers, cookies, meta tags, script URLs, HTML, DOM selectors, JS globals, DNS records
impliedBy["WordPress"]Filled in when the technology is inferred from another one (e.g. WordPress implies PHP and MySQL)
foundInwebsite or dnsdns = seen only in the domain's DNS records (see below)
website, cpe, saas, oss, pricinghttps://wordpress.org, cpe:2.3:a:wordpress:wordpress:...Vendor metadata from the fingerprint set; cpe helps match against vulnerability databases
url, finalUrl, domainhttps://techcrunch.com, https://techcrunch.com/, techcrunch.comfinalUrl is the URL after redirects
status, errorok / no_technologies_detected / errorErrors say why: DNS failure, timeout, HTTP 403 (bot protection)

About foundIn: dns: with checkDns on, the Actor also reads the domain's MX, TXT, NS and SOA records. They reveal:

  • the email provider (Google Workspace, Microsoft 365);
  • the DNS host (Cloudflare, Route 53);
  • SaaS tools the company verified its domain with (for example DocuSign, Atlassian, HubSpot, Zendesk or OpenAI).

These are useful sales signals, but they describe the company's accounts, not the website's code, so they are labelled separately and sorted last.

Run it on a schedule: get an alert when a site changes its stack

A site switching platforms (Magento to Shopify, Universal Analytics to GA4, adding Klaviyo or Intercom) is a common sales and competitor-tracking trigger. Set it up once:

  1. Save a task. Fill in the input (or paste the JSON below into the JSON editor) and click Save as a new task.
    { "urls": ["https://www.allbirds.com", "https://www.gymshark.com"], "monitorChanges": true, "monitorName": "prospects" }
  2. Schedule it weekly.
    • Open Schedules in the left menu of the Apify Console, create a schedule and add your task.
    • The first run outputs a baseline (change: "baseline"). Later runs output only rows with change: "added" or change: "removed", plus error rows for sites that couldn't be checked.
    • If nothing changed and every site was reachable, the dataset is empty.
    • With outputFormat: "sites", every site gets a row, with added and removed lists.
  3. Send the results somewhere. In the task's Integrations tab:
    • Slack: "Send notification via Slack" when a run succeeds.
    • E-mail or Google Drive: "Send results email via Gmail" attaches the rows; "Upload results to GDrive" saves them as a file.
    • Google Sheets, CRM, n8n: connect the task through Make, Zapier or n8n (listed under Automation platforms) and add a row per result.
    • Webhook: add an HTTP webhook for the event Run succeeded with your URL. The payload includes resource.defaultDatasetId; fetch the rows from https://api.apify.com/v2/datasets/<defaultDatasetId>/items.

Monitoring still charges per site checked, because each site is fetched and analyzed on every run. If a page that had website technologies suddenly shows none (usually a block page), the previous result is kept and the site is not charged. Changing categories, minConfidence, checkDns or renderJs starts a new baseline.

Who uses it

  • Sales and lead-gen teams: filter a prospect list to "uses Shopify" or "runs WordPress with WooCommerce", or enrich CRM accounts with their ecommerce platform and email provider.
  • Agencies and freelancers: find sites on outdated versions or a platform you specialise in.
  • Product and competitive research: see which analytics, A/B testing or chat tools competitors run, and get told when that changes.
  • Security and IT teams: inventory versions across your own sites (cpe maps to CVE databases).
  • AI agents: one call answers "what is this site built with?" with structured, evidence-backed rows.

How to use it

  1. Paste websites into Websites, one per line. Domains (example.com) and full page URLs both work.
  2. Optional: turn on Render JavaScript for more complete results on modern JavaScript sites.
  3. Optional: limit Only these categories (e.g. Ecommerce, CMS, Analytics, Payment processors), or switch Output format to one row per website.
  4. Click Start and download the results as JSON, CSV or Excel, or read them over the API.

HTTP mode or browser mode? One measured run per mode on allbirds.com, on Apify, 2026-10-20:

HTTP mode (default)Browser mode (renderJs: true)
Technologies found15 (10 from the website, 5 from DNS)30 (25 from the website, 5 from DNS)
Only found in browser modeVue.js, GSAP, core-js, Framer Motion, Microsoft Clarity, Facebook Pixel, Google Analytics, DoubleClick Floodlight, Datadog, OneTrust, Attentive, Shop Pay, Impact and others
Timeabout 1 s for the site (2.3 s for the whole run)about 20 s for the first site, including browser start
Price per site$0.002$0.005

HTTP mode reads the HTML, headers, cookies, meta tags, script URLs and DOM. It also finds globals that the page declares inline (such as Next.js's __NEXT_DATA__). Browser mode adds runtime JavaScript globals (React.version, Shopify, gtag...), background requests and late-loading tags.

Output example

One row per technology (default), from a real run on https://www.gymshark.com with categories: ["Ecommerce", "CMS", "Payment processors", "Analytics"]. Shortened: real rows also have website, cpe, saas, oss, pricing and checkedAt.

{
"url": "https://www.gymshark.com",
"finalUrl": "https://www.gymshark.com/",
"domain": "gymshark.com",
"technology": "Contentful",
"version": null,
"confidence": 100,
"categories": ["CMS"],
"detectedBy": ["html", "scripts"],
"impliedBy": [],
"foundIn": "website",
"category": "CMS",
"status": "ok",
"mode": "http"
}

The same run also returned Shopify, Afterpay, Cart Functionality and LinkedIn Insight Tag from the website, plus Mixpanel from DNS (foundIn: "dns").

With outputFormat: "sites", you get one row per website. This is from a real run on https://techcrunch.com, shortened:

{
"url": "https://techcrunch.com",
"domain": "techcrunch.com",
"status": "ok",
"technologyCount": 31,
"byCategory": {
"CDN": ["Cloudflare"],
"CMS": ["WordPress 6.9.10"],
"Marketing automation": ["Sailthru"],
"PaaS": ["WordPress VIP"],
"SEO": ["Yoast SEO 25.1", "Yoast SEO Premium 25.1"],
"Security": ["HSTS", "reCAPTCHA"],
"Tag managers": ["Google Tag Manager"]
},
"dnsServices": ["Atlassian Cloud", "Zendesk", "HubSpot", "DocuSign", "Figma", "Microsoft 365", "Airtable"],
"technologies": [
{ "technology": "WordPress", "version": "6.9.10", "confidence": 100, "categories": ["CMS", "Blogs"], "foundIn": "website" }
]
}

Use it from code, Make, Zapier or an AI agent

curl -X POST "https://api.apify.com/v2/acts/postatelier~website-tech-stack/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \
-H "Content-Type: application/json" \
-d '{"urls": ["https://www.allbirds.com"], "categories": ["Ecommerce"]}'
from apify_client import ApifyClient
client = ApifyClient("<YOUR_TOKEN>")
run = client.actor("postatelier/website-tech-stack").call(run_input={"urls": ["wordpress.org", "techcrunch.com"]})
for row in client.dataset(run["defaultDatasetId"]).iterate_items():
print(row["domain"], row["technology"], row.get("version"))

It works with the Apify MCP server, so AI agents can call it as a tool, and with the Apify apps for Make, Zapier and n8n.

Pricing

Pay per event, no subscription:

EventPricePer 1,000
Website analyzed (at least one technology found on the website)$0.002$2.00
Browser rendering (only with renderJs: true)$0.003 extra$3.00 extra

Sites that fail (DNS error, timeout, blocked, HTTP error), or where nothing is found on the website itself (DNS-only results included), are not charged. A challenge or placeholder page that returns HTTP 200 can still show real technologies, such as its CDN, and is then charged. Examples:

  • 1,000 prospect domains in HTTP mode: about $2.
  • 500 sites in browser mode: 500 × $0.005 = $2.50.
  • A weekly monitor of 200 competitor sites: 200 × $0.002 × 4 = about $1.60 a month.

Apify's free plan includes a monthly usage credit that covers small lists.

How detection works, and the fingerprint licence

  • Fingerprints. The technology definitions come from enthec/webappanalyzer, the community continuation of Wappalyzer's open fingerprints.
    • That repository is licensed GPL-3.0 (the GNU General Public License v3, not the AGPL). We checked its LICENSE file on 2026-10-20.
    • This Actor uses a pinned snapshot hosted on Apify; we don't distribute the fingerprint files.
    • Each run's SUMMARY record shows the snapshot's commit and date. We update the snapshot by hand from the upstream repository. Thanks to the webappanalyzer maintainers and contributors.
  • Matching engine. It is written for this Actor and follows Wappalyzer's rules:
    • Pattern confidences add up to 100.
    • Versions come from the matched text.
    • implies, requires and excludes are resolved, so WooCommerce is only reported on a WordPress site.
  • Scope. Each URL is one page, with no crawling. Run several pages of the same site (homepage, /pricing, /checkout) to see more.

Good to know

  • Bot protection. Sites behind strict bot protection may answer 403 or a challenge page. Those come back as error (not charged). The Actor doesn't solve CAPTCHAs or bypass protection.
  • Versions. Versions appear only when the site exposes them (a generator tag, a versioned script URL, a JS global). Many sites hide them.
  • Hint-based matches. A few fingerprints match on hints such as domains listed in a Content-Security-Policy header. Check detectedBy and confidence when a single result matters.
  • Public sites only. Private, local and cloud-metadata addresses are refused. You are responsible for checking only sites you're allowed to access.

FAQ

Is this the same as Wappalyzer? It uses the same fingerprint format and the open community fork of the fingerprints, with our own matching engine. Results are close to Wappalyzer's but not identical.

Why do I see AI and SaaS companies such as OpenAI or Atlassian for a website? Those come from DNS TXT records the company added to verify its domain with that service (foundIn: "dns", detectedBy: ["dns:TXT"]). Turn checkDns off, or filter on foundIn: "website", if you only want the website's own stack.

Can I check a specific page rather than the domain? Yes. Every input URL is checked as given, after following redirects.

What happens on a timeout? The site gets an error row saying "timed out" and isn't charged. Raise timeoutSecs for slow sites.

Do you store my URLs? Only in your own Apify run storage. With monitoring on, each URL's technology list is kept in a named key-value store in your account (techstack-monitor-<name>), so the next run can compare against it.