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": "SHlrUAkkWI0",
"url": "https://www.youtube.com/watch?v=SHlrUAkkWI0",
"title": "Lex trains w/ Khabib Nurmagomedov | Exclusive Footage at UFC PI",
"duration": null,
"channel": "Lex Fridman",
"publishedAt": null,
"stats": {
"plays": 64000
}
},
{
"videoId": "1WrrOJJ8-5g",
"url": "https://www.youtube.com/watch?v=1WrrOJJ8-5g",
"title": "High salaries for AI engineers: The talent war in AI",
"duration": null,
"channel": "Lex Fridman",
"publishedAt": null,
"stats": {
"plays": 89000
}
}
],
"next_cursor": "eyJvIjoxMH0"
},
"usage": {
"credits_spent": 1,
"balance": 656,
"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
How do I get the transcript of one YouTube Short?
Send its URL (youtube.com/shorts/<id>) or the bare id to the transcript endpoint, exactly as for a normal video. Captions are read first and AI Fallback Transcription takes over when there are none; a Short is short, so it comes back inline.
How do I list every Short on a channel?
POST the channel to the channel endpoint with tab shorts and page with cursor until next_cursor is null. Each page costs 1 credit. The Videos tab does not include Shorts, which is why a Shorts-only creator looks empty without it.
Why are duration and publishedAt null on Shorts rows?
The Shorts listing YouTube serves carries neither, so the API returns null rather than a guess. Fetching a Short's transcript returns its real duration.
Can I be told when a channel posts a new Short?
Yes. Create a monitor on the channel with tab shorts. Each check reports the new Shorts by webhook or in the events list, optionally with their transcripts.