# outseo.lol Scraper — Organic Clicks Leaderboard & Benchmarks (`haketa/outseo-scraper`) Actor

Scrape the outseo.lol organic-traffic leaderboard — every ranked website with its real Google Search Console click volume and rank — plus benchmarks: the Organic Index, biggest movers, CTR by Google position and visibility. Export as JSON, CSV or Excel; schedule to track it over time.

- **URL**: https://apify.com/haketa/outseo-scraper.md
- **Developed by:** [Haketa](https://apify.com/haketa) (community)
- **Categories:** SEO tools, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $6.50 / 1,000 leaderboard sites

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

## outseo.lol Scraper — Organic Traffic Leaderboard & SEO Benchmarks

Turn the public **outseo.lol** data into clean, structured rows. Get the full **organic‑traffic leaderboard** — every ranked website with its **real Google Search Console click volume** (never an estimate) — plus the aggregate benchmarks: the **Outseo Organic Index**, **biggest movers**, **CTR by Google position**, impression **visibility** and **device/market** signals.

Built for **SEO professionals, agencies, analysts, indie hackers and growth teams** who want a real, Search‑Console‑derived view of who is winning organic search — and who want to **track it over time** by scheduling the actor.

***

### ✨ What you get

**Leaderboard (one row per website)**

- **Domain & rank** — every website on the outseo.lol leaderboard with its position.
- **Real organic clicks** — actual Google Search Console click volume for each site, not a traffic estimate.
- **Description & URL** — the site's own description and link.
- **Change tracking** — compared to your last run: `new`, `up`, `down`, `unchanged` or `gone`, with rank and click deltas.
- **Contact emails** *(optional)* — visit each site and pull contact emails for outreach/lead‑gen.

**Aggregate benchmarks (snapshot)**

- **Outseo Organic Index** — median organic‑click momentum, with % growth and growing‑vs‑declining split.
- **CTR by Google position** — average CTR for position 1, 2‑3, 4‑5, 6‑10, 11‑20, 21‑50 (with sites per bucket). A rare, real CTR‑curve benchmark.
- **Biggest movers** — the fastest‑growing sites with rank, domain, link and % change.
- **Visibility distribution** — share of impressions in Top 3, 4‑10, 11‑20 and 21+.
- **Device & market signals** + the dated **weekly report** headline signals.

***

### 🚀 Quick start

1. Leave both sources on (**Stats** and **Weekly report**).
2. Click **Start**.
3. You get one clean snapshot record per source.

**Tip:** schedule this actor (daily or weekly) to build a time series of the Organic Index, CTR curve and movers.

***

### 📥 Input

| Field | Type | Description |
|---|---|---|
| **Scrape the leaderboard** (`includeLeaderboard`) | boolean | Get one row per ranked website (rank, domain, organic clicks, description). |
| **Maximum leaderboard sites** (`maxItems`) | integer | Cap the number of leaderboard sites. Empty = all. |
| **Track changes since last run** (`trackChanges`) | boolean | Add `changeType` + rank/click deltas vs the previous run. |
| **Enrich with contact emails** (`enrichEmails`) | boolean | Visit each site and pull contact emails (adds time/cost). |
| **Concurrency** (`maxConcurrency`) | integer | Parallel site visits for email enrichment. |
| **Scrape the Stats page** (`includeStats`) | boolean | Scrape `outseo.lol/stats` (Organic Index, movers, CTR by position, visibility, segments). |
| **Scrape the Weekly report** (`includeWeeklyReport`) | boolean | Scrape `outseo.lol/reports/weekly` (weekly snapshot with date and headline signals). |
| **Proxy configuration** (`proxyConfiguration`) | object | Apify Proxy is recommended (datacenter is enough). |

```json
{
  "includeLeaderboard": true,
  "includeStats": true,
  "includeWeeklyReport": true
}
```

***

### 📤 Output

The dataset holds two record types. **Leaderboard site** rows (`recordType: "site"`):

```json
{
  "recordType": "site",
  "rank": 1,
  "domain": "youtubetotranscript.com",
  "url": "https://youtubetotranscript.com/",
  "organicClicks": 1777170,
  "description": "Get YouTube Transcript and use with ChatGPT!",
  "isLuckyDuck": false,
  "changeType": "up",
  "rankDelta": 2,
  "clicksDelta": 15400,
  "previousRank": 3,
  "previousClicks": 1761770,
  "emails": ["contact@youtubetotranscript.com"],
  "source": "leaderboard",
  "scrapedAt": "2026-08-28T10:00:00.000Z"
}
```

> **Change tracking** compares each run to the previous one (stored between runs). The first run marks everything `new`; later runs show `up`/`down`/`unchanged`/`gone` with deltas. **Emails** appear only when **Enrich with contact emails** is on and an address is found.

And a **benchmark snapshot** (`recordType: "benchmark"`) per source. Example (trimmed):

```json
{
  "recordType": "benchmark",
  "source": "stats",
  "url": "https://outseo.lol/stats",
  "week": null,
  "visitors": 1352,
  "websitesBenchmarked": 218,
  "organicIndex": {
    "value": 109.9,
    "medianGrowthPct": 9.9,
    "websites": 166,
    "growingPct": 56.6,
    "decliningPct": 36.7
  },
  "signals": [
    { "label": "Top-result CTR", "value": "68.0%", "note": "Impression-weighted across 83 sites." }
  ],
  "biggestMovers": [
    { "rank": 1, "site": "platvo.com", "url": "https://www.platvo.com/", "changePct": 1966.4 }
  ],
  "ctrByPosition": [
    { "position": "1", "avgCtrPct": 68.0, "sites": 83 },
    { "position": "2-3", "avgCtrPct": 19.1, "sites": 102 },
    { "position": "4-5", "avgCtrPct": 4.2, "sites": 108 },
    { "position": "6-10", "avgCtrPct": 1.4, "sites": 130 }
  ],
  "visibility": [
    { "label": "Top 3", "sharePct": 5.7 },
    { "label": "Positions 4–10", "sharePct": 55.6 },
    { "label": "Positions 11–20", "sharePct": 14.5 },
    { "label": "Positions 21+", "sharePct": 24.2 }
  ],
  "scrapedAt": "2026-08-28T10:00:00.000Z"
}
```

#### Field reference

| Field | Description |
|---|---|
| `source` | `stats` or `weekly`. |
| `week` | Report week (weekly source). |
| `visitors`, `websitesBenchmarked` | Site‑wide counters. |
| `organicIndex` | `value`, `medianGrowthPct`, `websites`, `growingPct`, `decliningPct`. |
| `signals` | Headline metric cards (label / value / note) from the weekly report. |
| `biggestMovers` | `rank`, `site`, `url`, `changePct` for the fastest‑growing sites. |
| `ctrByPosition` | `position`, `avgCtrPct`, `sites` — the CTR curve. |
| `visibility` | Share of impressions by position band. |
| `segments` | Device & market breakdown (best‑effort). |
| `narrative` | The weekly report's summary line. |
| `scrapedAt` | ISO timestamp — use it to build a time series. |

***

### 💡 Use cases

- **CTR benchmarking** — use `ctrByPosition` as a real, up‑to‑date CTR curve to model traffic from rank changes.
- **Market pulse** — track the Organic Index week over week to see whether organic search is expanding or contracting.
- **Spotting momentum** — watch the biggest movers to discover fast‑growing sites in the cohort.
- **Reporting** — drop the numbers into client SEO reports and dashboards.
- **Time series** — schedule the actor to log a snapshot every week and chart the trend.

***

### 🎯 Tips

- **Schedule it.** The real value comes from running it regularly and comparing `scrapedAt` snapshots.
- **Keep both sources on.** Stats gives the full structured data; the weekly report adds the date and headline signals.
- **Filter after export.** Pull the arrays (`ctrByPosition`, `biggestMovers`) into your spreadsheet or database.

***

### 🔌 Run it your way

- **Apify Console** — click Start.
- **API** — start runs and pull the dataset programmatically.
- **Scheduler** — capture a snapshot on a schedule.
- **Integrations** — push results to Google Sheets, Zapier, Make, webhooks, S3 and more.

***

### ❓ FAQ

**Where does the data come from?**
outseo.lol publishes anonymized organic‑search benchmarks aggregated from verified Google Search Console data across participating websites. This actor reads the public pages only.

**Is any private or per‑site data exposed?**
No. The benchmarks are aggregate and anonymized; this actor only reads what outseo.lol publishes publicly.

**How often does the data change?**
The benchmarks refresh periodically (the weekly report is dated). Schedule the actor to capture each update.

**In what format is the data?**
Structured JSON by default, exportable to CSV, Excel and more.

***

### ⚖️ Legal & responsible use

This tool reads **publicly available**, aggregated and anonymized benchmark information for legitimate use such as SEO analysis and reporting. You are responsible for how you use the data and for complying with all applicable laws and regulations and the website's terms. This scraper is not affiliated with, endorsed by, or connected to outseo.lol; all trademarks belong to their respective owners.

***

#### Tags

`outseo` · `seo` · `seo benchmarks` · `organic search` · `ctr by position` · `ctr curve` · `search console` · `seo data` · `keyword ctr` · `serp ctr` · `seo analytics` · `organic traffic` · `seo reporting` · `rank tracking`

# Actor input Schema

## `includeLeaderboard` (type: `boolean`):

Scrape the outseo.lol leaderboard — one row per ranked website with its rank, domain, real organic click volume and description.

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

Cap the number of leaderboard sites. Leave empty for all.

## `trackChanges` (type: `boolean`):

Compare against the previous run and add change info to each site (new, up, down, gone, with rank and click deltas). Needs at least two runs.

## `enrichEmails` (type: `boolean`):

Visit each leaderboard site and extract contact emails (adds time and cost). Off by default.

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

How many sites to visit in parallel when email enrichment is on.

## `includeStats` (type: `boolean`):

Scrape outseo.lol/stats (Organic Index, biggest movers, CTR by position, visibility, segments).

## `includeWeeklyReport` (type: `boolean`):

Scrape outseo.lol/reports/weekly (the weekly 'State of Organic Search' snapshot with the report date).

## `proxyConfiguration` (type: `object`):

Apify Proxy is recommended (datacenter is enough).

## Actor input object example

```json
{
  "includeLeaderboard": true,
  "trackChanges": true,
  "enrichEmails": false,
  "maxConcurrency": 10,
  "includeStats": true,
  "includeWeeklyReport": true,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `dataset` (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 = {
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("haketa/outseo-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 = { "proxyConfiguration": { "useApifyProxy": True } }

# Run the Actor and wait for it to finish
run = client.actor("haketa/outseo-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 '{
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call haketa/outseo-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,haketa/outseo-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/x8O7OBsy99DiEgpS5/builds/fOtbCAJG9wHexHf3R/openapi.json
