# Tech Stack & Contacts Finder - Shopify, Shoptet, WooCommerce (`janhruza/website-technology-detector`) Actor

Detect any website’s ecommerce platform, CMS, payments & email provider + public contacts and Czech company data from ARES. Monitor changes. Cheap BuiltWith alternative.

- **URL**: https://apify.com/janhruza/website-technology-detector.md
- **Developed by:** [Jan Hrůza](https://apify.com/janhruza) (community)
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.00 / 1,000 analyzed websites

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 & Contacts Finder - Shopify, Shoptet, WooCommerce

Find out **what any website is built with** – in bulk. Paste a list of domains and get the ecommerce platform, CMS, analytics, payment gateways, email provider, hosting and 7,700+ other technologies for each one, plus the public contact details (email, phone, social profiles) you need to reach out.

A fast and affordable **BuiltWith and Wappalyzer alternative** – pay only for websites that were analyzed successfully.

### What can it detect?

- 🛒 **Ecommerce platforms** – Shopify, WooCommerce, Magento, PrestaShop, Shoptet, Upgates, Shopware, BigCommerce, Wix Stores…
- 📝 **CMS & site builders** – WordPress, Wix, Squarespace, Webflow, Webnode, Drupal, Joomla…
- 📊 **Analytics & marketing** – Google Analytics 4, Google Tag Manager, Meta Pixel, Hotjar, Klaviyo, Mailchimp, Ecomail…
- 💳 **Payment gateways** – Stripe, PayPal, Adyen, Comgate, GoPay, ThePay…
- 💬 **Live chat & support** – Intercom, Tidio, Smartsupp, LiveChat, Zendesk…
- 📧 **Email provider** (from DNS MX records) – Google Workspace, Microsoft 365, Seznam, Proton…
- 🖥️ **Hosting, CDN & servers** – Cloudflare, AWS, Nginx, WEDOS, Forpsi…
- 🇨🇿 **Czech & Central European tech** that global tools miss – Shoptet, Upgates, Heureka, Sklik (Seznam), Zbozi.cz, Packeta (Zásilkovna), Comgate, GoPay, Foxentry, Persoo, Eshop-rychle, FastCentrik…

Plus **SaaS tools the company uses** (from DNS domain verifications – e.g. Atlassian, HubSpot, Salesforce, Zendesk, OpenAI) and **public contacts**: emails, phone numbers, Facebook / Instagram / LinkedIn / YouTube / TikTok profiles and Czech company IDs (IČO).

🇨🇿 **Czech company details from ARES** – for every website with a Czech company ID, the Actor adds official data from the government register ARES: **company name, legal form, VAT ID, registered address, region, founding date, main business activity and employee count**. A complete B2B lead in one row – no extra charge.

### Use cases

- **Lead generation** – find every store in your list that runs on WooCommerce (or Shopify, or Shoptet) and offer your migration, plugin, theme or agency services.
- **Sales intelligence** – qualify prospects by their tech stack before you call.
- **Competitor research** – see which analytics, payment and marketing tools your competitors use.
- **Market research** – measure the market share of platforms in a country or niche.
- **List enrichment** – add tech stack + contacts columns to your CRM export.

### How to use it

1. Paste domains or URLs into **Websites** (one per line – thousands at once are fine).
2. Optionally fill in **Only output websites using…** (e.g. `Shopify` or `Ecommerce`) to keep only matching websites.
3. Click **Start**. Download results as Excel, CSV, JSON or connect via API / Make / Zapier / n8n.

#### Detection modes

| Mode | What it does | Best for |
|---|---|---|
| **Fast (HTTP)** – default | Downloads HTML, headers, cookies and DNS records | Big lists, ecommerce/CMS/email provider detection |
| **Full browser** | Renders the page in Chrome, also sees technologies injected by JavaScript (30–130 % more technologies in our tests) | Maximum accuracy for marketing tags, chat widgets, JS frameworks. Run with 2 GB+ memory. |

In our tests Full browser mode found **30–130 % more technologies** on ecommerce sites (e.g. tag-manager-loaded marketing tools). Give it at least **2 GB of memory** in Run options.

### Monitor changes (scheduled runs)

Turn on **Monitor changes between runs**, give the list a **Monitor name** (e.g. `clients-prague`) and run the same list regularly with [Apify Schedules](https://docs.apify.com/platform/schedules) – weekly or monthly. Every website then gets:

- `changeStatus` – `new`, `changed`, `unchanged` or `not-compared` (website didn't load, previous snapshot kept)
- `changeSummary` – e.g. *"Ecommerce: WooCommerce -> Shoptet; added: Comgate, Packeta; removed: GoPay"*
- `changes` – the same as structured data: platform / CMS / email provider / hosting changes, `added` and `removed` technologies
- `previousCheckAt` – when the website was checked last time

Turn on **Only output websites that changed** to get just the interesting rows – a ready-made sales signal: a shop that is migrating platforms, switching payment gateways or adding marketing tools is actively investing. Snapshots are stored in a named key-value store in your own Apify account; noisy technologies (CDN, fonts, HTTP/3…) are ignored.

### Cart check

Payment gateways, buy-now-pay-later options and shipping carriers are often visible only in the shopping cart. For ecommerce websites the Actor also opens the cart page linked from the homepage (1 extra request, no extra charge) and adds what it finds there. `cartPageUrl` shows which page was checked.

### Output example

```json
{
  "url": "https://www.example-eshop.cz/",
  "status": "ok",
  "title": "Pánská kosmetika | Example E-shop",
  "ecommercePlatform": "Shoptet",
  "cms": null,
  "emailProvider": null,
  "hosting": null,
  "paymentGateways": [],
  "analytics": ["Facebook Pixel", "Google Ads Conversion Tracking", "Google Analytics", "Google Tag Manager", "Heureka"],
  "liveChat": [],
  "technologyNames": "Shoptet, PHP, Nginx, Facebook Pixel, Google Ads, Google Analytics, Heureka, Sklik (Seznam), Foxentry, …",
  "technologies": [
    { "name": "Shoptet", "version": null, "confidence": 100, "categories": ["Ecommerce"], "website": "https://www.shoptet.cz" },
    { "name": "Google Analytics", "version": "GA4", "confidence": 100, "categories": ["Analytics"], "website": "https://google.com/analytics" }
  ],
  "emails": ["info@example-eshop.cz"],
  "phones": ["+420777000111"],
  "socials": { "facebook": "https://www.facebook.com/exampleeshop/", "instagram": "https://www.instagram.com/exampleeshop/" },
  "companyIds": ["12345678"],
  "companyName": "Example E-shop s.r.o.",
  "companyLegalForm": "Společnost s ručením omezeným",
  "companyVatId": "CZ12345678",
  "companyAddress": "Václavské náměstí 1, 11000 Praha 1",
  "companyCity": "Praha",
  "companyRegion": "Hlavní město Praha",
  "companyFoundedOn": "2015-03-01",
  "companyMainActivity": "Maloobchod prostřednictvím internetu",
  "companyEmployees": "6 - 9 zaměstnanců",
  "companyIsSoleTrader": false,
  "companyMatch": "high",
  "saasTools": ["Atlassian Cloud", "Zendesk"],
  "warning": null
}
```

Websites that could not be loaded are returned with `"status": "error"` and the reason, websites that block bots with `"status": "blocked"` – **neither is charged**.

### Pricing

Pay per event – you pay only for websites that were analyzed successfully:

| Event | Price |
|---|---|
| Website analyzed (Fast HTTP mode) | $4 per 1,000 websites |
| Website analyzed (Full browser mode) | $12 per 1,000 websites |

No subscription, no monthly minimum. Failed, unreachable and bot-blocked (HTTP 4xx/5xx) websites are free. Contact page lookups and DNS checks are included.

### FAQ

**How accurate is it?** Detection uses the open-source Wappalyzer-compatible fingerprint database (7,700+ technologies) extended with our own signatures. Every technology comes with a `confidence` score. Some technologies only appear after JavaScript runs – use Full browser mode for those.

**Where does the company data come from?** From [ARES](https://ares.gov.cz), the official open register of the Czech Ministry of Finance. The Actor only looks up company IDs (IČO) published on the website itself. `companyMatch` says how well the company name fits the website (`high` / `medium` / `low`) – a page can also show the IČO of its web agency or payment provider. `companyIsSoleTrader: true` marks natural persons, whose name and address are personal data.

**Is it legal?** The Actor loads only the public homepage (and, optionally, the contact page) of websites you provide, the same way a regular browser does. It does not log in, bypass protections or download databases. Contact details are only those publicly published by the website owner; you are responsible for processing them in line with GDPR and other laws that apply to you (e.g. legitimate interest for B2B outreach, honoring opt-outs).

**Can I run it on a schedule?** Yes – use Apify Schedules to re-check your list weekly and spot websites that switched platforms.

**Why are some big websites "blocked"?** Large retailers protected by Cloudflare or DataDome sometimes refuse automated requests. Such websites are returned with `status: "blocked"` and are **not charged**. Small and mid-size websites – the usual lead-gen targets – are rarely affected.

**Something is detected wrong or missing?** Open an issue on the Issues tab with the URL – we fix fingerprints quickly.

### Disclaimer

This Actor is provided "as is", without warranty of any kind. Technology detection is based on public signals and may be incomplete or inaccurate. The author's liability is limited to the amount you paid for the run in question. You are solely responsible for how you use the output data.

Fingerprint data: [webappanalyzer](https://github.com/enthec/webappanalyzer) (GPL-3.0).

# Actor input Schema

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

Domains or URLs to analyze, e.g. <code>shopify.com</code> or <code>https://www.example.cz</code>. One per line. Duplicates are removed automatically.

## `mode` (type: `string`):

<b>Fast (HTTP)</b> downloads the page HTML, headers, cookies and DNS records - cheap and fast, detects most platforms. <b>Full browser</b> renders the page in Chrome and also detects technologies loaded by JavaScript (tag managers, chat widgets, frameworks). Browser mode is slower and priced higher. Use at least 2 GB memory for browser mode.

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

Optional filter. Output only websites where at least one of these technologies or categories is detected, e.g. <code>Shopify</code>, <code>WooCommerce</code>, <code>Ecommerce</code>, <code>Live chat</code>. Case-insensitive. Filtered-out websites are still analyzed (and charged).

## `extractContacts` (type: `boolean`):

Extract publicly listed emails, phone numbers, social profiles and Czech/Slovak company IDs (IČO).

## `crawlContactPage` (type: `boolean`):

If the homepage has no e-mail (or, for .cz/.sk websites, no company ID IČO), also look at the contact page and the terms & conditions page (up to 2 extra requests, no extra charge).

## `checkCartPage` (type: `boolean`):

For ecommerce websites, also open the shopping cart to find payment gateways, buy-now-pay-later and shipping carriers that are not visible on the homepage (1 extra request, no extra charge).

## `enrichFromAres` (type: `boolean`):

For websites with a Czech company ID (IČO), add official data from the ARES register: company name, legal form, VAT ID, address, region, founding date, main business activity and employee count. Free, no extra charge.

## `checkDns` (type: `boolean`):

Look up MX/TXT/NS records to detect email provider (Google Workspace, Microsoft 365, Seznam...), DNS/hosting provider and verified SaaS tools.

## `minConfidence` (type: `integer`):

Hide technologies detected with lower confidence (0-100).

## `includeFailed` (type: `boolean`):

Output a row with the error for websites that could not be loaded. Failed websites are never charged.

## `monitorChanges` (type: `boolean`):

Remember each website's technologies and report what changed since the previous run (e.g. 'Ecommerce: WooCommerce -> Shoptet; added: Comgate'). Snapshots are kept in a named key-value store in your account.

## `monitorName` (type: `string`):

Use a different name for each list you monitor, e.g. 'competitors' or 'clients-prague'. Runs with the same name are compared with each other.

## `onlyChanged` (type: `boolean`):

Output only websites whose tech stack changed since the previous run. All websites are still analyzed (and charged).

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

How many websites to analyze in parallel. Browser mode is capped at 5.

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

How long to wait for a single website to respond before giving up. Timed-out websites are not charged.

## `retryBlockedWithProxy` (type: `boolean`):

If a website blocks the request (HTTP 403/429/503) or times out, retry it once through Apify residential proxy. Slower; helps only with some websites. No extra charge.

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

Usually not needed. Use a proxy only if many websites block you.

## Actor input object example

```json
{
  "websites": [
    "www.shoptet.cz",
    "www.wordpress.org",
    "www.allbirds.com"
  ],
  "mode": "http",
  "extractContacts": true,
  "crawlContactPage": true,
  "checkCartPage": true,
  "enrichFromAres": true,
  "checkDns": true,
  "minConfidence": 50,
  "includeFailed": true,
  "monitorChanges": false,
  "monitorName": "default",
  "onlyChanged": false,
  "maxConcurrency": 20,
  "timeoutSecs": 20,
  "retryBlockedWithProxy": false,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

Table with the ecommerce platform, CMS, email provider, key technologies and contacts of each website.

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

Every field for every website, including the full technology list with versions and confidence.

# 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": [
        "www.shoptet.cz",
        "www.wordpress.org",
        "www.allbirds.com"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("janhruza/website-technology-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 = { "websites": [
        "www.shoptet.cz",
        "www.wordpress.org",
        "www.allbirds.com",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("janhruza/website-technology-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 '{
  "websites": [
    "www.shoptet.cz",
    "www.wordpress.org",
    "www.allbirds.com"
  ]
}' |
apify call janhruza/website-technology-detector --silent --output-dataset

```

## MCP server setup

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