Body parameters
YouTube: @handle, /channel/UC… URL, or UC… ID. TikTok: profile URL (tiktok.com/@user). Instagram: profile URL (instagram.com/user/).
YouTube channels only. Which tab to list: videos (the default), shorts, or live (streams: past broadcasts and upcoming ones). playlists and podcasts list the channel's playlists instead of its videos: data.kind is playlist_list, and each row's url is accepted by the playlist endpoint. A tab the channel does not have (live on a channel that has never streamed, say) answers 200 with an empty list, which is free, and a notice such as "This channel has no Live tab."
YouTube channels only. Order of the videos, shorts or live tab: newest (the default), popular or oldest. popular is YouTube's own Popular order, most viewed first, and it leaves out videos with no views. Not accepted with the playlists and podcasts tabs.
YouTube channels only. Search inside this channel: the page holds its videos that match, rather than its latest uploads. Leave tab and sort unset.
Max items to return per page: videos, or the playlists or channels some listing options return. Defaults to 5.
Opaque pagination cursor from a previous response's next_cursor (max 256 characters). Omit for the first page. Cursors are scoped to the listing that issued them, so send the same platform and listing options with each page. Offset-based sources cannot page past the first 2000 items.
Newest video ID you have already seen. The response is trimmed to videos newer than it. A poll with since_video_id is a check for new uploads and costs 1 credit whether or not it finds any (a plain listing that comes back empty stays free). It needs newest-first videos: on a YouTube channel, the videos, shorts or live tab with the default sort and no query.
{
"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
- POSTTranscriptFetch a YouTube video's transcript over REST: the request, every parameter, the JSON response with timestamped segments, and curl, Python and Node examples.
- POSTSearchSearch YouTube over REST without a Data API key or quota: the request, the upload date, duration, captions and sort filters, a real response, and curl, Python and Node examples.
- POSTChannel VideosList a YouTube channel's videos over REST without a Data API key: the request, the tab, sort and query options, since_video_id polling, a real response, and curl, Python and Node examples.
- POSTPlaylistList a YouTube playlist's videos over REST without a Data API key: the request with a playlist URL or PL id, cursor paging, a real response, and curl, Python and Node examples.
- POSTShortsList and transcribe a channel's YouTube Shorts over REST: the channel endpoint with tab shorts, a real Shorts listing, how a Short's transcript is fetched, and curl, Python and Node examples.
- POSTChannel MonitorWatch a YouTube channel for new videos over REST: create a monitor, receive each upload by signed webhook or from the events list, optionally with its transcript, with curl, Python and Node examples.
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 so does a since_video_id poll that finds nothing new.
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 each poll costs 1 credit, found or not. 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.