# BuiltWith Scraper | Tech Stacks and Top Sites (`silentflow/builtwith-scraper`) Actor

BuiltWith scraper for technology stacks and Top Sites rankings. Get every technology detected on any website with category, tags, rank and AI Index, or list the top sites of 40 countries with company name, tech spend, sales revenue and traffic. Build technographic lead lists, no API key needed.

- **URL**: https://apify.com/silentflow/builtwith-scraper.md
- **Developed by:** [SilentFlow](https://apify.com/silentflow) (community)
- **Categories:** Lead generation, Marketing, SEO tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.36 / 1,000 websites

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## BuiltWith Scraper

**Turn BuiltWith into a table: the full technology stack of any list of websites, or the ranked Top Sites of a country with company name, tech spend and traffic, one row per website.** 100 top sites with their companies in a few seconds, 361 technologies for shopify.com in one page.

### How it works

![How it works](https://api.apify.com/v2/key-value-stores/YXm81xySHg6uRkewS/records/builtwith-scraper-how-it-works-v1.png)

1. **You type websites, or pick a country.** Paste domains one per line (`shopify.com`, `https://www.stripe.com/`) to get their technology profiles. Leave the list empty and pick a country to walk BuiltWith's Top Sites ranking instead, all sites or online stores only.
2. **Each website is read once.** A profile gives every technology BuiltWith detects on the site with its category, tags and description, plus the BuiltWith rank, the AI Index and the site age. A ranking page gives 100 sites with rank, company, country, monthly tech spend, sales revenue, social reach and traffic tier.
3. **One row comes back per website.** 22 fields, the same shape in both modes, with 7 fields per technology. Ready for a CRM import, a spreadsheet, a warehouse or an AI pipeline.

### ✨ Why teams choose this over other BuiltWith scrapers

Looking up prospects one by one on builtwith.com? Copying the Top Sites pages into a sheet by hand? Cleaning "Upgrade to Advanced" placeholders and text ranges like "1K to 5K" out of another scraper's output?

- 🧩 **Every technology, named and categorised.** A profile row lists each technology BuiltWith shows on the public page (361 for shopify.com, in 26 categories) with its category, tags, description, link and icon. No placeholder rows, no nested trees: one flat list you can filter with a single expression.
- 🏆 **The Top Sites ranking as data.** Pick one of 40 countries or the Global list, choose all sites or online stores only, and get the ranking 100 rows per page, up to 2,000 rows per list, with the company name on each row. The most used BuiltWith actors on the Store cannot read this list at all.
- 💵 **Numbers you can sort.** Tech spend, sales revenue, social reach and employees are integers in USD or units, never "1K to 5K". Dates are RFC 3339. Unknown values are `null`, never empty strings.
- 🏢 **Company on every ranked site.** Company name and a registration id such as an SEC CIK where BuiltWith has one, without an extra tab or a second actor.
- 🤖 **AI readiness and site age on every profile.** The AI Index (0 to 100), the registration date and the date of the last technology detection sit on the row, next to the BuiltWith rank.
- 🔀 **Two jobs, one form.** Profile the websites you name, or rank a market. Turn on one switch and every ranked site also carries its full technology stack.
- 🔓 **No account, no API key.** Click Start on the prefilled form and the first 100 rows arrive in seconds.

### 🎯 What you can do with BuiltWith data

| Team | What they build |
|------|-----------------|
| Sales and SDR | A prospect list enriched with the tools each website runs, to pitch the accounts on a competitor's stack or on a stack their product integrates with |
| Growth and marketing | The 2,000 biggest online stores of a country with revenue and spend estimates, as the seed of an outbound campaign |
| RevOps and data | A technographic column set in the CRM, refreshed monthly by a scheduled run over the account domains |
| Competitive intelligence | A monthly snapshot of competitors' stacks: which analytics, CRM, payment or CDN vendor they add or drop |
| Market research | Adoption of a technology among the top sites of ten countries, computed from the `technologies` column |
| Investors and analysts | The infrastructure and AI readiness of a target and its peers before a call |
| Agencies | A list of high-spend websites in a market that still run an outdated platform, for migration offers |
| Security and compliance | The third-party scripts, hosts and vendors present on a portfolio of company websites |

### 📥 Input parameters

Type websites, or pick a country. The form works as prefilled: the Top Sites of the United States, 100 rows.

| Parameter | Type | Default | What it does |
|-----------|------|---------|--------------|
| `domains` | array | none | Websites to profile, one per line. A domain (`shopify.com`) or a full address (`https://www.stripe.com/`) both work. When this list has at least one entry, the Top Sites options are ignored. |
| `topSitesCountry` | select | `United-States` | Used when the list is empty: the Top Sites ranking to walk. `Global` or one of 40 countries. |
| `maxItems` | integer | `100` | Rows to save. With websites, the first N of the list. With Top Sites, the ranking in order until N rows: 100 is one page, 2000 is a whole list. |

#### 🏆 Top sites

| Parameter | Type | Default | What it does |
|-----------|------|---------|--------------|
| `ecommerceOnly` | boolean | `false` | Only the online stores of the ranking, each with its estimated monthly sales revenue. |

#### 📄 Output

| Parameter | Type | Default | What it does |
|-----------|------|---------|--------------|
| `includeTechnologies` | boolean | `false` | Read the technology profile of every ranked site: full technology list, categories, AI Index and site age on each row. Profiles are read about ten seconds apart, so 100 sites take around 20 minutes. Websites you name always include their technologies. |

#### ⚙️ Advanced

| Parameter | Type | Default | What it does |
|-----------|------|---------|--------------|
| `debugMode` | boolean | `false` | Detailed run log. Leave off. |

### 📊 Output data

One row per website. Both modes share the same 22 fields; a field the source does not give is `null`.

A ranked site (Top Sites mode):

```json
{
  "id": "vimeo.com",
  "url": "https://builtwith.com/vimeo.com",
  "domain": "vimeo.com",
  "companyName": "Vimeo, Inc",
  "companyId": "SEC CIK 1837686",
  "technologies": null,
  "technologiesCount": null,
  "techCategories": null,
  "rank": 1,
  "techSpend": 10000,
  "salesRevenue": null,
  "socialFollowers": 200000,
  "employees": null,
  "traffic": "Very High",
  "aiIndex": null,
  "country": "United States",
  "firstRegisteredAt": null,
  "lastDetectedAt": null,
  "faviconUrl": "https://x.cdnpi.pe/serve/KVuyZOOMz70Ak8bG/vimeo.com",
  "dataType": "topSite",
  "isLiveLookup": false,
  "scrapedAt": "2026-09-20T09:12:41Z"
}
```

A technology profile (website list mode, technologies shortened):

```json
{
  "id": "shopify.com",
  "url": "https://builtwith.com/shopify.com",
  "domain": "shopify.com",
  "companyName": null,
  "companyId": null,
  "technologies": [
    {
      "name": "Hubspot",
      "category": "Analytics and Tracking",
      "tags": ["CRM", "Marketing Automation", "Lead Generation", "Inbound Marketing", "Sales Enablement", "Content Marketing", "Email Marketing"],
      "description": "Hubspot provides marketing information and leads via inbounding marketing software.",
      "link": "https://trends.builtwith.com/analytics/Hubspot",
      "iconUrl": "https://x.cdnpi.pe/serve/CmBSWOMPjh6lEXhc-b4d87b2c/hubspot.com",
      "isSubTechnology": false
    },
    {
      "name": "Google Universal Analytics",
      "category": "Analytics and Tracking",
      "tags": null,
      "description": "The analytics.js JavaScript snippet is a new way to measure how users interact with your website.",
      "link": "https://trends.builtwith.com/analytics/Google-Universal-Analytics",
      "iconUrl": "https://x.cdnpi.pe/serve/UPASDUCKmLywn7PY-caac43be/google.com",
      "isSubTechnology": true
    }
  ],
  "technologiesCount": 361,
  "techCategories": ["Analytics and Tracking", "Widgets", "Language", "eCommerce", "Frameworks", "Content Delivery Network", "Mobile", "Payment"],
  "rank": 999900,
  "techSpend": null,
  "salesRevenue": null,
  "socialFollowers": null,
  "employees": null,
  "traffic": null,
  "aiIndex": 100,
  "country": null,
  "firstRegisteredAt": "2005-03-11T00:00:00Z",
  "lastDetectedAt": "2026-09-19T00:00:00Z",
  "faviconUrl": null,
  "dataType": "profile",
  "isLiveLookup": false,
  "scrapedAt": "2026-09-20T09:12:44Z"
}
```

With `includeTechnologies` on, a ranked site carries both halves: the ranking columns and the `technologies` list.

### 🗂️ Data fields

22 fields per row. `technologies` holds 7 fields per entry.

| Group | Field | Type | Description |
|-------|-------|------|-------------|
| Identity | `id` | string | The domain, stable across runs |
| Identity | `url` | string | The BuiltWith profile page, permanent |
| Identity | `domain` | string | Root domain as BuiltWith keys it |
| Identity | `companyName` | string or null | Company behind the site (Top Sites rows) |
| Identity | `companyId` | string or null | Registration id BuiltWith links, such as `SEC CIK 1837686` |
| Content | `technologies` | array or null | One entry per detected technology, see below |
| Content | `technologiesCount` | integer or null | Number of technologies on the profile |
| Content | `techCategories` | array or null | Distinct categories, in page order |
| Measures | `rank` | integer or null | Position in BuiltWith Top Sites |
| Measures | `techSpend` | integer or null | Estimated monthly technology spend, USD, lower bound |
| Measures | `salesRevenue` | integer or null | Estimated monthly sales revenue, USD, online stores only |
| Measures | `socialFollowers` | integer or null | Combined social media followers, lower bound |
| Measures | `employees` | integer or null | Approximate employee count when BuiltWith shows one |
| Measures | `traffic` | string or null | Traffic tier: `Very High`, `High`, `Medium`, `Low` |
| Measures | `aiIndex` | integer or null | BuiltWith AI Index, 0 to 100 |
| Place and time | `country` | string or null | Country of the site |
| Place and time | `firstRegisteredAt` | string or null | Domain registration date, RFC 3339 |
| Place and time | `lastDetectedAt` | string or null | Date of the last technology detection, RFC 3339 |
| Media | `faviconUrl` | string or null | Site icon served by BuiltWith |
| Meta | `dataType` | string | `profile` or `topSite` |
| Meta | `isLiveLookup` | boolean | True when BuiltWith had no cached profile and scanned the site on the spot: a shorter technology list, no rank, AI Index or dates |
| Meta | `scrapedAt` | string | When the row was read, RFC 3339 UTC |

Each entry of `technologies`:

| Field | Type | Description |
|-------|------|-------------|
| `name` | string | Technology name as BuiltWith spells it |
| `category` | string | BuiltWith category card: Analytics and Tracking, Widgets, eCommerce, Frameworks, Payment, Web Hosting Providers, ... |
| `tags` | array or null | Sub-category badges, hidden "show more" ones included |
| `description` | string or null | BuiltWith's one-line description |
| `link` | string or null | Trends page of the technology |
| `iconUrl` | string or null | Technology icon |
| `isSubTechnology` | boolean | True when BuiltWith indents it under the previous entry |

`url` and `link` are permanent addresses. `iconUrl` and `faviconUrl` are served by BuiltWith's image CDN and have stayed valid for months in our tests.

### 🚀 Examples

#### Rank the top 100 sites of the United States

The prefilled form. One ranking page, company names included.

```json
{
  "topSitesCountry": "United-States",
  "maxItems": 100
}
```

#### Get the technology stack of your prospects

One row per domain with every technology, the rank, the AI Index and the site age.

```json
{
  "domains": ["shopify.com", "stripe.com", "airbnb.com", "notion.so", "figma.com"],
  "maxItems": 5
}
```

#### List the 500 biggest online stores of France with their revenue

Five ranking pages, `salesRevenue` filled on every row.

```json
{
  "topSitesCountry": "France",
  "ecommerceOnly": true,
  "maxItems": 500
}
```

#### Build a technographic dataset of Germany's top 200 sites

Every ranked site with its full technology list. About 200 profile pages, read ten seconds apart: allow 40 minutes.

```json
{
  "topSitesCountry": "Germany",
  "includeTechnologies": true,
  "maxItems": 200
}
```

#### Export a whole country list

The complete ranking of a list, 2,000 rows.

```json
{
  "topSitesCountry": "United-Kingdom",
  "maxItems": 2000
}
```

#### Find which of your accounts run HubSpot

Profile the account domains, then filter the `technologies` column on `name` in your sheet or notebook.

```json
{
  "domains": ["https://www.zendesk.com/", "https://www.atlassian.com/", "https://www.gitlab.com/", "https://www.hashicorp.com/"],
  "maxItems": 50
}
```

### 🤖 Copy to your AI assistant

Paste this block into Claude, ChatGPT or Cursor to give it full context about this scraper:

```
You have access to the BuiltWith Scraper on Apify: silentflow/builtwith-scraper

Two modes, one row per website in both:
- Website list: set "domains" (array of strings, domains or URLs). Each row is the technology profile of one domain.
- Top Sites: leave "domains" empty and set "topSitesCountry" (string enum: Global, United-States, United-Kingdom, Canada, Australia, New-Zealand, Germany, France, Netherlands, Italy, Spain, Mexico, India, Japan, Switzerland, China, Russia, Sweden, Norway, Brazil, Indonesia, Turkey, Saudi-Arabia, Argentina, Poland, Belgium, Thailand, Austria, Israel, Hong-Kong, Denmark, Singapore, Malaysia, South-Korea, Philippines, Pakistan, Chile, Finland, Vietnam, Czech-Republic, Romania). Each row is one ranked site.

Input schema:
- domains (array of strings, optional): websites to profile; wins over Top Sites when non-empty
- topSitesCountry (string, default "United-States"): ranking to walk when domains is empty
- maxItems (integer, default 100): rows to save; a Top Sites list holds up to 2000 rows
- ecommerceOnly (boolean, default false): Top Sites, online stores only, adds salesRevenue
- includeTechnologies (boolean, default false): Top Sites, also read each site's profile (technologies, aiIndex, dates)
- debugMode (boolean, default false)

Output per row (22 fields): id (string, the domain), url (string), domain (string), companyName (string|null), companyId (string|null), technologies (array|null of {name, category, tags (array|null), description, link, iconUrl, isSubTechnology}), technologiesCount (integer|null), techCategories (array|null), rank (integer|null), techSpend (integer|null, USD per month), salesRevenue (integer|null, USD per month), socialFollowers (integer|null), employees (integer|null), traffic (string|null), aiIndex (integer|null), country (string|null), firstRegisteredAt (RFC 3339|null), lastDetectedAt (RFC 3339|null), faviconUrl (string|null), dataType ("profile"|"topSite"), scrapedAt (RFC 3339).

Output per row also has isLiveLookup (boolean): true when BuiltWith scanned the site live instead of serving its cached profile. Profile rows carry technologies, rank, aiIndex and dates; Top Sites rows carry company, spend, revenue, social, traffic and country. Profiles are read about 10 seconds apart. No account or API key needed. Use apify-client for Python or JavaScript.
```

### 💻 Integrations

#### Enrich a CRM account list with technographics (Python)

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
accounts = ["zendesk.com", "atlassian.com", "gitlab.com", "hashicorp.com"]

run = client.actor("silentflow/builtwith-scraper").call(run_input={
    "domains": accounts,
    "maxItems": len(accounts),
})

for row in client.dataset(run["defaultDatasetId"]).iterate_items():
    names = {t["name"] for t in row["technologies"] or []}
    crm = sorted(n for n in names if n in {"Hubspot", "Salesforce", "Zoho CRM", "Pipedrive"})
    print(row["domain"], row["technologiesCount"], "technologies, CRM:", ", ".join(crm) or "none")
```

#### Build a lead list of high-spend online stores (JavaScript)

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });

const run = await client.actor('silentflow/builtwith-scraper').call({
    topSitesCountry: 'France',
    ecommerceOnly: true,
    maxItems: 500,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
const leads = items
    .filter((s) => (s.salesRevenue ?? 0) >= 1000000 && s.companyName)
    .map((s) => ({ rank: s.rank, domain: s.domain, company: s.companyName, revenue: s.salesRevenue, traffic: s.traffic }));

console.table(leads.slice(0, 20));
```

#### Measure a technology's share of a market (Python, CSV out)

```python
import csv
from collections import Counter
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("silentflow/builtwith-scraper").call(run_input={
    "topSitesCountry": "Germany",
    "includeTechnologies": True,
    "maxItems": 200,
})

share = Counter()
rows = list(client.dataset(run["defaultDatasetId"]).iterate_items())
for row in rows:
    for tech in row["technologies"] or []:
        if tech["category"] == "Content Management System":
            share[tech["name"]] += 1

with open("cms-share-germany.csv", "w", newline="") as f:
    writer = csv.writer(f)
    writer.writerow(["cms", "sites", "share"])
    for name, n in share.most_common():
        writer.writerow([name, n, round(n / len(rows), 3)])
```

#### Refresh a technographic sheet every month (Apify CLI)

```bash
apify call silentflow/builtwith-scraper --input '{"domains": ["shopify.com", "stripe.com"], "maxItems": 2}'
```

Schedule the same input from the Apify Console and connect the Google Sheets integration to the run's dataset.

### 📈 Performance

Measured on 20 September 2026 on the live site.

| Run | Rows | Time |
|-----|------|------|
| Top Sites, United States, 100 rows (the default input) | 100 | about 10 seconds |
| Top Sites, France, online stores only, 200 rows | 200 | about 20 seconds |
| 5 website profiles | 5 | about 2 minutes |
| Top Sites with technologies, 25 rows | 25 | about 5 minutes |

| Metric | Value |
|--------|-------|
| Fields per row | 22, plus 7 per technology |
| Sites per ranking page | 100 |
| Technologies on a large profile | several hundred (361 for shopify.com) |
| Depth of a Top Sites list | 20 pages, 2,000 rows |
| Limit per run | no fixed limit: `maxItems` is yours to set |

### 💾 Data export

Every run stores its rows in a dataset you can download as JSON, CSV, Excel, XML or HTML from the Storage tab, or pull from the API:

```
https://api.apify.com/v2/datasets/{DATASET_ID}/items?format=csv&token=YOUR_TOKEN
```

The dataset has two ready-made table views: **Websites** (website, company, country, rank, tech spend, social reach, traffic, technologies, profile link) and **Technology profiles** (website, technologies count, categories, AI Index, rank, registered, last detection, profile link). Schedules, webhooks and the Apify integrations (Google Sheets, Slack, Zapier, Make, n8n) work on top of the same dataset. In CSV and Excel the `technologies` list is flattened into columns; keep JSON when you need the nested list as is.

### 💡 Tips for best results

1. **Use root domains.** BuiltWith keys profiles on the registrable domain: `shopify.com`, not `help.shopify.com`. Full addresses are reduced to the domain for you.
2. **Start from the ranking, then profile.** Walk a country list first, pick the rows you care about, and run a second job with those domains. It is faster than turning `includeTechnologies` on for a whole list.
3. **Filter on `techCategories` before `technologies`.** The category list is short and tells you in one look whether a site has an eCommerce platform, a CRM or a payment provider.
4. **Read `technologiesCount` to judge a profile.** A site with fewer than ten technologies is often a parked or redirecting domain.
5. **Keep `maxItems` a multiple of 100 for Top Sites.** Each page is 100 rows; asking for 250 reads three pages and keeps 250.
6. **Schedule monthly, not daily.** BuiltWith's rankings and profiles move slowly; a monthly run catches vendor changes without re-reading the same rows.
7. **Give profile runs time.** Profiles are read about ten seconds apart on purpose, and a profile BuiltWith is still preparing is asked again half a minute later. A list of 100 domains is a 20-minute run, not a 20-second one.

### ❓ FAQ

**What exactly does the scraper read?**
BuiltWith's public Technology Profile page of a domain (every technology listed, rank, AI Index, site age) and the public Top Sites ranking pages (rank, company, country, spend, revenue, social reach, employees, traffic).

**Do I need a BuiltWith account or API key?**
No. Both pages are public. Nothing to sign up for and nothing to paste.

**Is the technology list complete?**
It contains every technology BuiltWith names on the public profile, with the count on the row. First and last detection dates per technology, and technologies removed over time, sit behind BuiltWith's paid plans and are not part of the output.

**What does `rank` mean?**
The position in BuiltWith Top Sites, a ranking BuiltWith computes from site age and technology spend, not from traffic. A profile row shows the site's position in the whole ranking; a Top Sites row shows its position in the list you asked for.

**What is `techSpend`?**
BuiltWith's estimate of the monthly cost of the paid technologies found on the site, in USD, as a lower bound. The Top Sites pages show 10,000 for every site in their first pages; the exact figure appears on the paid tabs of the site.

**Which countries are available?**
Global and 40 countries: United States, United Kingdom, Canada, Australia, New Zealand, Germany, France, Netherlands, Italy, Spain, Mexico, India, Japan, Switzerland, China, Russia, Sweden, Norway, Brazil, Indonesia, Turkey, Saudi Arabia, Argentina, Poland, Belgium, Thailand, Austria, Israel, Hong Kong, Denmark, Singapore, Malaysia, South Korea, Philippines, Pakistan, Chile, Finland, Vietnam, Czech Republic and Romania.

**How many rows can a Top Sites list give?**
20 pages of 100, so 2,000 rows per list. All sites and online stores are two different lists, so a country gives up to 4,000 distinct rows.

**Can I profile thousands of domains?**
Yes. Domains are read in order until `maxItems`, duplicates are skipped, and a domain BuiltWith does not know yields no row and a note in the run log. Very large lists take longer; split them across scheduled runs if you want fresh rows every day.

**Why is `companyName` null on some ranked sites?**
BuiltWith has no company on file for that domain. The field is `null` rather than an empty string so your filters stay honest.

**Why are `technologies` null on my Top Sites rows?**
The ranking pages do not list technologies. Turn `includeTechnologies` on to read each site's profile, or run the domains you care about through the website list.

**What is a live lookup?**
When BuiltWith has no cached profile for a domain it scans the site on the spot and answers with what it finds: a shorter technology list and no rank, AI Index or dates. The row is flagged `isLiveLookup: true` so you can tell it from a full profile. Run the domain again a few days later to get the full profile once BuiltWith has built it.

**Why did a profile run take longer than expected?**
Profiles are read about ten seconds apart, and a profile BuiltWith is still preparing is asked again half a minute later, up to three times. The run log says which domains are waiting. Domains BuiltWith kept behind its human test after three rounds get no row and a note in the log; run them again later.

**How fresh is the data?**
Live: every run reads the pages at run time, no cache. `lastDetectedAt` tells you when BuiltWith last saw a technology on the site.

**What happens when a run ends without rows?**
The run finishes with a status message that says why: unknown domains, an empty list, or a source that did not answer. No error rows are written to the dataset.

### ⚖️ Legal

This Actor extracts publicly available data from builtwith.com. It does not bypass any login, paywall or CAPTCHA. Users are responsible for complying with BuiltWith's terms of use and applicable data protection laws (GDPR, CCPA, and PIPL where relevant). The output describes companies and websites, not individuals; where a company name or registration id appears, handle it as business data. The data returned is informational; verify accuracy for regulated use cases.

### 🔗 Related scrapers

- [Website Tech Stack Scraper](https://apify.com/silentflow/website-tech-stack-scraper): detect the technologies of any website live, from the page itself.
- [Domain Enricher](https://apify.com/silentflow/domain-enricher): company data behind a list of domains.
- [Storeleads Scraper](https://apify.com/silentflow/storeleads-scraper): online stores by platform with sales estimates.
- [Company Data Scraper](https://apify.com/silentflow/company-data-scraper): firmographics for a list of companies.

### 📬 Support

Need something this scraper doesn't do yet? We ship features fast.

- Feature requests go straight to our backlog
- Enterprise needs? We do custom integrations and high-volume plans
- Pricing questions? Check the Monetization tab on the actor page

Response time: usually under 24 hours.

Check out our other scrapers: [silentflow on Apify](https://apify.com/silentflow)

# Actor input Schema

## `domains` (type: `array`):

The websites whose technology profile you want, one per line: <code>shopify.com</code>, <code>stripe.com</code>, or a full address like <code>https://www.airbnb.com/</code>. Each website becomes one row with every technology BuiltWith detects on it (a large site lists several hundred), its categories, tags and descriptions, the BuiltWith rank, the AI Index and the site age. Profiles are read about ten seconds apart: 10 websites take 2 minutes, 100 take 20. <b>Leave this empty</b> to read the Top Sites ranking of the country below instead.

## `topSitesCountry` (type: `string`):

Used when the website list is empty: the run walks BuiltWith's Top Sites ranking of this country, 100 sites per page, up to 2,000 sites per list. Each row carries the rank, domain, company name, country, monthly technology spend, sales revenue for eCommerce sites, social reach, employees and traffic tier.

## `maxItems` (type: `integer`):

How many rows to save. With a website list, the first N websites are read. With Top Sites, the ranking is walked in order until N rows: <code>100</code> is one page and takes a few seconds, <code>2000</code> is the whole list of a country.

## `ecommerceOnly` (type: `boolean`):

On: only the online stores of the country, ranked, with their estimated monthly sales revenue on every row. Off: every kind of site.

## `includeTechnologies` (type: `boolean`):

On: every Top Sites row also carries the full technology list of the site, its categories, AI Index and site age, read from its profile page. Profiles are read about ten seconds apart, so 100 sites take around 20 minutes. Off: the ranking columns only. Websites you look up by name always include their technologies.

## `debugMode` (type: `boolean`):

Adds detailed lines to the run log. Leave it off for normal runs.

## Actor input object example

```json
{
  "topSitesCountry": "United-States",
  "maxItems": 100,
  "ecommerceOnly": false,
  "includeTechnologies": false,
  "debugMode": false
}
```

# Actor output Schema

## `websites` (type: `string`):

Every row with domain, url, companyName, companyId, technologies, technologiesCount, techCategories, rank, techSpend, salesRevenue, socialFollowers, employees, traffic, aiIndex, country, firstRegisteredAt, lastDetectedAt, faviconUrl, dataType, isLiveLookup and scrapedAt.

## `profiles` (type: `string`):

The profile columns of each row: technologies count, categories, AI Index, rank, registration and last detection dates.

# 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 = {
    "topSitesCountry": "United-States"
};

// Run the Actor and wait for it to finish
const run = await client.actor("silentflow/builtwith-scraper").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 = { "topSitesCountry": "United-States" }

# Run the Actor and wait for it to finish
run = client.actor("silentflow/builtwith-scraper").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 '{
  "topSitesCountry": "United-States"
}' |
apify call silentflow/builtwith-scraper --silent --output-dataset

```

## MCP server setup

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

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/z9QhRrPrdfQmCZO2v/builds/Jv24LPPulcbkfKwWL/openapi.json
