# Website Tech Signal Detector (`replexa/website-tech-signal-detector`) Actor

Detect public website tech stack signals, metadata QA issues, CRM-ready lead tags, and optional stack-change snapshots.

- **URL**: https://apify.com/replexa/website-tech-signal-detector.md
- **Developed by:** [replexa](https://apify.com/replexa) (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

from $1.05 / 1,000 tech signal pages

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/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.

- **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 Tech Signal Detector

Website Tech Signal Detector is a lightweight website technology lookup and lead enrichment Actor. It detects public tech stack signals, compact metadata QA issues, CTA/pricing intent signals, and optional change snapshots from website HTML, script URLs, generator metadata, and HTTP headers.

Paste website URLs, run the Actor, and get one dataset item per website. The output is designed for CRM enrichment, lead scoring, competitor research, website technology audits, technical inventories, and scheduled monitoring where users need clear evidence instead of opaque scoring.

### What It Does

- Detects common public signals for CMS, website builders, ecommerce, analytics, tag managers, CDNs, frameworks, hosting, payments, consent, advertising, marketing automation, monitoring, security, documentation, AI support widgets, and server headers
- Returns evidence explaining why each signal was detected
- Adds confidence values so weak and strong signals can be reviewed differently
- Separates confirmed public technology signals from weaker site hints
- Produces lead-use-case tags such as `wordpress_site`, `shopify_store`, `analytics_installed`, and `cdn_detected`
- Lists unknown script hosts that may be useful for follow-up research
- Adds compact unknown-host summary fields for quick triage
- Adds compact metadata QA for title, description, canonical, Open Graph, Twitter/X card, and JSON-LD signals
- Optionally compares detected technologies, metadata, CTA texts, pricing mentions, and intent tags with a previous snapshot
- Adds `changeSeverity`, `changeSummary`, and `changedFields` for faster competitor or client-portfolio monitoring
- Adds an action-first SEO metadata report with `primaryUseCase`, `topFixPriority`, `nextBestAction`, and `seoActionReport`
- Keeps failed URL rows in the dataset with `request_failed` tags and request error details
- Uses public pages only and avoids browser automation by default for low-cost runs

### Common Use Cases

- Run bulk website technology lookup for prospect lists
- Enrich prospect website lists before CRM import or outbound qualification
- Segment leads by CMS, website builder, ecommerce platform, analytics, CDN, framework, hosting, marketing, payment, consent, or server signals
- Run quick competitor tech stack checks
- Build a lightweight technical inventory for a client portfolio
- Flag websites that need manual follow-up because unknown script hosts were found
- Monitor prospect, customer, or competitor websites for visible stack changes
- Monitor pricing-page, CTA, and metadata changes without configuring selectors
- Turn metadata issues into prioritized fixes instead of reviewing raw fields one by one
- Check whether a website profile has basic SEO and social metadata needed for previews and enrichment

### Input

The only required input is `Website URLs`.

```json
{
  "urls": [
    { "url": "https://example.com" }
  ]
}
```

Advanced settings such as website limit, metadata QA, stack comparison, parallel requests, timeout, and retries are optional. The defaults are intended for a quick first run.

### Output

Each checked website produces one dataset item.

```json
{
  "url": "https://example.com",
  "finalUrl": "https://example.com/",
  "statusCode": 200,
  "title": "Example website",
  "technologies": ["WordPress", "Google Analytics"],
  "categories": ["CMS", "Analytics"],
  "technologyCount": 2,
  "leadUseCaseTags": ["wordpress_site", "analytics_installed"],
  "evidence": [
    {
      "name": "WordPress",
      "categories": ["CMS"],
      "confidence": 0.9,
      "signalStrength": "strong",
      "reason": "wp-content or generator meta"
    }
  ],
  "unknownSignals": [
    {
      "type": "script_host",
      "value": "cdn.example-cdn.com",
      "example": "https://cdn.example-cdn.com/app.js"
    }
  ],
  "unknownSignalCount": 1,
  "topUnknownHosts": ["cdn.example-cdn.com"],
  "siteHints": [],
  "strongSignalCount": 1,
  "mediumSignalCount": 1,
  "weakHintCount": 0,
  "metaTitle": "Example website",
  "metaDescription": "Example website description",
  "canonicalUrl": "https://example.com/",
  "openGraphSummary": {
    "title": "Example website",
    "description": "Example Open Graph description",
    "image": "https://example.com/preview.png",
    "url": "https://example.com/",
    "type": "website"
  },
  "twitterCardSummary": {
    "card": "summary_large_image",
    "title": "Example website",
    "description": "Example Twitter/X card description",
    "image": "https://example.com/preview.png"
  },
  "jsonLdTypes": ["Organization"],
  "jsonLdParseErrors": [],
  "metadataIssues": [],
  "profileCompletenessScore": 100,
  "monitoringProfile": {
    "ctaTexts": ["Start free trial"],
    "pricingMentions": ["$29", "monthly"],
    "intentTags": ["cta_detected", "pricing_signal_detected"]
  },
  "primaryUseCase": "seo_metadata_action_report",
  "topFixPriority": "high",
  "nextBestAction": "Add a meta description that explains the page value in one sentence.",
  "seoActionReport": [
    {
      "fixPriority": "high",
      "issueType": "description",
      "recommendedFix": "Add a meta description that explains the page value in one sentence."
    }
  ],
  "changeStatus": "not_compared",
  "changeSeverity": "none",
  "changeSummary": "Snapshot comparison was not enabled.",
  "changedFields": [],
  "addedTechnologies": [],
  "removedTechnologies": [],
  "previousCheckedAt": "",
  "snapshotKey": "",
  "server": "nginx",
  "poweredBy": "",
  "requestError": "",
  "checkedAt": "2026-08-13T00:00:00.000Z"
}
```

### Pricing Plan

- Pricing model: Pay per event
- Event: `apify-default-dataset-item`
- Event title: `Tech signal page`
- Price: `$0.00105` per website
- Equivalent display: `$1.05 / 1,000 websites`
- Platform usage: included in the event price
- Baseline rule: 30% below the lowest directly comparable paid website technology detector found during pricing research.

### Notes And Limits

Detection is based on public page signals and heuristics. It is useful for enrichment and triage, but it should not be treated as a complete security inventory or guaranteed technology fingerprint. Some technologies leave no public signal, and some websites hide or bundle scripts.

### Responsible Use

Use this Actor only on public pages that you are authorized to inspect. Keep request limits reasonable. Do not use the output for spam, deceptive outreach, unauthorized security testing, or high-impact decisions without manual verification.

# Actor input Schema

## `urls` (type: `array`):

Add public website URLs to analyze, for example `https://example.com`.

## `maxRequestsPerCrawl` (type: `integer`):

Maximum number of websites to process in this run. Leave the default unless you need a larger batch.

## `includeMetadataQa` (type: `boolean`):

Add compact SEO, Open Graph, Twitter/X card, canonical, and JSON-LD QA fields to each website result.

## `compareWithPreviousRun` (type: `boolean`):

Compare detected technologies with the previous snapshot stored under the snapshot key.

## `snapshotKey` (type: `string`):

Optional namespace for technology change snapshots. Use one stable key per monitored list.

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

Maximum number of websites checked at the same time.

## `timeoutSecs` (type: `integer`):

Seconds to wait for each website before timing out.

## `maxRequestRetries` (type: `integer`):

How many times to retry a failed website request.

## Actor input object example

```json
{
  "urls": [
    {
      "url": "https://example.com"
    }
  ],
  "maxRequestsPerCrawl": 20,
  "includeMetadataQa": true,
  "compareWithPreviousRun": false,
  "snapshotKey": "default",
  "maxConcurrency": 5,
  "timeoutSecs": 30,
  "maxRequestRetries": 1
}
```

# Actor output Schema

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

Default dataset items produced by this Actor.

# 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 = {
    "urls": [
        {
            "url": "https://example.com"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("replexa/website-tech-signal-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 = { "urls": [{ "url": "https://example.com" }] }

# Run the Actor and wait for it to finish
run = client.actor("replexa/website-tech-signal-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 '{
  "urls": [
    {
      "url": "https://example.com"
    }
  ]
}' |
apify call replexa/website-tech-signal-detector --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,replexa/website-tech-signal-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/9s887784ah86eWfJZ/builds/U9gf5P45U0SICnlX8/openapi.json
