# Social Blade Scraper — YouTube, TikTok, Instagram, Twitch Stats (`rl1987/social-blade-lookup`) Actor

Scrape Social Blade statistics, daily history and growth projections for YouTube, TikTok, Instagram and Twitch. No login required, proxy rotation built in.

- **URL**: https://apify.com/rl1987/social-blade-lookup.md
- **Developed by:** [R.L.](https://apify.com/rl1987) (community)
- **Categories:** Social media, Developer tools, Automation
- **Stats:** 19 total users, 11 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $10.00 / 1,000 user search + profile lookups

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#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

## Social Blade Scraper — YouTube, TikTok, Instagram & Twitch Stats

Pull **Social Blade** statistics for any creator without an account, an API key, or a browser.
This Actor talks directly to Social Blade's live backend and returns clean, structured JSON for
**YouTube, TikTok, Instagram and Twitch** — including profile summaries, daily historical data, and
growth projections.

> ⚡ One batched request per creator fetches the profile, ~30 days of history **and** growth
> projections together — the same trick the official Social Blade mobile app uses.

### What you can scrape

| Result type | What you get | Accepts |
|---|---|---|
| **Profile** *(recommended)* | Resolves a handle, then returns profile + daily history + growth in a single batched call. | handle, ID or URL |
| **Search** | Matching accounts for a term (id, display name, username, subscribers/followers). | search term |
| **User** | Profile / summary stats only (avatar, country, ranks, totals, grade…). | **platform ID only** |
| **History** | Daily historical data points (configurable, up to 365 days). | **platform ID only** |
| **Growth** | Multi-window growth deltas (3–365 days). | **platform ID only** |

> ⚠️ **`user`, `history` and `growth` require a resolved platform ID** (e.g. a YouTube
> channel ID `UCX6OQ3DkcsbYNE6H8uQQuVA`, not the handle `mrbeast`) — a handle or URL returns
> an error. Only **`profile`** and **`search`** accept handles/URLs. To get history or growth
> from a handle, use **`profile`** (which resolves the handle first, then fetches both); you
> can turn off either section with `includeHistory` / `includeGrowth`. To find an account's
> ID, run a **`search`** first — the `id` field of each result is what these modes expect.

Supported platforms: **YouTube · TikTok · Instagram · Twitch**.
*(Social Blade removed Twitter/X data, so it is not available.)*

### Why this Actor

- **No login, no API key.** Works against Social Blade's public web backend.
- **Multi-platform in one Actor.** Switch between YouTube, TikTok, Instagram and Twitch with a single input field — or mix them in one run by pasting profile URLs.
- **Accepts anything you paste.** Handles (`mrbeast`), platform IDs, platform profile URLs (`https://youtube.com/@PewDiePie`) and Social Blade URLs all work — the platform is auto-detected from URLs.
- **Batched profile lookups.** Profile mode pulls summary + history + growth in **one** request, so you spend fewer proxy hits and finish faster.
- **Headline fields surfaced.** SB grade, ranks, country, category, total views/uploads, socials and multi-window growth are lifted to the top level — the same insights other scrapers bury or charge a subscription for.
- **Beats Cloudflare without a browser.** Social Blade JA3-fingerprints the TLS handshake, so plain Python HTTP clients get a 403 "Just a moment" page. The Actor impersonates a real Chrome TLS/HTTP2 fingerprint (via `curl_cffi`) and retries with a **fresh proxy IP** on any remaining challenge — no slow headless browser needed.

#### How it compares

| | This Actor | `radeance/socialblade-api` | `parseforge/socialblade-scraper` |
|---|---|---|---|
| Pricing | Pay-per-usage (no subscription) | $19.99/mo + usage | $8.19 / 1,000 results |
| Look up creators by handle/URL | ✅ | ✅ | ❌ (top-lists only) |
| Daily history time-series | ✅ (IG premium-gated) | ✅ | ❌ |
| Multi-window growth (3–365d) | ✅ (IG premium-gated) | ✅ | 30-day only |
| SB grade, ranks, socials | ✅ | ✅ | partial |
| Mixed-platform URLs in one run | ✅ | ✅ | ❌ |

We focus on **fast, no-subscription per-creator lookups with full history** — the cheapest path when you already know which creators you care about.

> ℹ️ **Instagram history & growth are gated by Social Blade.** Social Blade only serves
> Instagram's daily-history and growth sections to logged-in/premium accounts (its public
> backend answers `401 UNAUTHORIZED`). For Instagram, `profile` runs still return the full
> profile summary, but the `history`/`growth` fields come back `null` — and you are **not
> charged** for a section that wasn't delivered. YouTube, TikTok and Twitch are unaffected.

