Give it a list of domains. Each one comes back as a single row with five things: the technology stack (CMS, analytics, frameworks), the CDN in front of it, its DNS records, its SSL certificate issuer and expiry date, and its mail provider.
Most tech-stack tools report only the first of those. So if the question you actually have is "which of these sites sit behind Cloudflare", "whose certificate expires in the next 30 days", or "who handles this company's email", this answers it in one pass.
No headless browser, no residential proxy, one HTTP GET plus a handful of DNS and TLS lookups per domain. Built to run in 256 MB and finish in seconds.
Run it on Apify: https://apify.com/catalyst_prime/tech-stack-lookup
Free to run, no setup. You only use your own Apify account's included usage.
Give it one or more domains via urls (a JSON array, a single string, or a comma/newline
separated list of domains). If you're switching from another tech-detection tool, you can also
use whichever of these field names your existing input already uses. This Actor accepts all of
them as aliases for the same thing: startUrls, domains, websites, targetUrls, url.
Supply domains in any one of them, or mix several; they are combined and deduplicated.
| Field | Type | Default | Description |
|---|---|---|---|
urls |
array of strings | none | Domains or URLs to look up. Supply this or any one alias below. |
startUrls |
array | none | Alias of urls. Accepts plain strings or {"url": "..."} objects. |
domains |
array | none | Alias of urls. |
websites |
array | none | Alias of urls. |
targetUrls |
array | none | Alias of urls. |
url |
string | none | Alias of urls for a single domain. |
categories_filter |
array of strings | none (all categories) | Only report technologies in these categories, e.g. ["CMS", "Analytics"]. |
include_versions |
boolean | true |
Include the detected version number, when found. |
include_confidence |
boolean | true |
Include a 0-100 confidence score per technology. |
timeout_seconds |
integer | 15 |
Per-domain page-load timeout, clamped to 3-60. |
One dataset item per input domain:
{
"url": "https://stripe.com",
"domain": "stripe.com",
"technologies": [
{ "name": "Nginx", "categories": ["Web servers", "Reverse proxies"], "confidence": 85 }
],
"techNames": ["Amazon S3", "Amazon Web Services", "HSTS", "Nginx"],
"techCount": 4,
"dns": {
"a": ["198.137.150.231", "198.202.176.231"],
"ns": ["ns-1087.awsdns-07.org", "ns-423.awsdns-52.com"]
},
"cdn": "Cloudflare",
"tls": {
"issuer": "DigiCert Global G3 TLS ECC SHA384 2020 CA1",
"subject": "stripe.com",
"notAfter": "2026-11-12T23:59:59Z",
"daysUntilExpiry": 49
},
"mail": {
"records": ["aspmx.l.google.com", "alt1.aspmx.l.google.com"],
"provider": "Google Workspace"
},
"httpStatus": 200,
"charged": false
}cdn is omitted when no CDN was detected. tls/dns/mail always appear, each with its own
error field when that particular lookup failed. A domain that can't be reached still gets a
full row showing what could be resolved, so nothing is silently dropped. charged reports
whether this row's lookup was billed (see Pricing).
This Actor's input schema mirrors the market's existing tech-detection tool so you can swap tools without editing a saved input. What's new here: DNS records, CDN, TLS certificate issuer, and mail provider, none of which the incumbent reports.
Free. This Actor has no price set, so every run costs you only your own Apify platform
usage (about $0.00002 of compute per domain, measured over a 10-domain run). The charged
field in each output row stays false while the Actor is free.
The code does support pay-per-event billing on a single domain-lookup event, priced per
successfully processed domain, if a price is ever set on the Apify Console. A domain that fails
entirely (unreachable, no DNS, no TLS, no mail records) would not be charged. Nothing is
hardcoded in the Actor: it reads its own current price from the platform at startup and runs
unmetered when there isn't one.
The detection engine (wappalyzergo) does
not expose a numeric confidence score through its public API: it uses one internally to decide
whether a match counts at all, then discards it. When include_confidence is on, this Actor
reports a coarse two-tier estimate instead of pretending to replicate a score it doesn't have:
100 when a version number was extracted (implies a specific, high-precision pattern match),
85 otherwise.
- Google Trends Lookup: bulk Google Trends interest-over-time and related queries, read directly from Trends' own JSON endpoints.
- Email Verifier: syntax, live MX record, disposable-domain and role-account checks rolled into a 0-100 confidence score.
Saved, pre-configured runs you can try without writing any input: