# Website Tech Stack Checker: CMS, Shopify & Analytics (`vncntlabs/website-tech-stack`) Actor

See which CMS, ecommerce platform, analytics, CDN, payments and marketing tools any website runs, or find domains that use a given technology (Shopify, Printful, Klaviyo...). Licensed DataForSEO index, no scraping. $0.02 per domain lookup; find from $0.05 + $0.003 per match.

- **URL**: https://apify.com/vncntlabs/website-tech-stack.md
- **Developed by:** [VNCNT Labs](https://apify.com/vncntlabs) (community)
- **Categories:** SEO tools, Lead generation, MCP servers
- **Security:** Limited permissions
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $20.00 / 1,000 domain 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?

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 Checker: CMS, Shopify & Analytics

Paste a domain and see **which CMS, ecommerce platform, analytics, CDN, payments and marketing tools it runs**. Or paste a technology name such as **Shopify, Printful, Klaviyo or WordPress** and get a list of matching domains. One clean row per domain, ready for CSV, Sheets or an AI agent.

Licensed technology index (DataForSEO Domain Analytics Technologies). **No scraping of the sites you enter**, no login, no API key of your own. $0.02 per domain lookup; find mode from $0.05 per search plus $0.003 per matching domain.

Built for:

- **POD, merch and Etsy-adjacent sellers**: find Shopify stores on a given app or stack (Printful, Klaviyo, ReCharge...) without a BuiltWith subscription.
- **SEO freelancers and agencies**: a quick competitor tech audit before a pitch or migration.
- **SaaS and agency BD**: build a list of sites on a platform you sell into.
- **Developers and AI agents**: one call returns JSON you can filter and feed into outreach or research.

### What you get

| Row (`type`) | What's in it | Charged |
|---|---|---|
| `domain` (lookup) | `domain`, `title`, `description`, `domainRank`, `country`, `language`, `emails`, `phones`, `socialUrls`, `technologies` (by category), `technologyNames`, plus convenience lists `cms`, `ecommerce`, `analytics`, `marketing`, `cdn`, `payments`, `frameworks`, `servers` | `domain-overview` |
| `domain` (find) | same fields, plus `matchedTechnology` | `bulk-domain` (search itself is `keyword-batch`) |
| `search` | find-mode summary: `technology`, `totalDomains` in the index, `domainsDelivered` | `keyword-batch` when results came back |
| `skipped` | inputs that weren't valid or weren't checked, with the reason | free |

### Input examples

Lookup, five competitor sites:

```json
{ "mode": "lookup", "domains": ["printful.com", "bonfire.com", "prodigi.com", "shopify.com", "klaviyo.com"] }
```

Find Shopify stores (first 50):

```json
{ "mode": "find", "technologies": ["Shopify"], "limit": 50 }
```

Find Printful-powered stores:

```json
{ "mode": "find", "technologies": ["Printful"], "limit": 100 }
```

**Tips**

- Technology names are matched the way the index stores them (`Shopify`, not `shopify`). If a search comes back empty, try the common product spelling.
- Lookup paths on a URL are ignored; you always get whole-domain data.
- The index is refreshed on DataForSEO's schedule, so a site may have changed stack since it was last visited. That is a documented limit, not a live crawl.
- For traffic, ranked keywords and backlinks on the same domains, use [Domain SEO Data](https://apify.com/vncntlabs/domain-seo-data).

### Output example

```json
{
  "type": "domain", "mode": "lookup", "domain": "printful.com",
  "title": "Printful: Print on Demand & Dropshipping",
  "domainRank": 72, "language": "en",
  "ecommerce": ["Shopify"], "cdn": ["Cloudflare"],
  "analytics": ["Google Analytics"], "marketing": ["..."],
  "technologyNames": ["Shopify", "Cloudflare", "Google Analytics", "..."],
  "technologyCount": 18, "emails": ["support@printful.com"]
}
```

The dataset has two views, **Domains** and **Tech stack summary**. Export to CSV, Excel or JSON, or send results to Google Sheets, Slack or email with Apify integrations.

### Pricing (pay per event)

| Event | Price | When it is charged |
|---|---|---|
| Actor start | $0.005 | once per run |
| `domain-overview` ("Domain tech stack") | $0.02 | one domain with tech data in lookup mode |
| `keyword-batch` ("Technology search") | $0.05 | one find-mode search that returned domains |
| `bulk-domain` ("Domain matching technology") | $0.003 | one matching domain delivered in find mode |

So looking up 10 domains costs $0.205. Finding 100 Shopify domains costs $0.355.

You are not charged for:

- domains with no data in the index;
- empty technology searches;
- skipped inputs, and anything beyond your run's maximum charge.

**Apify free plan:** 5 lookup domains, or 1 find search × 10 matching domains, per run. Any paid Apify plan unlocks 1,000 domains / 1,000 matches.

### Use from AI agents (MCP)

AI assistants such as Claude, ChatGPT and Cursor can run this Actor through [Apify's MCP server](https://docs.apify.com/platform/integrations/mcp) (`https://mcp.apify.com`). The agent can look up the Actor, read its input schema, run it and read the results. Runs use your own Apify account and are charged at the prices on this page.

- **Actor name:** `vncntlabs/website-tech-stack`
- **Server URL with only this tool:** `https://mcp.apify.com?tools=vncntlabs/website-tech-stack`
- **Claude** (desktop app or claude.ai): Settings > Connectors > Add custom connector, paste the server URL, then sign in to Apify.
- **ChatGPT:** turn on Developer mode, then Settings > Apps & Connectors > Create, paste the server URL and choose OAuth.
- **Cursor:** run `/add-plugin apify` in Cursor chat and connect the Apify MCP server under Cursor Settings > Tools & MCPs, or add the server to `mcp.json`:

```json
{ "mcpServers": { "apify": { "url": "https://mcp.apify.com?tools=vncntlabs/website-tech-stack" } } }
```

Example prompt: *"Use the Apify Actor vncntlabs/website-tech-stack to list the CMS, ecommerce platform and analytics tools on printful.com and bonfire.com, then find 20 domains that use Printful."*

To cap the cost of an agent's run, it can pass `maxTotalChargeUsd` in the run options.

### FAQ

**Where does the data come from?** DataForSEO's Domain Analytics Technologies index, a licensed database of technologies detected on public websites. This Actor does not visit or scrape the sites you enter.

**Why is a domain showing no data?** Very new or very small sites may not be in the index yet. The row then says `no-data` and you aren't charged for it.

**Can I filter find results by country?** Not in this version. The row includes `country` when the index has it, so you can filter the dataset after the run.

**Is this a BuiltWith or Wappalyzer alternative?** It covers the same job (see a site's stack, or find sites on a stack) with pay-per-result pricing instead of a monthly subscription. Coverage and freshness follow DataForSEO's index.

**Related tools:** [Domain SEO Data](https://apify.com/vncntlabs/domain-seo-data) for traffic and keywords, [Website Contact Scraper](https://apify.com/vncntlabs/website-contact-scraper) for emails and phones on the same list, [Keyword Gap Finder](https://apify.com/vncntlabs/keyword-gap-finder) for content gaps.

Questions or a filter you'd like added? Email hello@vncntlabs.com.

Not affiliated with BuiltWith, Wappalyzer, Shopify, Printful, Klaviyo or DataForSEO.

# Actor input Schema

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

lookup: paste domains or URLs and get each site's CMS, ecommerce, analytics, CDN, payments and more. find: paste a technology name (Shopify, Printful, Klaviyo, WordPress...) and get matching domains.

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

Up to 1,000 domains or URLs per run. One row per domain. Duplicates of the same domain are checked once. Used only in lookup mode.

## `technologies` (type: `array`):

Technology names exactly as the index knows them (Shopify, WooCommerce, WordPress, Klaviyo, Printful, Cloudflare...). Up to 10 per run. Used only in find mode.

## `limit` (type: `integer`):

How many matching domains to return per technology. Default 100. You pay $0.05 per search with results plus $0.003 per domain delivered; empty searches are free.

## Actor input object example

```json
{
  "mode": "lookup",
  "domains": [
    "printful.com",
    "bonfire.com",
    "prodigi.com",
    "shopify.com",
    "klaviyo.com"
  ],
  "limit": 100
}
```

# Actor output Schema

## `domains` (type: `string`):

No description

## `stack` (type: `string`):

No description

## `all` (type: `string`):

No description

## `summary` (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": [
        "printful.com",
        "bonfire.com",
        "prodigi.com",
        "shopify.com",
        "klaviyo.com"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("vncntlabs/website-tech-stack").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": [
        "printful.com",
        "bonfire.com",
        "prodigi.com",
        "shopify.com",
        "klaviyo.com",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("vncntlabs/website-tech-stack").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": [
    "printful.com",
    "bonfire.com",
    "prodigi.com",
    "shopify.com",
    "klaviyo.com"
  ]
}' |
apify call vncntlabs/website-tech-stack --silent --output-dataset

```

## MCP server setup

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

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/uugzIs2hmCH5VSXQw/builds/IA9FYWC73EpdTuPaD/openapi.json
