Steadyline Data
Home / Tools / Tech Stack Detector
Sales leads

Bulk Tech Stack Detector: BuiltWith & Wappalyzer Alternative

Find what any list of websites is built with: CMS, ecommerce platform, analytics, marketing automation, chat, payments, frameworks, CDN, hosting and email provider (from DNS). HTTP-first and cheap ($2 per 1,000 domains) with an optional browser fallback.

Paste in a list of domains and get each site's technology stack back as clean JSON: CMS, ecommerce platform, analytics, tag managers, marketing automation, chat, payments, consent tools, frameworks, CDN, hosting, DNS host and email provider. It is built for lead lists, competitor research, agency prospecting and CRM enrichment, where you need thousands of domains checked cheaply rather than one site at a time in a browser extension.

Use cases

  • Technographic lead generation: find every Shopify, WooCommerce, HubSpot or Salesforce user in your domain list.
  • CRM enrichment: add CMS, ecommerce platform and email provider (Google Workspace vs Microsoft 365) to accounts.
  • Competitor and market research: measure the share of a technology across a market segment.
  • Agency prospecting: find sites on an outdated CMS or without analytics.
  • Security and IT inventory: CDN, hosting, DNS host and email security gateway at a glance.

How it works

  1. HTTP first. Each domain is fetched once with a normal browser user agent. We match response headers, cookie names, <meta> tags, <script src> URLs and HTML patterns against about 290 hand-written fingerprints.
  2. DNS. MX, TXT (SPF and verification records), NS and the CNAME of www reveal the email provider (Google Workspace, Microsoft 365, Zoho...), email security gateways (Proofpoint, Mimecast), sending services (SendGrid, Mailchimp, SES), DNS host and CDN. This also works when the website itself blocks bots.
  3. Optional browser fallback. Turn on browserFallback and domains that return 403/429/503, a bot challenge, or an empty JavaScript shell are re-tried in headless Chrome. The fallback also checks JavaScript globals.

Each technology has a confidence value. Header, cookie, script, meta and DNS matches score 100. HTML-pattern matches score 80, implied technologies score at most 90 (WooCommerce implies WordPress, which implies PHP), and weak heuristics score 50–60. Use minConfidence to filter. A version is returned when the page exposes one, for example a WordPress generator tag.

Input example

{ "domains": ["shopify.com", "allbirds.com", "hubspot.com"], "browserFallback": false, "includeDns": true, "minConfidence": 50 }

Use it from AI agents, the API or no-code tools

Add Apify's hosted MCP server with just this tool:

{
  "mcpServers": {
    "tech-stack-detector": { "url": "https://mcp.apify.com?tools=steadyline/tech-stack-detector" }
  }
}

Sign in with Apify (OAuth) on first connect, or send an Authorization: Bearer <APIFY_TOKEN> header. Then ask your agent, for example:

Use steadyline/tech-stack-detector to check which of these 50 domains run Shopify and which email provider each one uses.

See MCP setup for Claude, Cursor and VS Code or add all tools at once.

REST API

Run it and get results in one call:

curl -X POST "https://api.apify.com/v2/acts/steadyline~tech-stack-detector/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"domains": ["shopify.com", "wordpress.org", "allbirds.com", "hubspot.com", "vercel.com"]}'

No-code

Use the official Apify app in Zapier ("Run Actor"), Make ("Run an Actor") or n8n (Apify node), choose steadyline/tech-stack-detector, then send the dataset items to Google Sheets, Slack, a CRM or a database.

Pricing

Pay per event on Apify, no subscription. Prices are read from the public Apify Store listing; the Store page is authoritative.

EventPricePer 1,000
Domain analyzed
Charged per domain analyzed over HTTP.
$0.002$2.00
Domain analyzed (browser)
Charged per domain analyzed with full browser rendering.
$0.004$4.00
Actor start (Apify standard)
Charged when the Actor starts running. Number of events charged depends on Actor memory (one event per GB, minimum one event).
$0.00005–

Accuracy & limitations

  • Detection only sees what the homepage and DNS expose. Tools loaded later through Google Tag Manager (such as Google Analytics behind GTM) may only appear with the browser fallback, or not at all.
  • Some large sites block datacenter IPs. In our test, nytimes.com returned 403 even in the browser. Those rows are free and still include the DNS findings.
  • TXT verification records (Verified SaaS (DNS)) show that a company verified a domain with a vendor. They do not prove active use.

FAQ

How is this different from BuiltWith or Wappalyzer?

No subscription and no browser extension: you pay $0.002 per domain analyzed, run thousands of domains at once, and get JSON you can push to a sheet or CRM. The fingerprints are our own clean-room set (about 290 technologies), so coverage is narrower than BuiltWith's historical database.

Does it detect the email provider?

Yes, from MX, SPF and other DNS records: Google Workspace, Microsoft 365, Zoho, Proofpoint, Mimecast, SendGrid, Mailchimp, SES and more. This works even when the website blocks bots.

Do I pay for domains that fail?

No. Unreachable or blocked domains are returned with their DNS findings and an error, free of charge.

Can I run it on a schedule?

Yes. Create an Apify Schedule (or a saved Task with a schedule) and connect a webhook or integration to receive results.

Need a feature or found a bug?

Open an issue on the Issues tab of the tool's Apify Store page or email hello@steadylinedata.com. Built and maintained by Steadyline Data.

Acceptable use

Use this Actor only on public websites and for legitimate purposes such as market research, sales and security inventory. It makes one ordinary page request per domain plus public DNS queries. Do not use it to bypass access controls, to attack or overload sites, or in ways that break a site's terms or applicable law (including GDPR/CCPA when you combine results with personal data). You are responsible for how you use the output.