# Competitor Website Traffic Checker (`steadyscrape/competitor-website-traffic-checker`) Actor

Competitor website traffic from Semrush's free pages: a domain in, its top competitors out (and theirs on request), each with relevance, monthly visits, countries, traffic sources, search traffic, Authority Score and keywords. A Similarweb alternative. Export to JSON, CSV or Excel, or via API.

- **URL**: https://apify.com/steadyscrape/competitor-website-traffic-checker.md
- **Developed by:** [Steady Scrape](https://apify.com/steadyscrape) (community)
- **Categories:** SEO tools, Marketing, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$3.00 / 1,000 domains

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

## Competitor Website Traffic Checker

Find a website's **competitors** and check **competitor website traffic** in one run, with the figures **Semrush**
publishes on its free website overview pages. Enter your domain: you get the **top competitors** Semrush lists for it,
ranked by **relevance**, and each competitor's own traffic profile — **monthly visits** with six months of history, how big
it is next to you, **top countries**, **traffic sources**, **organic and paid search traffic**, **traffic from AI
platforms**, **Authority Score**, backlinks and **top keywords**. Ask for depth 2 and it also follows the competitors of
each competitor, so one domain maps a whole market.

No Semrush account, no login, no browser. Pay only for domains that have traffic data.

### What you can do with competitor website traffic data

- **Competitor analysis**: who your real competitors are online, how much traffic each one gets, and from which countries
  and channels.
- **Market mapping**: start from one well-known site in a niche and get up to 12 sites around it, each sized by visits.
- **Find similar websites** to a prospect, a portfolio company or a site you want to buy ads on.
- **SEO and content research**: the keywords and search traffic of every competitor, side by side.
- **Agency pitches and audits**: put a client's traffic next to its competitors' in a single table.
- **Lead lists**: discover companies that compete with your customers and rank them by traffic and Authority Score.

### How competitors are found

Each Semrush overview page lists up to **3 competitors** — domains whose audience overlaps — with a relevance score and
their visits. The Actor reads your domain's page, then each competitor's page:

- **Depth 1**: your domain + its competitors (up to 4 rows per domain, about 80 seconds).
- **Depth 2**: also the competitors of each competitor (up to 13 rows per domain, about 4.5 minutes).

A domain is checked and charged **once per run**, however many times it is found: when two of your domains share a
competitor, it is listed under the first one, and a domain you entered always stays one of yours. Each row says where it
was found (`seedDomain`, `depth`, `competitorOf`, `relevance`), and its own `competitors` list shows every competitor its
page names, with relevance and visits.

### Input

| Field | What it does |
|---|---|
| **Your domains** | One per line: `gymshark.com`, a link to any page of the site, or its Semrush overview link (`https://www.semrush.com/website/gymshark.com/overview/`). Read as the domain, lowercase and without `www.`; a domain named twice is checked once. Up to 300 per run. |
| **Depth** | `1` (default): your domains and their competitors. `2`: also their competitors' competitors. |
| **Max competitors per domain** | A cap on the competitor rows found from each of your domains, 1 to 12 (default 12), counted in the order they are found: depth 1 first, by relevance. |

```json
{
    "domains": ["gymshark.com"],
    "depth": 2,
    "maxCompetitorsPerSeed": 12
}
```

For `gymshark.com` at depth 2 (October 2026): gymshark.com, then athleanx.com, muscleandstrength.com and puregym.com at
depth 1, then builtwithscience.com, fitbod.me, hussle.com and menshealth.com at depth 2 — 8 domains, ~3 minutes.

### Output

One row per domain (lists shortened). This is athleanx.com, found as a competitor of gymshark.com:

```json
{
    "status": "ok",
    "reason": null,
    "input": "gymshark.com",
    "seedDomain": "gymshark.com",
    "depth": 1,
    "competitorOf": "gymshark.com",
    "relevance": 0.21,
    "domain": "athleanx.com",
    "visitsShareOfSeed": 0.0663,
    "semrushUrl": "https://www.semrush.com/website/athleanx.com/overview/",
    "brandName": null,
    "categories": ["Wellness"],
    "dataMonth": "2026-09",
    "pageUpdatedAt": "2026-10-14",
    "mainCountryCode": "US",
    "mainCountryName": "United States",
    "globalRank": 56884,
    "countryRank": 26690,
    "categoryRank": null,
    "categoryRankName": null,
    "visits": 897793,
    "visitsChange": -0.1817,
    "desktopVisits": 312024,
    "mobileVisits": 585769,
    "pagesPerVisit": 2.5218,
    "avgVisitDurationSeconds": 271,
    "bounceRate": 0.6176,
    "visitsHistory": [
        { "month": "2026-09", "visits": 897793, "desktopVisits": 312024, "mobileVisits": 585769 },
        { "month": "2026-08", "visits": 1097153, "desktopVisits": 343661, "mobileVisits": 753492 }
    ],
    "trafficByCountry": [
        { "countryCode": "US", "countryName": "United States", "visits": 363939, "share": 0.4054, "desktopShare": 0.5222, "mobileShare": 0.4778 },
        { "countryCode": "PL", "countryName": "Poland", "visits": 112044, "share": 0.1248, "desktopShare": 0.0164, "mobileShare": 0.9836 }
    ],
    "trafficSources": [
        { "host": "google.com", "channel": "Google organic", "share": 0.44142759, "visits": 137736, "previousMonthVisits": 120529 },
        { "host": "Direct", "channel": null, "share": 0.37522435, "visits": 117079, "previousMonthVisits": 157859 }
    ],
    "trafficDestinations": [{ "host": "youtube.com", "channel": null, "share": 0.11709762, "visits": 2921, "previousMonthVisits": 4388 }],
    "aiTraffic": [
        { "host": "gemini.google.com", "name": "Gemini", "visits": 442, "share": 0.0005, "history": [{ "month": "2026-09", "visits": 442 }] },
        { "host": "chatgpt.com", "name": "ChatGPT", "visits": 391, "share": 0.00044, "history": [{ "month": "2026-09", "visits": 391 }] }
    ],
    "organicSearchTraffic": 654094,
    "organicSearchTrafficChange": -0.1081,
    "paidSearchTraffic": 1858,
    "paidSearchTrafficChange": -0.2029,
    "searchTrafficHistory": [{ "month": "2026-09", "organic": 654094, "paid": 1858 }],
    "authorityScore": 53,
    "referringDomains": 4906,
    "referringDomainsChange": 0.0496,
    "backlinks": 40780,
    "backlinksChange": 0.0223,
    "backlinksHistory": [{ "month": "2026-09", "backlinks": 40780, "referringDomains": 4906 }],
    "keywordsCountryCode": "US",
    "topKeywords": [
        { "keyword": "athlean x", "intents": ["informational"], "position": 1, "searchVolume": 14800, "cpcUsd": 0.85, "trafficShare": 0.0405 },
        { "keyword": "chest workout upper", "intents": ["informational"], "position": 1, "searchVolume": 12100, "cpcUsd": 0.08, "trafficShare": 0.0102 }
    ],
    "competitors": [
        { "domain": "muscleandstrength.com", "relevance": 0.28, "visits": 2536820 },
        { "domain": "gymshark.com", "relevance": 0.21, "visits": 13551155 },
        { "domain": "builtwithscience.com", "relevance": 0.19, "visits": 898772 }
    ],
    "scrapedAt": "2026-10-25T07:20:00.000Z"
}
```

#### Fields

Shares, rates, changes and relevance are fractions: `0.2989` is 29.89 %, `-0.0118` is −1.18 % against the previous month.
A section Semrush does not show for a domain is `null`; a list it shows empty is `[]`.

| Field | Meaning |
|---|---|
| `status` | `ok` (traffic data, charged), `no_traffic` (Semrush has a page but no traffic estimate; Authority Score and backlinks included, free), `not_found` (no Semrush page for the domain, free), `invalid` (the line names no domain, free), `blocked` (Semrush refused the run, free), `error` (the page could not be read, free) |
| `reason` | Why a row is not `ok` |
| `input` | The line of your input the row comes from (for a competitor, the line of its seed) |
| `seedDomain` | Your domain this row was found from |
| `depth` | `0` your domain, `1` its competitor, `2` a competitor's competitor |
| `competitorOf`, `relevance` | The domain whose overview listed this one, and the relevance Semrush showed there (`null` for your own domains) |
| `domain`, `semrushUrl` | The domain checked and its Semrush page |
| `visitsShareOfSeed` | This domain's visits as a fraction of your domain's: `0.0663` is 6.63 %, above `1` when the competitor is bigger |
| `brandName`, `categories` | Brand and industry categories Semrush assigns |
| `dataMonth`, `pageUpdatedAt` | Month the traffic figures describe (`YYYY-MM`) and the day Semrush last rebuilt the page |
| `mainCountryCode`, `mainCountryName` | The domain's main market |
| `globalRank`, `countryRank`, `categoryRank`, `categoryRankName` | Traffic ranks: worldwide, in the main country, and in the main category |
| `visits`, `visitsChange`, `desktopVisits`, `mobileVisits` | Estimated monthly visits and their change against the previous month |
| `pagesPerVisit`, `avgVisitDurationSeconds`, `bounceRate` | Engagement |
| `visitsHistory` | Six months of visits, desktop and mobile |
| `trafficByCountry` | Top countries: visits, share, and desktop/mobile split |
| `trafficSources`, `trafficDestinations` | Sites desktop visitors come from and go to next, with `channel` where Semrush names one (`Google organic`) |
| `aiTraffic` | Visits from AI platforms, with six months each |
| `organicSearchTraffic`, `paidSearchTraffic` (+ `…Change`), `searchTrafficHistory` | Search traffic and six months of history |
| `authorityScore`, `referringDomains`, `backlinks` (+ `…Change`), `backlinksHistory` | Authority Score (0–100) and backlink profile, six months |
| `keywordsCountryCode`, `topKeywords` | Top 5 organic keywords in the main country's database: intents, position, monthly search volume, CPC in USD, share of the domain's organic traffic |
| `competitors` | Every competitor this domain's overview lists, with relevance and visits |
| `scrapedAt` | When the row was made (UTC) |

### Limits, honestly

- **Speed: about 3 domains a minute.** Semrush's robots.txt asks every crawler to wait 20 seconds between pages, and this
  Actor honors it: one page at a time, 20 seconds apart. One domain at depth 1 takes about 80 seconds, at depth 2 about
  4.5 minutes; 300 domains at depth 2 fit in the 24-hour run timeout.
- **Up to 3 competitors per page**: that is what Semrush's free overview shows. Some domains (notion.so, for one) show
  none; their row comes alone.
- **Coverage**: Semrush publishes free overview pages for popular domains (about a quarter of a million). A domain outside
  that list, most subdomains and internationalized domains give a free `not_found` row. Competitors always come from that
  list, so they have a page.
- **What Semrush locks on these pages is not included**: traffic cost, ad spend, branded traffic share and penalty risk.
- **The figures are Semrush's estimates**, updated monthly, not the sites' own analytics.

To check the traffic of a list of domains you already have, without competitors, use
[Semrush Website Traffic Checker](https://apify.com/steadyscrape/semrush-website-traffic-checker), its sibling.

### Pricing

**US$0.003 per domain with traffic data** (US$3 per 1,000), your domains and competitors alike. No start fee.
`no_traffic`, `not_found`, `invalid`, `blocked` and `error` rows are free. You can cap a run's cost with Apify's maximum
cost per run; the Actor stops cleanly when it is reached. A long run that Apify moves to another server picks up where it
left off instead of starting over.

### Is it legal?

The Actor reads the public overview pages Semrush shows to every visitor without an account, on paths Semrush's robots.txt
allows to crawlers (`Allow: /website/*`), at the pace that file asks for. It never logs in, never solves a challenge, and
leaves out what the pages lock. **This is an unofficial tool, not affiliated with, endorsed by or sponsored by Semrush**;
Semrush is a trademark of Semrush Inc. The figures are Semrush's estimates. You are responsible for using the data
lawfully and in line with Semrush's terms.

### Issues and requests

Open an issue on the Actor's page: a domain that looks wrong, a field you need, or anything that breaks.

# Actor input Schema

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

One per line: a domain (<code>gymshark.com</code>), any link to the website, or its Semrush overview link. For each one the Actor reads the competitors Semrush lists for it (up to 3, ranked by relevance) and checks each competitor's traffic too. Repeats are checked once. Semrush asks crawlers to wait 20 seconds between pages, so one domain with its 3 competitors takes about 80 seconds.

## `depth` (type: `integer`):

<code>1</code>: your domains and their competitors (up to 4 rows per domain). <code>2</code>: also the competitors of each competitor (up to 13 rows per domain, about 4.5 minutes). A domain already found is never checked twice.

## `maxCompetitorsPerSeed` (type: `integer`):

A cap on the competitor rows found from each of your domains, counted in the order they are found (depth 1 first, by relevance). Your domain's own row does not count.

## Actor input object example

```json
{
  "domains": [
    "gymshark.com"
  ],
  "depth": 1,
  "maxCompetitorsPerSeed": 12
}
```

# Actor output Schema

## `competitors` (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": [
        "gymshark.com"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("steadyscrape/competitor-website-traffic-checker").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": ["gymshark.com"] }

# Run the Actor and wait for it to finish
run = client.actor("steadyscrape/competitor-website-traffic-checker").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": [
    "gymshark.com"
  ]
}' |
apify call steadyscrape/competitor-website-traffic-checker --silent --output-dataset

```

## MCP server setup

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

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/HYyivpKDxmUPzZcLz/builds/NoL4VRs3ddj7ScLOv/openapi.json
