# Semrush Website Traffic Checker (`steadyscrape/semrush-website-traffic-checker`) Actor

Website traffic checker for any list of domains, from Semrush's free overview pages: monthly visits with history, engagement, top countries, traffic sources, organic and paid search, Authority Score, backlinks, top keywords, competitors. A Similarweb alternative, as CSV, JSON or API.

- **URL**: https://apify.com/steadyscrape/semrush-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

## Semrush Website Traffic Checker

Check the **website traffic** of any list of domains with the figures **Semrush** publishes on its free website overview
pages: **monthly visits** with six months of history (desktop and mobile), **global, country and category rank**, **pages per
visit, visit duration and bounce rate**, **top countries**, **traffic sources and destinations**, **traffic from AI
platforms** (ChatGPT, Gemini…), **organic and paid search traffic**, **Authority Score**, **referring domains and backlinks**,
the **top organic keywords** (intent, position, volume, CPC) and **competitors** — one row per domain.

Paste domains or links, get a table. No Semrush account, no login, no browser. Pay only for domains that have traffic data.

### What you can do with it

- **Competitor research**: how much traffic your competitors get, from which countries and channels, and how it moved over
  six months.
- **Lead qualification and sales prospecting**: rank a list of prospects' websites by traffic and authority before you call.
- **Link building and outreach**: sort a list of sites by Authority Score, referring domains and backlinks.
- **Market and investment research**: compare the reach of every player in a niche, month by month.
- **Media buying and partnerships**: check the audience size and country mix of a site before you buy a placement.
- **Monitoring**: schedule it monthly to keep a history of the domains you watch.

### Input

| Field | What it does |
|---|---|
| **Domains** | One per line: `gymshark.com`, a link to any page of the site (`https://www.gymshark.com/collections/new`), or the Semrush overview link (`https://www.semrush.com/website/gymshark.com/overview/`). Each line is read as its domain, lowercase and without `www.`; a domain named twice is checked once. Up to 4,000 per run. |

```json
{
    "domains": ["gymshark.com", "bbc.co.uk", "notion.so"]
}
```

### Output

One row per domain (lists shortened):

```json
{
    "status": "ok",
    "reason": null,
    "input": "gymshark.com",
    "domain": "gymshark.com",
    "semrushUrl": "https://www.semrush.com/website/gymshark.com/overview/",
    "brandName": "Gymshark",
    "categories": ["Retail", "Apparel and Fashion", "Wellness"],
    "dataMonth": "2026-09",
    "pageUpdatedAt": "2026-10-13",
    "mainCountryCode": "US",
    "mainCountryName": "United States",
    "globalRank": 4142,
    "countryRank": 2994,
    "categoryRank": 32,
    "categoryRankName": "Wellness",
    "visits": 13551155,
    "visitsChange": 0.15,
    "desktopVisits": 3807923,
    "mobileVisits": 9743232,
    "pagesPerVisit": 4.2251,
    "avgVisitDurationSeconds": 382,
    "bounceRate": 0.5455,
    "visitsHistory": [
        { "month": "2026-09", "visits": 13551155, "desktopVisits": 3807923, "mobileVisits": 9743232 },
        { "month": "2026-08", "visits": 11783834, "desktopVisits": 3373325, "mobileVisits": 8410509 }
    ],
    "trafficByCountry": [
        { "countryCode": "US", "countryName": "United States", "visits": 4050118, "share": 0.2989, "desktopShare": 0.3085, "mobileShare": 0.6915 },
        { "countryCode": "GB", "countryName": "United Kingdom", "visits": 2842571, "share": 0.2098, "desktopShare": 0.1452, "mobileShare": 0.8548 }
    ],
    "trafficSources": [
        { "host": "Direct", "channel": null, "share": 0.41822931, "visits": 1592585, "previousMonthVisits": 1367830 },
        { "host": "google.com", "channel": "Google organic", "share": 0.37846013, "visits": 1441147, "previousMonthVisits": 1293392 }
    ],
    "trafficDestinations": [{ "host": "shop.app", "channel": null, "share": 0.25365968, "visits": 91180, "previousMonthVisits": 61716 }],
    "aiTraffic": [
        {
            "host": "chatgpt.com",
            "name": "ChatGPT",
            "visits": 19049,
            "share": 0.00142,
            "history": [{ "month": "2026-09", "visits": 19049 }, { "month": "2026-08", "visits": 36404 }]
        }
    ],
    "organicSearchTraffic": 7486700,
    "organicSearchTrafficChange": -0.0118,
    "paidSearchTraffic": 149818,
    "paidSearchTrafficChange": -0.3606,
    "searchTrafficHistory": [{ "month": "2026-09", "organic": 7486700, "paid": 149818 }],
    "authorityScore": 77,
    "referringDomains": 12523,
    "referringDomainsChange": 0.016,
    "backlinks": 213401,
    "backlinksChange": 0.0126,
    "backlinksHistory": [{ "month": "2026-09", "backlinks": 213401, "referringDomains": 12523 }],
    "keywordsCountryCode": "US",
    "topKeywords": [
        { "keyword": "gymshark", "intents": ["navigational"], "position": 1, "searchVolume": 673000, "cpcUsd": 0.31, "trafficShare": 0.2584 },
        { "keyword": "gymshark leggings", "intents": ["navigational", "transactional"], "position": 1, "searchVolume": 12100, "cpcUsd": 0.37, "trafficShare": 0.0046 }
    ],
    "competitors": [{ "domain": "athleanx.com", "visits": 897793 }],
    "scrapedAt": "2026-10-20T05:30:00.000Z"
}
```

