# BuiltWith (Technology Looker) (`canadesk/builtwith`) Actor

Find out what websites are Built With (technology looker). It's fast and costs little.

- **URL**: https://apify.com/canadesk/builtwith.md
- **Developed by:** [Canadesk Support](https://apify.com/canadesk) (community)
- **Categories:** Automation, SEO tools, Lead generation
- **Features:** Full permissions
- **Stats:** 711 total users, 4 monthly users, 96.0% runs succeeded, 45 bookmarks
- **User rating**: 1.12 out of 5 stars

## Pricing

from $3.00 / 1,000 domain profiles

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

Look up website technologies and public company information from **BuiltWith**. Submit one domain or a list and choose a technology or company profile.

### Features

| **Process** | **What you get** |
| :--- | :--- |
| Technology profile | Main technologies and their categories, such as analytics, hosting, ecommerce and JavaScript libraries. |
| Technology profile with sub-products | Main technologies plus additional products, versions and add-ons displayed on the public page. |
| Company profile | Available company details, countries, associated domains and other public company fields. |

BuiltWith verification challenges currently prevent reliable collection in tested runs. The Actor reports unavailable lookups; private reports and interactive charts are not included.

### Getting started

1. Enter domains such as `hubspot.com` and `apify.com`, or their homepage URLs.
2. Select a process.
3. Choose whether to reuse cached results or fetch fresh data.
4. Start the Actor and open the dataset to review or export results.

Submit domains without paths, query strings or fragments. Up to 10,000 domains are accepted; duplicate domains are processed once. A run can stop before finishing the list if it reaches its spending or time limit, or repeatedly cannot retrieve data.

#### Example

```json
{
  "startUrls": ["hubspot.com", "apify.com"],
  "process": "gf",
  "cache": "1",
  "proxy": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }
}
```

Process values are `gt` for main technologies, `gf` for technologies with sub-products, and `gc` for company information. Existing integrations can continue using `"url": "hubspot.com"` instead of `startUrls`.

### Results

Under PPE, each successful domain lookup produces one profile. A technology profile includes its technologies and categories; a company profile includes available sections and their fields. Missing values remain empty rather than being invented.

For example, a technology result may contain:

```json
{
  "url": "hubspot.com",
  "process": "gt",
  "technologies": [{ "name": "Hubspot", "category": "Analytics", "url": "hubspot.com" }],
  "item_type": "domain_profile",
  "rowType": "result"
}
```

### Pricing and minimum results

See the **Pricing** tab for current rates, the start fee and any scheduled changes. Normal pay-per-event runs have a **shared minimum charge of 100 lookup units** across submitted domains. Each successful domain profile counts once, regardless of how many technologies or company fields it contains. Profiles above the minimum are charged individually. Each separate run has its own minimum, including scheduled or API runs. Platform usage is included. Technology and company lookups are separate selected processes.

If fewer than 100 results are available, the remaining rows are clearly marked as placeholders and contain no BuiltWith data. Export rows with `rowType: result` to keep only collected data. Placeholders have no additional charge beyond the minimum. Stopping a run does not refund a minimum already charged and may leave fewer dataset rows.

Until a scheduled switch to PPE takes effect, successful rental runs retain the existing default or compact output format. If every lookup fails, the dataset contains 100 clearly marked placeholders saying "Try another proxy"; these do not incur PPE charges during rental pricing. Under PPE, each real result row contains a complete domain profile for the selected process.

### Freshness and availability

Successful lookups can be reused for up to 90 days. Disable caching when you need a fresh lookup; fresh results still reflect BuiltWith's own detection history, not a live scan of the target website. Cached and freshly collected results follow the same pricing.

Only information visible in BuiltWith's public response is available. Some domains have limited information, and verification challenges can prevent a lookup. Interactive charts and private reports are not included. Proxy settings can affect availability. Failed lookups appear in the run log and the RUN_SUMMARY record. If a lookup problem prevents every result, the run returns one clear error record and charges a reduced minimum of up to **$0.02**, plus the start fee shown in Pricing.

### Support

Open an issue on this Actor's Issues tab with your run URL and affected domains.

# Actor input Schema

## `process` (type: `string`):

Choose which public BuiltWith information to collect.

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

Domains or homepage URLs. Duplicate domains are processed once. Each domain profile counts as one lookup, with all returned fields included. PPE runs share one 100-lookup minimum.

## `url` (type: `string`):

Legacy single-domain input. Used when Website domains is omitted.

## `cache` (type: `string`):

Reuse successful lookups. Cached results count toward the result minimum and price in the same way as fresh results.

## `savings` (type: `string`):

Applies during rental pricing only. PPE returns one profile per domain.

## `proxy` (type: `object`):

The recommended settings are provided. Platform usage is included in PPE pricing.

## Actor input object example

```json
{
  "process": "gt",
  "startUrls": [
    "hubspot.com",
    "apify.com"
  ],
  "cache": "1",
  "savings": "2",
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# 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": [
        "hubspot.com",
        "apify.com"
    ],
    "proxy": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("canadesk/builtwith").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": [
        "hubspot.com",
        "apify.com",
    ],
    "proxy": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("canadesk/builtwith").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": [
    "hubspot.com",
    "apify.com"
  ],
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call canadesk/builtwith --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,canadesk/builtwith"
        }
    }
}
```

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/JaKpkI1ExstGUrO8o/builds/qsA56Zm0QgoVmxHUY/openapi.json
