Domain WHOIS RDAP Lookup - DNS, MX & Expiry
Bulk domain lookup: official RDAP (WHOIS) registration, expiry and availability plus DNS, mail provider, SPF/DMARC and hosting ASN, with expiry and registrar filters.
datagrit › Data › Website Tech Stack Lookup - Technology Detector
DataDetect the technology stack of any list of domains: CMS, ecommerce, analytics, CDN, frameworks with versions, plus mail provider, SPF and DMARC.
Website Tech Stack Lookup tells you which technologies a list of websites runs on: CMS, ecommerce platform, analytics, tag manager, CDN, hosting, web server, JavaScript framework, marketing and chat tools, payment providers and hundreds more, with the version when the site exposes it, a confidence score and the evidence behind every detection. It also reads the public DNS of each domain to report the mail provider (MX), the SPF record with the email services it authorises, the DMARC policy and the DNS provider. Paste domains or URLs, run, and export JSON, CSV or Excel, or call it from the Apify API, n8n, Make or an AI agent through MCP.
The Actor loads the home page (or the URL you give) over plain HTTP and matches 847 technology fingerprints written for this Actor against the response headers, cookie names, meta tags, script URLs and page HTML. DNS adds MX, SPF, DMARC, NS, CNAME, A and PTR signals: mail providers and security gateways, sending services authorised in SPF, DNS hosts, hosting and CDN networks, and services the domain was verified with. Versions come from generator tags, headers such as Server and X-Powered-By, and versioned CDN paths. Technologies implied by another one (PHP by WordPress, React by Next.js) are marked "implied by" and carry a lower confidence.
Every result is one flat record, so it drops straight into a spreadsheet, a database or a CRM.
| Field | Type | Description | Example |
|---|---|---|---|
input | string | The entry exactly as it appeared in your list. | shopify.com |
domain | string | Registrable domain of the entry (public suffix aware, so www.bbc.co.uk gives bbc.co.uk). DNS checks (MX, SPF, DMARC, NS) run on this domain. | bbc.co.uk |
url | string | First URL requested for this entry. For a bare domain this is https://domain/; when it did not answer, the fallbacks https://www.domain/ and http://domain/ were tried. | https://shopify.com/ |
host | string | Hostname from your entry, lowercased and converted to ASCII (punycode). | shopify.com |
finalUrl | string | URL of the page that was analyzed, after redirects (when Follow redirects is on). | https://www.shopify.com/ |
statusCode | integer | HTTP status code of the analyzed response. Null when the site did not answer at all. | 200 |
redirectLocation | string | Where the site redirects to, filled only when Follow redirects is off and the first response is a redirect. | |
title | string | Text of the <title> tag of the analyzed page. | Shopify: The All-in-One Commerce Platform |
language | string | Page language from the <html lang> attribute, falling back to the Content-Language header and og:locale. | en-US |
technologyCount | integer | Number of technologies in the technologies list (after the Technology categories filter). | 18 |
technologyNames | string | Comma-separated names of the listed technologies, highest confidence first. | Shopify, Cloudflare, Google Workspace, React |
technologyCategories | string | Comma-separated distinct categories of the listed technologies. | Ecommerce, CDN, Email provider, JavaScript framework |
technologies | array | Every detected technology with its category, version when the site exposes one, confidence from 0 to 100 and up to three pieces of evidence (header, meta tag, script URL, cookie name, HTML snippet, DNS record, or the technology that implies it). | [{"name":"WordPress","category":"CMS",&q |
cms | string | Detected CMS, website builder, headless CMS or blog platform, with version when known. Always filled from all detected technologies, whatever the categories filter. | WordPress 6.8.2 |
ecommerce | string | Detected ecommerce platform(s), with version when known. | Shopify |
analytics | string | Detected analytics tools. For Google Analytics the version is GA4 or UA (Universal Analytics). | Google Analytics GA4, Hotjar |
tagManager | string | Detected tag managers. | Google Tag Manager |
cdn | string | Detected content delivery network in front of the site. | Cloudflare |
hosting | string | Detected hosting provider or platform (from response headers, CNAME, A and PTR records). | Vercel |
webServer | string | Detected web server or reverse proxy, with version when the Server header exposes it. | Nginx 1.24.0 |
jsFramework | string | Detected front-end frameworks. | Next.js, React |
programmingLanguage | string | Detected server-side language, with version when a header exposes it. | PHP 8.2.12 |
marketingAutomation | string | Detected marketing automation and email marketing tools (from page scripts and SPF includes). | HubSpot, Klaviyo |
liveChat | string | Detected live chat and customer support tools. | Intercom |
payment | string | Detected payment providers (from checkout scripts and domain verification records). | Stripe, PayPal |
dnsProvider | string | DNS hosting provider from the NS records of the domain. | Cloudflare DNS |
emailServices | string | Transactional email services authorised in the SPF record. | SendGrid, Amazon SES |
mailProvider | string | Provider that receives mail for the domain, from its MX records. "Other" means MX records exist but point to a provider the Actor does not recognise (see mxRecords). Null when the domain has no MX record or DNS was not checked. | Google Workspace |
mxRecords | string | Up to five MX hosts, lowest priority value first. | aspmx.l.google.com, alt1.aspmx.l.google.com |
hasSpf | boolean | True when the domain publishes a v=spf1 TXT record, false when it does not, null when DNS was not checked or did not answer. | true |
spfRecord | string | The SPF record text (first 500 characters). | v=spf1 include:_spf.google.com ~all |
hasDmarc | boolean | True when _dmarc.<domain> publishes a v=DMARC1 record, false when it does not, null when DNS was not checked or did not answer. | true |
dmarcPolicy | string | Policy (p=) of the DMARC record: none, quarantine or reject. | reject |
dnsChecked | boolean | True when the MX, TXT, DMARC and NS lookups all answered (an empty answer counts). False when some lookup failed, so a null mail field may mean "unknown". Null when DNS checks were turned off or the site row is found: false. | true |
htmlAnalyzed | boolean | True when the response was an HTML page and its markup, scripts and meta tags were analyzed; false when only headers, cookies and DNS were available. | true |
errorReason | string | Why a row has found: false: dns-not-found, dns-error, connection-refused, connection-reset, timeout, tls-error, host-unreachable, too-many-redirects, fetch-error, http-error, rate-limited, blocked-by-bot-protection, or no-matching-sites for the single status row when Only sites using any of these technologies matched nothing. | |
errorMessage | string | Details of the error, such as the HTTP status or the network error. | |
found | boolean | True for an analyzed site (charged). False for a site that could not be analyzed and for the status row; these rows are free. | true |
scrapedAt | string | ISO 8601 time of the check. | 2026-10-01T08:00:00.000Z |
sourceUrl | string | URL of the analyzed page (same as finalUrl), or the requested URL when the site did not answer. | https://www.shopify.com/ |
{
"input": "shopify.com",
"domain": "bbc.co.uk",
"url": "https://shopify.com/",
"host": "shopify.com",
"finalUrl": "https://www.shopify.com/",
"statusCode": 200,
"redirectLocation": null,
"title": "Shopify: The All-in-One Commerce Platform",
"language": "en-US",
"technologyCount": 18,
"technologyNames": "Shopify, Cloudflare, Google Workspace, React",
"technologyCategories": "Ecommerce, CDN, Email provider, JavaScript framework",
"technologies": [
{
"name": "WordPress",
"category": "CMS",
"version": "6.8.2",
"confidence": 100,
"evidence": [
"meta generator: WordPress 6.8.2",
"script https://example.com/wp-includes/js/jquery/jquery.min.js?ver=3.7.1"
]
}
],
"cms": "WordPress 6.8.2",
"ecommerce": "Shopify",
"analytics": "Google Analytics GA4, Hotjar",
"tagManager": "Google Tag Manager",
"cdn": "Cloudflare",
"hosting": "Vercel",
"webServer": "Nginx 1.24.0",
"jsFramework": "Next.js, React",
"programmingLanguage": "PHP 8.2.12",
"marketingAutomation": "HubSpot, Klaviyo",
"liveChat": "Intercom",
"payment": "Stripe, PayPal",
"dnsProvider": "Cloudflare DNS",
"emailServices": "SendGrid, Amazon SES",
"mailProvider": "Google Workspace",
"mxRecords": "aspmx.l.google.com, alt1.aspmx.l.google.com",
"hasSpf": true,
"spfRecord": "v=spf1 include:_spf.google.com ~all",
"hasDmarc": true,
"dmarcPolicy": "reject",
"dnsChecked": true,
"htmlAnalyzed": true,
"errorReason": null,
"errorMessage": null,
"found": true,
"scrapedAt": "2026-10-01T08:00:00.000Z",
"sourceUrl": "https://www.shopify.com/"
}
| Field | Name | Type | What it does |
|---|---|---|---|
domains | Domains or URLs | array | Domains (shopify.com), hostnames (www.bbc.co.uk) or full URLs (https://example.com/pricing), one per line. A bare domain is fetched at https://domain/, then https://www.domain/ and http://domain/ if the first address does not answer; a full URL is fetched exactly as given. Duplicates (with or without www, http or https) are merged, and entries that are not domains or http(s) URLs are listed in the run status. Leave empty to get a free example for two well-known sites. |
categories | Technology categories to list | array | Optional. Limit the technologies list (technologies, technologyNames, technologyCategories, technologyCount) to these categories. The summary columns (cms, ecommerce, analytics, mailProvider and the rest) are always filled from every detected technology. Categories: A/B testing, Accessibility, Advertising, Affiliate, Analytics, Blog, Build tool, Business software, CDN, CMS, CRM, Captcha, Comments, Cookie consent, Customer data platform, Customer support, DNS provider, Documentation, Ecommerce, Email marketing, Email provider, Email service, Feature flags, Font service, Forms, Forum, Headless CMS, Hosting, Image CDN, JavaScript CDN, JavaScript framework, JavaScript library, LMS, Live chat, Loyalty & referrals, Maps, Marketing automation, Monitoring, Operating system, PaaS, Payment, Personalization, Popups, Product adoption, Product search, Programming language, Push notifications, Reviews, SEO, Scheduling, Security, Session replay, Social, Static site generator, Subscriptions, Tag manager, Translation, UI framework, Video, Web framework, Web server, Website builder. |
requireTechnologies | Only sites using any of these technologies | array | Optional lead filter. Return (and charge for) a site only when it uses at least one of these technologies, for example Shopify, WooCommerce or HubSpot. Names are matched case-insensitively against the technology names in the output; unknown names are listed in the run status. Sites that do not match are skipped without charge. Unreachable sites still get a free row with found: false. |
followRedirects | Follow redirects | boolean | Follow HTTP redirects (and one meta refresh) to the final page and analyze that page. Turn off to analyze only the first response; a redirect is then returned with its status code and redirectLocation. |
includeDns | Check DNS (mail provider, SPF, DMARC, DNS host) | boolean | Look up MX, TXT (SPF and verification records), DMARC, NS, CNAME and A/PTR records of each domain to report the mail provider, SPF and DMARC, the DNS provider and services that verified the domain. Turn off for faster runs when you need only the website stack. |
maxConcurrency | Parallel sites | integer | How many sites are analyzed at the same time. Every site is a different server, so a higher value mostly speeds up long lists. |
requestTimeoutSecs | Request timeout (seconds) | integer | How long to wait for each page before trying the next address or reporting the site as unreachable (reason timeout). |
proxyConfiguration | Proxy configuration | object | Optional proxy for the page requests. Most sites answer without one; sites behind strict bot protection may block data center addresses and are then reported with found: false and reason blocked-by-bot-protection. DNS lookups do not use the proxy. |
Run the Actor and get the results in one request. Replace YOUR_APIFY_TOKEN with the token from your Apify account settings.
curl -X POST "https://api.apify.com/v2/acts/datagrit~website-tech-stack-lookup/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"domains":["shopify.com","wordpress.org","hubspot.com","stripe.com","vercel.com","bbc.co.uk","allbirds.com","techcrunch.com","webflow.com","joomla.org","github.com","apify.com"]}'import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('datagrit/website-tech-stack-lookup').call({
"domains": [
"shopify.com",
"wordpress.org",
"hubspot.com",
"stripe.com",
"vercel.com",
"bbc.co.uk",
"allbirds.com",
"techcrunch.com",
"webflow.com",
"joomla.org",
"github.com",
"apify.com"
]
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.length, items[0]);Install with npm i apify-client.
from apify_client import ApifyClient
import os
client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("datagrit/website-tech-stack-lookup").call(run_input={
"domains": [
"shopify.com",
"wordpress.org",
"hubspot.com",
"stripe.com",
"vercel.com",
"bbc.co.uk",
"allbirds.com",
"techcrunch.com",
"webflow.com",
"joomla.org",
"github.com",
"apify.com"
]
})
items = client.dataset(run["defaultDatasetId"]).list_items().items
print(len(items), items[0] if items else None)Install with pip install apify-client.
Bulk domain lookup: official RDAP (WHOIS) registration, expiry and availability plus DNS, mail provider, SPF/DMARC and hosting ASN, with expiry and registrar filters.
Find EU public contracts approaching expiry from TED award notices: incumbent, buyer, value, end date and renewal options.
French company lead lists from Sirene screened by net result and revenue, with net margin, size, matching establishment and optional directors.
Ashby job postings with normalized annual salary ranges, equity flags and new-since-last-run detection.