YouTube APIyoutube.com ↗
Retrieve video IDs, titles, URLs, view counts, and publish timestamps from any public YouTube channel. Supports sorting and automatic pagination.
What is the YouTube API?
This API exposes 1 endpoint — get_channel_videos — that returns up to the full video catalog of any public YouTube channel, with 5 data fields per video: video_id, title, url, views, and published. Pass a channel handle (with or without the @ prefix) and receive a structured array of videos sorted by latest, popular, or oldest, with automatic pagination to fulfill your 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.
"""YouTube Channel Videos API — fetch and browse video metadata from any channel."""
from parse_apis.youtube_channel_videos_api import YouTube, Sort, ChannelNotFound
client = YouTube()
# List latest videos from a channel (limit caps total items fetched)
channel = client.channel(handle="@SuccessionBio")
for video in channel.videos(sort_by=Sort.LATEST, limit=5):
print(video.title, "|", video.views, "|", video.published)
# Fetch most popular video using a different sort
top_video = channel.videos(sort_by=Sort.POPULAR, limit=1).first()
if top_video:
print(f"Most popular: {top_video.title} — {top_video.url}")
# 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.videos (latest + popular sort), ChannelNotFound error handling")
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
What get_channel_videos Returns
The get_channel_videos endpoint accepts a channel_handle (e.g. @SuccessionBio or SuccessionBio) and returns a videos array alongside a video_count integer and the normalized channel_handle string. Each object in videos includes a unique video_id, the video title, a direct watch url, a views count, and a published relative timestamp (e.g. "3 years ago").
Sorting and Pagination
The sort_by parameter accepts three values: latest (default), popular, and oldest. This lets you pull a channel's most-watched videos or reconstruct a chronological upload history. The limit integer parameter controls how many videos are returned; the API automatically pages through the channel's video grid until the limit is satisfied, so you don't need to manage continuation tokens yourself.
Scope and Coverage
The API works against any public YouTube channel's videos tab. Private, members-only, or age-restricted videos that require a signed-in viewer are not surfaced. The published field is a relative string as displayed on the page (e.g. "2 months ago") rather than an absolute ISO timestamp, which is worth accounting for if you need precise date filtering downstream.
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?+
- Track upload frequency for a competitor's channel by pulling the latest videos and checking
publishedtimestamps. - Build a popularity leaderboard by sorting with
sort_by=popularand ranking results byviews. - Seed a video database with
video_idandurlvalues for bulk metadata enrichment pipelines. - Monitor a creator's catalog size over time by comparing
video_countacross periodic snapshots. - Find a channel's oldest content by setting
sort_by=oldestto reconstruct upload chronology. - Aggregate title patterns across a channel's full catalog for keyword and topic analysis.
- Build a channel comparison tool by running
get_channel_videosacross multiple handles and comparingviewsdistributions.
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does YouTube have an official developer API?+
What does the `published` field actually contain?+
Does the API return video descriptions, tags, or duration?+
get_channel_videos endpoint returns video_id, title, url, views, and published per video. Descriptions, tags, duration, thumbnail URLs, and like counts are not included. You can fork this API on Parse and revise it to add those fields as a separate or extended endpoint.Are Shorts, live streams, or playlists included in the results?+
How does automatic pagination work with the `limit` parameter?+
limit higher than what a single page of the video grid contains, the API continues loading additional pages until the requested number of videos is fulfilled or the channel's catalog is exhausted. You do not need to pass page tokens or offsets yourself.