# Tech Stack Detector - Wappalyzer & BuiltWith Alternative (`scrapewise/tech-stack-detector`) Actor

Detect the tech stack of any website in bulk: CMS, ecommerce, analytics, CDN, JS frameworks, servers, payments, chat, tag managers, email provider. 7,600+ fingerprints with versions, confidence and DNS signals. $3 per 1,000 sites, offline sites free.

- **URL**: https://apify.com/scrapewise/tech-stack-detector.md
- **Developed by:** [Scrapewise Data](https://apify.com/scrapewise) (community)
- **Categories:** Developer tools, SEO tools, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.30 / 1,000 website tech stack detecteds

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

## Tech Stack Detector - Wappalyzer & BuiltWith Alternative

Paste a list of websites and get the technology stack of each one as clean JSON, CSV or Excel: CMS, ecommerce platform, analytics, tag manager, CDN, hosting, JavaScript framework, web server, programming language, payment processor, live chat, marketing automation, CRM and the email provider behind the domain, with versions and a confidence score. **US$ 3 per 1,000 websites, no monthly fee, and websites that are offline or blocked are free.**

It is a pay-per-use **Wappalyzer alternative** and **BuiltWith alternative** for sales and lead generation teams, agencies auditing client portfolios, market researchers and AI agents that need technographic data in bulk, from a spreadsheet, a CRM export or an automation, without a subscription.

### At a glance

| | This Actor | nexgendata/wappalyzer-replacement (most used for this term) |
|---|---|---|
| Price per 1,000 websites, Free plan | **US$ 3.00** | US$ 100.00 |
| Price per 1,000 websites, Gold plan and above | **US$ 2.30** | US$ 100.00 (same on every plan) |
| Offline, blocked or invalid websites | Returned with an `errorCode`, not charged | Not stated on its page |
| DNS signals (email provider, SaaS verification records) | Included, same price | Not stated on its page |
| Users in the last 30 days | 1 (published 2026-09-15) | 1,221 |
| Store rating | No reviews yet | No reviews yet |
| Public run success, last 30 days | No public runs yet; 22 of our 22 test runs succeeded | 100.0% (12,676 of 12,679) |

Competitor figures were read from the public Apify API (`api.apify.com/v2/store?search=wappalyzer`) on **2026-09-15** and change every day; the Store page always shows the live number. Across the ten most relevant Actors for "tech stack" that day, prices ran from about US$ 1 to US$ 100 per 1,000 websites, several of them with an extra fee of up to US$ 0.10 charged on every run start.

### In one call

Minimal input:

```json
{ "urls": ["wordpress.org", "www.shopify.com", "github.com"] }
```

One real row from a test run of 2026-09-15, with the `technologyNames` list and the summary columns trimmed (the full item is under "Output" below):

```json
{
  "url": "https://vercel.com/",
  "domain": "vercel.com",
  "statusCode": 200,
  "technologyCount": 12,
  "technologyNames": ["Amazon S3", "Amazon Web Services", "Google Workspace", "Next.js", "React", "Vercel", "Webpack"],
  "cms": null,
  "ecommerce": null,
  "analytics": "Linkedin Insight Tag",
  "cdn": "Amazon S3",
  "hosting": "Amazon Web Services, Vercel",
  "javascriptFrameworks": "Next.js, React",
  "emailProviders": "Google Workspace",
  "errorCode": null,
  "scrapedAt": "2026-09-15T18:54:11.654119+00:00"
}
```

### What you can do with it

- **Lead generation:** take 10,000 domains from a directory or a Google Maps export and keep only the stores running Shopify, WooCommerce or Magento, or only the sites that use HubSpot, Intercom or Stripe.
- **Sales intelligence:** enrich accounts in your CRM with the tools they already pay for (Salesforce, Zendesk, Microsoft 365 or Google Workspace) before the first call, and route leads by stack.
- **Competitor research:** see which analytics, A/B testing, CDN, payment and chat tools your competitors use, and schedule a monthly run to catch migrations.
- **Agencies and freelancers:** audit a client portfolio in one run: outdated WordPress or jQuery versions, missing tag manager, no CDN.
- **Market research:** measure the adoption of a platform across a country, an industry list or the top sites of a niche.
- **Security and IT inventory:** list the web servers, frameworks and exposed versions across your own domains.

### What it detects

**7,600+ technologies in 109 categories**, from the open fingerprint rules that power Wappalyzer, plus DNS rules written for this Actor. Every website is checked against:

| Signal | Examples of what it reveals |
|---|---|
| HTTP headers | Nginx 1.25, Apache, Cloudflare, Vercel, Varnish, PHP version from X-Powered-By, Next.js |
| Cookies | Shopify, Google Analytics (GA4 or UA), HubSpot, Stripe, Laravel, ASP.NET |
| Meta tags | WordPress 6.x generator, Drupal, Joomla, Wix, Squarespace, Shopify checkout tokens |
| Script URLs | React, Vue.js, jQuery 3.7.1, Google Tag Manager, Hotjar, Klaviyo, Intercom, Algolia |
| Inline scripts and HTML | Next.js, Nuxt, Gatsby, Magento, PrestaShop, Webflow, Tailwind CSS |
| DOM selectors (on the page HTML) | WooCommerce, Elementor, Stripe checkout links, cookie banners |
| DNS MX, SPF, NS, SOA, CNAME | Google Workspace, Microsoft 365, Zoho Mail, Proofpoint, Mimecast, SendGrid, Amazon SES, Mailchimp, Cloudflare DNS, Route 53, GoDaddy |
| DNS verification records | Atlassian, Slack, Zoom, Stripe, Salesforce, DocuSign, OpenAI and ~100 more SaaS tools the company verified its domain with |

The DNS part is what browser extensions miss: the email provider and the SaaS tools a company uses never show on its home page, but they are published in its DNS records. Verification records are returned in a separate `dnsVerifications` list so they do not mix with the website stack.

### Quick start

1. Paste domains or URLs in **Websites**, one per line. `example.com`, `www.example.com` and `https://example.com/pricing` all work.
2. Click **Start**.
3. Open the **Overview** tab, or download JSON, CSV, Excel or HTML.

```json
{
  "urls": ["wordpress.org", "www.shopify.com", "github.com"],
  "categoriesFilter": [],
  "checkDns": true,
  "maxConcurrency": 20
}
```

### Input

| Field | Type | Default | What it does |
|---|---|---|---|
| `urls` | array of strings | 3 examples | Websites to analyze. Duplicates are analyzed once. |
| `maxItems` | integer | empty (all) | Stop after this many websites. |
| `categoriesFilter` | array of strings | empty (all) | Keep only these categories, e.g. `CMS`, `Ecommerce`, `Analytics`, `CDN`, `JavaScript frameworks`, `Payment processors`. |
| `minConfidence` | integer 0-100 | 50 | Drop weak detections. |
| `includeVersions` | boolean | true | Extract version numbers when exposed. |
| `checkDns` | boolean | true | Read MX, TXT, NS, SOA and CNAME records. |
| `legacyFieldNames` | boolean | false | Also write `status_code`, `final_url`, `tech_count`, `tech_names`, `scan_time_ms`. |
| `timeoutSecs` | integer 3-60 | 20 | Time to wait for each website. |
| `maxConcurrency` | integer 1-100 | 20 | Websites analyzed in parallel. |
| `proxyConfiguration` | object | Apify Proxy | Used for retries: the first request goes out directly, a blocked or failed website is retried through the proxy and then with a Chrome-like client. |

#### Switching from another tech stack Actor

You do not need to change your integration. The Actor also reads `startUrls` (plain strings or `{"url": ...}` objects, including uploaded files), `domains`, `websites`, `targetUrls`, `startDomains` (the BuiltWith Actor name), `url` (one string, or several separated by commas or new lines), and the snake\_case options `categories_filter`, `include_versions`, `include_confidence` and `timeout_seconds`. When a snake\_case option is present, the snake\_case output fields are added automatically.

### Output

One item per website. This is a real item from a test run on 15/09/2026, shortened only in the `technologies` list (5 of 12) and the `categories` object (5 of 12):

```json
{
  "url": "https://vercel.com/",
  "inputUrl": "vercel.com",
  "finalUrl": "https://vercel.com/",
  "domain": "vercel.com",
  "statusCode": 200,
  "redirectChain": [],
  "title": "Agentic Infrastructure - Vercel",
  "language": "en",
  "technologyCount": 12,
  "technologyNames": ["Amazon S3", "Amazon Web Services", "Google Workspace", "HSTS", "Linkedin Insight Tag", "Next.js", "Open Graph", "Priority Hints", "PWA", "React", "Vercel", "Webpack"],
  "cms": null,
  "ecommerce": null,
  "analytics": "Linkedin Insight Tag",
  "tagManagers": null,
  "cdn": "Amazon S3",
  "hosting": "Amazon Web Services, Vercel",
  "javascriptFrameworks": "Next.js, React",
  "webFrameworks": "Next.js",
  "webServers": "Next.js",
  "programmingLanguages": null,
  "paymentProcessors": null,
  "liveChat": null,
  "marketingAutomation": null,
  "crm": null,
  "emailProviders": "Google Workspace",
  "advertising": null,
  "technologies": [
    { "name": "Google Workspace", "categories": ["Webmail", "Email"], "version": null, "confidence": 100, "website": "https://workspace.google.com/", "detectedBy": ["dns:MX"] },
    { "name": "Next.js", "categories": ["JavaScript frameworks", "Web frameworks", "Web servers", "Static site generator"], "version": null, "confidence": 100, "website": "https://nextjs.org", "detectedBy": ["headers"] },
    { "name": "React", "categories": ["JavaScript frameworks"], "version": null, "confidence": 100, "website": "https://reactjs.org", "detectedBy": ["html"] },
    { "name": "Vercel", "categories": ["PaaS"], "version": null, "confidence": 100, "website": "https://vercel.com", "detectedBy": ["headers", "dns:SOA"] },
    { "name": "Webpack", "categories": ["Miscellaneous"], "version": null, "confidence": 100, "website": "https://webpack.js.org/", "detectedBy": ["implied by Next.js"] }
  ],
  "categories": { "Analytics": ["Linkedin Insight Tag"], "CDN": ["Amazon S3"], "JavaScript frameworks": ["Next.js", "React"], "PaaS": ["Amazon Web Services", "Vercel"], "Webmail": ["Google Workspace"] },
  "dnsVerifications": [],
  "responseTimeMs": 15272,
  "errorCode": null,
  "error": null,
  "scrapedAt": "2026-09-15T18:54:11.654119+00:00"
}
```

In a separate test run on 500 popular websites, 397 were analyzed and charged, with 10.9 technologies per website on average; the other 103 (offline domains, anti-bot walls, timeouts) were returned with an `errorCode` for free.

#### Output fields

| Field | Description |
|---|---|
| `url` | Website as analyzed (normalized). |
| `inputUrl` | Website exactly as you sent it. |
| `finalUrl` | Address after redirects. |
| `domain` | Final host without `www.`. |
| `statusCode` | HTTP status of the final page. |
| `redirectChain` | Addresses visited before the final one. |
| `title`, `language` | Page title and `lang` attribute. |
| `technologyCount`, `technologyNames` | How many and which technologies, alphabetical. |
| `cms`, `ecommerce`, `analytics`, `tagManagers`, `cdn`, `hosting` | Summary columns, comma-separated names, ready for a spreadsheet. |
| `javascriptFrameworks`, `webFrameworks`, `webServers`, `programmingLanguages` | Summary columns. |
| `paymentProcessors`, `liveChat`, `marketingAutomation`, `crm`, `emailProviders`, `advertising` | Summary columns. |
| `technologies` | One object per technology: `name`, `categories`, `version`, `confidence` (0-100), `website`, `detectedBy`. |
| `categories` | Technology names grouped by category. |
| `dnsVerifications` | SaaS tools the company verified its domain with (company signals). |
| `responseTimeMs` | Time to download the page. |
| `errorCode`, `error` | Filled only when the website could not be analyzed. |
| `scrapedAt` | Time of the analysis (ISO 8601). |

`detectedBy` tells you why each technology was reported: `headers`, `cookies`, `meta`, `scriptSrc`, `scripts`, `css`, `html`, `dom`, `url`, `dns:MX`, `dns:SPF`, `dns:NS`, `dns:SOA`, `dns:CNAME`, `dns:TXT`, or `implied by WordPress` (WordPress implies PHP and MySQL, Next.js implies React).

#### Error codes (never charged)

| errorCode | Meaning |
|---|---|
| `INVALID_URL` | The input is not a domain or an http(s) URL. |
| `DNS_NOT_FOUND` | The domain does not resolve (also tried with `www.`). |
| `CONNECTION_FAILED` | The server refused or dropped the connection (also tried over plain HTTP). |
| `TIMEOUT` | No answer within `timeoutSecs`. |
| `SSL_ERROR` | The TLS handshake failed. |
| `TOO_MANY_REDIRECTS` | More than 10 redirects. |
| `BLOCKED` | The website answered with an anti-bot challenge on every attempt. Technologies seen in headers and DNS are still returned. |
| `HTTP_ERROR` | The website answered 4xx or 5xx (`statusCode` has the code). |
| `UNEXPECTED_ERROR` | Anything else. Please open an issue with the website. |

A run only fails when not a single website could be analyzed, so a list with a few dead domains still finishes as succeeded.

### Pricing

**US$ 3.00 per 1,000 websites analyzed, no monthly fee.** You pay the event "Website tech stack detected" once per website that answered, whatever the number of technologies found, with DNS, versions and all categories included. Offline, invalid, blocked and HTTP-error websites are returned with an `errorCode` and are not charged. There is no start fee per run.

| Option | Typical price for 1,000 websites |
|---|---|
| **This Actor** | **US$ 3.00, pay per use** |
| Other tech stack Actors in Apify Store | from about US$ 2 plus a fee per run, up to US$ 100 |
| BuiltWith and Wappalyzer lookup plans | monthly subscription, with lookup quotas |

Apify's free plan includes monthly credits, enough to analyze a few thousand websites for free every month.

### How to use it from code

#### Python

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("scrapewise/tech-stack-detector").call(run_input={
    "urls": ["wordpress.org", "www.shopify.com", "github.com"],
    "categoriesFilter": ["CMS", "Ecommerce", "Analytics"],
})
for site in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(site["domain"], site["cms"], site["ecommerce"], site["analytics"])
```

#### Node.js

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

const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });
const run = await client.actor('scrapewise/tech-stack-detector').call({
    urls: ['wordpress.org', 'www.shopify.com', 'github.com'],
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((site) => console.log(site.domain, site.technologyNames));
```

#### One HTTP call (cURL)

```bash
curl -X POST "https://api.apify.com/v2/acts/scrapewise~tech-stack-detector/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"urls": ["wordpress.org", "github.com"]}'
```

The synchronous endpoint waits up to 5 minutes, which fits a few hundred websites. For bigger lists, start the run and read the dataset when it finishes, or use a webhook.

#### No-code: n8n, Make, Zapier, Google Sheets

Use the Apify integration in n8n, Make or Zapier: "Run Actor" with `scrapewise/tech-stack-detector`, then "Get dataset items". A common flow is "new row in Google Sheets or new company in the CRM, then detect the stack, then write the CMS, ecommerce and email provider back".

#### Scheduling and monitoring

Save your list as a task and add a schedule (weekly or monthly). Compare `technologyNames` between runs to see who migrated from one platform to another, added a chat tool or changed CDN.

### Use with AI agents and MCP

The Actor works as a tool for AI agents through the [Apify MCP server](https://mcp.apify.com) in Claude, ChatGPT, Cursor, VS Code and any MCP client. Add `scrapewise/tech-stack-detector` to the server's tools and ask things like:

- "What CMS, analytics and payment provider do these 20 competitors use?"
- "From this list of domains, which ones run Shopify and use Klaviyo?"
- "Does example.com use Google Workspace or Microsoft 365?"

The output is compact and structured (summary columns plus `technologies`), so an agent can answer without parsing HTML. Items with `errorCode` tell the agent exactly why a website was skipped.

### How it works, and honest limits

The Actor downloads each home page (or the exact URL you give) over plain HTTP, like a browser would, follows redirects and meta refresh, and reads up to 2.5 MB of HTML. It then matches the headers, cookies, meta tags, script URLs, inline scripts, styles, HTML and DOM selectors against the fingerprints, runs the DNS lookups in parallel, and applies the rules between technologies (implies, requires, excludes). No browser is launched, which is why it is fast and cheap.

- **JavaScript is not executed.** Technologies that are only visible after scripts run in a browser (for example a chat widget injected by a tag manager, or JavaScript variables) can be missed. The server-side, HTML and DNS signals cover the large majority of CMS, ecommerce, framework, CDN, hosting, analytics and email detections.
- **One page per website.** The home page is analyzed unless you give a deeper URL. A checkout provider that only appears on the cart page needs that URL.
- **Anti-bot protection.** A few very large websites answer automated requests with a challenge. They come back with `BLOCKED`, the headers and DNS technologies, and no charge.
- **Confidence.** Most fingerprints score 100. Weak hints score 25 to 50 and are hidden by the default `minConfidence` of 50; set it to 0 to see everything.

Something wrong or missing? Open an issue on the Actor page with the website and what you expected. Issues are answered within 12 hours, and new fingerprints are added on request.

This Actor only reads public pages and public DNS records, without logging in, and respects the websites' terms.

### FAQ

**Is this an alternative to Wappalyzer?**
Yes. It uses the same open fingerprint format and rules that Wappalyzer published before it went closed source (maintained by the webappanalyzer project), adds DNS rules, and runs them in bulk in the cloud with pay-per-use pricing instead of a subscription.

**Is it a BuiltWith alternative?**
For current technology detection, yes: you get the live stack of each website at US$ 3 per 1,000. It does not include BuiltWith's historical data (when a technology was first and last seen) or its lists of all websites using a technology; for that, run this Actor on your own list on a schedule.

**How many websites can I analyze in one run?**
There is no fixed limit. Runs of 500 websites take a few minutes with the default concurrency of 20; you can raise `maxConcurrency` to 50 or 100 for large lists.

**Do I pay for websites that are down?**
No. Only websites that answered and were analyzed are charged. Every other website is returned with an `errorCode` for free.

**How accurate is it?**
Detection is rule-based: when a rule matches, the technology is there. Accuracy is highest for server-side and HTML signals (CMS, ecommerce, frameworks, servers, CDN) and for DNS (email provider). See the limits above for what needs a real browser.

**Can I filter by category?**
Yes, with `categoriesFilter`. The price does not change, but the output is smaller.

**Can I find all websites that use a technology?**
The Actor analyzes the websites you give it. To build a prospect list, feed it domains from Google Maps, a directory or your CRM and filter the results by `technologyNames`.

**Does it detect the email provider?**
Yes, from MX and SPF records: Google Workspace, Microsoft 365, Zoho Mail, Proton Mail, Fastmail, Yandex, GoDaddy, Amazon WorkMail, plus secure email gateways (Proofpoint, Mimecast, Barracuda, Cisco) and email senders (SendGrid, Amazon SES, Mailchimp, Mailgun, Postmark, Brevo).

**Can I call it from Python, Node.js or an AI agent?**
Yes. See the API examples above and the MCP section. The input also accepts the field names of other tech stack Actors.

**Can I analyze a specific page instead of the home page?**
Yes, give the full URL (for example `https://example.com/checkout`). The URL is analyzed as given.

**Why does a website show Cloudflare and nothing else?**
It probably answered with a challenge page. Check `errorCode`: `BLOCKED` items are not charged.

### Credits

Web fingerprints come from the open-source [webappanalyzer](https://github.com/enthec/webappanalyzer) project (GPL-3.0), the community continuation of the Wappalyzer rules. DNS email and verification rules were added for this Actor. This Actor is not affiliated with Wappalyzer or BuiltWith.

### Changelog

- **2026-09-15 (page):** added the "At a glance" comparison with the most used Actor for this term, measured on the public Apify API that day, plus the minimal input and a real output row in the first screen.
- **2026-09-15, 0.1:** first version. 7,653 technologies, 109 categories, DNS MX/SPF/NS/SOA/CNAME/TXT detection, summary columns, error codes without charge, input names of other tech stack and BuiltWith Actors. Direct request first (median under 1 second per website), then a proxy retry and a Chrome-like client for websites behind anti-bot walls.

### Em português

Detector de tecnologias de sites em lote: CMS, plataforma de e-commerce, analytics, CDN, framework, servidor, pagamento, chat e provedor de e-mail de cada site, com versão e confiança. Serve para prospecção (achar lojas Shopify ou WooCommerce numa lista), inteligência comercial (saber que ferramentas o cliente já usa) e análise de concorrentes. **US$ 3 por 1.000 sites, sem mensalidade; site fora do ar ou bloqueado não é cobrado.**

Keywords: tech stack detector, website technology checker, wappalyzer alternative, builtwith alternative, technology lookup, website technology detector, CMS detector, ecommerce platform detector, what technology does a website use, technographics, lead enrichment, tech stack API, shopify store finder, wordpress detector, email provider lookup, MX lookup

# Actor input Schema

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

Domains or URLs, one per line (example.com, www.example.com or https://example.com/pricing). The scheme is added when missing and duplicates are analyzed once.

## `maxItems` (type: `integer`):

Stop after this many websites. Leave empty to analyze every website in the list.

## `categoriesFilter` (type: `array`):

Keep only technologies in these categories, e.g. CMS, Ecommerce, Analytics, CDN, JavaScript frameworks, Payment processors, Live chat, Tag managers, Email. Case-insensitive. Empty = all 109 categories. The price is the same.

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

Drop detections below this confidence (0-100). Most fingerprints score 100; weak hints score 25-50.

## `includeVersions` (type: `boolean`):

Extract version numbers when the website exposes them (generator meta tag, script file names, Server and X-Powered-By headers).

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

Read the domain's MX, TXT (SPF and verification records), NS, SOA and CNAME records to detect the email provider (Google Workspace, Microsoft 365), DNS host and SaaS tools that never show on the page (Salesforce, HubSpot, Atlassian, Zoom, Slack).

## `legacyFieldNames` (type: `boolean`):

Also write status\_code, final\_url, tech\_count, tech\_names and scan\_time\_ms, the field names used by other tech stack Actors, so an existing integration keeps working. Turned on automatically when the input uses snake\_case options (timeout\_seconds, categories\_filter, include\_versions, include\_confidence).

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

How long to wait for a website to answer before it is reported with errorCode TIMEOUT (not charged).

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

How many websites are analyzed at the same time.

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

The first request goes out directly (fastest). If a website blocks it or fails, it is retried through this proxy (Apify datacenter by default) and then with a Chrome-like client.

## `startUrls` (type: `array`):

Same as Websites. Accepts plain strings, request objects ({"url": "https://example.com"}) and {"requestsFromUrl": "https://.../list.txt"} for a remote text file.

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

Same as Websites.

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

Same as Websites.

## `startDomains` (type: `array`):

Same as Websites (the name used by the BuiltWith Actor).

## `url` (type: `string`):

One website, or several separated by commas or new lines.

## Actor input object example

```json
{
  "urls": [
    "wordpress.org",
    "www.shopify.com",
    "github.com"
  ],
  "minConfidence": 50,
  "includeVersions": true,
  "checkDns": true,
  "legacyFieldNames": false,
  "timeoutSecs": 20,
  "maxConcurrency": 20,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

No description

## `resultsCsv` (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 = {
    "urls": [
        "wordpress.org",
        "www.shopify.com",
        "github.com"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapewise/tech-stack-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": [
        "wordpress.org",
        "www.shopify.com",
        "github.com",
    ],
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("scrapewise/tech-stack-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": [
    "wordpress.org",
    "www.shopify.com",
    "github.com"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call scrapewise/tech-stack-detector --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,scrapewise/tech-stack-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/IxpZasTW4hpSkKcx6/builds/52caDhlFobYNEzUup/openapi.json
