Website Tech Stack Detector - Evidence & Change Tracking avatar

Website Tech Stack Detector - Evidence & Change Tracking

Pricing

from $3.00 / 1,000 website observations

Go to Apify Store
Website Tech Stack Detector - Evidence & Change Tracking

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

Brandt May

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

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:

CategoryTechnologies
CMS and site toolsWordPress, Drupal, Joomla, Ghost, TYPO3, Hugo, Webflow, Wix, Squarespace, Docusaurus
EcommerceWooCommerce, Shopify, PrestaShop, Magento
Frameworks and librariesNext.js, Nuxt, Gatsby, Angular, SvelteKit, Express, jQuery, Alpine.js, Bootstrap
Analytics and tagsGoogle Tag Manager, Google tag, Google Analytics 4, Plausible Analytics, Microsoft Clarity, Hotjar, Segment, Mixpanel, PostHog, Fathom Analytics
Marketing and advertisingGoogle Ads, HubSpot, Marketo, Klaviyo, Mailchimp, Meta Pixel, TikTok Pixel, LinkedIn Insight Tag
SupportIntercom, Zendesk, Crisp, Tawk.to, Drift, Freshchat
PaymentsStripe.js, PayPal SDK, Braintree
Monitoring and consentSentry, New Relic, Datadog RUM, OneTrust, Cookiebot, Usercentrics
InfrastructureCloudflare, 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

InputDefaultMeaning
websitesTwo-site demo in codeUp to 100 strings or {url, externalId, additionalUrls} objects
maxWebsites100Process this many input records after exact duplicate removal
comparePreviousfalseSave and compare complete observations
snapshotNamewebsite-tech-monitorPrivate named store; use a distinct name per independent monitor
maxRunSeconds240Wall-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.