YouTube Channel Scraper API
Our YouTube channel scraper turns any handle, channel ID, or URL into structured JSON: subscriber count, video count, description, avatar, and the channel's videos in one request, then pages deeper with a simple cursor.
Why YouTube Channel data is hard to get
A channel page loads its key numbers after the first response, so the raw HTML holds placeholders and hand-written selectors break within weeks. The official Data API is cleaner but rounds subscriberCount down to three significant figures over 1,000 subs (123,456 shows as 123000) and gates every call behind a 10,000-unit daily quota.
The YouTube Channel Scraper API in one request
curl "https://api.youtubescraperapi.com/api/v1/youtube/channel?channel=@mkbhd&api_key=$API_KEY" import requests
BASE = "https://api.youtubescraperapi.com"
API_KEY = "YOUR_API_KEY"
# Page 1: pass the channel handle, id, or URL.
data = requests.get(
f"{BASE}/api/v1/youtube/channel",
params={"channel": "@mkbhd", "api_key": API_KEY},
timeout=30,
).json()
print(data["channel_name"], "-", data["subscriber_count"], "subscribers")
print(data["video_count"], "videos")
for video in data["videos"]:
print(video["position"], video["views"], video["title"], video["url"])
# Walk further pages by following next_page_url. Each call is one page,
# one flat charge: no server-side deep loop, no surprise multi-page bill.
while data["has_more"]:
data = requests.get(
BASE + data["next_page_url"],
params={"api_key": API_KEY},
timeout=30,
).json()
for video in data["videos"]:
print(video["position"], video["views"], video["title"], video["url"]) Parameters
| Parameter | Required | Default | Notes |
|---|---|---|---|
channel | required | - | Channel handle, id, or URL, e.g. @mkbhd, UCBJycsmduvYEL83R_U4JriQ, or a youtube.com/@handle link. Required unless you pass page_token. |
page_token | optional | - | Cursor for the next page of videos. Pass the next_page_token from a prior response (or just follow next_page_url) instead of channel. One of channel or page_token is required. |
tab | optional | videos | Which channel tab to read, e.g. videos. Defaults to videos. |
country | optional | - | Optional two-letter country code to fetch the channel as seen from that region. |
api_key | required | - | Your API key, passed as a query parameter. Get one free at signup. |
What the YouTube Channel Scraper API returns
{
"channel": "@mkbhd",
"channel_id": "UCBJycsmduvYEL83R_U4JriQ",
"channel_name": "Marques Brownlee",
"handle": "@mkbhd",
"vanity_url": "https://www.youtube.com/@mkbhd",
"tab": "videos",
"description": "I make videos about technology and gadgets.",
"subscriber_count": 19800000,
"video_count": 1742,
"avatar": "https://yt3.googleusercontent.com/ytc/AIdro_abc123=s900",
"videos": [
{
"position": 1,
"id": "dQw4w9WgXcQ",
"title": "The Best Phone of the Year",
"url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
"thumbnail": "https://i.ytimg.com/vi/dQw4w9WgXcQ/hq720.jpg",
"channel": "Marques Brownlee",
"views": "4,231,908 views",
"published": "3 days ago"
}
],
"videos_count": 30,
"page": 1,
"next_page_token": "eyJjIjoiNHFtRnNn...p9",
"next_page_url": "/api/v1/youtube/channel?page_token=eyJjIjoiNHFtRnNn...p9",
"has_more": true
} | Field | Type | Description |
|---|---|---|
channel_id | string | The channel's unique YouTube ID, the stable identifier that never changes. |
channel_name | string | The channel's display name as shown on its page. |
handle | string | The channel's @handle, e.g. @mkbhd. |
vanity_url | string | The canonical channel URL. |
description | string | The full channel description from the About section. |
subscriber_count | integer | Subscriber count parsed from the live channel page. |
video_count | integer | Total number of public videos on the channel. |
avatar | string | URL of the channel's profile picture. |
videos | array | Videos on this page, each with position, id, title, url, thumbnail, channel, views, and published. |
videos_count | integer | Number of videos returned on this page (one page per call). |
page | integer | The page number for this response, starting at 1. |
next_page_token | string | Cursor for the next page. Pass it back as page_token, or null when has_more is false. |
next_page_url | string | Ready-made path for the next page, /api/v1/youtube/channel?page_token= |
has_more | boolean | True when another page of videos is available, false on the last page. |
What you can build using the API
Influencer discovery
Competitor tracking
Channel monitoring
Creator databases
Recent video feeds
Outreach enrichment
Why teams choose our YouTube Channel Scraper API
Pass an @handle, a raw channel ID, or a full URL and we resolve it for you, with no OAuth, no Google Cloud project, and no unit budget to ration. Every request runs through rotating proxies, anti-bot handling, JS rendering, and retries, returning validated JSON with a stable schema in about 2.6 seconds.
Handle, ID, or URL input
Anti-bot and proxy rotation
JS rendering built in
Auto-retry across pools
Validated JSON schema
Flat-cost cursor pagination
YouTube Channel Scraper API vs the official YouTube API
| Our API | DIY (requests / headless) | YouTube Data API v3 | |
|---|---|---|---|
| Input by handle or URL | Yes, handle, ID, or URL | Manual page fetch and parse | Resolves @handle and legacy username; URLs need search.list |
| Exact subscriber count | Parsed from the live page | Possible but parser breaks often | Rounded to 3 significant figures over 1,000 subs |
| Setup | API key only | Proxies, headless browser, parsers | Google Cloud project plus OAuth |
| Rate limits | By plan, no daily unit budget | Bound by your proxy pool | 10,000 units/day default |
| Anti-bot and proxies | Built in | You build and maintain it | Not applicable |
| Recent videos in one call | Yes, in the videos array, with a cursor for more | Extra requests and scrolling | Separate playlistItems / search calls |
| Deeper video pages | Follow next_page_url, flat charge per page | Hand-managed continuation tokens | Page tokens, 1 unit per playlistItems page |
Start free, scale when ready
| Plan | Price | Best for |
|---|---|---|
| Free | 1,000 requests | Testing and small jobs |
| Pro | $0.60 / 1k | Production workloads |
| Pay-as-you-go | $0.90 / 1k | Spiky or one-off volume |
Median response 2.6s. You only pay for successful requests.
FAQ
A YouTube channel scraper is a tool that reads a channel's public data and returns it in a structured format. Our YouTube channel scraper API takes a handle, channel ID, or URL and returns the channel name, handle, vanity URL, description, subscriber count, video count, avatar, and a list of recent videos as JSON from a single request.
Send one GET request to our youtube/channel endpoint with the channel handle, ID, or URL and your API key. We render the page, rotate proxies, handle anti-bot checks, retry on failure, and parse the result, so you get clean JSON back without maintaining selectors against YouTube's changing markup.
Our API parses the subscriber count from the live channel page. The official YouTube Data API rounds statistics.subscriberCount down to three significant figures for channels over 1,000 subscribers, so a channel with 123,456 subscribers reports 123000 there, and the precise number is only visible to the owner in YouTube Studio.
No. You only need a youtubescraperapi key, passed as the api_key query parameter. There is no OAuth flow, no Google Cloud project, and no daily quota of units to manage. The free tier includes 1,000 requests per month.
You can pass a handle like @mkbhd, a raw channel ID like UCBJycsmduvYEL83R_U4JriQ, or a full channel URL. The single channel parameter accepts all three and resolves them server side.
Median end-to-end response is about 2.6 seconds, which includes proxy routing, anti-bot handling, retries, and parsing. One call returns the channel profile plus the first page of videos, so you do not chain extra requests just to assemble a profile.
Each response carries a next_page_token, a next_page_url, and a has_more flag. To page deeper, follow next_page_url (which is /youtube/channel?page_token=