# SimilarWeb Scraper - Traffic, Ranks and Keywords (`s-r/similarweb-scraper`) Actor

Get SimilarWeb traffic estimates for any domain: monthly visits, global country and category rank, bounce rate, traffic sources, top ranking keywords with CPC, detected technologies and similar sites.

- **URL**: https://apify.com/s-r/similarweb-scraper.md
- **Developed by:** [SR](https://apify.com/s-r) (community)
- **Categories:**
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## SimilarWeb Scraper

Traffic estimates for any domain: **monthly visits, global, country and category
rank, bounce rate, pages per visit, traffic sources, the keywords a site ranks
for with CPC, its detected technology stack and its closest competitors.**

One domain in, one row out. Pass a list and get a comparison table.

### What a run returns

Real output, taken while writing this:

| | github.com | ebay.com |
|---|---|---|
| Global rank | **49** | **44** |
| Monthly visits | 637,885,711 | 669,411,467 |
| Bounce rate | 36.27% | 38.55% |
| Pages per visit | 5.87 | 6.75 |
| Avg. visit | 06:26 | 06:07 |
| Organic / paid search | 99.97% / 0.03% | 83.27% / 16.73% |
| Keywords ranked for | 3,756,914 | 5,847,215 |
| Similar sites | stackoverflow, npmjs, pypi, gitlab | amazon, walmart, aliexpress, etsy |

That organic-versus-paid split is the line worth staring at: eBay buys 16.73% of
its search traffic, GitHub buys effectively none. Two sites of almost identical
size with completely different economics.

### Read `traffic_bucket` as a size, not a score

`traffic_bucket` is SimilarWeb's own magnitude band. It looks like a warning and
is not: **github.com is graded `<1B`** on 638 million visits, and a small site is
graded `<20K`. It tells you which bracket a site falls in, nothing about how much
to trust the number.

Confidence follows the **visit count** instead. Below 50,000 monthly visits the
estimate rests on very little panel data, and those rows carry
`low_confidence: true`, with the affected domains listed in the run summary. A
site with a few thousand visits is flagged; a site with hundreds of millions is
not, whatever band it sits in.

Every figure here is an **estimate**, not measured analytics. They are most
reliable on large sites and least on small ones, and the flag exists so that
distinction survives into your spreadsheet.

### Fields

- **Ranking**: `global_rank`, `country_rank`, `category_rank`, each with its
  change, plus `rank_neighbours` — the domains immediately above and below
- **Traffic**: `monthly_visits`, `visits_change_percent`, `traffic_history`,
  `traffic_bucket`, `low_confidence`
- **Engagement**: `bounce_rate_percent`, `pages_per_visit`,
  `avg_visit_duration`
- **Channels**: `traffic_sources_percent` across direct, organic, paid,
  referrals, social, mail and ads
- **Search**: `organic_search_percent`, `paid_search_percent`,
  `ranking_keywords_count`, `top_keywords` with volume and CPC where published
- **Stack**: `technologies` by category, e.g. analytics, advertising, ecommerce
- **Competitive**: `similar_sites`
- **Company**: `company_name`, `company_founded`, employee band, HQ country

`top_keywords` is worth calling out. It arrives with CPC attached, which makes
it a keyword-research source as well as a traffic one, and it needs no key.

### Reliability

The figures come from the same profile pages SimilarWeb publishes, read
directly rather than through a third-party reseller, so there is no extra layer
between you and the source.

Runs are consistent: repeated checks of the same domain returned the full
payload every time, from more than one network path. That matters because
traffic data tends to get pasted into a deck and quoted for a quarter, so a
result that only works some of the time is worse than no result.

If a profile ever comes back without its data, the run says `no_data` and
explains that the page shape may have changed, instead of handing you a row of
zeroes. A run of zeroes that looks successful is the failure mode worth being
loud about.

### Input reference

| Field | Type | Default |
|---|---|---|
| `domains` | list of domains or URLs | `["github.com","ebay.com"]` |
| `limit` | 1-500 | 50 |
| `retries` | 1-8 | 4 |

Full URLs are reduced to the domain, so `https://www.github.com/foo` and
`github.com` behave the same. A value that is not a domain is rejected with a
message rather than fetched.

### Typical uses

- **Competitor benchmarking.** Run your domain alongside three rivals and
  compare visits, engagement and the paid-versus-organic split in one table.
- **Market sizing.** `similar_sites` plus `category_rank` maps who else occupies
  a niche and how large it is.
- **Lead qualification.** Traffic, technology stack and company size in one row
  tells a sales team whether a prospect is worth the call.
- **Keyword research without a key.** `top_keywords` with CPC, per competitor.
- **Technology prospecting.** Filter on `technologies` to find every site in a
  list running a particular platform.
- **Trend monitoring.** Schedule it and join on `domain`; `traffic_history` and
  the rank-change fields show direction.

### Notes on behaviour

A page that loads but carries no application state is reported as `no_data` with
a note that the crawler-agent route may have closed, rather than returning a row
of zeroes. A run of zeroes that looks successful is the failure worth being loud
about, because traffic data is exactly the kind people paste into a deck without
re-checking.

Domains are paced with a short randomised gap. Exits are pinned to one country.

Some fields are simply absent for smaller sites: `similar_sites` and the company
block come back `null` rather than empty, because SimilarWeb publishes them only
where it has the data.

# Actor input Schema

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

Domains to analyse, for example github.com. Full URLs are accepted and reduced to the domain.

## `limit` (type: `integer`):

How many domains to process in one run. Each costs one page fetch.

## `retries` (type: `integer`):

Retries with backoff before a domain is reported as an error.

## Actor input object example

```json
{
  "domains": [
    "github.com",
    "ebay.com"
  ],
  "limit": 50,
  "retries": 4
}
```

# Actor output Schema

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

One row per domain profile.

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

Counts and which domains are too small for a confident estimate.

## `errors` (type: `string`):

Failures with a code and a redacted message.

# 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": [
        "github.com",
        "ebay.com"
    ],
    "limit": 50,
    "retries": 4
};

// Run the Actor and wait for it to finish
const run = await client.actor("s-r/similarweb-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 = {
    "domains": [
        "github.com",
        "ebay.com",
    ],
    "limit": 50,
    "retries": 4,
}

# Run the Actor and wait for it to finish
run = client.actor("s-r/similarweb-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 '{
  "domains": [
    "github.com",
    "ebay.com"
  ],
  "limit": 50,
  "retries": 4
}' |
apify call s-r/similarweb-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,s-r/similarweb-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/c7j1tv3vtHLxBXupQ/builds/BM2SNoDa53iGO0B43/openapi.json
