# Tech Stack Detector & Pixel Checker: CMS, GA4, GTM, Meta Pixel (`cygnix_labs/website-tech-stack-detector`) Actor

Tech stack detector, pixel checker and BuiltWith / Wappalyzer alternative for lead lists. Paste domains or emails; get CMS, Shopify, GA4, GTM tags, Meta/TikTok/LinkedIn pixels, tracking IDs, consent, chat, hosting with evidence. Parked & dead domains free. 3 free, then $0.0015/domain.

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

## Pricing

$1.50 / 1,000 domain analyzeds

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 Detector & Pixel Checker: CMS, GA4, GTM, Meta Pixel

**Answer first:** this actor is a **tech stack detector, pixel checker and website technology lookup** (a BuiltWith / Wappalyzer alternative) for lead generation, agency prospecting and SEO. Give it a list of **domains, URLs or email addresses**. For each one it reads the homepage (plus up to 2 extra pages) **and the site's public Google Tag Manager container**, then returns every technology it finds, grouped by category: **CMS and site builder, ecommerce platform, analytics (GA4), tag managers, ad pixels (Meta, Google Ads, TikTok, LinkedIn, Pinterest, X, Bing, Reddit, Snap), heatmaps (Hotjar, Clarity), cookie consent, live chat, email and marketing tools, payments, CDN and hosting, JS frameworks, SEO plugins (Yoast, Rank Math, AIOSEO) and schema.org**. Every detection comes with a **confidence score, the evidence that matched** (header, script URL, meta tag, cookie or HTML snippet) and the **tracking IDs** found (GA4 `G-`, `GTM-`, `AW-`, Meta Pixel ID and more). **The first 3 analyzed domains of every run are free, then $0.0015 per domain ($1.50 per 1,000).** Dead, blocked and empty sites, **parked or for-sale domains** and **placeholder pages** (server default page, "coming soon", suspended hosting) are reported and never billed, and every row tells you if the domain **redirects to another company's site** (e.g. jet.com → walmart.com). That makes it a quick lead-list cleaner too.

| Quick facts | |
|---|---|
| Best for | Lead lists by technology (e.g. Shopify stores running Meta ads), agency prospecting and pitch prep, competitor research, SEO / analytics audits, CRM enrichment |
| Input | A list of domains, URLs or emails (`allbirds.com`, `https://ghost.org`, `jane@acme.com` → acme.com) |
| Output | One row per domain: `cms`, `ecommerce`, `analytics`, `tagManagers`, `advertising`, `sessionRecording`, `consent`, `chat`, `marketing`, `payment`, `cdnHosting`, `frontend`, `seoPlugins`, `trackingIds`, plus `technologies[]` with category, confidence, version and evidence, `seo` (title, meta description, canonical, hreflang, schema.org types), and lead-list flags `finalDomain`, `redirectedToOtherSite`, `parkedOrForSale`, `placeholderPage` |
| Coverage | 314 fingerprint rules in 25 categories, written by Cygnix Labs. GTM container scan finds pixels that never appear in the page HTML |
| Price | First 3 domains free every run, then **$0.0015 per analyzed domain**. Same price for 1, 2 or 3 pages and the GTM scan. No start fee |
| Needs | No API keys, no proxies, no login. Public pages only, robots.txt respected |
| Not included | JavaScript rendering, historical tech data, company firmographics, tools that load only after login or consent clicks |

**Try it now:** the input is prefilled with 3 domains, so the first run is free.

### Lead-list check: dead, parked and redirected domains (real run, 20 Oct 2026)

Build 0.1.4, run `K7ZfYUaz2fCT35GB5`, 14 input lines incl. an email address, a typo and junk domains. 10 analyzed (3 free + 7 billed = **$0.0105**), everything else free:

| Input | Status | Flags | Billed |
|---|---|---|---|
| jane.doe@gymshark.com | ok: Shopify | checked as gymshark.com | yes |
| jet.com | ok: Next.js, React | `redirectedToOtherSite: true`, `finalDomain: walmart.com` | yes |
| cheapwidgets.com | parked or for-sale domain (domain parking / for-sale script) | `parkedOrForSale: true` | **no** |
| nonexistent-domain-cygnix-xyz.com | unreachable (`DNS: domain does not resolve`) | | **no** |
| stackoverflow.com | blocked by bot protection (HTTP 403) | headers still show Cloudflare | **no** |
| not-a-domain | invalid input (`not a public domain name`) | | **no** |

