# Website Tech Stack Detector (Bulk) · SiteVerdict (`siteverdict/siteverdict-tech-stack-detector`) Actor

Find the tech stack of thousands of websites: CMS, ecommerce, analytics, ad pixels, cookie banners, CRM, chat, payments, CDN, hosting, frameworks, JS library versions and email provider (MX/SPF). Evidence for every detection, filters and change monitoring.

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

## Pricing

Pay per event

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

## SiteVerdict — Tech Stack Detector & Sales Lead Signals

**Quick start:** keep the three prefilled sites and press **Start** (HTTP mode, the default). You get each site's technologies with the evidence for each match.

**What it costs:** $0.003 per site in HTTP mode (default), $0.008 per site in browser mode. The prefilled 3-site run costs $0.009 plus any optional extras that apply: hiring signals $0.005, AI outreach angle $0.005 (your own AI key), and company enrichment $0.004 per site, which runs only when you add your own Companies House API key.

**Works well with:** [Agency Lead Finder](https://apify.com/siteverdict/siteverdict-agency-lead-finder) · [Domain & Email Health Checker](https://apify.com/siteverdict/siteverdict-domain-email-health) · [Local Business Leads](https://apify.com/siteverdict/siteverdict-local-business-leads).

**Paste a list of company websites. Get back a ranked prospect list for *your* offer.** For each site you get:

- what it runs, with evidence and versions (1,112 technologies);
- how much it likely spends on tools;
- whether it is hiring, and which tools its job ads name;
- what changed since your last run;
- for UK firms, the Companies House record;
- one plain-English line on why to contact them now.

In our own hand-verified test of 30 public sites on 11 Oct 2026, we found no false detections in either mode; browser mode found 99.8% of the technologies we verified by hand and fast HTTP mode 86.5%. Thirty sites is a small sample: expect some missed and some wrong detections on other sites, especially custom or heavily cached ones. See [the benchmark](#benchmark-honest-numbers).

### Three ways teams use it

1. **SaaS sales and RevOps.** Upload your target-account CSV and choose your offer. You get a 0-100 score per account with the reasons. Example: *"Uses Shopify; displacement: uses competitor Mailchimp; hiring 3 marketing roles; 8 paid tools ≈ $1.4k-9k/mo list price."*

   Import `HUBSPOT_COMPANIES.csv` straight into HubSpot.
2. **Agencies prospecting.** Look for gaps you can sell into, for example:

   - Shopify stores with no SMS tool;
   - sites running ad pixels with no cookie banner;
   - WordPress sites with no caching layer.

   Each lead says *why*, so your first message is specific.
3. **Investors and competitive intelligence.** Schedule monitor mode on a portfolio or competitor list. You get alerts like *"Switched Email marketing: Mailchimp → Klaviyo"* or *"Started using Greenhouse (Recruiting & ATS)"*. These are buying signals, sent to Slack or a webhook.

### Before → after

**Before:** a column of domains from your CRM.

**After:** one row per company. This example is trimmed.

```json
{
  "domain": "northwind.example",
  "lead": {
    "offer": "Email/SMS marketing for online stores",
    "score": 76, "tier": "A", "tierLabel": "Hot prospect",
    "summary": "Uses Shopify (Ecommerce); Displacement: uses competitor Mailchimp; Hiring: 3 open marketing role(s)",
    "breakdown": { "fit": 30, "need": 25, "budget": 11, "intent": 10 },
    "reasons": [
      { "kind": "fit", "points": 30, "reason": "Uses Shopify" },
      { "kind": "need", "points": 13, "reason": "No SMS marketing tool detected" },
      { "kind": "need", "points": 15, "reason": "Displacement: uses competitor Mailchimp" },
      { "kind": "budget", "points": 11, "reason": "4 paid tool(s) ≈ $230-1,300/mo list price" },
      { "kind": "intent", "points": 10, "reason": "Hiring: 3 open marketing role(s)" }
    ]
  },
  "outreachAngle": "Northwind runs Shopify with Mailchimp and is hiring three marketers, so moving email and SMS onto one platform now would land before the new team builds flows.",
  "spend": { "paidToolCount": 4, "spendTier": "medium", "estimatedMonthlyUsd": { "low": 230, "high": 1300 } },
  "hiring": { "ats": "Greenhouse", "openRoles": 12, "rolesByFunction": { "marketing": 3, "engineering": 5, "sales": 2, "other": 2 },
              "toolsMentioned": [ { "tool": "Klaviyo", "roles": 2, "sampleRoles": ["CRM Marketing Manager"] } ] },
  "buyingSignals": ["Started using Meta Pixel (Advertising) since 2026-10-04", "12 open role(s) on Greenhouse"],
  "company": {
    "onSite": { "ukCompanyNumber": "01234567", "vatNumber": "GB123456789", "socialProfiles": { "linkedin": "https://www.linkedin.com/company/northwind" } },
    "companiesHouse": { "companyName": "NORTHWIND TRADING LIMITED", "status": "active", "incorporatedOn": "2014-03-02",
                        "sicCodes": [{ "code": "47910", "description": "Retail sale via mail order houses or via Internet" }], "lastAccountsType": "small" }
  },
  "ecommerce": ["Shopify"], "emailProviders": ["Google Workspace"],
  "technologies": [
    { "name": "Shopify", "category": "Ecommerce", "confidence": 100, "version": null,
      "evidence": ["header x-shopid: 1234", "resource: https://cdn.shopify.com/..."] },
    { "name": "jQuery", "category": "JavaScript library", "confidence": 100, "version": "3.7.1",
      "evidence": ["resource: https://northwind.example/…/jquery.min.js?ver=3.7.1"] }
  ]
}
```

### What it detects

The signature set covers **1,112 technologies in 77 categories**. Every signature is written by SiteVerdict from vendors' public documentation. None is copied from Wappalyzer or its GPL forks.

| Area | Examples |
|---|---|
| CMS, builders, ecommerce | WordPress (with version, theme and plugins), Drupal, Joomla, Webflow, Wix, Squarespace, Statamic, Payload, Shopify (with theme and apps), WooCommerce, Magento, BigCommerce, Salesforce Commerce Cloud |
| Marketing stack | GA4 vs UA, GTM, Adobe, Segment, RudderStack, Hotjar, Clarity, Mixpanel, Amplitude, PostHog; Meta, Google Ads, LinkedIn, TikTok, Reddit, The Trade Desk and StackAdapt pixels |
| CRM, marketing automation, email/SMS | HubSpot, Marketo, Pardot, Salesforce, Klaviyo, Mailchimp, Braze, Customer.io, Attentive, Postscript, Kit, Campaign Monitor |
| Consent (CMP) | OneTrust, Cookiebot, Usercentrics, Didomi, Sourcepoint, TrustArc, Transcend, the HubSpot and Shopify banners, Google Consent Mode |
| Chat, support, reviews, search, testing | Intercom, Zendesk, Drift, Gorgias, Qualified; Trustpilot, Yotpo, Bazaarvoice; Algolia; Optimizely, VWO, LaunchDarkly |
| Payments | Stripe, PayPal, Adyen, Checkout.com, Klarna, Clearpay, Affirm, Recharge, Ordergroove |
| B2B intent and visitor identification | Leadfeeder, Clearbit, 6sense, Demandbase, ZoomInfo WebSights, RB2B, Warmly, Apollo, Bizible |
| Recruiting / ATS (new) | Greenhouse, Lever, Ashby, Workable, Teamtailor, Personio, SmartRecruiters, Workday, iCIMS, BambooHR and more |
| Infrastructure | Cloudflare, Fastly, Akamai, CloudFront, Vercel, Netlify, WP Engine, Kinsta, Laravel Cloud, AWS WAF, DataDome |
| DNS-based | Email provider (MX), email security (Mimecast, Proofpoint, MessageLabs, Cloudflare), SPF senders (SendGrid, SES, HubSpot, Greenhouse, NetSuite), DMARC vendor, DNS host, 40+ SaaS domain-verification tokens (Atlassian, DocuSign, Anthropic, OpenAI, HackerOne…) |

Every detection carries a **category**, a **confidence** (0-100), a **version** when the site shows one, and **evidence**.

### Lead scoring: explainable, for your offer

Pick a preset, or describe your own offer. Each site gets a score out of 100:

| Component | Points | What counts |
|---|---|---|
| Fit | 0-30 | The site uses your target platform or category |
| Need | 0-25 | A category gap (e.g. "no SMS tool") or a competitor to displace |
| Budget | 0-20 | Number and tier of paid tools |
| Intent | 0-25 | Relevant open roles, tools named in job ads, tech added or removed since the last run |

**Every point comes with a sentence.** Sites that are not a fit are capped and say so.

**Presets:**

- general B2B quality;
- email/SMS for online stores;
- cookie consent / CMP;
- CRO / A/B testing;
- live chat / support;
- Shopify apps or agency;
- WordPress agency;
- email security / DMARC;
- B2B intent data;
- analytics / CDP.

**Custom offer (JSON):**

```json
{ "name": "Klaviyo agency", "targetTechs": ["Shopify"], "competitorTechs": ["Mailchimp", "Omnisend"],
  "gapCategories": ["SMS marketing"], "excludeTechs": ["Attentive"], "hiringFunctions": ["marketing", "ecommerce"] }
```

### Input examples

**Score a CRM export for your offer, with hiring signals and a HubSpot file**

```json
{ "csvUrl": "https://docs.google.com/spreadsheets/d/e/.../pub?output=csv", "offerPreset": "ecommerce-email-sms",
  "hiringSignals": true, "minLeadScore": 50 }
```

**UK accounts with Companies House data and an AI outreach line (your keys)**

```json
{ "urls": ["northwind.example", "acme-widgets.example"], "offerPreset": "general-b2b",
  "companiesHouseApiKey": "…", "aiProvider": "anthropic", "aiApiKey": "…" }
```

**Weekly buying-signal watch with Slack alerts**

```json
{ "datasetId": "<your accounts dataset>", "mode": "browser", "monitor": true, "monitorKey": "target-accounts",
  "onlyChanges": true, "slackWebhookUrl": "https://hooks.slack.com/services/…" }
```

**Shopify stores not using Klaviyo yet**

```json
{ "urls": ["…"], "onlySitesUsing": ["Shopify"], "excludeSitesUsing": ["Klaviyo"] }
```

### Output

- **Dataset views:**
  - **Prospects:** score, tier, why, angle, spend, hiring and company.
  - **Sites:** the stack overview.
  - **Technologies:** flat, one row per technology.
  - **Monitor changes.**
  - **Errors.**
- **Key-value store:**
  - `LEADS.csv`: ranked, one row per company, with the stack by category.
  - `HUBSPOT_COMPANIES.csv`: HubSpot Companies import. Default columns map automatically; choose "Create new property" for the `SiteVerdict …` columns. Company Domain Name de-duplicates.
  - `REPORT`: a shareable HTML report.
  - `AGENT_SUMMARY`: compact JSON for AI agents.
  - `SITES_BY_TECH`.
  - `TECHS_FLAT.csv`.
  - `RUN_SUMMARY`.

All CSVs are protected against spreadsheet formula injection.

### Pricing

Pay per event. You only pay when something is delivered.

| Event | When | Price |
|---|---|---|
| `site-detected` | Fast HTTP mode: site analysed, technologies found, passed your filters and min score | $0.003 |
| `site-detected-browser` | Same, in real-browser mode | $0.008 |
| `hiring-signals` | Open roles or tool mentions found (careers page or public job board) | $0.005 |
| `company-enriched` | A Companies House record was attached (needs your free CH key) | $0.004 |
| `ai-outreach-angle` | An outreach line was written with your own LLM key | $0.005 |

Lead scoring, spend tier, on-site company details, buying signals, exports, the HTML report and alerts are **included**.

**Examples:**

| Job | Approximate cost |
|---|---|
| 100 sites, HTTP mode, scored | **$0.30** |
| 100 sites + hiring signals (about 40 with roles) + Companies House (about 30 UK matches) | **≈ $0.62** |
| 1,000 sites in browser mode | **$8** |
| Weekly monitor of 200 competitors, `onlyChanges` | only the sites that changed are charged |

**Never charged:**

- errors, bot-protection blocks and robots.txt skips;
- empty results and sites removed by your filters or minimum score;
- unchanged sites skipped by `onlyChanges`;
- failed AI calls or Companies House misses.

The run stops cleanly at your maximum total charge.

### Benchmark (honest numbers)

We hand-verified 30 public sites across WordPress, Shopify, Drupal, Joomla, Webflow, Squarespace, Next.js, Rails, Laravel, publishers and SaaS homepages, on 11 Oct 2026. Full method and caveats are in `BENCHMARK.md`.

| | Precision | Recall | Versions correct | Speed |
|---|---|---|---|---|
| Fast HTTP mode | no false detections found | 86.5% | 21/21 | ~1 s/site |
| Real browser mode | no false detections found | 99.8% | 21/21 | ~10 s/site |

Limits: 30 sites checked by hand on one day; "precision" here means we found no wrong detections among them, not that the detector cannot be wrong.

**Compared with the most-used Store alternatives** (from their public docs, not by running them):

- We are the only one with per-detection evidence and versions, the DNS email/SaaS stack, hiring signals, explainable lead scores for your offer, Companies House enrichment, built-in buying-signal monitoring and a HubSpot export.
- **BuiltWith's own database is larger and has years of history.** If you need "first seen in 2019", use BuiltWith.

### FAQ

**Can it find "all sites using X"?**
No. It analyses the sites you give it. Feed it a list from your CRM, a directory or another Actor, then filter and score.

**Why did HTTP mode miss a pixel?**
Many tags are injected by Google Tag Manager after the page loads. Use browser mode for the complete marketing stack.

Tools that wait for cookie consent are never seen. We do not click banners on your behalf.

**How is "spend" estimated?**
We sum public list-price bands of the paid tools we detect: SMB < $100/mo, mid-market $100-1,000/mo, enterprise > $1,000/mo. It is a signal of tool budget, not a quote and not actual spend.

**Where do hiring signals come from?**
From the company's own careers page (robots.txt respected), plus the documented public job-board APIs of Greenhouse, Lever and Ashby. We output job titles, departments, counts and tool names only, never recruiter or applicant data.

**Does the AI see or send anything personal?**
No. It only sees company-level facts we detected, and it only writes a sentence. Nothing is emailed. It uses your own Anthropic or OpenAI key, which is never logged or stored. Default model: `claude-sonnet-5-5`.

**Do I need a Companies House key?**
Only for the registry fields. Without a key you still get the company number, VAT number and organisation details the website itself publishes, plus a link to the public Companies House page. Keys are free at developer.company-information.service.gov.uk.

### Limits

- **Pages per site.** The homepage plus up to 10 extra pages, and the careers page when hiring signals are on.
- **Page size.** HTML is capped at 3 MB per page.
- **Versions.** Shown only when the site exposes them.
- **Hidden tools.** Tools without a public trace, such as a back-office ERP, cannot be seen unless DNS reveals them, for example through SPF or verification tokens.
- **Job boards.** Only Greenhouse, Lever and Ashby are read through an API. Other ATSs are recognised, and their counts are estimated from the careers page.
- **Companies House.** The API allows 600 requests per 5 minutes per key. We stay under that limit, so large UK lists run at about 2 companies per second.

### Compliance & data sources

**Public, official sources only:**

- page HTML, response headers and cookie *names*;
- public DNS (MX, TXT/SPF, `_dmarc`, NS, CNAME) and the TLS certificate;
- robots.txt;
- the documented public job-board APIs of Greenhouse, Lever and Ashby;
- the Companies House public data API, with your own key.

Companies House data: *Contains public sector information licensed under the Open Government Licence v3.0.* SIC descriptions are from Companies House `api-enumerations` (MIT).

**robots.txt is respected by default.** Bot protection, CAPTCHAs and logins are never bypassed. We use an honest User-Agent (`SiteVerdict/tech-stack-detector`), with no proxy rotation.

**Personal data is OFF.** No names, emails or phone numbers of individuals are collected or output. That includes Companies House officers and PSCs, schema.org `telephone` and `email`, and LinkedIn `/in/` profiles. Company social pages only.

**UK GDPR / PECR.** This tool identifies companies and technologies, not people. If you use the results for outreach:

- B2B email to *corporate subscribers* is allowed under PECR with an opt-out.
- Sole traders and partnerships count as *individual subscribers* and need prior consent for electronic marketing.
- Keep a legitimate-interests assessment, and honour objections.

This is not legal or financial advice.

**Where data is stored.** Results go to the run's default dataset and key-value store in your own Apify account. If you read input from another dataset, it is only read. Default storages are unnamed; how long Apify keeps them is set by Apify and your plan, not by SiteVerdict ([Apify data retention](https://docs.apify.com/platform/storage/usage#data-retention)). With monitoring on, each site's last detected technologies are kept in a **named** key-value store, `siteverdict-tech-monitor`, which Apify keeps until you delete it.

**Third parties you choose.** Companies House enrichment uses your own key. The optional AI outreach angle sends your offer description and the company facts found (public website, DNS and register data; no personal data) to Anthropic or OpenAI under your own key and their terms. SiteVerdict receives no copy of any data.

Technology names are trademarks of their owners and are used only to identify them. SiteVerdict is not affiliated with any vendor.

Built by SiteVerdict (BharatFare Travel and Technologies Ltd, UK). Contact: aman.thakran@bharatfare.com.

# Changelog

This Actor's version history is a separate document: https://apify.com/siteverdict/siteverdict-tech-stack-detector/changelog.md

# Actor input Schema

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

One per line. Bare domains (example.com) are fine; we try https first, then http. Duplicates are removed.

## `csvText` (type: `string`):

Optional. Paste a CSV export (e.g. from a CRM). We use the column named url / website / domain / homepage, or the column you name below.

## `csvUrl` (type: `string`):

Optional. Public link to a CSV file (e.g. a Google Sheets 'publish to web' CSV link).

## `csvColumn` (type: `string`):

Optional. Header of the column that holds the domain/URL. Auto-detected when empty.

## `datasetId` (type: `string`):

Optional. Dataset ID or name from another run (e.g. a leads scraper). Each item's url / website / domain field is used.

## `datasetField` (type: `string`):

Optional. Field name (dot path allowed, e.g. company.website). Auto-detected when empty.

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

Fast HTTP (default, cheapest): reads HTML, headers, cookies, DNS, TLS and robots.txt. Browser: renders the page in headless Chrome, so it also sees scripts injected by tag managers, global JS variables and framework internals. More accurate, slower, priced higher.

## `extraPaths` (type: `array`):

Optional paths such as /pricing, /contact or /cart. Some tools (checkout, booking, chat) only load on inner pages. Max 10, fetched over plain HTTP.

## `autoSamplePages` (type: `integer`):

Also check up to N internal links picked from the homepage (shop, pricing, contact, blog first). 0 = homepage only.

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

Reads public MX, SPF, TXT verification tokens, DMARC reporting vendor, NS and CNAME records.

## `checkTls` (type: `boolean`):

Connects to port 443 and reads the certificate issuer and expiry date.

## `respectRobotsTxt` (type: `boolean`):

If a site's robots.txt disallows our crawler (or all crawlers) for a page, we do not fetch it and only use DNS/TLS. Keep this on.

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

Hide detections below this confidence. 50 keeps single weak signals; 100 = only strong evidence.

## `includeEvidence` (type: `boolean`):

Show why each technology was detected (script URL, header, cookie name, DNS record...).

## `onlySitesUsing` (type: `array`):

Technology names, e.g. Shopify, Klaviyo, HubSpot. Case-insensitive. Sites without a match are not output and not charged.

## `onlyCategories` (type: `array`):

Category names, e.g. Ecommerce, Live chat, Consent management (CMP), Email provider.

## `matchAll` (type: `boolean`):

Off = any match is enough (OR).

## `excludeSitesUsing` (type: `array`):

Drop sites that use any of these technologies, e.g. Klaviyo (to find Shopify stores that do not use it yet). Excluded sites are not charged.

## `offerPreset` (type: `string`):

Every site gets a 0-100 prospect score for this offer, with the reasons (fit, need, budget, buying intent). Free, always on.

## `offer` (type: `object`):

Fields: name, description, targetTechs, targetCategories, competitorTechs, complementTechs, gapCategories, excludeTechs, hiringFunctions. Example: {"name":"Klaviyo agency","targetTechs":\["Shopify"],"competitorTechs":\["Mailchimp"],"gapCategories":\["SMS marketing"]}

## `minLeadScore` (type: `integer`):

Sites below this score are not output and not charged.

## `hiringSignals` (type: `boolean`):

Finds the careers page and, if linked, reads the public Greenhouse / Lever / Ashby job-board API: open roles by function and the tools job ads mention (e.g. "HubSpot", "Snowflake"). Charged (hiring-signals) only when roles or tool mentions are found. Job titles only, never recruiter names.

## `companyEnrichment` (type: `boolean`):

Free: reads the UK company number, VAT number, schema.org organisation data and company social pages the site itself publishes.

## `companiesHouseApiKey` (type: `string`):

Your free key from developer.company-information.service.gov.uk. Adds status, incorporation date, SIC codes, accounts type and registered office. Charged (company-enriched) only when a record is attached. No officers or personal data.

## `companyNameSearch` (type: `boolean`):

UK sites only. Uses an EXACT normalised name match (one active company), so it never guesses.

## `aiProvider` (type: `string`):

Writes one factual sentence per good prospect: the reason to contact them now. Uses only the detected company-level facts. Nothing is sent to prospects.

## `aiApiKey` (type: `string`):

Your Anthropic or OpenAI key. Billed by your provider; never logged or stored.

## `aiModel` (type: `string`):

Default: claude-sonnet-5-5 (Anthropic) or gpt-4o-mini (OpenAI).

## `aiMinLeadScore` (type: `integer`):

Saves your LLM spend: only prospects at or above this score get an outreach angle.

## `aiMaxSites` (type: `integer`):

Hard cap on generated angles (and on the ai-outreach-angle event) per run.

## `exportHubspot` (type: `boolean`):

Ready for HubSpot > Import > Companies (Company Domain Name is the de-duplication key).

## `monitor` (type: `boolean`):

Stores each site's stack in a named key-value store (siteverdict-tech-monitor) and adds a diff to every result. Schedule the Actor to track competitors or customers.

## `monitorKey` (type: `string`):

Keeps separate histories for different lists, e.g. competitors or shopify-leads.

## `onlyChanges` (type: `boolean`):

With monitor mode: skip sites that are unchanged or seen for the first time (baseline). Skipped sites are not charged.

## `slackWebhookUrl` (type: `string`):

Incoming-webhook URL (https://hooks.slack.com/...). Posts the sites whose stack changed. Nothing is posted when nothing changed.

## `webhookUrl` (type: `string`):

HTTPS URL that receives a JSON list of changed sites with buying signals.

## `maxSites` (type: `integer`):

Stop after this many unique sites. 0 = no limit.

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

Default 8 in HTTP mode, 2 in browser mode.

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

How long to wait for a page before giving up.

## Actor input object example

```json
{
  "urls": [
    "allbirds.com",
    "monzo.com",
    "laravel.com"
  ],
  "mode": "http",
  "autoSamplePages": 0,
  "checkDns": true,
  "checkTls": true,
  "respectRobotsTxt": true,
  "minConfidence": 50,
  "includeEvidence": true,
  "matchAll": false,
  "offerPreset": "general-b2b",
  "offer": {},
  "minLeadScore": 0,
  "hiringSignals": false,
  "companyEnrichment": true,
  "companyNameSearch": false,
  "aiProvider": "none",
  "aiMinLeadScore": 50,
  "aiMaxSites": 100,
  "exportHubspot": true,
  "monitor": false,
  "monitorKey": "default",
  "onlyChanges": false,
  "maxSites": 0,
  "timeoutSecs": 25
}
```

# Actor output Schema

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

No description

## `report` (type: `string`):

No description

## `files` (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": [
        "allbirds.com",
        "monzo.com",
        "laravel.com"
    ],
    "offer": {}
};

// Run the Actor and wait for it to finish
const run = await client.actor("siteverdict/siteverdict-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": [
        "allbirds.com",
        "monzo.com",
        "laravel.com",
    ],
    "offer": {},
}

# Run the Actor and wait for it to finish
run = client.actor("siteverdict/siteverdict-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": [
    "allbirds.com",
    "monzo.com",
    "laravel.com"
  ],
  "offer": {}
}' |
apify call siteverdict/siteverdict-tech-stack-detector --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,siteverdict/siteverdict-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/TlhMlRyT9DYJxcB95/builds/6MLSiRpVEB1qnT97c/openapi.json
