Reference

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.

1 credit per page, free when since_video_id finds nothing newView pricing

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.
POST/api/v2/transcripts/channelidempotent

List 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

channelstringrequired
YouTube: @handle, /channel/UC… URL, or UC… ID. TikTok: profile URL (tiktok.com/@user). Instagram: profile URL (instagram.com/user/).
Example
tab"videos" | "shorts" | "live" | "playlists" | "podcasts"optional
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."
Example
sort"newest" | "popular" | "oldest"optional
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.
Example
querystring (1-200 characters)optional
YouTube channels only. Search inside this channel: the page holds its videos that match, rather than its latest uploads. Leave tab and sort unset.
limitinteger (1–50)optional
Max items to return per page: videos, or the playlists or channels some listing options return. Defaults to 5.
Example
cursorstringoptional
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.
since_video_idstringoptional
Newest video ID you have already seen. The response is trimmed to videos newer than it, and a page with nothing newer costs no credits - so you can poll a channel for new uploads for free. It needs newest-first videos: on a YouTube channel, the videos, shorts or live tab with the default sort and no query.

Request example

curl https://transcriptfetch.com/api/v2/transcripts/channel \
  -H "Authorization: Bearer $TRANSCRIPTFETCH_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"channel":"@lexfridman","limit":10}'

Responses

SuccessExample response envelope
{
  "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.