# Website Tech Stack Detector: 280+ Technologies, Leads & Signals (`euroscrape/website-intelligence`) Actor

Detect the tech stack of any website: 280+ technologies (CMS, e-commerce, analytics, cookie consent, booking…), plus company identity from the legal notice (legal name, VAT, directors, emails, phones) and sales signals (outdated WordPress, EOL PHP, no HTTPS, GDPR risks).

- **URL**: https://apify.com/euroscrape/website-intelligence.md
- **Developed by:** [EuroScrape](https://apify.com/euroscrape) (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 $14.00 / 1,000 website analyzeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## Website Tech Stack Detector: 280+ Technologies, Leads & Signals

**Point it at websites, or at a Google search like `plombier Lyon`, and get back everything a sales or agency team needs to qualify and contact the company:**

- 🧩 **Tech stack**: 280+ technologies that matter for small and mid-size businesses. CMS and site builders (WordPress, Wix, Shopify, Jimdo, TYPO3, Webflow…), e-commerce, page builders, analytics, ads pixels, cookie-consent tools, chat, booking, reviews, payment, hosting and CDN. Versions are included where the site exposes them.
- 🏢 **Company identity & contacts**: legal name, legal form, registry numbers (HRB, SIREN, FN, UID, KvK, BCE, CIF, UK company number), VAT IDs, managing directors, address, emails and phones, read from the site's legal notice (Impressum, mentions légales…).
- 🎯 **Sales signals + opportunity score (0–100)**: the concrete reasons to reach out, such as an outdated WordPress, end-of-life PHP, no HTTPS, a site that isn't mobile-friendly, tracking without cookie consent (GDPR), Google Fonts loaded from Google servers (GDPR), a missing legal notice, a DIY site builder, no analytics, an unmaintained site or a slow server.

### ✨ Why this Actor

| | |
|---|---|
| 💸 **Fair price** | The most-used technology lookup on the Store charges **$100 / 1,000 sites** for technologies alone. Here you get technologies + company identity + contacts + sales signals for **$20 / 1,000**. |
| 🎯 **Built for prospecting** | Filter with `onlyWithTechnologies: ["Wix"]` and `minOpportunityScore: 40` to get "companies on Wix with at least two issues, with their manager's name and email" in one run. |
| 🔎 **From keywords to leads** | Type `Tischlerei München` or `dentist Leeds`. Directories and marketplaces (Yelp, Gelbe Seiten, Pages Jaunes, Yoojo…) are skipped, so you get real company websites. |
| 📅 **Always current** | "Outdated WordPress" and "end-of-life PHP" are computed on every run from WordPress.org and official PHP end-of-life dates, not from a stale list. |
| 🇪🇺 **Europe-aware** | GDPR signals (consent tool, Google Fonts), and legal-notice parsing in German, French, English, Dutch, Italian and Spanish. |
| 🧾 **Evidence included** | Every detected technology comes with where it was seen (meta tag, header, cookie, asset, HTML). Detection reads the site's code, never its visible text: an agency writing "we build Shopify stores" is not reported as a Shopify store. |

### 🎯 Use cases

- **Web and marketing agencies**: find local businesses with an outdated or DIY website, no analytics or GDPR issues, and contact the manager with a concrete argument.
- **SaaS and tech sales**: build lists of companies using (or not using) a technology, for example Shopify stores with no reviews app, or restaurants with no online booking.
- **Market research**: technology market share in a sector or city.
- **Compliance and security consultants**: spot EOL PHP, expired or expiring SSL certificates and missing legal notices.

### 🚀 Examples

**Agency prospecting in Lyon:**

```json
{ "searchQueries": ["plombier Lyon", "électricien Lyon"], "searchCountry": "fr", "resultsPerQuery": 30, "minOpportunityScore": 30 }
```

**All Wix and Jimdo sites among your list:**

```json
{ "websites": ["example-bakery.de", "example-garage.fr"], "onlyWithTechnologies": ["Wix", "Jimdo"] }
```

### 📦 Output (a real website; personal and registry details hidden here)

```json
{
  "domain": "lyon.plomberie-roche.fr",
  "finalUrl": "https://lyon.plomberie-roche.fr/",
  "platformSummary": "WordPress 6.9.9 + Elementor + Divi",
  "cms": "WordPress",
  "technologyNames": [
    "WordPress",
    "Elementor",
    "Divi",
    "Gutenberg blocks",
    "Yoast SEO",
    "Contact Form 7",
    "WPForms",
    "WP Rocket",
    "jQuery",
    "Font Awesome",
    "Google Fonts",
    "Google Maps"
  ],
  "opportunityScore": 29,
  "salesSignals": [
    {
      "code": "outdated_wordpress",
      "severity": 2,
      "label": "Outdated WordPress 6.9.9 (latest 7.1.2): security and maintenance risk."
    },
    {
      "code": "google_fonts_gdpr",
      "severity": 1,
      "label": "Google Fonts loaded from Google servers: GDPR risk in the EU (German court rulings)."
    },
    {
      "code": "no_analytics",
      "severity": 1,
      "label": "No analytics detected: they cannot measure their marketing."
    }
  ],
  "audit": {
    "https": true,
    "responseTimeMs": 203,
    "mobileViewport": true,
    "sslDaysLeft": 50,
    "cmsVersion": "WordPress 6.9.9",
    "latestWordPress": "7.1.2",
    "phpVersion": null,
    "phpEndOfLife": null,
    "copyrightYear": 2026,
    "trackers": [],
    "consentTools": [],
    "googleFontsExternal": true
  },
  "companyName": "ETS Roche Père & Fils",
  "legalForm": "SAS",
  "registrations": [
    {
      "type": "FR_SIRET",
      "value": "813708252000XX"
    },
    {
      "type": "FR_SIREN",
      "value": "8137082XX"
    }
  ],
  "vatIds": [
    "FR708137082XX"
  ],
  "managingDirectors": [
    "…"
  ],
  "primaryEmail": "…@live.fr",
  "phones": [
    "+33 4 …"
  ],
  "country": "FR",
  "technologies_sample": [
    {
      "name": "WordPress",
      "category": "cms",
      "version": "6.9.9",
      "evidence": [
        "meta:generator",
        "html"
      ]
    },
    {
      "name": "Elementor",
      "category": "page-builder",
      "version": "4.3.2",
      "evidence": [
        "asset",
        "html"
      ]
    }
  ]
}
```

### 🔍 Sales signals

| Code | Severity | Meaning |
|---|---|---|
| `no_https` | 3 | Not served over HTTPS |
| `not_mobile_friendly` | 3 | No mobile viewport |
| `eol_php` | 3 | PHP version past end-of-life |
| `outdated_wordpress` | 2 | WordPress two or more minor versions behind |
| `trackers_without_consent` | 2 | Analytics or ads pixels without a detectable consent tool (EU) |
| `no_legal_notice` | 2 | No Impressum / mentions légales (EU) |
| `stale_website` | 2 | Footer copyright two or more years old |
| `slow_server` | 2 | First byte after more than 1.5 s |
| `ssl_expiring` | 2 | SSL certificate expires within 21 days |
| `google_fonts_gdpr` | 1 | Google Fonts loaded from Google servers (EU) |
| `diy_builder` | 1 | Built with Wix, Jimdo, IONOS or a similar builder |
| `no_analytics` | 1 | No analytics at all |
| `outdated_jquery` / `no_meta_description` | 1 | Security and SEO basics |

The `opportunityScore` adds these up, capped at 100.

### 💰 Pricing

| Event | Price |
|---|---|
| Website analyzed (tech + signals + identity & contacts) | **$20 / 1,000 websites** |
| Google search page (10 results) | $4 / 1,000 pages |
| Run start | $0.003 |

Unreachable websites and parked domains (for sale) are free.

### ❓ FAQ

- **Why could a website be reported as unreachable when it works in my browser?** Many small European websites block foreign servers. The Actor automatically retries those through a residential connection in the website's country; only websites that are really down, parked or not HTML stay unreachable (and are free).
- **Is the "slow server" signal reliable?** Response time (time to first byte) is measured on a separate thread so the analysis itself never skews it, and it is not reported when the site had to be reached through a proxy.
- **What if I set a maximum cost or a short timeout?** The Actor stops cleanly before either limit: every website you are charged for is delivered, nothing is charged for work that could not finish, and the run ends as *Succeeded* with a message telling you how many websites are left.
- **How does detection work?** It uses EuroScrape's own curated signature database, matched on HTML, scripts, meta tags, HTTP headers and cookies. There's no browser, so it's fast and cheap. Technologies injected later through Google Tag Manager can't always be seen.
- **Is it legal?** It only reads public pages, the same way a browser does. Contact details come from legal notices that companies must publish by law. Use personal data (manager names) in line with the GDPR.

### ⭐ Your feedback

If this Actor saves you time, a short review on Apify Store helps other users find it. Missing a field, a country or a filter? Say it in your review: the most requested features are added first.

### 🔗 More from EuroScrape

- [EU VAT Number Validator (VIES): Bulk Check, Proof & Alerts](https://apify.com/euroscrape/vat-validator): validate VAT numbers in bulk against the EU's official registry, with consultation proof for tax audits and alerts when a customer's number becomes invalid.
- [App Store Reviews Scraper + Google Play Reviews](https://apify.com/euroscrape/app-reviews): reviews from both stores in 58 countries, rating by version and country, alerts on new negative reviews.
- [EU Public Tenders Scraper: TED, BOAMP & Awards](https://apify.com/euroscrape/eu-public-tenders): open tenders and contract awards from all of Europe (TED) and France (BOAMP, DECP), with winners per lot, values in € and daily alerts.
- [Impressum & Legal Notice Scraper (EU)](https://apify.com/euroscrape/company-identity): legal identity, registry numbers and VAT IDs from any website, registry-verified.
- [French Companies Scraper (SIRENE)](https://apify.com/euroscrape/france-companies): every French company by activity, area and size, with verified websites and emails.
- [UK Companies House Scraper](https://apify.com/euroscrape/uk-companies): UK companies by SIC code and location, with directors, websites and emails.
- [Kleinanzeigen Scraper: Deal Finder & Price-Drop Alerts](https://apify.com/euroscrape/kleinanzeigen-scraper): German classifieds with a deal score and instant alerts.
- [EU Second-Hand Marketplaces Scraper: Vinted, OLX & More](https://apify.com/euroscrape/eu-marketplace-deals): one search on the top second-hand marketplace of 18 European countries, prices in €, cheapest country and resale margin.
- [Google Hotels Scraper: Prices from Every Booking Site](https://apify.com/euroscrape/google-hotels-prices): hotel prices for any destination and dates, with the price on every booking site, rate parity, price calendars and alerts.
- [Google Flights Scraper: Cheapest Dates, Prices & Price History](https://apify.com/euroscrape/google-flights-prices): flight prices for any route and dates, cheapest day to fly, typical price range, CO2 and price-drop alerts.
- [Vinted Scraper: 26 Countries, Deals, Alerts & Seller Data](https://apify.com/euroscrape/vinted-scraper): search Vinted across 26 countries, prices with buyer fees, seller ratings, cheapest-country comparison and instant alerts on new listings.
- [France Real Estate Sold Prices (DVF): €/m², Sales & Trends](https://apify.com/euroscrape/france-property-prices): every property sale registered by the French State — real prices, €/m², addresses, GPS, market trends per city and alerts on new sales.

# Actor input Schema

## `websites` (type: `array`):

Websites or domains to analyze, one per line (e.g. "example.com").

## `searchQueries` (type: `array`):

Find company websites with Google, e.g. "plombier Lyon", "Tischlerei München", "dentist Leeds". Directories are skipped.

## `searchCountry` (type: `string`):

Google country and language for search queries.

## `resultsPerQuery` (type: `integer`):

Google results to check per query (10 per page).

## `onlyWithTechnologies` (type: `array`):

Keep only websites using at least one of these technologies or categories, e.g. "WordPress", "Shopify", "Wix", "ecommerce", "booking", "consent".

## `minOpportunityScore` (type: `integer`):

Keep only websites with at least this many problems/opportunities (0–100), e.g. 30 for agency prospecting.

## `includeIdentity` (type: `boolean`):

Read the legal notice (Impressum, mentions légales…) to get the legal name, registry numbers, VAT IDs, managing directors, emails and phones.

## `verifyInRegistry` (type: `boolean`):

Check French SIREN and UK company numbers against the official registers (status, official name).

## `maxWebsites` (type: `integer`):

Maximum number of websites to analyze.

## Actor input object example

```json
{
  "websites": [
    "pelissard.fr",
    "fenster-veidt.de",
    "allbirds.com"
  ],
  "searchCountry": "fr",
  "resultsPerQuery": 20,
  "includeIdentity": true,
  "verifyInRegistry": false,
  "maxWebsites": 500
}
```

# Actor output Schema

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

Platform, opportunity score, company and contacts.

## `technologies` (type: `string`):

Full tech stack per website.

## `leads` (type: `string`):

Contacts with the reasons to reach out.

## `runSummary` (type: `string`):

Counters for this run (items found, output, errors).

# 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 = {
    "websites": [
        "pelissard.fr",
        "fenster-veidt.de",
        "allbirds.com"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("euroscrape/website-intelligence").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 = { "websites": [
        "pelissard.fr",
        "fenster-veidt.de",
        "allbirds.com",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("euroscrape/website-intelligence").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 '{
  "websites": [
    "pelissard.fr",
    "fenster-veidt.de",
    "allbirds.com"
  ]
}' |
apify call euroscrape/website-intelligence --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,euroscrape/website-intelligence"
        }
    }
}
```

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/eI4wwLGYCzF8VMyLi/builds/0YvcaIchV42JJA1VQ/openapi.json
