# Tech Stack & Email Finder - BuiltWith Alternative (`inatanli/tech-stack-detector`) Actor

Find what technology any website runs + contact emails. 7,500+ fingerprints, flat output for Clay, GSheet or your CRM.

- **URL**: https://apify.com/inatanli/tech-stack-detector.md
- **Developed by:** [Ina Li](https://apify.com/inatanli) (community)
- **Categories:** Lead generation, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $6.00 / 1,000 website scanneds

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js/docs.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## Tech Stack & Email Finder - BuiltWith Alternative

**Find out what any website runs — CMS, e-commerce platform, analytics, CRM, marketing pixels, email provider, hosting — plus the emails listed on it. One flat, enrichment-ready row per domain, built for Clay, Attio, and outbound workflows.**

Feed it a list of URLs or bare domains. For each one you get a single record with filterable tech columns (`cms`, `ecommerce`, `crm`, `email_provider`, …), the full detection detail underneath, DNS-derived infrastructure intel, and an `emails[]` array with domain-match flags. A BuiltWith alternative and Wappalyzer alternative priced for list enrichment, not enterprise dashboards.

### What you can do with it

Tech stack is one of the highest-value qualification and segmentation signals in outbound. With one enrichment pass you can:

- **Segment by platform combo** — "all Shopify + Klaviyo shops" → run platform-specific campaign angles
- **Pitch on absence** — "WordPress agencies with *no* chat widget / *no* analytics" → the missing tool becomes the opener
- **Score GTM maturity** — CRM + marketing automation + A/B testing presence tells you how sophisticated an account's stack is
- **See backend infrastructure no pixel reveals** — `email_provider` from MX records (Google Workspace vs Microsoft 365 vs self-hosted)
- **Catch hiring signals** — `recruitment_staffing` (Greenhouse, Lever, …) from career-page infrastructure
- **Clean your list while enriching it** — `is_parked` drops dead domains before you spend sending budget on them
- **Get a contact channel in the same pass** — extracted emails with `domain_match` flags, no second enrichment tool

### Why this instead of the alternatives

| | Price | Output shape | Detection depth | Emails |
|---|---|---|---|---|
| **BuiltWith / Wappalyzer SaaS** | $295–450/mo | Dashboards & exports | Deep, but priced for enterprise | ❌ |
| **Other tech-stack actors (full-breadth)** | $10–100/1k | Tech lists | 6,000–7,500 fingerprints, no email extraction | ❌ |
| **HTTP-only detector actors** | cheap | varies | 45–106 hardcoded techs; miss everything injected after hydration — GTM pixels, SPA markup, network beacons | ❌ |
| **Standalone email finders** | ~$10/1k | Emails only | No tech detection at all | ✅ |
| **This actor** | from $6/1k + usage — no result fee on failed scans | Flat, Clay-ready + full detail | ~7,500 fingerprints, real browser, network interception, DNS | ✅ |

### Output

One row per input URL. **Every field is always present** — scalars null, lists empty, never omitted — so your downstream schema never breaks.

#### Key columns (operator's glossary)

| Column | What it tells you |
|---|---|
| `cms` | Content platform (WordPress, Webflow, …) |
| `ecommerce` | Shop platform (Shopify, WooCommerce, …) |
| `crm` | CRM detected on the site (HubSpot, …) |
| `marketing_automation` | Marketing automation platform |
| `email` | Email marketing/delivery tools (Klaviyo, Mailchimp, …) |
| `email_provider` | Backend mail host from MX records (Google Workspace, Microsoft 365, …) |
| `analytics[]` | Analytics tools |
| `advertising[]` | Ad & pixel tags (Meta Pixel, LinkedIn Insight, …) |
| `retargeting[]` | Retargeting tags |
| `tag_managers` | Tag manager (GTM, …) |
| `live_chat` | Chat widget — absence is a pitch trigger |
| `customer_data_platform` | CDP (Segment, …) |
| `payment_processors[]` | Payment rails (Stripe, PayPal, …) |
| `buy_now_pay_later` / `cart_abandonment` / `shipping_carriers[]` | E-commerce ops maturity |
| `ab_testing` / `personalisation` / `surveys` | Experimentation & CRO maturity |
| `cookie_compliance` | Privacy tooling — strong EU signal |
| `appointment_scheduling` | Calendly etc. — sales-touch motion |
| `form_builders` | Lead-capture stack |
| `reviews` | Social-proof investment |
| `recruitment_staffing` | Hiring infrastructure (Greenhouse, Lever, …) |
| `artificial_intelligence[]` | AI adoption signal |
| `page_builders` | Elementor/Divi — agency-prospecting signal |
| `cdn` / `hosting` | Infrastructure |
| `javascript_frameworks[]` / `web_frameworks[]` | Build stack |
| `has_dmarc` | Email security posture (from TXT) |
| `is_parked` | Parked/dead domain — drop it from your list |
| `tech_count` | Total technologies detected |
| `tech_by_category` | Every native category → detected techs, for anything not covered above |
| `technologies[]` | Full audit detail: name, categories, version, confidence, evidence |
| `emails[]` | `{ email, domain_match, source_path }` |
| `error` / `detection_error_reason` | Honest failure status — see below |

#### Sample row (abridged)

```jsonc
{
  "url": "gymshark.com",
  "domain": "gymshark.com",
  "cms": null,
  "ecommerce": "Shopify",
  "email": "Klaviyo",
  "email_provider": "Google Workspace",
  "analytics": ["Google Analytics"],
  "advertising": ["Meta Pixel", "TikTok Pixel"],
  "tag_managers": "Google Tag Manager",
  "live_chat": null,
  "has_dmarc": true,
  "is_parked": false,
  "tech_count": 24,
  "tech_by_category": { "Ecommerce": ["Shopify"], "Analytics": ["Google Analytics"] /* … */ },
  "technologies": [
    { "name": "Shopify", "categories": ["Ecommerce"], "version": null, "confidence": 100, "evidence": "network:cdn.shopify.com" }
    /* … */
  ],
  "dns": { "mx": ["aspmx.l.google.com"], "ns": ["…"], "txt_verifications": ["google-site-verification"], "cname": null, "dmarc": "v=DMARC1; p=quarantine" },
  "emails": [{ "email": "support@gymshark.com", "domain_match": true, "source_path": "/contact" }],
  "error": false,
  "detection_error_reason": null,
  "cached": false,
  "scanned_at": "2026-07-11T12:00:00.000Z"
}
````

### Use it in Clay

1. In your Clay table, add an **HTTP API** enrichment column.

2. **Method:** `POST` — **URL:**

   ```text
   https://api.apify.com/v2/acts/inatanli~tech-stack-detector/run-sync-get-dataset-items?token={{your Apify API token}}
   ```

3. **Body:**

   ```json
   { "startUrls": ["{{Domain}}"] }
   ```

4. Reference results with dot-notation: `ecommerce`, `email_provider`, `emails[0].email`, or any category via `tech_by_category.Ecommerce`.

5. Gate downstream tables on the flat fields — e.g. only continue where `ecommerce = "Shopify"` and `email = null` (no email marketing tool = your pitch).

Re-runs of the same domains within 7 days are served from cache — fast and cheap. Pass `"skipCache": true` to force fresh scans.

### Use it from an AI agent (MCP)

The actor is callable through [Apify's MCP server](https://mcp.apify.com/), so an agent can answer "what does acme.com run?" inside a loop:

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=inatanli/tech-stack-detector",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}
```

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `startUrls` | array | — | URLs or bare domains; one output row each |
| `proxyConfiguration` | object | Apify auto | Standard proxy config |
| `skipCache` | boolean | `false` | Bypass the 7-day result cache |
| `extractEmails` | boolean | `true` | Disable the contact-page probe for faster, cheaper runs |

### Reading the results

Rows with `error: true` mean the scan failed (`detection_error_reason` says why) — filter them out before treating empty fields as "doesn't use it." Failed scans incur no result fee. And a missing detection isn't proof a tool isn't used: backend-only tools with no public web signal may stay invisible.

***

Technology fingerprints from [enthec/webappanalyzer](https://github.com/enthec/webappanalyzer) (GPL-3.0), refreshed at every image build.

# Actor input Schema

## `startUrls` (type: `array`):

URLs or bare domains to scan. Each entry produces exactly one output row.

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

Proxy settings for the scan. Defaults to Apify automatic proxies.

## `skipCache` (type: `boolean`):

Force a fresh detection, bypassing the 7-day result cache.

## `extractEmails` (type: `boolean`):

Extract publicly listed emails from the scanned page and up to 4 contact-type pages. Disable for faster, cheaper runs.

## Actor input object example

```json
{
  "startUrls": [
    "https://www.clay.com/",
    "https://apify.com"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "skipCache": false,
  "extractEmails": true
}
```

# Actor output Schema

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

One row per input URL with the key tech-stack columns.

# 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 = {
    "startUrls": [
        "https://www.clay.com/",
        "https://apify.com"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("inatanli/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 = {
    "startUrls": [
        "https://www.clay.com/",
        "https://apify.com",
    ],
    "proxyConfiguration": { "useApifyProxy": True },
}

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

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

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

```

## CLI example

```bash
echo '{
  "startUrls": [
    "https://www.clay.com/",
    "https://apify.com"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call inatanli/tech-stack-detector --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=inatanli/tech-stack-detector",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Tech Stack & Email Finder - BuiltWith Alternative",
        "description": "Find what technology any website runs + contact emails. 7,500+ fingerprints, flat output for Clay, GSheet or your CRM.",
        "version": "0.0",
        "x-build-id": "bmCs5vVMutoSYK82x"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/inatanli~tech-stack-detector/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-inatanli-tech-stack-detector",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/inatanli~tech-stack-detector/runs": {
            "post": {
                "operationId": "runs-sync-inatanli-tech-stack-detector",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/inatanli~tech-stack-detector/run-sync": {
            "post": {
                "operationId": "run-sync-inatanli-tech-stack-detector",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "startUrls"
                ],
                "properties": {
                    "startUrls": {
                        "title": "Start URLs",
                        "type": "array",
                        "description": "URLs or bare domains to scan. Each entry produces exactly one output row.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Proxy settings for the scan. Defaults to Apify automatic proxies.",
                        "default": {
                            "useApifyProxy": true
                        }
                    },
                    "skipCache": {
                        "title": "Skip cache",
                        "type": "boolean",
                        "description": "Force a fresh detection, bypassing the 7-day result cache.",
                        "default": false
                    },
                    "extractEmails": {
                        "title": "Extract emails",
                        "type": "boolean",
                        "description": "Extract publicly listed emails from the scanned page and up to 4 contact-type pages. Disable for faster, cheaper runs.",
                        "default": true
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