### Pricing

This Actor uses **pay-per-event** pricing — no monthly subscription. You only pay for the data you actually receive (failed/empty queries are never charged):

| Event | Price | Charged when |
|---|---|---|
| User search + profile lookup | **$0.01** | A `search`, `user`, or `profile` query returns its profile/summary data. |
| Historical data | **$0.01** | A daily history time-series is returned (in `history` or `profile` mode). |
| Growth data | **$0.01** | A multi-window growth section is returned (in `growth` or `profile` mode). |

What a query costs:

| Run | Cost per query |
|---|---|
| `search` or `user` | $0.01 |
| `profile` with history + growth (default) | $0.03 |
| `profile` with `includeHistory: false` and `includeGrowth: false` | $0.01 |

> Apify Proxy usage and compute are billed separately by Apify at standard platform rates.

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `platform` | string | `youtube` | `youtube`, `tiktok`, `instagram` or `twitch`. |
| `queries` | array of strings | — | Handles / IDs / profile URLs (or search terms for `search`). **`user`/`history`/`growth` require a platform ID; `profile`/`search` also accept handles & URLs.** Required. |
| `resultType` | string | `profile` | `profile`, `search`, `user`, `history` or `growth` (see [What you can scrape](#what-you-can-scrape) for which accept handles). |
| `includeHistory` | boolean | `true` | In `profile` mode, include the daily history section. Turn off for a smaller, faster request. |
| `includeGrowth` | boolean | `true` | In `profile` mode, include the multi-window growth section. Turn off for a smaller, faster request. |
| `historyLimit` | integer | `30` | Daily data points for `history` / `profile` (1–365). |
| `maxConcurrency` | integer | `5` | Queries processed in parallel. |
| `maxRetries` | integer | `6` | Retries (with IP rotation) per request when Cloudflare challenges. |
| `proxyConfiguration` | object | Residential Apify Proxy | Proxy settings. Residential is the default; datacenter IPs get hard-blocked by Cloudflare under load. |

#### Example input

```json
{
  "platform": "youtube",
  "queries": ["mrbeast", "pewdiepie"],
  "resultType": "profile",
  "historyLimit": 30,
  "maxConcurrency": 5,
  "proxyConfiguration": { "useApifyProxy": true }
}
```

### Output

One record is pushed to the dataset per query. Example (`profile`, abbreviated):

```json
{
  "platform": "youtube",
  "resultType": "profile",
  "query": "mrbeast",
  "id": "UCX6OQ3DkcsbYNE6H8uQQuVA",
  "displayName": "MrBeast",
  "username": null,
  "subscribers": 502000000,
  "followers": null,
  "views": "130065447496",
  "uploads": 988,
  "sbGrade": "A++",
  "country": "US",
  "category": "entertainment",
  "madeForKids": false,
  "createdAt": "2012-02-20T00:00:00.000Z",
  "ranks": { "sb": 13, "subscribers": 1, "views": 12, "country": 1, "category": 1 },
  "socials": [ { "url": "https://instagram.com/mrbeast", "title": "Follow" } ],
  "avatar": "https://yt3.ggpht.com/...",
  "scrapedAt": "2026-06-19T12:00:00+00:00",
  "user": { "id": "UCX6OQ3DkcsbYNE6H8uQQuVA", "description": "...", "stats": { "...": "..." } },
  "history": [ { "date": "2026-06-18T00:00:00.000Z", "subscribers": 501000000, "views": 129900000000, "videos": 987 } ],
  "growth": {
    "subscribers": { "3d": 1000000, "7d": 3000000, "30d": 15000000, "90d": 30000000, "365d": 96000000 },
    "views":       { "3d": 509488425, "30d": 6576018368, "365d": 43252485950 },
    "videos":      { "3d": 1, "30d": 7, "365d": 111 }
  }
}
```

> `growth` groups subscriber, view and upload deltas by metric, each keyed by timeframe over
> **3, 7, 14, 30, 60, 90, 180 and 365-day** windows. `history` is the daily time-series.
> Set `includeHistory` / `includeGrowth` to `false` to omit either section.

A `search` record contains a `results` array; failed queries include an `error` field instead of data
(the run continues — one bad query never aborts the batch).

### Tips & limits

- **Use residential proxy (the default).** Social Blade is behind Cloudflare. Residential IPs reliably succeed across all platforms; datacenter IPs work for low volume but get hard-blocked under concurrency. Lower `maxConcurrency` if you still see challenges.
- **`profile` is the cheapest way to get everything** — prefer it over running `user` + `history` + `growth` separately.
- Field availability varies by platform (e.g. YouTube uses `subscribers`, TikTok/Instagram use `followers`).
- This Actor reads publicly available data from Social Blade. Respect Social Blade's terms and applicable laws; use the data responsibly.

### How it works

The Actor calls Social Blade's tRPC backend (`https://socialblade.com/api/trpc`) with GET requests —
the same endpoints the website itself uses. Cloudflare fingerprints the TLS handshake, so the Actor
uses `curl_cffi` to impersonate a real Chrome browser's TLS/HTTP2 fingerprint; this gets a normal JSON
response without the cost of a headless browser. When a challenge page is still returned instead of
JSON, the request is retried on a fresh proxy IP until it succeeds or `maxRetries` is exhausted.

# Actor input Schema

## `platform` (type: `string`):

The social platform to look up. Note: Social Blade removed Twitter/X data.

## `queries` (type: `array`):

One entry per account to scrape. For `profile` and `search` result types, accepts a handle/username (`mrbeast`), a platform ID (`UCX6OQ3DkcsbYNE6H8uQQuVA`), a platform profile URL (`https://youtube.com/@PewDiePie`, `https://tiktok.com/@khaby.lame`), or a Social Blade URL (`https://socialblade.com/youtube/handle/ninja`); when a URL identifies the platform it overrides the `platform` field, so you can mix platforms in one run. ⚠️ The `user`, `history` and `growth` result types require a resolved platform ID (not a handle/URL) — to get history/growth from a handle, use `profile` instead, or run `search` first to find the `id`.

## `resultType` (type: `string`):

What to fetch for each query:

- **profile** — resolve the handle, then fetch profile + daily history + growth in one batched call (recommended; accepts handle/ID/URL).
- **search** — return matching accounts for the term (accepts a search term).
- **user** — profile/summary stats only. Requires a platform ID.
- **history** — daily historical data points only. Requires a platform ID.
- **growth** — multi-window growth deltas only. Requires a platform ID.

⚠️ `user`, `history` and `growth` need a resolved platform ID (e.g. `UCX6OQ3DkcsbYNE6H8uQQuVA`), not a handle. For history/growth from a handle, use `profile`.

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

In `profile` result type, include the daily history section. Turn off to make a smaller, faster request when you only need the profile summary. Ignored for other result types.

## `includeGrowth` (type: `boolean`):

In `profile` result type, include the multi-window growth section. Turn off to make a smaller, faster request. Ignored for other result types.

## `historyLimit` (type: `integer`):

Number of daily data points to fetch for `history` and `profile` result types.

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

Maximum number of queries processed in parallel. Lower this if you hit Cloudflare challenges.

## `maxRetries` (type: `integer`):

How many times to retry a request (rotating proxy IP) when Cloudflare returns a challenge page instead of JSON.

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

Proxy settings. Residential Apify Proxy is the default and strongly recommended — Social Blade is behind Cloudflare, and datacenter IPs get hard-blocked under load while residential IPs reliably succeed.

## Actor input object example

```json
{
  "platform": "youtube",
  "queries": [
    "mrbeast",
    "https://www.youtube.com/@PewDiePie"
  ],
  "resultType": "profile",
  "includeHistory": true,
  "includeGrowth": true,
  "historyLimit": 30,
  "maxConcurrency": 5,
  "maxRetries": 6,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `results` (type: `string`):

Social Blade records (profile / search / user / history / growth), one per input query, in the default dataset.

# 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 = {
    "queries": [
        "https://www.youtube.com/botterboynova",
        "https://www.tiktok.com/@brett.dev",
        "https://www.twitch.tv/pokimane",
        "https://www.instagram.com/nike"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("rl1987/social-blade-lookup").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 = { "queries": [
        "https://www.youtube.com/botterboynova",
        "https://www.tiktok.com/@brett.dev",
        "https://www.twitch.tv/pokimane",
        "https://www.instagram.com/nike",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("rl1987/social-blade-lookup").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "queries": [
    "https://www.youtube.com/botterboynova",
    "https://www.tiktok.com/@brett.dev",
    "https://www.twitch.tv/pokimane",
    "https://www.instagram.com/nike"
  ]
}' |
apify call rl1987/social-blade-lookup --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=rl1987/social-blade-lookup",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/1KmezGkKhBRqRHakY/builds/I2DSgo4W1jzo9RJe1/openapi.json