Full rows: [JSON](https://api.apify.com/v2/datasets/E5ee9IEBMW4vIJtBl/items?format=json\&clean=1) · [CSV](https://api.apify.com/v2/datasets/E5ee9IEBMW4vIJtBl/items?format=csv\&clean=1) · [Excel](https://api.apify.com/v2/datasets/E5ee9IEBMW4vIJtBl/items?format=xlsx\&clean=1). In the same run hubspot.com showed 8 ad pixels (Google Ads, Floodlight, LinkedIn, Meta, Bing UET, Reddit, TikTok, X) and allbirds.com GA4 + Google Ads + Meta + TikTok + Bing UET + Outbrain, most of them from the GTM container.

### Sample output: full tech stack (real run, 19 Oct 2026, 13 domains)

Unedited output of build 0.1.2 (run `RUMaU8lSDMiGdAbFa`): `{"urls": ["allbirds.com", "techcrunch.com", "webflow.com", "ghost.org", "hubspot.com", "wpbeginner.com", "tartinebakery.com", "franklinbbq.com", "vapiano.de", "skullcandy.com", "nonexistent-domain-cygnix-xyz.com", "linkedin.com", "stackoverflow.com"], "extraPagesPerDomain": 1}`. Finished in about 10 seconds. 10 domains were analyzed (3 free + 7 billed = **$0.0105**); the made-up domain (unreachable), linkedin.com (robots.txt disallows bots) and stackoverflow.com (HTTP 403 bot protection) were **not billed**.

**Download the full sample (all 13 rows with every field, public, no login):** [JSON](https://api.apify.com/v2/datasets/2Me4xnsSxsb2UCL6D/items?format=json\&clean=1) · [CSV](https://api.apify.com/v2/datasets/2Me4xnsSxsb2UCL6D/items?format=csv\&clean=1) · [Excel](https://api.apify.com/v2/datasets/2Me4xnsSxsb2UCL6D/items?format=xlsx\&clean=1)

| Domain | CMS / platform | Analytics & tags | Ad pixels | Other highlights |
|---|---|---|---|---|
| allbirds.com | Shopify (+ Shop Pay) | GA4, Universal Analytics, GTM | Google Ads, Meta, TikTok, Microsoft UET, Outbrain | Microsoft Clarity, OneTrust, Cloudflare |
| techcrunch.com | WordPress 6.9.10 + Yoast SEO | GA4, GTM, Jetpack Stats | Google Ads, Meta, LinkedIn Insight, X | Microsoft Clarity, Cloudflare, reCAPTCHA + Turnstile |
| hubspot.com | HubSpot CMS | GA4, GTM, Cloudflare Web Analytics | Google Ads, Floodlight, Meta, LinkedIn, TikTok, X, Bing, Reddit | Hotjar, Cloudflare |
| webflow.com | Webflow | GA4, GTM | Google Ads, Meta, LinkedIn, Bing, Reddit | Marketo forms, GSAP, Cloudflare |
| skullcandy.com | Shopify (+ Shop Pay) | - | - | Klaviyo, Yotpo reviews, Bootstrap, Cloudflare |
| wpbeginner.com | WordPress + All in One SEO 5.0.3 | GA4, Cloudflare Web Analytics | - | Microsoft Clarity, WPForms, PHP 8.0.30 |
| tartinebakery.com | WordPress 7.1.3 + Elementor 4.3.5 | - | - | Cookiebot + Google Consent Mode, Vimeo |
| franklinbbq.com | Squarespace | - | Meta Pixel | LocalBusiness schema, Google Maps embed |
| ghost.org | Hugo (homepage) + Ghost (help center) | - | - | Netlify, Alpine.js |
| vapiano.de | TYPO3 | - | - | Open Graph, Twitter Cards |

On allbirds.com, hubspot.com, techcrunch.com and webflow.com the ad pixels and GA4 IDs come from the **Google Tag Manager container**. They are not in the page HTML, so an HTML-only scanner misses them.

One row from the dataset (trimmed to 4 of 22 technologies):

```json
{
  "domain": "techcrunch.com",
  "status": "ok",
  "httpStatus": 200,
  "finalUrl": "https://techcrunch.com/",
  "title": "TechCrunch | Startup and Technology News",
  "technologyCount": 22,
  "cms": "WordPress",
  "analytics": "Jetpack Stats, Google Analytics 4",
  "tagManagers": "Google Tag Manager",
  "advertising": "Google Ads, LinkedIn Insight Tag, Meta Pixel, X (Twitter) Pixel",
  "sessionRecording": "Microsoft Clarity",
  "cdnHosting": "Cloudflare",
  "seoPlugins": "Open Graph tags, Schema.org JSON-LD, Twitter / X Cards, Yoast SEO",
  "trackingIds": {
    "ga4": ["G-KJR3C2ZQN6"],
    "gtm": ["GTM-M24PKK8"],
    "googleAds": ["AW-26970898", "AW-29214594", "AW-816022932", "AW-954765627"],
    "metaPixel": ["1447508128842484"]
  },
  "technologies": [
    { "name": "WordPress", "category": "cms", "confidence": 100, "confidenceLevel": "high", "version": "6.9.10",
      "evidence": ["header: link: <https://techcrunch.com/wp-json/>; rel=\"https://api.w.org/\"", "meta generator: WordPress 6.9.10"] },
    { "name": "Yoast SEO", "category": "seo", "confidence": 95, "confidenceLevel": "high",
      "evidence": ["html: :-1' /> <!-- This site is optimized with the Yoast SEO Premium plugin v25.1 (Yoast S"] },
    { "name": "Google Tag Manager", "category": "tagManager", "confidence": 95, "ids": ["GTM-M24PKK8"],
      "evidence": ["html: ataLayer','GTM-M24PKK8'); </script> <!-- End G"] },
    { "name": "Meta Pixel", "category": "advertising", "confidence": 85, "ids": ["1447508128842484"],
      "evidence": ["GTM container GTM-M24PKK8: connect.facebook.net/en_US/fbevents.js"] }
  ],
  "pagesAnalyzed": 2,
  "gtmContainersScanned": ["GTM-M24PKK8"],
  "charged": true
}
```

### What it detects (25 categories, 314 rules)

| Category | Examples |
|---|---|
| CMS & site builders | WordPress, Webflow, Wix, Squarespace, Framer, Ghost, HubSpot CMS, Drupal, Joomla, TYPO3, Duda, Craft CMS, AEM, Sitecore, Contentful, Sanity, Storyblok, Hugo, Jekyll, Bubble |
| Ecommerce | Shopify, WooCommerce, Magento / Adobe Commerce, BigCommerce, PrestaShop, Salesforce Commerce Cloud, Shopware, OpenCart, Ecwid, Snipcart, Lemon Squeezy, Gumroad |
| Page builders & WP plugins | Elementor, Divi, WPBakery, Beaver Builder, Bricks, WP Rocket, Jetpack, WPML, Contact Form 7, Gravity Forms, WPForms |
| SEO | Yoast SEO, Rank Math, All in One SEO, SEOPress, The SEO Framework, schema.org JSON-LD / microdata types, Open Graph, Twitter Cards, hreflang |
| Analytics | Google Analytics 4, Universal Analytics, Plausible, Fathom, Matomo, Adobe Analytics, Mixpanel, Amplitude, Heap, PostHog, Umami, Cloudflare and Vercel analytics |
| Heatmaps & recordings | Hotjar, Microsoft Clarity, FullStory, Mouseflow, Lucky Orange, Smartlook, Crazy Egg, LogRocket, Contentsquare |
| Tag managers & CDPs | Google Tag Manager (with container scan), Tealium, Adobe Launch, Segment, RudderStack, Stape |
| Ad & marketing pixels | Meta Pixel, Google Ads, Floodlight, AdSense, TikTok Pixel, LinkedIn Insight Tag, Pinterest Tag, X Pixel, Snap Pixel, Microsoft UET, Reddit, Quora, Criteo, Taboola, Outbrain, AdRoll |
| Cookie consent / CMP | OneTrust, Cookiebot, CookieYes, Osano, Usercentrics, Didomi, TrustArc, Termly, iubenda, Complianz, Google Consent Mode |
| Chat & support | Intercom, Drift, Zendesk, LiveChat, Tawk.to, Crisp, Tidio, Olark, Freshchat, Gorgias, Help Scout, HubSpot chat, WhatsApp links |
| Email & marketing | HubSpot, Mailchimp, Klaviyo, Marketo, Pardot, ActiveCampaign, Kit (ConvertKit), Brevo, MailerLite, Omnisend, Drip, Customer.io, Attentive, Privy |
| Payments | Stripe, PayPal, Shop Pay, Klarna, Afterpay, Affirm, Square, Braintree, Adyen, Amazon Pay, Razorpay, Paddle, Chargebee, Mollie |
| CDN, hosting & servers | Cloudflare, Fastly, Akamai, CloudFront, Vercel, Netlify, GitHub Pages, Google Cloud, Azure, Fly.io, Render, Heroku, WP Engine, Kinsta, Pantheon, Bunny CDN, Nginx, Apache, LiteSpeed, IIS |
| Frameworks & libraries | Next.js, Nuxt, Gatsby, Remix, Astro, SvelteKit, React, Vue, Angular, Alpine.js, htmx, Hotwire, jQuery, Bootstrap, Tailwind, GSAP, Google Fonts, Font Awesome |
| Also | A/B testing (Optimizely, VWO, AB Tasty), monitoring (Sentry, New Relic, Datadog), security (reCAPTCHA, hCaptcha, Turnstile, WAFs, HSTS), reviews (Trustpilot, Yotpo, Judge.me, Okendo), booking and forms (Calendly, Typeform, Jotform), video (YouTube, Vimeo, Wistia), site search (Algolia), accessibility widgets |

#### How confidence works

| Score | Evidence |
|---|---|
| 100 | Response header (`server: Squarespace`, `x-vercel-id`) or meta generator (`WordPress 6.9.10`) |
| 95 | Script URL (`static.klaviyo.com/onsite/js/...`) |
| 90 | Other resource URL (stylesheet, image, iframe) or cookie name |
| 85 | Found inside the site's Google Tag Manager container |
| 70-80 | HTML snippet (inline code such as `fbq('init', ...)`) |
| 60 | Implied by another technology (PHP implied by WordPress, React implied by Next.js) |

Two independent kinds of evidence add 5 points. Use `minConfidence` (default 50) to hide weak matches.

### Input

```json
{
  "urls": ["allbirds.com", "https://ghost.org", "techcrunch.com"],
  "extraPagesPerDomain": 1,
  "scanGtmContainers": true,
  "minConfidence": 50
}
```

| Field | Default | What it does |
|---|---|---|
| `urls` (required) | | Domains, URLs or email addresses, one per line (commas and spaces also split). Duplicates and www / non-www twins are merged. Invalid lines (IP addresses, `localhost`, `ftp://`, words without a TLD) get a free `invalid input` row. `startUrls` (`[{"url": ...}]`) and `domains` are accepted too |
| `extraPagesPerDomain` | 1 | Also check up to 2 internal pages: shop / collection, pricing, blog or contact page, in that order |
| `scanGtmContainers` | true | Read the public GTM container (`gtm.js`, max 2 per domain) and report the tags and IDs inside |
| `minConfidence` | 50 | Hide detections below this score |
| `respectRobotsTxt` | true | Skip pages that robots.txt disallows for `CygnixTechDetector` |
| `maxConcurrency` | 10 | Domains in parallel. Pages within one domain are fetched one at a time |
| `requestTimeoutSecs` | 20 | Per page |

### What a run costs

You pay only for domains that were actually analyzed (page loaded and at least one technology found). **The first 3 in every run are free.** No start fee, and the price does not change with extra pages or the GTM scan.

| Analyzed domains | You pay |
|---|---|
| 3 | **$0** (free in every run) |
| 100 | $0.15 |
| 1,000 | $1.50 |
| 10,000 | $15.00 |
| 100,000 | $150.00 |

(Exact: (domains − 3) × $0.0015.) Never billed: unreachable domains, HTTP errors, bot-protection and challenge pages, robots.txt blocks, non-HTML and empty pages, **parked / for-sale domains, placeholder pages** (web server default page, directory listing, suspended hosting, "site not found", or "coming soon" with no CMS/shop/analytics), invalid input lines and duplicates. Set **Maximum cost per run** in the run options and the actor stops exactly at that amount (tested 20 Oct 2026: a $0.003 cap = 3 free + 2 billed, run `7sqMW6AkmFBJpUyEr`). Domains it didn't get to are listed in `SUMMARY.notProcessedDomains` so you can re-run just those. It runs on 512 MB with plain HTTP (no browser, no proxy).

### How it compares (live Apify Store prices, verified 20 Oct 2026)

List prices on the Apify Free plan, read from the Apify Store API on 20 October 2026 (30-day users from the same API). There are 150+ tech-stack actors in the Store; these are the ones with real usage plus the cheapest. Several charge less on higher Apify plans.

| Actor | Price on the Free plan | ~Cost for 1,000 domains | Monthly users | Notes |
|---|---|---|---|---|
| **cygnix_labs/website-tech-stack-detector** (this) | **$0.0015 per analyzed domain, first 3 free, no start fee** | **$1.50** | new | GTM container scan, tracking IDs, evidence + confidence, parked / redirect / placeholder flags, failed domains free |
| builtwith/builtwith-official-technology-scraper | $0.002 per result | ~$2 (if one result per domain) | 122 | Official BuiltWith data, the category leader |
| automation-lab/wappalyzer-technology-lookup | $0.00024 per website + $0.005 start | ~$0.25 | 34 | Cheapest paid option in bulk, Wappalyzer-style lookup |
| motivational_nickel/website-technology-detector | $0.0015 per result + $0.002 start | ~$1.50 | 19 | Same per-domain price, plus a start fee |
| bovi/builtwith-tech-stack-scraper | $0.0015 per result + $0.0005 start | ~$1.50 | 8 | Same per-domain price, plus a start fee |
| automation-lab/tech-stack-detector | $0.0023 per URL + $0.035 start | ~$2.34 | 24 | "45+ technologies" |
| apivault_labs/tech-stack-lookup | $0.005 per result + small start fee | ~$5 | 22 | Also returns emails and phones |
| scrapemint/website-tech-stack-detector | $0.01 per technology row | ~$100+ (10+ rows per site) | 39 | One row per technology |
| rl1987/wappalyzer-tech-lookup | $0.0012 per technology row | ~$12-20 | 14 | One row per technology |
| cerridwen/techstack-detector | $0.01 per result | ~$10 | 12 | 7,500+ technologies, DNS / TLS, security score |
| misterkhan/website-tech-stack-scanner | $0.10 per result | ~$100 | 25 | 7,000+ technologies |
| nexgendata/wappalyzer-replacement | $0.10 per tech detection | depends on detections | 26 | Grouped JSON output |
| magicfingers/techstack-detector, shahidirfan/Website-Tech-Stack-Detector | free | $0 + your compute | 17 / 11 | Free, basic detection |

**Honest take.** BuiltWith is the proven leader. It covers far more technologies and has historical data, so pick it if you need breadth or "who used X in 2022". Actors with 7,000+ fingerprints (cerridwen, misterkhan) will also name niche tools we don't. If all you need is the cheapest possible Wappalyzer-style lookup on a huge list, automation-lab's Wappalyzer lookup is cheaper per site. This actor is for **evidence-backed checks of the tools that matter for prospecting and marketing audits** (CMS, ecommerce, analytics, pixels, consent, chat, email, hosting) **plus lead-list hygiene**: it **reads the GTM container**, so it finds GA4, Google Ads, Meta, TikTok and LinkedIn tags that load only through Tag Manager; it returns the tracking IDs; and it tells you which domains are parked, dead, placeholders or redirect to another company, without charging for them. Against motivational_nickel and bovi (same $0.0015) you skip the start fee and get 3 free domains per run.

### For AI agents / MCP

**When an agent should call this actor:** the user asks what a website is built with, which CMS / ecommerce platform / analytics / ad pixels / chat tool / hosting a site uses, wants a BuiltWith- or Wappalyzer-style lookup for a list of domains, wants to filter leads by technology ("which of these stores use Shopify and Klaviyo?"), or needs a site's GA4 / GTM / Meta Pixel IDs for an audit.

Connect the Apify MCP server with only this actor enabled (works in Claude, ChatGPT, Cursor, VS Code, Codex and any MCP client):

```
https://mcp.apify.com?tools=cygnix_labs/website-tech-stack-detector
```

Or search with the default server: `search-actors` keywords such as `tech stack detector`, `pixel checker`, `website technology lookup`, `builtwith alternative`, `wappalyzer alternative`.

Example `call-actor` input:

```json
{ "urls": ["allbirds.com", "skullcandy.com", "franklinbbq.com"], "extraPagesPerDomain": 1 }
```

**What to read from the result:** one dataset row per domain. The flat fields (`cms`, `ecommerce`, `analytics`, `advertising`, `chat`, `marketing`, `cdnHosting` ...) are comma-separated names, good for quick answers. `technologies[]` holds the full list with `confidence` and `evidence`, and `trackingIds` holds GA4 / GTM / Google Ads / Meta Pixel / TikTok IDs. Check `status`: only `ok` rows are billed. Drop rows where `parkedOrForSale` is true or `redirectedToOtherSite` is true when you clean a lead list.

**Cost control for agents:** 3 domains are free in every run, then $0.0015 per analyzed domain. Pass `maxTotalChargeUsd` in `callOptions` to hard-cap spend. This actor is pay-per-event, so it also works with Apify agentic payments.

Example prompt: *"Which of these 200 ecommerce sites run Shopify with a Meta Pixel but no TikTok Pixel? Give me the list as CSV."*

### FAQ

**Is this Wappalyzer or BuiltWith?** No. It is an independent detector with its own fingerprint rules written by Cygnix Labs. It does not use Wappalyzer's or BuiltWith's data or APIs. "Alternative" means it does the same kind of job.

**Why does it find pixels that other scanners miss?** Many sites load GA4, Google Ads, Meta, TikTok, LinkedIn, Hotjar and Clarity only through Google Tag Manager. The tag code lives in the public container file (`googletagmanager.com/gtm.js?id=GTM-...`), not in the page. This actor reads that file too. These detections are marked `GTM container GTM-XXXX: ...` with confidence 85. A tag in the container is configured, but it may only fire on some pages or after consent.

**Does it render JavaScript?** No. It reads the HTML, headers and cookies the server sends, plus the GTM container. Tools injected later by other scripts (not by GTM) may be missed. This keeps it fast and cheap.

**Why was a domain not billed?** It was unreachable, returned an HTTP error, showed a bot-protection or challenge page (Cloudflare, AWS WAF, reCAPTCHA), was blocked by robots.txt, returned non-HTML or an empty page, was a parked / for-sale domain or a placeholder page, or only security headers were found. You also get 3 free domains in every run. For blocked sites the row still lists what the response headers revealed (for example Cloudflare), free of charge.

**How are parked and for-sale domains detected?** By the parking or marketplace code on the page (Sedo, Bodis, ParkingCrew, Above, Google's domain-parking ads script, GoDaddy and Namecheap parking, Dan / Afternic / HugeDomains), a redirect to a domain marketplace, or short pages that say "this domain may be for sale". Such rows get `parkedOrForSale: true` and are free. Placeholder pages (nginx / Apache default page, "Index of /", suspended hosting, "site not found", "coming soon") get `placeholderPage`; they're free unless a real CMS, shop or analytics tool is present (for example a Shopify store behind a "coming soon" page is still billed, because the stack is real).

**What does `redirectedToOtherSite` mean?** The domain you gave ends up on a different registrable domain (jet.com → walmart.com, mint.com → intuit.com). The tech stack shown is the destination's. Useful for spotting acquired or merged companies in old lead lists. `finalDomain` shows where it landed. Meta-refresh and `location.href` redirects on near-empty pages are followed once.

**Can I paste email addresses?** Yes. `jane@acme.com` is checked as `acme.com`. Duplicates (several people at the same company) are merged, so you pay once per domain.

**Can I check a specific page instead of the homepage?** Yes. Give the full URL (`https://basecamp.com/pricing`) and that page is analyzed first.

**How accurate are versions?** Versions come from meta generator tags, headers (e.g. `x-powered-by: PHP/8.0.30`) and versioned script URLs. Many sites hide them, so `version` is often null.

**Is it legal?** It reads public pages only, sends one request at a time per domain, identifies itself (`CygnixTechDetector`) and respects robots.txt by default.

### Integrations

Run it through the Apify API, schedule it, or send results to Google Sheets, HubSpot, Clay, Make, Zapier, n8n or a webhook. Export as CSV or Excel. Pair it with [Outreach Contact Finder](https://apify.com/cygnix_labs/outreach-contact-finder) to add emails and social profiles to the same domain list.

### Changelog

- **0.1.4** (2026-10-20): Reliability and billing fixes. Max cost per run is now enforced exactly under parallel processing (before, a $0.003 cap could charge one extra domain and analyze and drop several more); domains not reached are listed in `SUMMARY.notProcessedDomains`. Parked / for-sale domains and placeholder pages are now detected and never billed (new `parkedOrForSale`, `placeholderPage`). New `finalDomain` and `redirectedToOtherSite`. Meta-refresh / JS redirects on near-empty pages are followed (they used to be reported as empty pages). Email addresses are accepted as input. Invalid lines and unexpected errors now produce a free row instead of disappearing. `http://` inputs fall back to `https://`, and error messages are readable (`DNS: domain does not resolve`, `timeout`, `TLS/SSL certificate error`). Rival prices re-verified 20 Oct 2026.
- **0.1.3** (2026-10-19): First public release (the sample above comes from build 0.1.2, same code; 0.1.3 adds this README). 314 fingerprint rules in 25 categories, GTM container scan, tracking ID extraction, schema.org / Open Graph / hreflang checks, bot-challenge and robots.txt handling. $0.0015 per analyzed domain, first 3 free every run. Rival prices verified 19 Oct 2026.

### More tools by Cygnix Labs

- [Outreach Contact Finder: Website Emails, Phones & Socials](https://apify.com/cygnix_labs/outreach-contact-finder)
- [Website SEO Audit & Site Audit + AEO/GEO Checker](https://apify.com/cygnix_labs/site-seo-aeo-audit)
- [AEO & GEO Audit + llms.txt Checker (URL list)](https://apify.com/cygnix_labs/aeo-readiness-checker)
- [Internal Link Audit & Orphan Page Finder](https://apify.com/cygnix_labs/internal-link-audit)
- [Keyword Clustering + Content Briefs](https://apify.com/cygnix_labs/keyword-clusterer-brief)
- Free local SEO MCP server: [cygnix-seo-mcp](https://github.com/cygnixlabs-cmd/cygnix-seo-mcp) (`npx -y cygnix-seo-mcp`)

Questions or a feature request? Open an issue on this actor's Issues tab. We answer within 24 hours.

# Actor input Schema

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

One website per line: a domain (allbirds.com), a URL (https://ghost.org) or an email address (jane@acme.com is checked as acme.com). Duplicates and www/non-www twins are merged; invalid lines get a free 'invalid input' row. The homepage (or the URL you give) is analyzed, plus optional extra pages. Parked/for-sale domains, placeholder pages and dead sites are reported and never billed.

## `extraPagesPerDomain` (type: `integer`):

Besides the homepage, also check up to 2 internal pages (shop/collection, pricing, blog or contact page, in that order) to catch tools that only load there (cart, checkout, chat, forms). Same price for 0, 1 or 2.

## `scanGtmContainers` (type: `boolean`):

Many sites load GA4, Google Ads, Meta, TikTok, LinkedIn, Hotjar and other pixels only through Google Tag Manager, so they never appear in the page HTML. When on, the public GTM container (gtm.js) of each site is read too (max 2 per domain) and the tags and IDs inside it are reported.

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

Hide detections below this score. 100 = header or meta generator, 95 = script URL, 90 = other resource URL or cookie, 85 = found in the GTM container, 70-80 = HTML snippet, 60 = implied (e.g. PHP implied by WordPress).

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

Domains processed in parallel. Pages inside one domain are fetched one at a time.

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

Skip pages that robots.txt disallows for our user-agent (CygnixTechDetector). Domains whose homepage is disallowed are reported and never billed.

## `requestTimeoutSecs` (type: `integer`):

Per page. Slow or dead sites are reported as unreachable and never billed.

## Actor input object example

```json
{
  "urls": [
    "allbirds.com",
    "techcrunch.com",
    "webflow.com"
  ],
  "extraPagesPerDomain": 1,
  "scanGtmContainers": true,
  "minConfidence": 50,
  "maxConcurrency": 10,
  "respectRobotsTxt": true,
  "requestTimeoutSecs": 20
}
```

# Actor output Schema

## `results` (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 = {
    "urls": [
        "allbirds.com",
        "techcrunch.com",
        "webflow.com"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("cygnix_labs/website-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",
        "techcrunch.com",
        "webflow.com",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("cygnix_labs/website-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",
    "techcrunch.com",
    "webflow.com"
  ]
}' |
apify call cygnix_labs/website-tech-stack-detector --silent --output-dataset

```

## MCP server setup

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