How to get the tech stack and email provider of any website
30 Oct 2026 · benthepythondev
Say you have a list of company domains and want to know what each one runs: which CMS or frontend framework, which payment provider, which support widget, which email provider. You could open view-source on every site, but that stops being practical after about ten domains. The Tech Stack Detector takes a list of URLs and returns one structured record per site.
It works over plain HTTP with no headless browser. It reads the response headers, HTML, scripts, stylesheets, meta tags and cookies and matches them against 100+ technology signatures in 15+ categories. With DNS turned on, it also reads the domain's MX, SPF and TXT records to find the email provider and the SaaS tools that have verified the domain.
What you get
Each row describes one website:
- url and domain: what you asked for and the domain that was analyzed.
- technologies: a deduplicated list. Each entry has a
name, acategory(for example Frontend Framework, Payment, Customer Support), aconfidenceof high or medium, and aversionwhen the site exposes one. The README says versions are picked up for common frameworks like WordPress, jQuery, Bootstrap, React, Vue and Angular. Each entry also has adetectedByfield that says which signal found it: header, cookie, html, script, meta or dns. - technology_count and categories: the total, plus the same technologies grouped by category.
- Email and SaaS verification categories (when
includeDnsis on): the email provider and senders from MX and SPF (Google Workspace, Microsoft 365, Zoho, SendGrid, Mailgun, Amazon SES, HubSpot and others), and SaaS tools from TXT tokens (Atlassian, Slack, Zoom, OpenAI, Canva, DocuSign and others). - server, powered_by and meta_generator: the Server and X-Powered-By headers and the generator meta tag.
- title and description: the page title and meta description.
- status_code, redirect_url and ssl: basic HTTP facts.
- analyzed_at and analysis_time_ms: when the site was checked and how long it took.
Real example output
Below is part of a real row for stripe.com, cut down to a few technologies:
{
"url": "https://stripe.com",
"domain": "stripe.com",
"success": true,
"technologies": [
{"name": "React", "category": "Frontend Framework", "confidence": "high", "version": null},
{"name": "Next.js", "category": "Frontend Framework", "confidence": "high", "version": null},
{"name": "Intercom", "category": "Customer Support", "confidence": "high", "version": null},
{"name": "Stripe", "category": "Payment", "confidence": "high", "version": null}
],
"technology_count": 7,
"categories": {
"Frontend Framework": ["React", "Next.js"],
"Customer Support": ["Intercom"],
"Payment": ["Stripe", "PayPal"]
},
"server": "nginx",
"title": "Stripe | Financial Infrastructure to Grow Your Revenue",
"status_code": 200,
"ssl": true,
"analysis_time_ms": 167
}
That site took 167 ms to analyze, which is what you'd expect from a check that skips the browser.
What people use it for
The README lists these uses:
- Lead qualification. The email provider and connected SaaS tools come from DNS, and you won't see them on the page itself. A sales team can use them to tell whether a company runs Google Workspace or Microsoft 365, or uses tools like Atlassian or DocuSign, before reaching out.
- Prospect research in bulk. Give it a list of domains and get the CMS, frameworks, analytics, payment provider and CDN for each one, so nobody has to inspect every site by hand.
- Competitor tracking. Run the same list on a schedule and compare the rows over time to see when a competitor adds or drops a tool.
How to run it on Apify
Open the actor at apify.com/benthepythondev/tech-stack-detector and pass your input:
{
"urls": ["https://stripe.com", "vercel.com", "shopify.com", "notion.so"],
"maxUrls": 0,
"includeDns": true
}
urls: the sites to check.https://is optional.maxUrls: a cap on how many to process (0means no limit).includeDns: reads MX and TXT records for the email and SaaS layer. It's on by default and runs in parallel with the page fetch.
You can export results as JSON, CSV or Excel, run the actor on a schedule, call it through the Apify API, or connect it to Make, Zapier or n8n.
Pricing is per website row: $0.0025 on the Free plan and less on paid Apify plans, plus a $0.00005 start fee per run. From November 12, 2026 a row costs $0.002875 on the Free plan, with the same plan discounts. You aren't charged for a site that can't be reached. It gets no dataset row and is listed with its error and error_type in the run's FAILED_SITES key-value store record.
How to call it as an API on RapidAPI
If you'd rather call a plain REST endpoint with a RapidAPI key, the same detector is listed at rapidapi.com/benthepythondev0/api/tech-stack-detector3.
Honest limits
- It's signature matching, not a full audit. The detector only finds technologies that match one of its 100+ signatures. Anything outside that list won't show up.
- Check surprising results. The stripe.com row above lists WooCommerce and PayPal next to Stripe. A signature can fire on something the page's HTML or scripts only mention, so read
confidenceanddetectedBybefore you trust an unexpected entry. - No browser means no client-side-only detection. Plain HTTP is fast, but a tool that only loads after JavaScript runs in a browser may be missed.
- Versions are often empty. Every technology in the stripe.com row has
version: null. You only get versions when the site exposes them. - The DNS layer depends on public records. Email and SaaS detection only works when the domain publishes MX, SPF or TXT records that point to those services.
- Unreachable sites are left out of the dataset. Look in
FAILED_SITESto see which ones failed and why.
Affiliate if you still need an Apify account: apify.com/?fpr=qolupv. I may earn a commission; the price you pay does not change.