# Website Tech Stack & Domain Lookup (DNS, SSL, WHOIS) (`dima_kadirovich/tech-stack-domain-lookup`) Actor

For any list of domains: technologies used (CMS, e-commerce, analytics, CDN, hosting), email provider, SPF/DMARC, SaaS tools from DNS verification records, SSL expiry, and WHOIS/RDAP registrar and domain age. $2 per 1,000 domains, all in one.

- **URL**: https://apify.com/dima\_kadirovich/tech-stack-domain-lookup.md
- **Developed by:** [Cronexa Data Tools](https://apify.com/dima_kadirovich) (community)
- **Categories:** Lead generation, MCP servers, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 domains

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 & Domain Lookup do?

Give it a list of domains, and for **each domain** you get:

- 🧩 **Technologies used on the website**: CMS, e-commerce platform, analytics, tag managers, CDN, hosting, frameworks, payment processors, marketing tools, live chat and cookie consent. **7,600+ technologies** are recognized, with versions when available.
- 📧 **Email setup**: email provider (Google Workspace, Microsoft 365, Proofpoint…), SPF record, **DMARC policy**
- 🔎 **SaaS tools the company uses**, read from DNS verification records (for example Atlassian, Stripe, Miro, HubSpot, OpenAI). This is a strong buying-intent signal that most tech lookup tools don't show.
- 🔒 **SSL certificate**: valid or not, issuer, expiry date and **days until expiry**
- 🗓️ **WHOIS / RDAP**: registrar, creation and expiry dates, **domain age**, status, nameservers, and whether the domain is **available to register**
- 🌐 Page title, description, language, server, response time, and the company's **social profiles**

All in **one row per domain**, for **$2 per 1,000 domains**, with platform usage included.

### Who is it for?

- **Sales & lead generation**: find every Shopify, WordPress or HubSpot user in your lead list, and qualify accounts by stack, email provider and company age
- **Agencies**: pre-qualify prospects (for example "WordPress sites without Google Tag Manager")
- **Market research**: technology adoption across a list of competitors or an industry
- **IT & security teams**: SSL expiry monitoring, SPF/DMARC coverage and registrar checks across all your domains
- **Domain investors**: bulk domain age, expiry and availability

### How do I use it?

1. Paste your domains (one per line) into **Domains or website URLs**. `example.com`, `www.example.com` and full URLs all work.
2. Keep all checks on, or turn off the ones you don't need.
3. Click **Start**, then download the results as **CSV, Excel or JSON**. The table view shows CMS, e-commerce, hosting, email, SSL days left, registrar and domain age as columns.

#### Example input

```json
{
  "domains": ["allbirds.com", "wordpress.org", "github.com"],
  "detectTechnologies": true,
  "dnsLookup": true,
  "sslCheck": true,
  "whoisLookup": true
}
```

### Output example

A real result for `allbirds.com` (shortened):

```json
{
  "domain": "allbirds.com",
  "finalUrl": "https://www.allbirds.com/",
  "httpStatus": 200,
  "title": "Allbirds: Comfortable, Sustainable Shoes & Apparel",
  "ecommerce": [
    "Shopify"
  ],
  "cms": [],
  "cdn": [
    "Cloudflare"
  ],
  "tagManagers": [
    "Google Tag Manager"
  ],
  "hosting": [],
  "technologyNames": [
    "Apple iCloud Mail",
    "Cloudflare",
    "Cursor",
    "DocuSign",
    "Google Tag Manager",
    "HSTS",
    "HTTP/3",
    "Let's Encrypt",
    "Microsoft 365",
    "Miro",
    "Shopify"
  ],
  "emailProvider": "Microsoft 365",
  "spf": "v=spf1 include:allbirds_com._es.easydmarc.com include:spf.protection.outlook.com ~all",
  "dmarcPolicy": "quarantine",
  "verifiedServices": [
    "apple-domain",
    "cursor-domain",
    "google-site",
    "miro",
    "rippling-domain"
  ],
  "ssl": {
    "valid": true,
    "issuer": "Let's Encrypt",
    "issuerCommonName": "YE1",
    "validFrom": "2026-08-11",
    "validTo": "2026-11-09",
    "daysUntilExpiry": 40
  },
  "whois": {
    "available": false,
    "registrar": "MarkMonitor Inc.",
    "createdDate": "2002-01-09",
    "expiresDate": "2028-01-09",
    "updatedDate": "2025-12-08",
    "domainAgeYears": 24.7,
    "status": [
      "client delete prohibited",
      "client transfer prohibited",
      "client update prohibited",
      "server delete prohibited",
      "server transfer prohibited",
      "server update prohibited"
    ],
    "nameservers": [
      "ns1.markmonitor.com",
      "ns2.markmonitor.com",
      "ns3.markmonitor.com",
      "ns4.markmonitor.com",
      "ns5.markmonitor.com"
    ]
  },
  "technologies": [
    {
      "name": "Shopify",
      "categories": [
        "Ecommerce"
      ],
      "version": null,
      "confidence": 100,
      "website": "https://shopify.com",
      "saas": true,
      "openSource": null,
      "detectedVia": "website"
    }
  ]
}
```

Each technology has `detectedVia`: `website` (found on the site itself) or `dns` (a service the company uses, found in its DNS records). The summary columns (`cms`, `ecommerce`, `analytics`…) only use technologies found on the website.

### How much does it cost?

| What | Price |
|---|---|
| Domain looked up | **$0.002** ($2 per 1,000 domains) |
| Invalid input (not a domain) | **Free** |
| Platform usage | **Included** |

Technologies, DNS, email, SSL and WHOIS are all included in that one price.

### Good to know

- Technologies are detected from the page HTML, headers, cookies, script URLs, meta tags, DNS records and the SSL issuer. Technologies that are only visible after JavaScript runs in a browser may be missed.
- Some big brands block automated visits. Those rows have `websiteBlocked: true`; DNS, SSL and WHOIS data still work for them.
- WHOIS data comes from **RDAP**, the official modern replacement for WHOIS, queried directly at each registry.
- Personal registrant data is not collected. Most registries hide it anyway.

### Credits

Technology fingerprints come from [webappanalyzer](https://github.com/enthec/webappanalyzer) (GPL-3.0), a community-maintained successor of Wappalyzer's open-source fingerprints.

### Questions or problems?

Open an issue in the **Issues** tab, and it will be answered quickly.

### Use it from AI assistants (Claude, ChatGPT, Cursor)

AI agents can run this Actor as a tool through the [Apify MCP server](https://mcp.apify.com). Add this to your MCP client (Claude Desktop, Claude Code, Cursor, VS Code…) and sign in with Apify in the browser when asked:

```json
{
  "mcpServers": {
    "tech-stack-domain-lookup": { "url": "https://mcp.apify.com?tools=dima_kadirovich/tech-stack-domain-lookup" }
  }
}
```

Then just ask, for example:

- *"Which of these 20 domains use Shopify, and which email provider does each one use?"*
- *"Check SSL expiry and DMARC policy for all our company domains and flag problems."*

The agent fills in the input, runs the Actor and reads the results. You pay the same per-result price.

### More tools from Dima Data Tools

- [Medium Articles Scraper & Monitor](https://apify.com/dima_kadirovich/medium-articles-scraper): Medium articles by tag, author, or publication as clean Markdown, with "only new" monitoring
- [Bulk Image Downloader](https://apify.com/dima_kadirovich/bulk-image-downloader): every image from any web page, as download links or ZIP, with duplicates and icons removed
- [Website SEO Audit & Broken Link Checker](https://apify.com/dima_kadirovich/website-seo-audit): crawl a site, score every page 0–100, find broken links, and get a shareable HTML report
- [Website to Markdown Crawler for AI](https://apify.com/dima_kadirovich/website-to-markdown): any website as clean main-content Markdown, with RAG chunks, llms.txt, and a cheap "only changed pages" refresh mode

# Actor input Schema

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

One per line: `example.com`, `www.example.com`, or `https://example.com/page`. Paste thousands at once with Bulk edit.

## `detectTechnologies` (type: `boolean`):

Find the CMS, e-commerce platform, analytics, tag managers, CDN, hosting, frameworks, payment and marketing tools (7,600+ technologies).

## `dnsLookup` (type: `boolean`):

A/AAAA/MX/NS/TXT/CNAME records, email provider (Google Workspace, Microsoft 365...), SPF, DMARC policy, and SaaS tools found in DNS verification records.

## `sslCheck` (type: `boolean`):

Certificate validity, issuer, expiry date and days until expiry.

## `whoisLookup` (type: `boolean`):

Registrar, creation and expiry dates, domain age, status, nameservers, and whether the domain is available to register.

## `proxyConfiguration` (type: `object`):

Only needed if websites block the lookups.

## Actor input object example

```json
{
  "domains": [
    "allbirds.com",
    "wordpress.org",
    "github.com"
  ],
  "detectTechnologies": true,
  "dnsLookup": true,
  "sslCheck": true,
  "whoisLookup": true,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `domains` (type: `string`):

One row per domain: technologies, email provider, SPF/DMARC, SaaS tools, SSL, WHOIS/RDAP.

# 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": [
        "allbirds.com",
        "wordpress.org",
        "github.com"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("dima_kadirovich/tech-stack-domain-lookup").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": [
        "allbirds.com",
        "wordpress.org",
        "github.com",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("dima_kadirovich/tech-stack-domain-lookup").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": [
    "allbirds.com",
    "wordpress.org",
    "github.com"
  ]
}' |
apify call dima_kadirovich/tech-stack-domain-lookup --silent --output-dataset

```

## MCP server setup

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

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/T8uVxwxh1wg52tAnd/builds/JLf2F9TuglcCDg38C/openapi.json
