# Website Technology Checker by Domain | Launch 30% Off (`winningsolutions/website-technology-stack-lookup`) Actor

Run a website technology checker on your domain list. One row per domain with tech stack names, categories, and last\_visited. Index lookup without fetching the site. No proxy, WHOIS, DNS, or SSL.

- **URL**: https://apify.com/winningsolutions/website-technology-stack-lookup.md
- **Developed by:** [Winning Solutions](https://apify.com/winningsolutions) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $16.50 / 1,000 tech stacks

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?

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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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

## Website Technology Checker: Tech Stack Lookup

A **lookup Actor** that checks detected technologies for your domains at scale. Paste a **domain list** and the Actor turns each entry into a structured tech stack row automatically.

It returns **structured JSON** with **domain**, **technology names**, **categories**, **contact fields**, and **lastVisited**.

Designed for **sales teams, marketers, and agencies**, the Actor delivers categorized index data with an honest data timestamp. Crawl-index lookup. No site fetch. No proxy setup.

> ## Launch price: 30% OFF until 8 November 2026
>
> **Now $16.50 / 1,000 domains.** Regular rate is $24.00 / 1,000 from 8 November 2026.
>
> Same events. Same fields. Lower rate until that date.

> ## Index lookup without site fetch
>
> **No HTTP scan. No proxy field.**
>
> Enter domains and get each tech stack from a crawl index. The Actor does not load the target page. Each row shows technology names, categories, and **lastVisited** so you know the data age.

### Use Cases

- **Enrich** domain lists with technology names and categories for outbound sales
- **Check** website tech stacks on prospect domains before outreach
- **Detect** CMS and frameworks on competitor sites from a domain list
- **Replace** manual one-by-one tech lookups with batch index results
- **Filter** lead lists by stack signals such as WordPress or Shopify

### Index

- [Release Notes](#release-notes)
- [Features](#features)
- [Use Cases](#use-cases)
- [Pricing](#pricing)
- [Input](#input)
- [Input Example](#input-example)
- [API and MCP usage](#api-and-mcp-usage)
- [Output Structure](#output-structure)
- [Output Example](#output-example)

### Release Notes

#### v1.1 - Full index fields

- **Contact fields:** emails, phoneNumbers, and socialGraphUrls on every result row
- **Grouped stack:** technologyGroups, technologyCategories, and fixed category columns

#### v1.0 - Initial public release

- **Domain list input:** Look up up to 100 domains per run from one array field
- **Index lookup:** Tech stacks from crawl index with lastVisited on every result row

### Features

🔍 **Website technology checker:** One dataset row per domain with flat technology names, group rollups, and category columns.

📋 **Domain list input:** Paste domains or URLs. The Actor normalizes hosts and deduplicates exact matches.

📅 **Honest data age:** Every result row includes lastVisited from the crawl index, not a live scan time.

🏷️ **Categorized stack:** Technologies include group and category fields, group rollups, and fixed columns such as cms, ecommerce, and cdn.

⚠️ **Diagnosis rows:** Invalid domains and lookup failures become dataset rows with \_metadata.error instead of silent drops.

🆓 **Free plan guard:** Free plan accounts stop after 10 source calls per run and keep results already written.

📊 **Companion fields:** domainRank, country, language, title, description, emails, phone numbers, and social URLs when the index has them.

### Pricing

> **Launch 30% OFF until 8 November 2026.** $16.50 / 1,000 domains now. $24.00 / 1,000 from 8 November 2026.

#### Launch pricing (until 2026-11-08)

| Cost item | Rate |
| --------- | ---- |
| Tech stack (1 domain) | $16.50 / 1,000 domains |
| Actor start | $0.00005 (infrequent) |
| Apify platform compute (RAM/time) | Billed by Apify platform pricing |

#### Regular pricing (from 2026-11-08)

| Cost item | Rate |
| --------- | ---- |
| Tech stack (1 domain) | $24.00 / 1,000 domains |
| Actor start | $0.00005 (infrequent) |
| Apify platform compute (RAM/time) | Billed by Apify platform pricing |

> **Launch cost per domain: ~$0.0165** (30% OFF $0.024). One billed tech-stack row equals one domain lookup in the default run.

Diagnosis rows and invalid domains are not charged. Only delivered result rows with resultCharged true bill as tech-stack.

#### Free plan limit

Runs from Apify free plan accounts are limited to 10 source calls per run.
The run finishes normally at that point and keeps every result already written.

#### Cost Examples

Based on launch rates in force until 2026-11-08.

**Scenario A: 1 domain**

- Actor start: $0.00005
- 1 domain: $0.0165
- **Total: ~$0.01655**

**Scenario B: 10 domains**

- Actor start: $0.00005
- 10 domains: $0.165
- **Total: ~$0.16505**

**Scenario C: 100 domains**

- Actor start: $0.00005
- 100 domains: $1.65
- **Total: ~$1.65005**

### Input

The Actor accepts the following input parameters (see the **Input** tab in the Apify Console for the full, interactive schema):

| Parameter | Type | Required | Default | Description |
| --------- | ---- | -------- | ------- | ----------- |
| `domains` | array of string | yes | none | Domains to look up. One array entry is one domain or URL. The actor uses the host. It does not fetch the page. Empty values after trim are dropped. Exact duplicate hosts run once. `www` stays part of the host. Max 100 domains per run. More than 100 is rejected. Free plan accounts stop after 10 source calls. |

### Input Example

```json
{
  "domains": ["winning-solutions.de"]
}
```

### API and MCP usage

Runs write **one dataset row per domain**. Fetch rows from the default dataset after the run succeeds (or use the synchronous endpoint below).

**REST (sync, returns dataset items):** replace `YOUR_USERNAME`, `YOUR_API_TOKEN`, and use the same JSON body as in [Input Example](#input-example).

```bash
curl "https://api.apify.com/v2/acts/YOUR_USERNAME~website-technology-stack-lookup/run-sync-get-dataset-items?token=YOUR_API_TOKEN" \
  -X POST \
  -H "Content-Type: application/json" \
  -d '{"domains":["winning-solutions.de"]}'
```

**JavaScript (`apify-client`):**

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

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const input = {
  domains: ['winning-solutions.de'],
};
const run = await client.actor('YOUR_USERNAME~website-technology-stack-lookup').call(input);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

**Apify MCP server (AI agents):** configure your MCP client with URL `https://mcp.apify.com?tools=YOUR_USERNAME~website-technology-stack-lookup` (you can combine multiple tools per [Apify MCP docs](https://docs.apify.com/platform/integrations/mcp)). Pass the API token via your client (for example an `Authorization: Bearer ...` header), not inside the Actor input JSON.

### Output Structure

The Actor returns structured data for each domain. The table below lists the main fields. Optional dataset views in the Apify Console may show a subset.

| Field | Type | Description | Example Value |
| ----- | ---- | ----------- | ------------- |
| `inputDomain` | string | Normalized host sent to the lookup | `winning-solutions.de` |
| `domain` | string | Domain value from the index | `www.winning-solutions.de` |
| `title` | string | null | Page title when present | `Winning Solutions` |
| `description` | string | null | Meta description when present | `Agency site` |
| `metaKeywords` | array | null | Meta keywords when present | `null` |
| `domainRank` | number | null | Domain rank when present | `455` |
| `lastVisited` | string | null | Crawl index timestamp for this domain | `2022-10-10 12:57:46 +00:00` |
| `countryIsoCode` | string | null | Country ISO code when present | `DE` |
| `languageCode` | string | null | Language code when present | `de` |
| `contentLanguageCode` | string | null | Content language when present | `de` |
| `emails` | array of string | Emails from the index. Empty array when none | `["info@example.com"]` |
| `phoneNumbers` | array of string | Phone numbers from the index. Empty array when none | `["+49-261-13490322"]` |
| `socialGraphUrls` | array of string | Social URLs from the index. Empty array when none | `["https://twitter.com/example"]` |
| `technologies` | array of object | Flat list with group, category, and name | `[{"group":"web_development","category":"programming_languages","name":"PHP"}]` |
| `technologyNames` | array of string | Unique technology names in first-seen order | `["PHP","WordPress"]` |
| `technologyCount` | number | Count of unique technology names | `2` |
| `technologyGroups` | array of object | Unique names rolled up by group | `[{"group":"web_development","names":["PHP"],"count":1}]` |
| `technologyCategories` | array of object | Unique names rolled up by group and category | `[{"group":"content","category":"cms","names":["WordPress"],"count":1}]` |
| `cms` | array of string | CMS names. Empty array when none | `["WordPress"]` |
| `analytics` | array of string | Analytics tools. Empty array when none | `[]` |
| `advertising` | array of string | Advertising tools. Empty array when none | `[]` |
| `ecommerce` | array of string | Ecommerce platforms. Empty array when none | `[]` |
| `paymentProcessors` | array of string | Payment processors. Empty array when none | `[]` |
| `javascriptLibraries` | array of string | JavaScript libraries. Empty array when none | `["jQuery"]` |
| `programmingLanguages` | array of string | Programming languages. Empty array when none | `["PHP"]` |
| `webServers` | array of string | Web servers. Empty array when none | `[]` |
| `cdn` | array of string | CDN names. Empty array when none | `["Cloudflare"]` |
| `databases` | array of string | Databases. Empty array when none | `["MySQL"]` |
| `paas` | array of string | PaaS names. Empty array when none | `[]` |
| `marketingAutomation` | array of string | Marketing automation tools. Empty array when none | `[]` |
| `wordpressPlugins` | array of string | WordPress plugins. Empty array when none | `[]` |
| `shopifyApps` | array of string | Shopify apps. Empty array when none | `[]` |
| `security` | array of string | Security tools. Empty array when none | `[]` |
| `_metadata.resultCharged` | boolean | Whether this row was charged | `true` |
| `_metadata.error` | string | null | Present on failure / empty diagnostic rows | *(varies)* |
| `_metadata.errorContext` | string | null | Extra error context when `error` is set | *(varies)* |

#### Output Example

```json
{
  "inputDomain": "winning-solutions.de",
  "domain": "www.winning-solutions.de",
  "title": "Winning Solutions",
  "description": "Agency site",
  "metaKeywords": null,
  "domainRank": 455,
  "lastVisited": "2022-10-10 12:57:46 +00:00",
  "countryIsoCode": "DE",
  "languageCode": "de",
  "contentLanguageCode": "de",
  "emails": ["info@example.com"],
  "phoneNumbers": ["+49-261-13490322"],
  "socialGraphUrls": ["https://twitter.com/example"],
  "technologies": [
    {
      "group": "web_development",
      "category": "programming_languages",
      "name": "PHP"
    },
    {
      "group": "content",
      "category": "cms",
      "name": "WordPress"
    }
  ],
  "technologyNames": ["PHP", "WordPress"],
  "technologyCount": 2,
  "technologyGroups": [
    { "group": "web_development", "names": ["PHP"], "count": 1 },
    { "group": "content", "names": ["WordPress"], "count": 1 }
  ],
  "technologyCategories": [
    { "group": "web_development", "category": "programming_languages", "names": ["PHP"], "count": 1 },
    { "group": "content", "category": "cms", "names": ["WordPress"], "count": 1 }
  ],
  "cms": ["WordPress"],
  "analytics": [],
  "advertising": [],
  "ecommerce": [],
  "paymentProcessors": [],
  "javascriptLibraries": [],
  "programmingLanguages": ["PHP"],
  "webServers": [],
  "cdn": [],
  "databases": [],
  "paas": [],
  "marketingAutomation": [],
  "wordpressPlugins": [],
  "shopifyApps": [],
  "security": [],
  "_metadata": {
    "resultCharged": true,
    "error": null,
    "errorContext": null
  }
}
```

# Actor input Schema

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

Domains to look up. One array entry is one domain or URL. The actor uses the host. It does not fetch the page. Empty values after trim are dropped. Exact duplicate hosts run once. `www` stays part of the host. Max 100 domains per run. More than 100 is rejected. Free plan accounts stop after 10 source calls.

## Actor input object example

```json
{
  "domains": [
    "winning-solutions.de"
  ]
}
```

# Actor output Schema

## `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": [
        "winning-solutions.de"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("winningsolutions/website-technology-stack-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": ["winning-solutions.de"] }

# Run the Actor and wait for it to finish
run = client.actor("winningsolutions/website-technology-stack-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": [
    "winning-solutions.de"
  ]
}' |
apify call winningsolutions/website-technology-stack-lookup --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,winningsolutions/website-technology-stack-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/oTj0sWAchU0woz8sv/builds/zGKjt4JhGfg4M4hg7/openapi.json