#### Fields

Shares, rates and changes 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`, `domain`, `semrushUrl` | The line as given, the domain checked, and its Semrush page |
| `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 (`commercial`, `informational`, `navigational`, `transactional`; an empty list where Semrush records none), position, monthly search volume, CPC in USD, share of the domain's organic traffic |
| `competitors` | Domains with an overlapping audience, with their visits |
| `scrapedAt` | When the row was made (UTC) |

### Limits, honestly

- **Speed: about 3 domains a minute** (180 an hour). 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. 100 domains take about 35 minutes; the run timeout
  is 24 hours, enough for the 4,000 domains a run accepts.
- **Coverage**: Semrush publishes free overview pages for popular domains (about a quarter of a million). A domain outside
  that list, most subdomains (`blog.example.com`) and internationalized domains give a free `not_found` row.
- **Small sites**: when Semrush has too little data to estimate traffic, the row is `no_traffic`, free, with the Authority Score
  and backlinks it does show.
- **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.

### Pricing

**US$0.003 per domain with traffic data** (US$3 per 1,000). 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 (<code>https://www.gymshark.com/collections/new</code>) or its Semrush overview link (<code>https://www.semrush.com/website/gymshark.com/overview/</code>). Each is read as its domain without <code>www.</code>; repeats are checked once. Semrush's free pages cover popular root domains; a domain without one gives a free <code>not_found</code> row. Semrush asks crawlers to wait 20 seconds between pages, so a run checks about 3 domains a minute.

## Actor input object example

```json
{
  "domains": [
    "gymshark.com",
    "bbc.co.uk",
    "notion.so"
  ]
}
```

# Actor output Schema

## `domains` (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",
        "bbc.co.uk",
        "notion.so"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("steadyscrape/semrush-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",
        "bbc.co.uk",
        "notion.so",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("steadyscrape/semrush-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",
    "bbc.co.uk",
    "notion.so"
  ]
}' |
apify call steadyscrape/semrush-website-traffic-checker --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,steadyscrape/semrush-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/6r0VMhwzbebS4m1Kh/builds/DH0et8uEYuIp1eO9Q/openapi.json
