# Tech Stack & Email Provider Detector (Wappalyzer + DNS) (`ecru_kiwi/tech-stack-email-provider-detector`) Actor

Detect 7,600+ website technologies (CMS, ecommerce, analytics, frameworks, CDN) plus the company's email provider, email-sending tools and SaaS stack from public DNS records. Bulk domains, $4 per 1,000.

- **URL**: https://apify.com/ecru\_kiwi/tech-stack-email-provider-detector.md
- **Developed by:** [Vasiliy Klyotskin](https://apify.com/ecru_kiwi) (community)
- **Categories:** Lead generation, Developer tools, SEO tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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

## Tech Stack & Email Provider Detector (Wappalyzer + DNS)

Find out **what any website is built with** and **which SaaS tools the company behind it uses**, in bulk.

For every domain you get:

- **7,600+ website technologies** from the homepage: CMS, ecommerce platform, analytics, tag managers, JavaScript frameworks, CDN, hosting, payment tools, marketing pixels and more, with versions where detectable. It uses the open Wappalyzer fingerprint database.
- **Email provider** from MX records: Google Workspace, Microsoft 365, Zoho, Proofpoint, Mimecast and others.
- **Email-sending tools** from SPF: HubSpot, Salesforce, Marketo, SendGrid, Mailchimp, Zendesk, Postmark, Amazon SES and others.
- **SaaS tools verified in DNS**: Atlassian, DocuSign, Stripe, Slack, OpenAI, Zoom, Miro, Jamf, Loom, Canva and 100+ more. Companies publish these ownership tokens when they roll a tool out company-wide.
- **DMARC policy** and the **TLS certificate issuer**.

DNS signals reveal the internal stack: tools that never appear in a site's HTML but show what the company pays for. HTML-only detectors such as Wappalyzer and BuiltWith-style scrapers can't see them.

### Use cases

- **Lead qualification.** Keep only companies on Microsoft 365, HubSpot users, Shopify stores, WordPress sites and so on.
- **Sales intelligence.** Know a prospect's CRM, helpdesk, email and security stack before the first call.
- **Market research.** Measure technology adoption across thousands of domains.
- **Competitor tracking.** Find who uses a competitor's product by its DNS token or script.
- **Enrichment for AI agents.** Clean, predictable JSON per domain.

### Input

```json
{
  "domains": ["apify.com", "stripe.com", "https://wordpress.org"],
  "includeDns": true,
  "maxConcurrency": 30
}
```

- Bare domains or full URLs are accepted, and duplicates are removed.
- Up to 100,000 domains per run.
- No proxy is needed for most sites.

### Output (one item per domain)

```json
{
  "domain": "apify.com",
  "statusCode": 200,
  "title": "Apify: Marketplace of ready-to-run tools for AI",
  "technologyNames": ["Algolia", "Amazon CloudFront", "Amazon S3", "Amazon Web Services", "HSTS", "HTTP/3", "Leadfeeder"],
  "technologies": [{ "name": "Algolia", "version": "", "categories": ["Search engines"], "website": "https://www.algolia.com" }],
  "categories": { "Analytics": ["Leadfeeder"], "CDN": ["Amazon CloudFront", "Amazon S3"], "Search engines": ["Algolia"] },
  "tls": { "issuer": "Amazon", "subject": "*.apify.com", "notAfter": "2027-01-16T23:59:59Z" },
  "dns": {
    "emailProvider": "Google Workspace",
    "emailSendingServices": ["Amazon SES", "Google Workspace", "HubSpot", "Mailgun"],
    "saasVerifications": ["Google Search Console", "Mixpanel", "OpenAI", "Tito", "Zapier"],
    "hasDmarc": true,
    "dmarcPolicy": "reject",
    "mx": ["aspmx.l.google.com", "..."],
    "spfIncludes": ["_spf.google.com", "mailgun.org", "amazonses.com", "..."],
    "otherVerificationTokens": []
  },
  "error": null
}
```

You can export results as JSON, CSV, Excel, or fetch them through the API, webhooks, Make, Zapier or n8n.

### Pricing

**$4 per 1,000 analyzed domains** ($0.004 per domain), pay per result.

- **No charge for failures.** Domains that don't resolve and have no reachable website are returned with an `error` and are not charged.
- **DNS signals are included** at no extra cost.
- **The cost limit is respected.** Set *Maximum cost per run* and the Actor stops when it is reached.

### FAQ

**How accurate is technology detection?**
It uses the community-maintained Wappalyzer fingerprints on the homepage HTML, headers and cookies, without a browser. That makes it fast and cheap. A few technologies that are only injected by JavaScript after page load can be missed.

**Some sites return 403.**
Some websites block automated traffic. You still get header-based technologies and all DNS signals. You can enable Apify Proxy in the input to retry blocked sites through other IPs.

**Is this legal?**
The Actor reads only public information: a website's public homepage and public DNS records. No logins and no personal data.

**How fast is it?**
Roughly 300 domains in under a minute at the default settings. Unreachable sites are capped by the request timeout.

# Actor input Schema

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

Websites to analyze, one per line. Bare domains (example.com) or full URLs (https://example.com/pricing). Duplicates are removed automatically. Up to 100,000 per run.

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

Reads public MX, SPF, TXT and DMARC records to detect the email provider (Google Workspace, Microsoft 365, ...), email-sending services (HubSpot, SendGrid, Salesforce, ...) and SaaS tools the company verified its domain with (Atlassian, DocuSign, Stripe, Slack, OpenAI, ...). No extra cost.

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

How many websites are analyzed in parallel.

## `requestTimeoutSecs` (type: `integer`):

Timeout for loading each homepage.

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

Optional. Most websites work without a proxy. Use Apify Proxy if many sites block datacenter traffic.

## Actor input object example

```json
{
  "domains": [
    "apify.com",
    "stripe.com",
    "wordpress.org"
  ],
  "includeDns": true,
  "maxConcurrency": 30,
  "requestTimeoutSecs": 15,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

## `results` (type: `string`):

No description

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

// Run the Actor and wait for it to finish
const run = await client.actor("ecru_kiwi/tech-stack-email-provider-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": [
        "apify.com",
        "stripe.com",
        "wordpress.org",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("ecru_kiwi/tech-stack-email-provider-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": [
    "apify.com",
    "stripe.com",
    "wordpress.org"
  ]
}' |
apify call ecru_kiwi/tech-stack-email-provider-detector --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,ecru_kiwi/tech-stack-email-provider-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/mminauqFEjS4vJ9j0/builds/d7FbaYfzaDtskIoNk/openapi.json
