# Website Tech Stack Detector: What Is Any Site Built With? (`vindr/website-tech-stack-detector`) Actor

A pay-as-you-go alternative to Wappalyzer and BuiltWith. See what any website is built with: CMS, ecommerce, analytics, ad pixels (also via Google Tag Manager), chat, email and DNS provider, domain age and SSL expiry. 350+ technologies, incl. Vipps and Klarna. $5 per 1,000 sites.

- **URL**: https://apify.com/vindr/website-tech-stack-detector.md
- **Developed by:** [VindR](https://apify.com/vindr) (community)
- **Stats:** 1 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 websites

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

### What does Website Tech Stack Detector do?

Website Tech Stack Detector tells you what a website is built with. Give it a list of domains and you get back the CMS, ecommerce platform, analytics and ad tools, payment providers, live chat, cookie consent tool, recruiting system, email provider, DNS provider and more for each site, plus the domain's age, registrar and expiry date and the SSL certificate's issuer and expiry.

It recognizes over 350 technologies, including the big international ones (Shopify, WordPress, HubSpot, Stripe, Google Analytics) and many that other detectors miss, especially in the Nordics: Vipps, Klarna, Qliro, Nets, MobilePay, Walley, Enonic, Sitevision, Umbraco, Dynamicweb, Cookiebot, Cookie Information, Boost.ai, Teamtailor, Webcruiter, ReachMee and more.

Use it to build lead lists ("online stores on Shopify that don't use Klaviyo yet"), research competitors, qualify accounts in your CRM, or keep track of which tools your market is moving to.

### How does it work?

For every website, the detector does three things:

1. **Reads the homepage** once, like a browser or search engine would. It looks at the scripts, links, HTTP headers, cookies and meta tags. Only the code counts: a page that just mentions "Klarna" in a news article is not marked as a Klarna user. If the site uses Google Tag Manager, the detector also reads the tag manager's public setup file, the same file every visitor's browser downloads. Many sites add their ad pixels and analytics there instead of in the page, so this is how you see tools like the Meta Pixel, TikTok Pixel, LinkedIn Insight Tag or Google Ads.
2. **Looks up public DNS records.** MX records show the email provider (Google Workspace, Microsoft 365), SPF records show which services send email for the domain (SendGrid, Salesforce, HubSpot), TXT records show verified tools (Atlassian, Meta Business, Slack), and NS records show the DNS provider.
3. **Checks the domain and certificate.** It looks up the domain's registration date, registrar and expiry date in the official RDAP registry (the modern replacement for WHOIS), where the top-level domain offers it, and reads the SSL certificate the site presents. Contact details of domain owners are never collected.

Each technology comes with a confidence level. **High** means we found a strong signal like a script from the vendor's own domain, a header or a DNS record. **Medium** means we found it in one place only: in the page code, or in the site's Google Tag Manager setup. A tool found in Google Tag Manager is set up on the site, but it may only run on some pages or after the visitor accepts cookies.

The detector respects robots.txt and doesn't try to get past bot protection. If a site blocks us, you still get the DNS results for it, clearly marked with `homepageChecked: false`.

### What data do you get?

| Field | Example |
|---|---|
| Website | vipps.no |
| CMS | WordPress |
| Ecommerce platform | Shopify |
| Analytics | Google Analytics, Hotjar |
| Advertising pixels | Meta Pixel, Google Ads, TikTok Pixel |
| Payments | Klarna, Vipps |
| Recruiting | Teamtailor |
| Email provider | Microsoft 365 |
| DNS provider | Cloudflare DNS |
| CDN | Cloudflare |
| Domain age, registrar, expiry | 24.7 years, MarkMonitor Inc., 2028-01-09 |
| SSL certificate | issuer, expiry date and days left, valid or not |
| All technologies | name, category, confidence, version when known, and where it was found |
| Page info | final URL, page title, description and language |

### How to use it

1. Click **Try for free** at the top of this page.
2. Paste your websites into **Websites**, one per line. A few or tens of thousands both work.
3. Optional: add filters, like **Only keep sites that use any of** `Shopify` and **Skip sites that use any of** `Klaviyo`.
4. Click **Start**. Most websites take less than a second each.
5. Download the results as Excel, CSV or JSON, or use the API.

#### Input example

Find Shopify stores in a list that don't use Klaviyo yet:

```json
{
    "domains": ["allbirds.com", "example-shop.no", "another-store.se"],
    "mustUseAny": ["Shopify"],
    "mustNotUse": ["Klaviyo"]
}
```

You can use technology names or whole categories in the filters, for example `Payments` or `Cookie consent`. Names are not case sensitive. If you misspell a name, the run log tells you, and if none of the names in **Only keep sites that use any of** are recognized, the run stops before checking anything.

### Output example

Here is one result, shortened to keep it readable:

```json
{
    "input": "allbirds.com",
    "domain": "allbirds.com",
    "url": "https://www.allbirds.com/",
    "homepageChecked": true,
    "homepageNote": null,
    "title": "Allbirds",
    "language": "en",
    "technologyCount": 17,
    "cms": null,
    "ecommerce": "Shopify",
    "analytics": ["Google Analytics"],
    "advertising": ["Criteo", "Google Ads", "Meta Pixel", "Microsoft Advertising", "Outbrain", "TikTok Pixel"],
    "payments": [],
    "recruiting": [],
    "emailProvider": "Microsoft 365",
    "dnsProvider": null,
    "cdn": "Cloudflare",
    "domainAgeYears": 24.7,
    "domainExpiresAt": "2028-01-09T15:24:37Z",
    "registrar": "MarkMonitor Inc.",
    "sslIssuer": "Let's Encrypt",
    "sslDaysLeft": 45,
    "categories": {
        "Advertising": ["Criteo", "Google Ads", "Meta Pixel", "Microsoft Advertising", "Outbrain", "TikTok Pixel"],
        "Analytics": ["Google Analytics"],
        "CDN": ["Cloudflare"],
        "Cookie consent": ["OneTrust"],
        "Ecommerce": ["Shopify"],
        "Email provider": ["Microsoft 365"],
        "Reviews": ["Yotpo"],
        "Tag management": ["Google Tag Manager"]
    },
    "technologies": [
        { "name": "Meta Pixel", "category": "Advertising", "confidence": "medium", "version": null, "evidence": ["gtm"] },
        { "name": "Cloudflare", "category": "CDN", "confidence": "high", "version": null, "evidence": ["header"] },
        { "name": "Shopify", "category": "Ecommerce", "confidence": "high", "version": null, "evidence": ["code", "cookie", "header", "script"] },
        { "name": "Microsoft 365", "category": "Email provider", "confidence": "high", "version": null, "evidence": ["dns"] }
    ],
    "dns": {
        "mx": ["allbirds-com.mail.protection.outlook.com"],
        "ns": ["..."],
        "spfIncludes": ["spf.protection.outlook.com"]
    },
    "domainRegistration": {
        "registrar": "MarkMonitor Inc.",
        "createdAt": "2002-01-09T15:24:37Z",
        "expiresAt": "2028-01-09T15:24:37Z",
        "updatedAt": "2025-12-08T09:31:58Z",
        "ageYears": 24.7,
        "status": ["client transfer prohibited", "server delete prohibited"],
        "source": "rdap.verisign.com"
    },
    "sslCertificate": {
        "issuer": "Let's Encrypt",
        "subject": "allbirds.com",
        "validFrom": "2026-08-11T00:48:33.000Z",
        "validTo": "2026-11-09T00:48:32.000Z",
        "daysLeft": 45,
        "valid": true,
        "problem": null,
        "altNameCount": 1
    },
    "checkedAt": "2026-09-24T12:00:00.000Z"
}
```

A `RUN_SUMMARY` record in the key-value store lists how many websites were checked, saved and filtered out, and why any could not be checked.

### How much does it cost?

You pay **$5 per 1,000 websites** saved, which is half a cent per website. Server time is included.

- Websites that can't be reached, don't exist or are removed by your filters are not charged.
- 100 websites cost $0.50. 10,000 websites cost $50.
- With the filters, you only pay for the matches. Checking 10,000 websites to find 400 Shopify stores costs $2.
- The $5 in free monthly credit on the Apify free plan covers about 1,000 websites a month.

Set **Max websites in total** or a maximum cost per run if you want a hard budget.

### What can you use it for?

- **Lead generation.** Find companies that use a tool you integrate with, or a competitor's tool you want to replace.
- **Sales qualification.** Enrich a list of accounts with their CMS, ecommerce platform and email provider before you reach out.
- **Market research.** See how popular Shopify, WooCommerce or HubSpot is among the companies in your country.
- **Competitor tracking.** Run the same list every month and see which tools come and go.
- **IT and security checks.** Find domains with SSL certificates that expire soon, or spot how old a company's domain is before you trust it.

### FAQ

#### Is it legal?

The detector reads each website's public homepage once, the same way a browser or search engine does, and looks up public DNS records. It respects robots.txt, doesn't log in, and doesn't try to get around bot protection. It doesn't collect email addresses, phone numbers or other personal data. As always, you are responsible for how you use the results.

#### Why is the domain age missing for some websites?

Domain registration data comes from the official RDAP registries. Most generic domains (.com, .net, .org and many others) and some country domains like .no offer it, but some countries, including Sweden (.se) and Denmark (.dk), don't publish RDAP yet. For those, the registration fields are empty. The SSL certificate is read for every site.

#### Why don't I see a store's payment provider?

Many online stores only load their payment provider in the checkout, not on the homepage. The detector reads the homepage, so it finds payment providers that show up there (for example Klarna's "pay later" messages or a Vipps button) but can miss ones that only appear at checkout. Don't read a missing payment provider as "doesn't use it".

#### Why are some websites marked "homepageChecked: false"?

Some sites block automated visitors or were too slow to answer. We don't try to get around that. Instead you get the results from DNS records, which still show the email provider, DNS provider and verified tools.

#### Is this a Wappalyzer or BuiltWith alternative?

It can be, depending on what you need. Wappalyzer and BuiltWith are subscription services with much larger technology databases and historical data, and they are great if you need that. This Actor is for when you want to check your own list of websites and pay only for what you use, with no monthly plan. It also reads DNS records, so you get the email provider, sending services and verified tools, and it covers Nordic technologies that the big services often miss. Results come straight from each website at the time you run it.

#### How accurate is it?

Detection is based on concrete signals like the vendor's own script domains, headers, DNS records and Google Tag Manager tags, not on guesses. It can still be wrong now and then, and it can miss tools that only load after you log in or interact with the page, because only the homepage (and its Google Tag Manager setup) is read. The confidence field tells you how strong each finding is, and the evidence field tells you where it was found: `script`, `code`, `header`, `cookie`, `meta`, `dns` or `gtm`.

#### Can it find the Facebook (Meta) Pixel?

Yes. Most sites add the Meta Pixel through Google Tag Manager rather than in the page itself, and the detector reads the Google Tag Manager setup to find it. The same goes for the TikTok, LinkedIn, Snapchat, Pinterest and Reddit pixels, Google Ads and Microsoft Advertising. A few sites use other tag managers or load their pixels from their own server, and those can be missed.

#### Can you add a technology?

Yes. Open an issue on the **Issues** tab with the name and a website that uses it. We add new technologies based on requests.

#### Can I use it from my own code?

Yes. Every Apify Actor has an API. See the **API** tab for examples in Python, JavaScript and plain HTTP. It also works with Make, n8n, Zapier and Google Sheets.

### Supported technologies

These are the names you can use in the filters.

**A/B testing:** AB Tasty, Convert, Kameleoon, Optimizely, VWO

**Advertising:** Adform, Adtraction, Awin, Criteo, Google Ad Manager, Google Ads, Google AdSense, LinkedIn Insight Tag, Meta Pixel, Microsoft Advertising, Outbrain, Pinterest Tag, Reddit Pixel, Snap Pixel, Taboola, TikTok Pixel, X (Twitter) Pixel

**Analytics:** Adobe Analytics, Amplitude, Cloudflare Web Analytics, Contentsquare, Crazy Egg, Fathom, FullStory, Google Analytics, Heap, Hotjar, Kilkaya, Matomo, Microsoft Clarity, Mixpanel, Piano Analytics, Piwik PRO, Plausible, PostHog, Segment, Simple Analytics, Siteimprove, Smartlook, Umami, Vercel Analytics, Yandex Metrica

**CDN:** Akamai, Amazon CloudFront, Azure Front Door, Bunny CDN, cdnjs, Cloudflare, Fastly, jsDelivr, KeyCDN, unpkg

**CMS:** Adobe Experience Manager, Bloomreach, Carrd, Concrete CMS, Contao, Craft CMS, Drupal, Duda, Dynamicweb, Enonic XP, Framer, Ghost, GitBook, HubSpot CMS, Jimdo, Joomla, Kentico, Liferay, Magnolia, Notion site, Optimizely CMS (Episerver), Sitecore, Sitevision, Squarespace, Strikingly, TYPO3, Umbraco, Webflow, Weebly, Wix, WordPress

**CRM:** Pipedrive, Salesforce, Upsales, Zoho CRM

**Cookie consent:** Axeptio, Complianz, consentmanager, Cookie Information, Cookiebot, CookieFirst, CookieYes, Didomi, iubenda, OneTrust, Osano, Quantcast Choice, Sourcepoint, Termly, TrustArc, Usercentrics

**DNS provider:** Akamai DNS, Amazon Route 53, Azure DNS, Binero DNS, Cloudflare DNS, DNSimple, Domeneshop DNS, Gandi DNS, GoDaddy DNS, Google Cloud DNS, Hetzner DNS, Loopia DNS, Namecheap DNS, NS1, One.com DNS, OVHcloud DNS, UltraDNS, Vercel DNS, Wix DNS

**Ecommerce:** Abicart (Textalk), BigCommerce, Centra, Commercetools, DanDomain, Ecwid, Lightspeed eCom, Litium, Magento, Mystore, nopCommerce, Norce (Jetshop), OpenCart, PrestaShop, Quickbutik, Salesforce Commerce Cloud, SAP Commerce Cloud, Shopify, Shoporama, Shopware, SmartWeb, Squarespace Commerce, Vendre, Wikinggruppen, Wix eCommerce, WooCommerce

**Email marketing:** APSIS, Brevo, Klaviyo, Mailchimp, MailerLite, Rule

**Email provider:** Binero Mail, Domeneshop Mail, Fastmail, GoDaddy Email, Google Workspace, iCloud Mail, Loopia Mail, Microsoft 365, One.com Mail, Proton Mail, Simply.com Mail, Yandex Mail, Zoho Mail

**Email security:** Barracuda, Cisco Secure Email, Mimecast, Proofpoint

**Email sending:** Amazon SES, Mailgun, Mandrill, Postmark, SendGrid, SparkPost

**Fonts:** Adobe Fonts, Font Awesome, Google Fonts

**Headless CMS:** Contentful, Contentstack, Crystallize, DatoCMS, Hygraph, Prismic, Sanity, Storyblok

**Hosting:** Acquia, Firebase Hosting, Fly.io, GitHub Pages, Google Cloud, Heroku, Kinsta, Netlify, Pantheon, Render, Vercel, WP Engine

**JavaScript framework:** Angular, Astro, Gatsby, Next.js, Nuxt, React, Remix, Svelte, SvelteKit, Vue.js

**JavaScript library:** Alpine.js, core-js, GSAP, htmx, jQuery, Lodash

**Live chat and support:** Boost.ai, Chatwoot, Crisp, Drift, Freshworks, Giosg, Gorgias, Help Scout, Intercom, LiveChat, Olark, Puzzel, Tawk.to, Tidio, Trengo, Userlike, Zendesk

**Maps:** Google Maps, Leaflet, Mapbox

**Marketing automation:** ActiveCampaign, HubSpot, Marketo, Microsoft Dynamics 365 Marketing, Salesforce Marketing Cloud Account Engagement (Pardot), Voyado

**Payments:** Adyen, Bambora, Braintree, Checkout.com, Dintero, Klarna, Lemon Squeezy, MobilePay, Mollie, Nets Easy (Nexi), Paddle, PayPal, Qliro, Square, Stripe, Svea, Swedbank Pay, Trustly, Vipps, Walley

**Personalization:** Clerk.io, Dynamic Yield, Hello Retail, Nosto, Relewise

**Productivity:** Adobe, Apple Business, Atlassian, Canva, DocuSign, Dropbox, Meta Business, Miro, MongoDB Atlas, OpenAI, Slack, TeamViewer, Webex, Workplace from Meta, Zoom

**Programming language:** Java, Node.js, PHP

**Recruiting:** Ashby, BambooHR, Breezy HR, EasyCruit, Greenhouse, HR-manager, iCIMS, JazzHR, Jobbnorge, Jobylon, Lever, Oracle Taleo, Personio, ReachMee, Recman, Recruitee, SAP SuccessFactors, SmartRecruiters, Teamtailor, Varbi, Webcruiter, Workable, Workday

**Reviews:** Feefo, Judge.me, Reviews.io, Trustmary, Trustpilot, Yotpo

**SEO:** Google Search Console

**Search:** Addsearch, Algolia, Cludo, Doofinder, Klevu, Loop54, Voyado Elevate

**Security:** Cloudflare Turnstile, Google reCAPTCHA, hCaptcha, KnowBe4

**Tag management:** Adobe Experience Platform Launch, Google Tag Manager, Tealium

**UI framework:** Bootstrap, Tailwind CSS

**Video:** Brightcove, Qbrick, Vidyard, Vimeo, Wistia, YouTube

**Web framework:** ASP.NET, Django, Express, Laravel, Ruby on Rails

**Web server:** Apache, Caddy, Envoy, LiteSpeed, Microsoft IIS, Nginx, OpenResty, Varnish

### Feedback

Missing a technology or found a wrong result? Open an issue on the **Issues** tab and we will look into it.

### More tools from VindR

- [Bulk WHOIS Lookup](https://apify.com/vindr/bulk-whois-lookup): cheaper when you only need registrar, dates, availability and name servers.
- [Sitemap Extractor, URL Status and Broken Link Checker](https://apify.com/vindr/sitemap-url-checker): list and check every page of a website.
- [Career Site Jobs Scraper](https://apify.com/vindr/eu-career-site-jobs): see which companies are hiring, and for which roles.

# Actor input Schema

## `domains` (type: `array`):

The websites to check, one per line. Plain domains (<code>example.com</code>) and full URLs both work. Duplicates are removed automatically.

## `mustUseAny` (type: `array`):

Keep only websites that use at least one of these technologies, for example <code>Shopify</code>, <code>HubSpot</code> or <code>Klarna</code>. You can also use a category like <code>Payments</code>. Sites that don't match are not saved and not charged.

## `mustNotUse` (type: `array`):

Drop websites that use any of these, for example <code>HubSpot</code> to find Shopify stores that don't use HubSpot yet.

## `includeDns` (type: `boolean`):

Also look at MX, SPF, TXT and NS records. This finds the email provider (Google Workspace, Microsoft 365), sending services, DNS provider and tools verified on the domain. Recommended.

## `includeDomainInfo` (type: `boolean`):

Also look up the domain age, registrar and expiry date (from the official RDAP registries, where the top-level domain offers it, like .com, .net, .org and .no) and the SSL certificate issuer and expiry.

## `maxResults` (type: `integer`):

Stop after saving this many websites. Use 0 for no limit.

## `maxConcurrency` (type: `integer`):

How many websites to check at the same time.

## Actor input object example

```json
{
  "domains": [
    "vipps.no",
    "allbirds.com",
    "wordpress.org"
  ],
  "includeDns": true,
  "includeDomainInfo": true,
  "maxResults": 0,
  "maxConcurrency": 10
}
```

# Actor output Schema

## `websites` (type: `string`):

One item per website with every technology found.

## `runSummary` (type: `string`):

How many websites were checked, saved and filtered out, and why any could not be checked.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "domains": [
        "vipps.no",
        "allbirds.com",
        "wordpress.org"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("vindr/website-tech-stack-detector").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "domains": [
        "vipps.no",
        "allbirds.com",
        "wordpress.org",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("vindr/website-tech-stack-detector").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "domains": [
    "vipps.no",
    "allbirds.com",
    "wordpress.org"
  ]
}' |
apify call vindr/website-tech-stack-detector --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,vindr/website-tech-stack-detector"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/c865DQXuKmn9Bs4h2/builds/3H8bPWkgIOzC52MBp/openapi.json
