How to check the tech stack of hundreds of websites at once
Short answer
Use a bulk tech-stack detector that reads the same evidence for every domain. DomainDNA on Apify checks each homepage's HTML and headers, DNS, RDAP and TLS certificate, and returns one record per domain: technologies with evidence, MX provider, SPF/DMARC, domain age and TLS expiry, at $0.004 per domain.
- Clean the list to bare domains, one per line, duplicates removed.
- Run it; each record has technologies[] (name, category, evidence), email (mxProvider, SPF, DMARC), registration and tls.
- Filter: e.g. category = Ecommerce and name = WooCommerce to find stores on a given platform.
- Treat blocked: true rows as partial for the tech list; DNS, email, TLS and domain age are still complete.
- Schedule it in monitor mode to get only the domains whose stack, mail provider or DMARC changed.
Copy-paste code
Python (pip install apify-client): which sites run Shopify, and who hosts their email
import os
from apify_client import ApifyClient
client = ApifyClient(os.environ["APIFY_TOKEN"])
domains = [l.strip() for l in open("domains.txt") if l.strip()]
run = client.actor("cybermax/domain-intel").call(run_input={"domains": domains})
for r in client.dataset(run["defaultDatasetId"]).iterate_items():
tech = {t["name"] for t in r.get("technologies", [])}
mail = (r.get("email") or {}).get("mxProvider")
dmarc = ((r.get("email") or {}).get("dmarc") or {}).get("policy")
print(r["domain"], "Shopify" in tech, mail, dmarc, (r.get("registration") or {}).get("ageDays"))JavaScript / Node (npm i apify-client)
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('cybermax/domain-intel').call({ domains: ['stripe.com', 'apify.com'] });
const { items } = await client.dataset(run.defaultDatasetId).listItems();
for (const r of items) console.log(r.domain, r.summary, r.technologies.map((t) => t.name).join(', '));No code: n8n, Make or Zapier
n8n: HTTP Request node (or the Apify node, action "Run an Actor and get dataset")
Method: POST
URL: https://api.apify.com/v2/acts/cybermax~domain-intel/run-sync-get-dataset-items
Auth: Header Auth -> Authorization: Bearer <your Apify token>
Body: JSON {"domains": ["stripe.com", "apify.com"], "monitor": true, "monitorKey": "leads"}
Output: one n8n item per result row, ready for Google Sheets / Airtable / a Slack message
Make: Apify app -> "Run an Actor" (Actor: cybermax/domain-intel, wait for finish = yes)
-> Apify "Get Dataset Items" (dataset = the run's defaultDatasetId) -> Google Sheets "Add a Row"
Zapier: Apify app -> action "Run Actor" (cybermax/domain-intel, input JSON as above)
-> trigger "Finished Actor Run" -> "Fetch Dataset Items" -> your app
Runs longer than 5 minutes: start with POST /v2/acts/cybermax~domain-intel/runs and read the dataset when the run finishes.From an AI agent (MCP)
# Any MCP client (Claude Desktop, Claude Code, Cursor, VS Code): Apify's hosted MCP server
{
"mcpServers": {
"domain-intel": {
"command": "npx",
"args": ["-y", "mcp-remote", "https://mcp.apify.com/?tools=cybermax/domain-intel",
"--header", "Authorization: Bearer ${APIFY_TOKEN}"],
"env": { "APIFY_TOKEN": "<your Apify token>" }
}
}
}
# The agent sees one tool, cybermax--domain-intel, with the Actor's input schema.| Field | Value |
|---|---|
| summary | email on Google Workspace, DMARC p=reject, domain 31y old |
| technologies | Next.js (html: /_next/static/), Nginx (header server) |
| email.mxProvider | Google Workspace |
| email.dmarc.policy | reject |
| registration.registrar | SafeNames Ltd. |
| securityHeaders.score | 5/6 |
| files | robots.txt, llms.txt, security.txt |
Source: DomainDNA (Apify Actor cybermax/domain-intel) README, real run on 23 Sep 2026
What a bulk tech lookup is used for
Sales teams build lists of companies on a platform they integrate with (Shopify, WooCommerce, HubSpot). Agencies find sites on an old CMS to pitch a rebuild. Security and IT teams check which vendors lack DMARC or have a certificate about to expire. Investors and analysts track platform share across a portfolio.
Why evidence matters
Every technology comes with what triggered it (a header, a script path, a meta tag, an MX record), so you can verify a surprising result in seconds instead of trusting a black-box label.
Good to know
Price on Apify: $0.004 per domain analyzed ($4 per 1,000); domains that do not resolve are free. In monitor mode, unchanged domains are skipped and not charged.
Detection reads what a site exposes; a technology hidden behind a CDN or not visible in the HTML is reported as unknown rather than guessed.
DomainDNA: Know what any website runs on, in seconds
$0.004 per domain, domains that don't resolve are freeDomainDNA returns each domain's tech stack with evidence, mail provider, SPF/DMARC, domain age and TLS expiry in one record. $0.004 per domain; domains that don't resolve are free.
Runs on your own Apify account, pay per result; failed results are not charged.Questions
Is this a Wappalyzer or BuiltWith alternative?
For bulk lists, yes: the same kind of evidence-based detection, plus email security, domain age and TLS in one record, billed per domain with no subscription.
Can I find all websites that use a technology?
Not from nothing: start from a list of domains (an industry list, a CRM export) and filter the results by technology.
Can an AI agent use it?
Yes. Apify's MCP server exposes it as cybermax--domain-intel.
Free: the Free API Starter Kit
Copy-paste calls for 4 APIs with free daily tiers (CVE priority, VIN recalls, US duty rates, email checks), then 5 short emails on KEV/EPSS, MCP and free data.