Website Tech Stack Detector - Evidence & Change Tracking
Pricing
from $3.00 / 1,000 website observations
Website Tech Stack Detector - Evidence & Change Tracking
Detect supported CMS, ecommerce, analytics and framework signals from public HTML and headers. Evidence per finding, CRM IDs and complete-scope repeat comparisons. No browser or API key.
Pricing
from $3.00 / 1,000 website observations
Rating
0.0
(0)
Developer
Brandt May
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Give this Actor a list of public websites. It reads their HTML and response headers, then returns supported technology signals with the exact asset, header or HTML attribute behind each finding. Use the results to segment supplied company lists, review a website portfolio, or compare the same pages on a schedule.
It supports CMS and ecommerce systems, frameworks, analytics, advertising, customer support, payments and hosting signals. Your own externalId travels with each result so you can join the output to existing records. No external API key is required.
Start with two public examples
{"websites": [{ "url": "https://wordpress.org/", "externalId": "wordpress-demo" },{ "url": "https://nextjs.org/", "externalId": "nextjs-demo" }]}
An omitted or empty websites array runs this two-site demo. No automatic site crawl occurs. You can supply up to 100 websites and at most two additional pages on each website's original origin:
{"websites": [{"url": "https://wordpress.org/","externalId": "site-123","additionalUrls": ["https://wordpress.org/about/", "https://wordpress.org/news/"]}],"maxRunSeconds": 240}
Reading supplied inner pages helps find tools not visible on the homepage. Every supplied page must be inspected successfully for that website to enter the result dataset. A failed page is recorded in SUMMARY; the incomplete website is not billed as a result or used to update history.
Output
Each successful website check produces one record. A simplified illustrative result:
{"url": "https://nextjs.org/","externalId": "nextjs-demo","finalUrl": "https://nextjs.org/","status": "ok","httpStatus": 200,"pageCount": 1,"technologyCount": 2,"technologyNames": ["Next.js", "Vercel"],"technologiesByCategory": {"framework": ["Next.js"],"hosting": ["Vercel"]},"findings": [{"name": "Next.js","category": "framework","certainty": "direct","evidence": [{"type": "header","value": "x-powered-by: Next.js","sourcePage": "https://nextjs.org/"}]}],"detectionMethod": "public_html_and_response_headers","rulesVersion": "1.0.0","changeStatus": "not_compared"}
Actual records include checkedAt, pageUrls, scopeKey, previousCheckedAt, addedTechnologies and noLongerObservedTechnologies. Findings are alphabetized; evidence is capped at three examples per technology per page, up to nine per website. Asset evidence omits query strings and fragment identifiers. certainty: direct means an identifying artifact was observed, not that we verified a vendor subscription, executed its code, or measured how the site uses it.
status is ok when a supported signal was found, or no_supported_signal when the HTML was successfully inspected without a match. Both are completed, billable checks. A zero-signal result does not prove software is absent.
The default key-value store's SUMMARY record contains processed counts, skipped inputs, failures, per-page reasons and time-budget coverage. Failure classes include blocked pages, robots restrictions, HTTP errors, non-HTML responses, request errors and timeouts. If no website can be completely inspected, the run fails with a diagnostic instead of silently succeeding empty.
If your run charge limit prevents a result from being saved, the Actor stops with a clear warning and SUMMARY.stoppedOnChargeLimit: true. Unsaved results do not advance history. A charge limit reached before the first result is a normal empty budget stop, reported as outcome: stopped_on_charge_limit.
Supported signal catalog
These are the explicitly implemented names; coverage is limited to their visible signals:
| Category | Technologies |
|---|---|
| CMS and site tools | WordPress, Drupal, Joomla, Ghost, TYPO3, Hugo, Webflow, Wix, Squarespace, Docusaurus |
| Ecommerce | WooCommerce, Shopify, PrestaShop, Magento |
| Frameworks and libraries | Next.js, Nuxt, Gatsby, Angular, SvelteKit, Express, jQuery, Alpine.js, Bootstrap |
| Analytics and tags | Google Tag Manager, Google tag, Google Analytics 4, Plausible Analytics, Microsoft Clarity, Hotjar, Segment, Mixpanel, PostHog, Fathom Analytics |
| Marketing and advertising | Google Ads, HubSpot, Marketo, Klaviyo, Mailchimp, Meta Pixel, TikTok Pixel, LinkedIn Insight Tag |
| Support | Intercom, Zendesk, Crisp, Tawk.to, Drift, Freshchat |
| Payments | Stripe.js, PayPal SDK, Braintree |
| Monitoring and consent | Sentry, New Relic, Datadog RUM, OneTrust, Cookiebot, Usercentrics |
| Infrastructure | Cloudflare, Vercel, Netlify, nginx, Apache, Microsoft IIS |
Signatures inspect script and stylesheet references, selected preload assets, generator tags, explicit HTML attributes, narrow inline JavaScript assignments and response headers. A vendor mentioned in ordinary page prose or a normal hyperlink does not count. Shopify CDN assets alone do not label a site as a Shopify store. A generic Google tag is distinguished from a GA4 tag identifier. No inferred backend or framework dependencies are added.
Compare repeat runs
{"websites": ["https://wordpress.org/", "https://nextjs.org/"],"comparePrevious": true,"snapshotName": "my-website-portfolio"}
The first successful run returns all successful checks and establishes a baseline. Reuse the same store name and exact supplied page set on later runs. Results still include every successful website, with changeStatus of baseline, baseline_reset, unchanged or changed. Unchanged results are billable because the site was inspected again.
Snapshots contain URLs and technology names and are saved in the named key-value store in your Apify account. A changed supplied page scope creates a separate baseline. A rules version or final redirect destination change resets the baseline, avoiding a misleading comparison. Incomplete or failed website checks never overwrite a baseline. Avoid concurrent runs that share a snapshot store: the last completing run saves the latest snapshot.
noLongerObservedTechnologies means the current complete check did not observe those signals. A site may have changed consent settings, hidden assets or delivered different markup; this is not proof that a tool was uninstalled. There is no webhook or notification sending in this Actor. You can use the exported result with your own automation.
Inputs and limits
| Input | Default | Meaning |
|---|---|---|
websites | Two-site demo in code | Up to 100 strings or {url, externalId, additionalUrls} objects |
maxWebsites | 100 | Process this many input records after exact duplicate removal |
comparePrevious | false | Save and compare complete observations |
snapshotName | website-tech-monitor | Private named store; use a distinct name per independent monitor |
maxRunSeconds | 240 | Wall-clock budget; minimum 30, maximum 3600 |
At most three supplied pages per website, five redirects per page, 2 MB HTML per page and 20 seconds per request are allowed within the overall budget. Respectful public HTTP requests check robots.txt, including redirect destinations. Requests blocked by access controls are reported. Sites requiring login or JavaScript execution cannot be fully inspected by this Actor. HTML consent gates and geography can change visible signals. This is an observed technology inventory, not a security or compliance audit, traffic estimate, revenue estimate, or complete Wappalyzer/BuiltWith replacement.
Exact repeated page scopes with the same externalId are deduplicated. Different IDs or different supplied page scopes produce separate checks. The Actor preserves the input record's first URL as url; the fetched final location is finalUrl.
Pricing
The launch price is $0.005 per successful website check ($5 per 1,000) on Free/Bronze. Each check includes its supplied scope of up to three pages. A successful zero-signal check and an unchanged comparison are charged. Failed, robots-disallowed, incomplete or unprocessed websites are not charged as results. An Actor Start event of $0.00005 also applies. Silver is 20% lower and Gold/Platinum/Diamond 40% lower. The live Pricing tab is authoritative.
Normal Apify account credits and limits apply. No feature requires a separate API subscription. Do not run the same monitored scope concurrently if you need an ordered comparison history.
Examples
The tasks/ directory contains three proposed example inputs: WordPress CMS/header signals, Next.js framework/hosting signals, and WordPress evidence across three supplied pages. They are local proposals until separately validated on the platform and published.