# Website Traffic Rank Checker - Similarweb Alternative, Bulk (`tidytools/website-traffic-rank`) Actor

Bulk website traffic rank from Chrome's real-user data: global Top 1K-1M rank, rank in each of 238 countries, top country and 12-month trend for any list of domains. No Similarweb login or proxies. $1.50 per 1,000 domains.

- **URL**: https://apify.com/tidytools/website-traffic-rank.md
- **Developed by:** [Yukai Lin](https://apify.com/tidytools) (community)
- **Categories:** SEO tools, Marketing, Lead generation
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.20 / 1,000 domain checkeds

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

### What does Website Traffic Rank Checker do?

**Input:** a list of domains (or URLs, or e-mail addresses). **Output:** one row per domain with its worldwide rank tier (Top 1K ... Top 1M), its rank in each country, its top country and a 12-month trend. **Price:** $1.50 per 1,000 domains found; domains that are not listed, duplicates and invalid lines are free. No start fee.

**Be clear about what the number is:** the rank comes from Google's **Chrome UX Report (CrUX)** popularity buckets (Top 1K, 5K, 10K, 50K, 100K, 500K, 1M), measured on real Chrome users. It is **not a visit count**. If you need estimated monthly visits, bounce rate or traffic sources, you need a Similarweb-data Actor instead; this Actor is for ranking and filtering many domains by real popularity, per country, at a low price.

Quick start: paste domains into **Domains**, press **Start** (see "How to use it" below). Each row has:

- its **global traffic rank**: Top 1K, 5K, 10K, 50K, 100K, 500K or 1M websites worldwide, measured by real Chrome users,
- its **rank in every country** where it is popular (238 countries), with the **top country** first,
- a **12-month history** of the global rank and a **6-month trend**: rising, falling, stable, new or dropped out,
- optional **rank in the countries you choose** (`rankIn.us`, `rankIn.de`...) for filtering a lead list by market.

It covers **10.8 million domains**: every site in the global top 1 million plus each country's own top list, so local businesses that are popular in one country are included too.

**Real data, no scraping of Similarweb.** The ranks come from Google's **Chrome UX Report (CrUX)**: the origins that real Chrome users load most, published monthly by Google (CC BY 4.0) and collected per country in [crux-top-lists](https://github.com/zakird/crux-top-lists). Nothing is read from Similarweb, so there are no logins, proxies, blocked requests or empty rows.

#### Real results (data month August 2026, checked 3 October 2026)

| Domain | Global rank | Best country | Countries listed | 6-month trend |
|---|---|---|---|---|
| shopify.com | Top 1K | Top 1K in United States | 220 | stable |
| bbc.co.uk | Top 1K | Top 1K in United Kingdom | 223 | stable |
| ikea.com | Top 1K | Top 1K in United States | 204 | stable |
| notion.com | Top 5K | Top 1K in Japan | 197 | rising (was Top 50K) |
| momoshop.com.tw | Top 5K | Top 1K in Taiwan | 56 | stable |
| zapier.com | Top 50K | Top 10K in United States | 147 | falling (was Top 10K) |
| apify.com | Top 100K | Top 50K in Germany | 135 | rising (was Top 500K) |
| notion.so | Top 500K | Top 50K in United States | 103 | falling (was Top 5K) |
| scrapingbee.com | Top 1M | Top 500K in United States | 35 | stable |

The history makes moves like Notion's switch from notion.so to notion.com visible at a glance.

### Use cases

- **Lead qualification**: rank a list of company websites (from Google Maps, a CRM or a trade-show list) by real popularity, and keep only the ones that matter in your market (`countries: ["us"]`).
- **Market and competitor maps**: see which sites lead in each country and which are growing or shrinking.
- **Partnerships, affiliates and media buying**: check the size of a publisher before you contact or pay them.
- **Domain investing and due diligence**: see whether a site's traffic is rising or falling over the last year.
- **Data enrichment**: run it on the `website` field of another Actor's dataset (Dataset ID input).

### How much does it cost?

| Event | Price | When |
|---|---|---|
| Domain checked | **$1.50 / 1,000 domains** | a domain found in at least one Chrome top list (global or country) |

**Free:** domains that are not in any Chrome top list this month (`found: false`, usually sites with very little traffic), duplicates (checked once) and invalid lines. **No start fee.** Larger Apify plans get the usual volume discount (Silver 10%, Gold and above 20%).

**Example:** 10,000 domains = **$15** at most, less when some are not listed. Speed: a list of 500 domains took 15 to 60 seconds (data cached or not), so 10,000 domains take a few minutes.

For comparison (Apify Store, 3 October 2026): Similarweb scraper Actors charge $0.002-$0.02 per site (the most used ones: $0.003 with 388 users, $0.002 with 362 users, $0.013 with 303 users in 30 days). They return Similarweb's own estimates (visits, bounce rate, traffic sources), which this Actor does not have; this Actor returns Chrome's measured rank tiers per country and a year of history.

#### Control your cost

- **Before it starts**, the run logs its worst-case cost (domains x price) and compares it with your **maximum charge per run**. Batches that would pass the maximum are not started: `SUMMARY.status` is `LIMIT_REACHED` and `SUMMARY.notProcessed` lists the domains that were not checked.
- Every row has `charged: true` or `false`; failed rows have an `error` that ends with "(not charged)".

### How to use it

1. Paste domains, URLs or e-mail addresses into **Domains**, one per line, or pick a **Dataset ID** (and **Dataset field**) from another run.
2. Optional: list **Countries to report** (two-letter codes) to get `rankIn.<code>` columns.
3. Click **Start**. **Domains (overview)** shows the ranks and trend; **Domains (all fields)** adds the per-country list and the 12-month history.

Subdomains are checked as their registrable domain (`shop.example.co.uk` becomes `example.co.uk`; `www.`, upper case, a trailing dot, ports and paths are ignored); the best origin of the domain counts (for example `https://www.example.com`). Non-Latin names such as `münchen.de` are checked in their `xn--` form. The original line stays in `input`; spellings of the same domain are merged into one row (`inputs` lists them) and charged once. Entries can be separated by line breaks, spaces, semicolons or commas (commas inside a URL path are kept).

**Country codes** are two letters (`us`, `de`; `uk` is read as `gb`). A value that is not two letters (for example `USA` or `Germany`) is ignored and listed in `SUMMARY.ignoredCountries`; a code that none of the found domains is ranked in (a typo, or a country without a list) is listed in `SUMMARY.countriesWithoutMatches` and its `rankIn` value is `null`.

#### Input example

This is the input the form is prefilled with; a run with it takes about a minute and costs only cents:

```json
{
    "domains": [
        "apify.com",
        "notion.so",
        "shopify.com",
        "bbc.co.uk",
        "tools.yukai.uk"
    ],
    "countries": [
        "us",
        "gb"
    ]
}
```

#### Output example

Real result (3 October 2026, data month 2026-08), shortened:

```json
{
    "input": "apify.com",
    "domain": "apify.com",
    "found": true,
    "globalRank": 100000,
    "globalRankLabel": "Top 100K websites worldwide",
    "trend": "up",
    "globalRankSixMonthsAgo": 500000,
    "monthsInGlobalTop1M": 12,
    "topCountry": "de",
    "topCountryName": "Germany",
    "topCountryRank": 50000,
    "topCountryRankLabel": "Top 50K in Germany",
    "countryCount": 135,
    "rankIn": { "us": 100000, "tw": 100000, "de": 50000 },
    "countryRanks": [
        { "country": "de", "countryName": "Germany", "rank": 50000, "rankLabel": "Top 50K" }
    ],
    "globalHistory": [
        { "month": "2025-09", "rank": 500000 },
        { "month": "2026-08", "rank": 100000 }
    ],
    "summary": "Top 100K worldwide; Top 50K in Germany; listed in 135 countries; 6-month trend: rising",
    "origin": "https://apify.com",
    "dataMonth": "2026-08",
    "charged": true
}
```

#### What the fields mean

- `globalRank` / `rankIn.<cc>` / `countryRanks[].rank`: the rank bucket. `10000` means "among the 10,000 most visited origins" (worldwide, or in that country). Smaller is more popular.
- `topCountry`: the country where the site is relatively most popular. Countries are ordered by the rank bucket compared with the size of that country's list, so "Top 50K in the United States" comes before "Top 10K in a country with only 5,000 listed sites".
- `trend`: global bucket now compared with 6 months earlier. `new` = entered the global top 1M; `dropped` = left it (it may still be listed in some countries).
- `globalHistory`: one entry per month for the last 12 months; `rank: null` = not in the global top 1M that month.

### Use it from code

```bash
curl -X POST "https://api.apify.com/v2/acts/tidytools~website-traffic-rank/run-sync-get-dataset-items?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"domains":["shopify.com","zapier.com","example.org"],"countries":["us","gb"]}'
```

**With AI agents (MCP):** connect Apify's MCP server (`https://mcp.apify.com?tools=tidytools/website-traffic-rank`) to Claude, Cursor or any MCP client and ask, for example, "Which of these 50 shops are in the US top 100K, and which are growing?". Minimal input: `{"domains": ["shopify.com"]}`.

### Limitations

- **A rank tier, not a number of visits.** Chrome publishes buckets (Top 1K ... Top 1M), not visit counts, so two sites in "Top 10K" are not ordered against each other. There are no bounce rates, traffic sources or keywords.
- **Chrome users only** (desktop and Android), and only origins with enough traffic to be published; sites with very little traffic are not listed (and not charged).
- **Monthly data**: the current release is August 2026 (Google publishes each month in the second week of the next one). Every row says which month it is (`dataMonth`).
- Country lists are relative to each country: a Top 10K site in a small country can have fewer visitors than a Top 100K site in the United States.

### FAQ

**Does the Actor collect usage data?** The Actor sends one anonymous usage counter per run (input type, item count range, outcome) to improve the tool; no URLs, content or account data.

**Is this the number of visits?** No. Chrome publishes rank buckets, not visit counts. Two sites in "Top 10K" cannot be ordered against each other, and the Actor never estimates visits. Use it to tell a Top 1K site from a Top 500K site, to compare countries and to see the 12-month direction.

**What happens with a wrong or empty input?** Lines that are not a domain (an IP address, "localhost", a bare "co.uk", a domain ending that does not exist such as `example.c`, text) get a row with `errorType: "invalid_input"` and `charged: false`; if nothing valid is left the run still ends normally (SUMMARY.status `FAILED`, nothing charged). A Dataset ID that cannot be read also gives one free error row, and any domains you pasted are still checked.

**Why does `foo.github.io` or `news.bbc.co.uk` show the rank of `github.io` / `bbc.co.uk`?** Ranks exist per registrable domain, so every subdomain gets the rank of its parent domain (a page of a site hosted on a shared domain such as `github.io` or `blogspot.com` is not ranked on its own). Several subdomains of one domain are one row and one charge.

**Why is my site "not found"?** It is not among the most visited origins of Chrome users in any country this month. It is reported with `found: false` and not charged.

**Can I use the results commercially?** Yes. The Chrome UX Report is published by Google under CC BY 4.0 (credit: "Chrome UX Report, Google").

**How is this different from the Domain Authority Checker?** That Actor measures links (who links to a site); this one measures visits by real users, per country and over time. Both are by TidyTools and accept the same inputs.

### Support

Open an issue in the **Issues** tab with the domains and the run link. Issues are checked regularly.

# Actor input Schema

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

Domains, website addresses or e-mail addresses, one per line (example.com, https://www.example.com/page, info@example.com). Subdomains are checked as their registrable domain (shop.example.co.uk -> example.co.uk). Up to 100,000 per run; duplicates are merged. Invalid lines become a result row with errorType "invalid_input" (not charged).

## `datasetId` (type: `string`):

Check the domains in another Actor run's dataset, e.g. the website field of a lead list or Google Maps run.

## `datasetField` (type: `string`):

Field with the domain, URL or e-mail address, e.g. "website", "domain" or "email" (dot paths work). Empty = the first URL field found (url, website, link, domain...).

## `countries` (type: `array`):

Two-letter country codes (us, gb, de, tw...). Each row gets rankIn.<code> with the domain's rank bucket in that country, or null when it is not in that country's list. Handy for filtering a lead list by market.

## `maxCountries` (type: `integer`):

How many countries to list in countryRanks (best rank first, ties by market size). 0 = every country the domain is listed in (up to 238).

## `includeHistory` (type: `boolean`):

Add globalHistory: the domain's global rank bucket in each of the last 12 months (null = not in the global top 1M that month).

## `maxConcurrency` (type: `integer`):

Batches of 50 domains looked up at the same time.

## Actor input object example

```json
{
  "domains": [
    "apify.com",
    "notion.so",
    "shopify.com",
    "bbc.co.uk",
    "tools.yukai.uk"
  ],
  "countries": [
    "us",
    "gb"
  ],
  "maxCountries": 10,
  "includeHistory": true,
  "maxConcurrency": 2
}
```

# Actor output Schema

## `domains` (type: `string`):

No description

## `full` (type: `string`):

No description

## `summary` (type: `string`):

No description

# 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 = {
    "domains": [
        "apify.com",
        "notion.so",
        "shopify.com",
        "bbc.co.uk",
        "tools.yukai.uk"
    ],
    "countries": [
        "us",
        "gb"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("tidytools/website-traffic-rank").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 = {
    "domains": [
        "apify.com",
        "notion.so",
        "shopify.com",
        "bbc.co.uk",
        "tools.yukai.uk",
    ],
    "countries": [
        "us",
        "gb",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("tidytools/website-traffic-rank").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 '{
  "domains": [
    "apify.com",
    "notion.so",
    "shopify.com",
    "bbc.co.uk",
    "tools.yukai.uk"
  ],
  "countries": [
    "us",
    "gb"
  ]
}' |
apify call tidytools/website-traffic-rank --silent --output-dataset

```

## MCP server setup

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

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/QTlig3gBQedJW1HV4/builds/heCUMb1DBwGaORFNN/openapi.json
