# Website Technology Auditor — BuiltWith Alternative (`khadinakbar/website-stack-evidence-audit`) Actor

Audit website technology stacks from public page evidence. Export detected tools, categories, confidence, source routes, and timestamps per domain. An optional catalog tier adds broader technology coverage.

- **URL**: https://apify.com/khadinakbar/website-stack-evidence-audit.md
- **Developed by:** [Khadin Akbar](https://apify.com/khadinakbar) (community)
- **Categories:** SEO tools, Developer tools, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 source-evidenced website audits

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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Website Technology Auditor — BuiltWith Alternative

Audit website technology stacks from public page evidence. Export detected tools, categories, confidence, source routes, and timestamps per domain. An optional catalog tier adds broader technology coverage. For technical auditors, each dataset record is one domain's technology findings with confidence and source evidence.

### Workflow: put the results to work

Use the public-page tier when you need inspectable evidence for a known domain. Select the catalog tier when broader coverage is useful, then review the source route and freshness of each finding. A detection is stronger when its evidence matches the exact website you intended to audit.

### Best fit for website technology audits

Use this Actor to audit a prospect, competitor, migration candidate, or website portfolio when you already know the domains. Choose:

Review the Pricing tab for current event rates. Total run cost includes the events actually charged and Apify platform usage; any separately billed provider access is described in the input and data-access guidance.

Review the Pricing tab for current event rates. Total run cost includes the events actually charged and Apify platform usage; any separately billed provider access is described in the input and data-access guidance.

For historical adoption data, reverse technology lists, relationships, or a broader technology-data suite, use BuiltWith or another provider that maintains those records. This Actor focuses on supplied-domain audits and does not turn a technology name into a list of websites.

### How this BuiltWith alternative compares

This Actor replaces the supplied-domain technology-audit step: identify technologies associated with a known website and retain machine-readable provenance. BuiltWith remains the better fit when the job needs its historical technology database, reverse lists, relationships data, product datasets, broader reporting, or suite features.

| Decision             | This Actor                                                                                                                                    | BuiltWith                                                                            | Best fit                                                                                     |
| -------------------- | --------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------- |
| Bounded workflow     | Audits known domains through live public responses, with optional managed catalog enrichment.                                                 | Provides a broader technology-data suite and API products.                           | Choose this Actor for a focused domain audit; choose BuiltWith for broader product coverage. |
| Freshness            | Records audit time for live responses and provider `last_visited` separately.                                                                 | Offers current and historical technology data products.                              | Use the Actor for explicit per-source provenance and BuiltWith when history is required.     |
| Output               | Returns typed JSON with technologies, evidence, source routes, inspected URLs, and timestamps.                                                | Supports broader data, API, and reporting workflows.                                 | Use the Actor when evidence-linked JSON is the required deliverable.                         |
| Billing              | Charges per persisted base or premium audit plus Apify platform usage.                                                                        | Uses product and credit pricing for broader offerings.                               | Compare current pricing against the exact workload before choosing.                          |
| Effective efficiency | Processes a bounded domain batch and returns one reusable JSON row per accepted audit; equal-workload timing evidence remains a release gate. | Supports broader lookup and reporting workflows.                                     | Choose based on the output and operator workflow required for the job.                       |
| Automation           | Runs through Apify Console or API and stores results in a dataset.                                                                            | Provides documented APIs and data products.                                          | Use the integration surface already used by the downstream workflow.                         |
| Scope boundary       | Does not provide reverse-search or historical technology timelines.                                                                           | Covers historical, reverse-list, relationship, dataset, and broader suite workflows. | Choose BuiltWith when those wider capabilities drive the decision.                           |

BuiltWith is a trademark of its owner. This independent Actor is not affiliated with, associated with, or endorsed by BuiltWith. DataForSEO is an independent third-party data provider.

### From domain input to a stack decision

A sales researcher starts with a bounded list of prospect domains and chooses detailed `hybrid_premium` coverage. The Actor then inspects the selected public paths, enriches each domain from the managed catalog, and exports one provenance-aware dataset row per usable audit. Next, the researcher filters `categoriesSummary` for ecommerce, analytics, or support signals and passes the matching domains into qualification or migration review. Repeating the saved task later creates another buyer-owned point-in-time snapshot.

### Inputs and quick start

Default live-only audit:

```json
{
    "startUrls": [{ "url": "https://example.com" }],
    "dataMode": "live_only",
    "pathsToInspect": ["/", "/pricing", "/contact"],
    "maxPagesPerDomain": 3,
    "maxDomains": 10,
    "useApifyProxy": true,
    "responseFormat": "detailed"
}
```

Premium catalog-enriched audit:

```json
{
    "startUrls": [{ "url": "https://example.com" }],
    "dataMode": "hybrid_premium",
    "pathsToInspect": ["/"],
    "maxPagesPerDomain": 1,
    "maxDomains": 1,
    "useApifyProxy": true,
    "responseFormat": "detailed"
}
```

Run the Actor after deployment:

```bash
curl "https://api.apify.com/v2/acts/khadinakbar~website-stack-evidence-audit/runs" \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"startUrls":[{"url":"https://example.com"}],"dataMode":"live_only","pathsToInspect":["/"],"maxPagesPerDomain":1,"maxDomains":1,"useApifyProxy":true,"responseFormat":"detailed"}'
```

### Output contract

One dataset row represents one successful domain audit.

| Field                     | Meaning                                                                                     |
| ------------------------- | ------------------------------------------------------------------------------------------- |
| `domain`                  | Hostname used for the audit and optional catalog lookup.                                    |
| `scanStatus`              | `COMPLETE`, `PARTIAL`, or `VALID_EMPTY` for that domain.                                    |
| `dataMode`                | Actual billed result tier: `live_only` or `hybrid_premium`.                                 |
| `dataSources`             | Provenance routes used: public responses, DataForSEO, or both.                              |
| `providerLastVisited`     | DataForSEO catalog visit time, or `null` for live-only rows.                                |
| `pagesInspected`          | Public page URLs and response status codes used in the audit.                               |
| `technologies`            | Detected technologies with categories and confidence. Detailed mode also includes evidence. |
| `technologies[].evidence` | The public signal or managed catalog observation supporting a detection.                    |
| `scannedAt`               | ISO 8601 time when this Actor assembled the result.                                         |

Example premium record:

```json
{
    "domain": "example.com",
    "scanStatus": "COMPLETE",
    "dataMode": "hybrid_premium",
    "dataSources": ["public_responses", "dataforseo_domain_technologies"],
    "providerLastVisited": "2026-08-13 15:15:27 +00:00",
    "pagesInspected": [{ "url": "https://example.com/", "statusCode": 200 }],
    "technologyCount": 1,
    "categoriesSummary": { "CDN": 1 },
    "technologies": [
        {
            "name": "Cloudflare",
            "categories": ["CDN"],
            "confidence": 70,
            "evidence": [
                {
                    "source": "provider_catalog",
                    "locator": "DataForSEO Domain Technologies",
                    "matched": "Managed catalog observation for example.com; catalog last visited 2026-08-13 15:15:27 +00:00",
                    "confidence": 70
                }
            ]
        }
    ],
    "scannedAt": "2026-09-07T12:00:00.000Z"
}
```

Provider-only results are marked `PARTIAL` and identify the catalog as their sole source. Provider catalog confidence is normalized to 70 as a transparent Actor heuristic, separate from DataForSEO's supplied fields. A provider timestamp describes when the provider last visited the domain, while `scannedAt` describes this Actor run.

### Use with an AI agent through Apify MCP

> Use this BuiltWith alternative to audit `https://example.com` in `hybrid_premium` mode. Return the CMS, analytics, payment, support, and CDN technologies, separate live evidence from managed catalog evidence, and report both collection timestamps.

A valid result returns `COMPLETE`, `PARTIAL`, or `VALID_EMPTY` with explicit `OUTPUT` and `RUN_SUMMARY` records. A valid URL whose required public responses and premium catalog are both unavailable returns `UPSTREAM_FAILED` or `CONFIG_ERROR` with an actionable diagnostic and no domain-audit event charge.

### Best results and responsible use

Start with a small batch and detailed output. Include `/pricing`, `/contact`, or other same-site public paths only when they are relevant. A technology may be absent because it is server-side, feature-gated, missing from inspected paths, hidden, or absent from the provider catalog; treat the result as observed evidence, not proof of absence.

Use the Actor only on public websites and in line with applicable law and the target website's terms. Repeat a saved task on a schedule when you need a buyer-owned series of point-in-time snapshots.

### Builder's note

I designed this Actor around auditability and graceful degradation: every result states which route produced it, premium failures fall back to the base product when possible, and each technology retains its supporting public signal or catalog provenance.

### Evidence and verification

`ALTERNATIVE_ACTOR_DOSSIER.json` records the bounded BuiltWith alternative comparison. `PROVIDER_PRICING.json` records the optional provider's unit cost, account pricing readback, and premium event margin. Private build, output, pricing, and release-matrix evidence are recorded before any publication-ready claim.

### Pricing and run costs

This Actor uses **Pay per event plus Apify platform usage**. The [Pricing tab](https://apify.com/khadinakbar/website-stack-evidence-audit/pricing) lists the current event rates and billing terms.

| Event | Billing unit | When it applies |
|---|---|---|
| `apify-actor-start` | Actor Start | Charged when the Actor starts running. Number of events charged depends on Actor memory (one event per GB, minimum one event). |
| `site-audited` | Source-evidenced website audit | One completed and persisted public-domain technology audit with current source evidence. |
| `premium-site-audited` | Premium hybrid website audit | One persisted domain audit combining current public-page evidence with an owner-managed DataForSEO Domain Technologies catalog result. |

Run cost combines the charged events and Apify platform usage. Review the run charge limit and requested result count before starting.

### Connect an AI agent

Use the [Apify MCP configurator](https://mcp.apify.com) to choose an available client connection. Inspect this Actor’s current input schema and required credentials before running it.

# Actor input Schema

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

Public website URLs to audit, for example `https://example.com`. The Actor normalizes each URL to its domain and checks the selected same-site paths. Submit up to 50 entries; Maximum domains controls how many are processed. Use public HTTP(S) websites rather than technology names or reverse-search queries.

## `dataMode` (type: `string`):

Choose `live_only` for the $0.005 current public-page audit, or `hybrid_premium` for a $0.06 result that combines live evidence with the owner-managed DataForSEO Domain Technologies catalog. Premium catalog results include provider freshness provenance and can rescue a domain when its live pages are unavailable. If the provider fails but live evidence succeeds, the Actor automatically persists and bills only the base audit.

## `pathsToInspect` (type: `array`):

Relative public paths inspected for every supplied domain, for example `/`, `/pricing`, and `/contact`. The default samples several common pages because a homepage alone can miss payment or support integrations. This is not a list of external URLs and cross-site paths are rejected.

## `maxPagesPerDomain` (type: `integer`):

Hard cap for same-site public pages inspected per domain, from 1 to 4. Defaults to 3 and uses the earliest valid entries from Same-site paths to inspect. This is not a website-depth crawl or a limit on technology detections.

## `maxDomains` (type: `integer`):

Hard cap for distinct domain audits from Start URLs, from 1 to 50. Defaults to 10 so a run remains predictable even when a larger URL list is supplied. This is not a pagination setting or a reverse technology search limit.

## `useApifyProxy` (type: `boolean`):

Use Apify Residential Proxy for public-page requests to improve access consistency on websites that restrict direct cloud traffic. Defaults to enabled and can add platform proxy usage charges in addition to the per-domain event price. This does not bypass logins, paywalls, CAPTCHA challenges, or website access controls.

## `responseFormat` (type: `string`):

Choose `detailed` to return technology evidence with the public signal that matched, or `concise` for only name, categories, and confidence. Defaults to detailed for auditability and is best for reviews or migration research. This setting does not change which pages are requested or which signatures are available.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://example.com"
    }
  ],
  "dataMode": "live_only",
  "pathsToInspect": [
    "/",
    "/pricing",
    "/contact"
  ],
  "maxPagesPerDomain": 3,
  "maxDomains": 10,
  "useApifyProxy": true,
  "responseFormat": "detailed"
}
```

# Actor output Schema

## `audits` (type: `string`):

One structured technology audit per usable domain, with actual data mode, source routes, and freshness provenance.

## `runSummary` (type: `string`):

Detailed terminal outcome, page and provider counts, provider cost, margin, warnings, and event-charge counts.

## `compactOutput` (type: `string`):

Stable terminal result for agents and automations.

# 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 = {
    "startUrls": [
        {
            "url": "https://example.com"
        }
    ],
    "dataMode": "live_only",
    "pathsToInspect": [
        "/",
        "/pricing",
        "/contact"
    ],
    "maxPagesPerDomain": 3,
    "maxDomains": 10,
    "useApifyProxy": true,
    "responseFormat": "detailed"
};

// Run the Actor and wait for it to finish
const run = await client.actor("khadinakbar/website-stack-evidence-audit").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 = {
    "startUrls": [{ "url": "https://example.com" }],
    "dataMode": "live_only",
    "pathsToInspect": [
        "/",
        "/pricing",
        "/contact",
    ],
    "maxPagesPerDomain": 3,
    "maxDomains": 10,
    "useApifyProxy": True,
    "responseFormat": "detailed",
}

# Run the Actor and wait for it to finish
run = client.actor("khadinakbar/website-stack-evidence-audit").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 '{
  "startUrls": [
    {
      "url": "https://example.com"
    }
  ],
  "dataMode": "live_only",
  "pathsToInspect": [
    "/",
    "/pricing",
    "/contact"
  ],
  "maxPagesPerDomain": 3,
  "maxDomains": 10,
  "useApifyProxy": true,
  "responseFormat": "detailed"
}' |
apify call khadinakbar/website-stack-evidence-audit --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,khadinakbar/website-stack-evidence-audit"
        }
    }
}
```

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/XFAdEZmNTVz0ZnZ9M/builds/3FPRzfuYhdCfq9SVU/openapi.json
