YouTube Channel Videos API
One POST resolves a YouTube channel into a paginated list of its uploads, newest first, each with a url the transcript and batch endpoints accept as-is. The channel can be given as an @handle, a UC… id or any channel URL. tab switches to the channel's Shorts, live streams, playlists or podcasts; sort and query reorder or search inside the channel; since_video_id returns only what is newer than a video you have already seen, and an empty answer is free, which makes polling a channel on a schedule cheap.
Each page of results is one credit; a page trimmed to nothing by since_video_id costs nothing, so polling a channel for new uploads is free. Failed requests are free.
On this platform
- A channel that does not exist answers 404 not_found; one with no uploads answers 200 with an empty list.
- tab playlists and podcasts answer with data.kind playlist_list; each row's url is accepted by the playlist endpoint.
- A page with nothing newer than since_video_id costs nothing; every other page costs 1 credit.
/api/v2/transcripts/channelidempotentList a channel's or profile's videos, Shorts, streams or playlists
Resolve a creator into a paginated list of videos (metadata only), newest first. A channel or profile that does not exist answers 404 not_found; an existing one with no uploads answers 200 with an empty list. The platform is read from the input: a YouTube channel, or a TikTok or Instagram profile URL. Every row's url is accepted by the transcript and batch endpoints as-is. Pass since_video_id to get back only the items newer than one you've already seen - a page with nothing new is free, which makes this safe to poll on a schedule. A YouTube channel also takes tab (its Shorts, live streams, playlists or podcasts instead of its videos), sort (popular or oldest first) and query (search inside the channel). The playlists and podcasts tabs answer with data.kind playlist_list, whose rows' urls the playlist endpoint accepts as-is.
Body parameters
channelstringrequiredtab"videos" | "shorts" | "live" | "playlists" | "podcasts"optionalsort"newest" | "popular" | "oldest"optionalquerystring (1-200 characters)optionallimitinteger (1–50)optionalcursorstringoptionalsince_video_idstringoptionalRequest example
Responses
{
"ok": true,
"request_id": "req_…",
"data": {
"kind": "video_list",
"source": "channel_videos",
"platform": "youtube",
"videos": [
{
"videoId": "dQw4w9WgXcQ",
"url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
"title": "Example video",
"duration": 212,
"channel": "Example Channel",
"publishedAt": "2009-10-25T00:00:00Z",
"stats": {
"plays": 1600000000
}
}
],
"next_cursor": "eyJvIjoxMH0"
},
"usage": {
"credits_spent": 1,
"balance": 98,
"bytes": 0
}
}Every YouTube endpoint
Frequently asked questions
- Is this the YouTube Data API's channels or playlistItems call?
- No. It is TranscriptFetch's own listing endpoint: no Google project, API key, OAuth or quota units. One page of a channel costs 1 credit, and a page with nothing new since since_video_id costs nothing.
- How do I get every video on a channel?
- Call the endpoint with the channel and a limit, then keep sending data.next_cursor back as cursor until it is null. Each page costs 1 credit. To transcribe them, send the rows' urls to the batch endpoint.
- How do I watch a channel for new uploads?
- Pass the newest videoId you have seen as since_video_id. The response holds only videos newer than it, and a page with nothing newer is free. For scheduled checks with webhooks, use a monitor instead.
- Can I list a channel's Shorts, live streams or playlists?
- Yes. tab shorts lists its Shorts, tab live its past and upcoming streams, and tab playlists or podcasts its playlists, answered as a playlist_list whose rows the playlist endpoint accepts. sort (popular, oldest) and query (search inside the channel) apply to the videos, shorts and live tabs.