Echo Lab Tools › Tech stack
Find out what CMS, ecommerce platform, email provider and SaaS a website uses, in bulk
The website tech stack detector is an Apify Actor that takes a list of domains and returns, for each one, the technologies it can see (CMS, ecommerce platform, JavaScript framework, analytics, CDN, email provider, SaaS verification records) as JSON, each with a confidence level and the exact evidence that triggered it.
What you get
- 206 independently written fingerprints over homepage HTML, script URLs, headers, cookie names and meta generator
- Public DNS signals (MX, TXT/SPF, NS, CNAME): email provider, DNS host and SaaS tools that never appear on the homepage
- Evidence and confidence for every detection, plus flat name lists and category groups for CSV filtering
Price: $2.50 per 1,000 domains + $0.00005 per runLogin needed: noRuns on: Apify (API, schedule, MCP)
How it works
For each domain (bare or as a URL; duplicates and invalid lines are dropped and not billed), the Actor does two independent things:
- Homepage check. One HTTPS GET of the homepage (HTTP fallback on TLS failure), up to five redirects and 2 MB. It matches fingerprints against the HTML, script and stylesheet URLs, response headers, cookie names (never values) and the meta generator tag.
robots.txtis respected by default; if the homepage is disallowed, it is skipped and DNS checks still run. - DNS check. Public MX, TXT (including SPF), NS and CNAME records over DNS-over-HTTPS (Cloudflare, with Google as fallback). This is where email providers, DNS hosts and SaaS domain-verification records show up, things a homepage never reveals.
Every detection carries a category, a high or medium confidence, a short evidence string and the vendor's website. The Actor then derives best guesses for emailProvider, dnsProvider, hosting and cdn. There is no browser and no JavaScript execution, which keeps it fast and cheap, with the trade-offs listed below.
Sample output
A complete row from a real run on the Apify platform (run CkObmsf1Ee1MNoL6e, build 0.1.4, 2026-11-05):
{
"domain": "wordpress.org",
"inputValue": "wordpress.org",
"finalUrl": "https://wordpress.org/",
"httpStatus": 200,
"title": "Blog Tool, Publishing Platform, and CMS – WordPress.org",
"technologies": [
{
"name": "WordPress",
"category": "CMS",
"version": "7.2",
"confidence": "high",
"evidence": "meta generator: WordPress 7.2",
"website": "https://wordpress.org"
},
{
"name": "Google services",
"category": "Domain verification (SaaS used)",
"version": null,
"confidence": "high",
"evidence": "dns txt: google-site-verification=",
"website": "https://google.com"
},
{
"name": "Google Tag Manager",
"category": "Tag manager",
"version": null,
"confidence": "medium",
"evidence": "html: googletagmanager.com/gtm.js",
"website": "https://tagmanager.google.com"
},
{
"name": "nginx",
"category": "Web server",
"version": null,
"confidence": "high",
"evidence": "header server: nginx",
"website": "https://nginx.org"
}
],
"technologyNames": [
"WordPress",
"Google services",
"Google Tag Manager",
"nginx"
],
"categories": {
"CMS": [
"WordPress"
],
"Domain verification (SaaS used)": [
"Google services"
],
"Tag manager": [
"Google Tag Manager"
],
"Web server": [
"nginx"
]
},
"emailProvider": null,
"dnsProvider": null,
"hosting": null,
"cdn": null,
"homepageSkipped": null,
"error": null,
"errorMessage": null,
"checkedAt": "2026-11-05T04:03:11.702141+00:00"
}
A larger real run (IboHolfuN2y17Wsa3, build 0.1.3) checked 20 domains in 11 seconds. Part of it, including the misses:
| Domain | Platform found | Email provider | CDN | Detections | Note |
|---|---|---|---|---|---|
wordpress.org |
WordPress | — | — | 3 | |
techcrunch.com |
WordPress | Mimecast | Cloudflare | 11 | |
woocommerce.com |
WordPress, WooCommerce | — | — | 7 | |
gymshark.com |
Shopify | Proofpoint | Cloudflare | 11 | |
kyliecosmetics.com |
Shopify, Vue.js | Google Workspace | Cloudflare | 9 | |
vercel.com |
Next.js, Vercel Hosting | Google Workspace | — | 13 | |
stripe.com |
Next.js | Google Workspace | — | 13 | |
github.com |
Contentful | Microsoft 365 | — | 16 | |
webflow.com |
Webflow | Google Workspace | — | 19 | |
squarespace.com |
Squarespace | Google Workspace | — | 10 | |
wix.com |
— | Google Workspace | — | 11 | |
openai.com |
— | Google Workspace | — | 11 | homepage 403 (fetch_failed) |
Read the misses too. The tool did not flag Wix on wix.com: whatever wix.com serves on its own homepage did not match our Wix fingerprint. openai.com answered the homepage request with HTTP 403, so only DNS signals were found (still 11 of them, including Google Workspace for email). A made-up domain in the same run came back with no detections and homepageSkipped: "fetch_failed", and was billed as one row.
Output fields
| Field | Type | Meaning |
|---|---|---|
domain, inputValue |
string | Normalized hostname and first supplied value |
finalUrl, httpStatus, title |
string / integer / null | Homepage after redirects; null when not fetched |
technologies |
array | {name, category, version, confidence, evidence, website} per detection |
technologyNames |
array | Flat list of names for CSV filters |
categories |
object | Category → names, e.g. {"CMS": ["WordPress"]} |
emailProvider, dnsProvider, hosting, cdn |
string / null | Best guesses from all detections |
homepageSkipped |
string / null | null, robots_txt or fetch_failed |
error, errorMessage |
string / null | When enabled checks cannot complete (e.g. domain_not_found, timeout) |
checkedAt |
string | UTC timestamp |
Detected categories include CMS, ecommerce, website builders, JavaScript and web frameworks, analytics, tag managers, advertising pixels, A/B testing, marketing automation, CRM, email delivery and hosting, live chat, payments, CDN, hosting/PaaS, DNS providers, web servers, WAFs, consent banners, fonts, video, search, reviews, forms, scheduling and SaaS domain verification (Atlassian, OpenAI, Zoom, Adobe, Slack and others).
How much does a tech stack lookup cost?
Pricing is per result: $2.50 per 1,000 domains ($0.0025 per domain) plus $0.00005 per run, platform usage included. A valid domain whose checks fail is still saved and billed; duplicates and invalid lines are not.
Worked examples: the 20-domain run above is $0.05. Enriching a 1,000-row lead list is $2.50; 10,000 rows is $25. Apify's free plan includes $5 a month for Store tools (apify.com/pricing, checked 2026-11-06), which covers 2,000 domains.
Limits you should know about
- Fingerprints, not an inventory. 206 fingerprints will miss things, as wix.com above shows. A detection is evidence of use, not proof of a paid subscription.
- No JavaScript execution. Technologies loaded after page load or interaction can be missed, and a vendor script can mean an embedded integration rather than the site's main platform.
- DNS signals can be stale. Verification records often outlive the subscription, SPF lists allowed senders rather than current use, and an MX security gateway can hide the real mailbox provider.
- Blocked homepages lower recall. HTTP errors, robots rules and anti-bot pages (like openai.com's 403) leave only DNS detections. There is no CAPTCHA solving or bypass.
- Only the domains you supply, only today. It cannot list every site that uses Shopify, and it has no history of when a site adopted or dropped a technology.
API: call it from code
curl -X POST "https://api.apify.com/v2/acts/echolab~tech-stack-detector/run-sync-get-dataset-items" \
-H "Authorization: Bearer $APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"domains": ["shopify.com", "https://wordpress.org/", "stripe.com"]}'
Python, finding Shopify stores in a lead list:
from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
domains = [line.strip() for line in open("leads.txt") if line.strip()]
run = client.actor("echolab/tech-stack-detector").call(run_input={
"domains": domains,
"categories": ["Ecommerce", "Email hosting"], # optional allowlist
})
for row in client.dataset(run["defaultDatasetId"]).iterate_items():
if "Shopify" in row["technologyNames"]:
print(row["domain"], row["emailProvider"])
Tech stack detector vs. BuiltWith and Wappalyzer
| Option | Good for | Trade-off |
|---|---|---|
| This Actor | Bulk lookups of your own domain list, DNS and email signals included, evidence per detection, paid per domain | Smaller fingerprint set; no history; no "all sites using X" lists |
| BuiltWith | Historical technology data and ready-made lists of sites using a technology | Subscription pricing |
| Wappalyzer | Large fingerprint set; browser extension for one-off checks; paid API and lead lists | Bulk use goes through paid plans |
| Browser extensions in general | Checking one site you have open, with JavaScript executed | Manual, one site at a time |
When not to use it: if you need a list of every company running a technology, or when a site switched platforms, use BuiltWith or a similar database. If you check one site, a browser extension is quicker. This tool fits when you already have the domains, a CRM export or a scraped list, and want CMS, ecommerce, email and SaaS signals added to each row cheaply.
Open the tech stack detector on Apify for the full input schema.
Changelog
- 2026-11-06 — made public on the Apify Store; this page published.
- 2026-11-05 — build 0.1.4: production test on wordpress.org, stripe.com and shopify.com; pay-per-result pricing ($2.50 per 1,000 domains).