YouTube APIyoutube.com ↗
Extract YouTube channel videos, check live stream status, and search channels by niche. Returns titles, view counts, subscriber data, and contact emails.
What is the YouTube API?
This API exposes 3 endpoints for extracting public YouTube channel data: video listings, live stream status, and channel discovery. The get_channel_videos endpoint returns video IDs, titles, watch URLs, view counts, and relative publish timestamps for any public channel, with support for sorting by latest, popular, or oldest and automatic pagination to fulfill any requested limit.
curl -X GET 'https://api.parse.bot/scraper/17f80f00-16b9-481b-8d14-fa845ca3f046/get_channel_videos?limit=5&sort_by=latest&channel_handle=%40SuccessionBio' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace youtube-com-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""Walkthrough: YouTube Channel Videos API — search channels, browse videos, check live status."""
from parse_apis.YouTube_Channel_Videos_API import YouTube, Sort, ChannelNotFound
client = YouTube()
# Search for channels in a niche (limit caps total items fetched)
for ch in client.channel_search_results.search(niche="personal finance", limit=3):
print(ch.channel_name, "|", ch.subscriber_count, "|", ch.contact_email)
# Construct a known channel and browse its latest videos
channel = client.channel(handle="@mkbhd")
for video in channel.videos(sort_by=Sort.LATEST, limit=3):
print(video.title, "|", video.views, "|", video.published)
# Check if a news channel is currently live streaming
news = client.channel(handle="@SkyNews")
status = news.live_status()
print(f"Live: {status.is_live}, Title: {status.live_title}, Viewers: {status.live_viewers}")
# Handle a channel that doesn't exist
try:
missing = client.channel(handle="@thisChannelDoesNotExist99999")
for v in missing.videos(limit=1):
print(v.title)
except ChannelNotFound as exc:
print(f"Channel not found: {exc.channel_handle}")
print("Exercised: channel_search_results.search, channel.videos, channel.live_status, ChannelNotFound")
Retrieve videos from a YouTube channel's public videos page. Returns video IDs, titles, watch URLs, view counts, and relative publish timestamps. Supports sorting by latest (default), popular, or oldest. Automatically paginates through the channel's video grid to fulfill the requested limit. View counts and publish dates are returned as human-readable strings exactly as YouTube renders them (e.g. '21 views', '2 weeks ago').
| Param | Type | Description |
|---|---|---|
| limit | integer | Maximum number of videos to return. The scraper paginates automatically to fulfill the limit. |
| sort_by | string | Sort order for videos. |
| channel_handlerequired | string | YouTube channel handle, with or without the leading '@' (e.g. '@SuccessionBio' or 'SuccessionBio'). |
{
"type": "object",
"fields": {
"videos": "array of Video objects with video_id, title, url, views, published",
"video_count": "integer — number of videos returned in this response",
"channel_handle": "string — the normalized channel handle with @ prefix"
},
"sample": {
"data": {
"videos": [
{
"url": "https://www.youtube.com/watch?v=WDx-dJ-oznI",
"title": "The Alien Intern: Why Managing AI Agents Is the Career Skill of the Decade | SalesDNA Podcast",
"views": "21 views",
"video_id": "WDx-dJ-oznI",
"published": "2 weeks ago"
},
{
"url": "https://www.youtube.com/watch?v=QmWjcCLEUlw",
"title": "Have an Omnipresent, Helpful Opinion | SalesDNA Podcast",
"views": "38 views",
"video_id": "QmWjcCLEUlw",
"published": "1 month ago"
}
],
"video_count": 5,
"channel_handle": "@SuccessionBio"
},
"status": "success"
}
}About the YouTube API
Video Listings
The get_channel_videos endpoint accepts a channel_handle (with or without the @ prefix) and returns an array of video objects, each containing video_id, title, url, views, and published. Use the sort_by parameter to order results by latest (default), popular, or oldest. The limit parameter controls how many videos are returned; pagination is handled automatically so you always get the exact count requested regardless of how deep into the channel's history it reaches.
Live Stream Detection
get_channel_live_status checks whether a given channel is currently broadcasting. When is_live is true, the response includes the stream's live_title, live_url, live_viewers (formatted as a human-readable string matching what YouTube displays, e.g. "12K watching"), and a thumbnail_url. When the channel is offline, is_live is false and all stream-specific fields return null.
Channel Discovery
search_channels accepts a niche query string and returns matching channel objects with channel_handle, channel_name, channel_url, subscriber_count, video_count, profile_picture, description, and any publicly listed contact email. Use the page and limit parameters to paginate through results without duplicates across calls. The total_results field reflects how many channels were returned in that specific response.
The YouTube API is a managed, monitored endpoint for youtube.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when youtube.com changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official youtube.com API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Audit a competitor's upload cadence by sorting their channel videos by oldest and tracking
publishedtimestamps - Monitor a news or sports channel for active live streams using
is_liveandlive_viewers - Build a channel prospecting list for influencer outreach by searching a niche and collecting contact emails from About pages
- Aggregate view counts across a channel's most popular videos to estimate audience engagement
- Detect when a brand channel goes live and trigger a notification using
live_urlandthumbnail_url - Paginate through a channel's full video history to build a complete archive of
video_idandtitlepairs - Find channels in a specific niche alongside their
subscriber_countto filter by audience size
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 200 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
| Team | $300/mo | 20,000 | 300 req/min |
| Company | $1,000/mo | 100,000 | 500 req/min |
Each endpoint has a fixed posted price per successful call — most fall between 1 and 10 credits — shown on this API's page before you run it. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does YouTube have an official developer API?+
What does `get_channel_live_status` return when a channel is not live?+
is_live is false and live_url, live_title, live_viewers, and thumbnail_url all return null. When the channel is live, live_viewers is a display string (e.g. '4.2K watching') rather than a raw integer, so plan your parsing accordingly.Does `search_channels` always return a contact email for each channel?+
email field is only populated when the channel owner has made an email address publicly visible on their About page. Many channels do not expose one, so expect null values to be common in the results.Does the API return video comments, descriptions, or tags?+
get_channel_videos returns video_id, title, url, views, and published per video — comments, full descriptions, and tags are not included. You can fork this API on Parse and revise it to add an endpoint that fetches individual video detail pages for those fields.Can I retrieve videos from a channel that uses a custom URL rather than a handle?+
channel_handle parameter expects the @-prefixed handle format (e.g. @SuccessionBio). Channels that only have legacy /c/ or /user/ custom URLs may not resolve correctly. The easiest workaround is to find the channel's current handle from its YouTube profile page first.