YouTube video data API

Open videos, channels and playlists, read comment threads, pull transcripts in the language you want, or run a YouTube search. Each item comes back as one record.

Record types
video comment transcript channel playlist
Fields
102
From
$1.80 per 1,000 records

What you can request

Set mode in the request body to choose what comes back; without it the request runs as video. Each mode reads the inputs listed next to it.

ModeWhat comes backInputsBilled as
videoThe detail of each video, channel upload or playlist entry.videoUrls channelUrls playlistUrls videoDetailvideo-detail
channelEach channel's profile, plus one record per video it lists.channelUrls playlistUrls includeChannelAboutchannel-detail video
commentsOne record per comment, with replies if you ask for them.videoUrls channelUrls includeReplies commentSortcomment
transcriptThe transcript of each video, with timestamped segments.

With detectSponsors: true, sponsor segments are marked and the record is billed as transcript-sponsor.

videoUrls channelUrls languages allowGenerated allowTranslation includeSegmentstranscript
searchOne record per video, channel or playlist that matches each query.searchQueries searchType searchUploadDate searchSortsearch-result

Every request also takes maxItems (records for the whole request) and maxItemsPerInput (records per search, URL or name).

Datasets

These YouTube record types have their own page, with their own example record, fields, options and prices.

DatasetOne record isFieldsFrom, per 1,000
TranscriptsOne video's full caption transcript, optionally with detected sponsor-read segments.23$5.00
CommentsOne comment, or reply, posted on a YouTube video.23$1.80
ChannelsOne YouTube channel's profile: its identity, stats and about-page details.21$3.60

Example request and record

The request below is the one this example record answers. The names, usernames, photos and contact details of people in it are fictional. Long values in the record are shortened.

curl

curl -X POST https://api.urakimon.com/records/youtube \
  -H "x-api-key: $URAKIMON_API_KEY" \
  -H "content-type: application/json" \
  -d '{
    "mode": "video",
    "videoUrls": ["gTKS8SAwUzE", "Qtl8lJwbd4g", "Af6i6ChAVTw"],
    "videoDetail": "full"
  }'

Python

import os
import requests

res = requests.post(
    "https://api.urakimon.com/records/youtube",
    headers={"x-api-key": os.environ["URAKIMON_API_KEY"]},
    json={
        "mode": "video",
        "videoUrls": [
            "gTKS8SAwUzE",
            "Qtl8lJwbd4g",
            "Af6i6ChAVTw"
        ],
        "videoDetail": "full"
    },
)
res.raise_for_status()
records = res.json()["records"]

Node

const res = await fetch("https://api.urakimon.com/records/youtube", {
  method: "POST",
  headers: {
    "x-api-key": process.env.URAKIMON_API_KEY,
    "content-type": "application/json",
  },
  body: JSON.stringify({
    "mode": "video",
    "videoUrls": ["gTKS8SAwUzE", "Qtl8lJwbd4g", "Af6i6ChAVTw"],
    "videoDetail": "full"
  }),
});
const { records } = await res.json();
Example YouTube recordDownload
{  "source": "youtube",  "type": "video",  "videoId": "gTKS8SAwUzE",  "url": "https://www.youtube.com/watch?v=gTKS8SAwUzE",  "embedUrl": "https://www.youtube.com/embed/gTKS8SAwUzE",  "title": "I Survived The Most Extreme Places On Earth",  "description": "We raced through some of the most extreme places on Earth to see who could make it to the finish line first! Gemini helped us plan, probl…",  "keywords": [],  "category": "Entertainment",  "lengthSeconds": 1407,  "viewCount": 108853431,  "likeCount": 1413611,  "channelId": "UCexample100000000000000",  "channelName": "Jordan Example",  "channelUrl": "https://www.youtube.com/@example_user_1",  "channelHandle": "@example_user_1",  "publishDate": "2026-09-05T09:00:01-07:00",  "uploadDate": "2026-09-05T09:00:01-07:00",  "isLive": false,  "isFamilySafe": true,  "isUnlisted": false,  "isMembersOnly": false,  "isShortsEligible": false,  "isPrivate": false,  "hasPaidPromotion": false,  "availableCountries": 249,  "thumbnail": "https://i.ytimg.com/vi_webp/gTKS8SAwUzE/maxresdefault.webp",  "thumbnails": [    {      "url": "https://i.ytimg.com/vi/gTKS8SAwUzE/hqdefault.jpg?sqp=-oaymwEmCKgBEF5IWvKriqkDGQgBFQAAiEIYAdgBAeIBCggYEAIYBjgBQAE=&rs=AOn4CLApqY0PG8E29IfD…",      "width": 168,      "height": 94    },    {      "url": "https://i.ytimg.com/vi/gTKS8SAwUzE/hqdefault.jpg?sqp=-oaymwEmCMQBEG5IWvKriqkDGQgBFQAAiEIYAdgBAeIBCggYEAIYBjgBQAE=&rs=AOn4CLA5z6hOJU3f9pqm…",      "width": 196,      "height": 110    },    {      "url": "https://i.ytimg.com/vi/gTKS8SAwUzE/hqdefault.jpg?sqp=-oaymwEnCPYBEIoBSFryq4qpAxkIARUAAIhCGAHYAQHiAQoIGBACGAY4AUAB&rs=AOn4CLCvtOzTKaSM1jhJ…",      "width": 246,      "height": 138    }  ],  "playability": "UNPLAYABLE",  "playabilityReason": "Video unavailable",  "viewCountText": "108,853,431 views",  "publishDateText": "Sep 5, 2026",  "hashtags": [],  "location": null,  "series": null,  "descriptionLinks": [    {      "text": "https://gemini.google.com/app/downloa...",      "url": "https://gemini.google.com/app/download/mobile?android-min-version=301356232&ios-min-version=322.0&is_sa=1&pt=9008&mt=8&utm_medium=paid&ut…"    },    {      "text": "https://www.amazon.com/stores/page/79...",      "url": "https://www.amazon.com/stores/page/795E1A4C-4A12-42DD-AC74-D8C3FBD9C30E?channel=Video-QR"    },    {      "text": "/ @example_user_1",      "url": "https://www.youtube.com/channel/UCexample100000000000000"    }  ],  "channelSubscriberCount": 516000000,  "channelIsVerified": true,  "chapters": [],  "relatedVideoIds": [    "U_LlX4t0A9I",    "cr642ejN_60",    "_L1Rim7-IPo"  ],  "id": "gTKS8SAwUzE",  "event": "video-detail",  "collectedAt": "2026-09-20T19:39:23.563Z"}

Fields

Every record starts with the same envelope: source, type, event, id, url, collectedAt. What the envelope means. The tables below list the fields after it, read from real YouTube records. Where a field does not apply to an item it is null or an empty list, not left out. "Present on" names the billed events a field comes with when it is not on every record of that type.

video records

One YouTube video, either as a lightweight listing/search card or the full watch-page detail. Billed as search-result or video or video-detail.

51 fields on video records, besides the envelope
FieldTypeWhat it holdsPresent on
videoIdstringYouTube's 11-character video ID.All
embedUrlstringhttps://www.youtube.com/embed/<videoId> embed URL.Only video-detail
titlestringVideo title.All
descriptionstringFull video description text, or null.Only video-detail
keywordsarrayArray of the uploader's hidden tag keywords; empty when there are none.Only video-detail
categorystringVideo category name from the player response, for example "Music"; null when absent.Only video-detail
lengthSecondsintegerVideo length in seconds, as an integer.Only video-detail
viewCountinteger | nullView count as an integer.All
likeCountintegerLike count as an integer, exact when available; null when unavailable.Only video-detail
channelIdstringID of the uploading channel.All
channelNamestringUploading channel's display name.All
channelUrlstringFull https URL of the uploading channel.Only search-result, video-detail
channelHandlestringThe uploading channel's @handle, or null when its channel URL carries none.All
publishDatestringOriginal publish date, ISO 8601, null when unknown.Only video-detail
uploadDatestringDate the video file was uploaded, ISO 8601, null when unknown; can differ from publishDate for a scheduled premiere.Only video-detail
isLivebooleanTrue when the video is or was broadcast as a livestream.Only search-result, video-detail
isFamilySafebooleanTrue when the video is marked safe for all audiences, null when unknown.Only video-detail
isUnlistedbooleanTrue when the video's visibility is set to unlisted, null when unknown.Only video-detail
isMembersOnlybooleanTrue when the video is restricted to channel members; present when videoDetail is not "basic".Only video-detail
isShortsEligiblebooleanTrue when the video is eligible to appear as a Short, null when unknown.Only video-detail
isPrivatebooleanTrue when the video is private.Only video-detail
hasPaidPromotionbooleanTrue when the uploader marked the video as containing paid promotion, null when unknown.Only video-detail
availableCountriesintegerNumber of countries the video is available in, or null when the count is unknown.Only video-detail
thumbnailstringURL of the largest available thumbnail image.All
thumbnailsarrayArray of {url, width, height} thumbnail image renditions.Only video-detail
playabilitystringPlayer's playability status string, for example "OK" or "UNPLAYABLE", or null.Only video-detail
playabilityReasonstringHuman-readable reason for the playability status, or null.Only video-detail
viewCountTextnull | stringView count as YouTube's own display text, for example "108,853,431 views"; present when videoDetail is not "basic".Only video-detail
publishDateTextstringPublish date as YouTube's own display text, for example "Sep 5, 2026"; present when videoDetail is not "basic".Only video-detail
hashtagsarrayArray of hashtag strings shown above the title; present when videoDetail is not "basic".Only video-detail
locationnullPlace name linked above the title as a location search, or null; present when videoDetail is not "basic".Only video-detail
seriesnull{title, playlistId} of the playlist the video's super-title links to, or null; present when videoDetail is not "basic".Only video-detail
descriptionLinksarrayArray of {text, url} links parsed from the description; present when videoDetail is not "basic".Only video-detail
channelSubscriberCountintegerSubscriber count shown on the watch page, as an integer; present when videoDetail is not "basic".Only video-detail
channelIsVerifiedbooleanTrue when the uploading channel has YouTube's verified badge (search and full-detail records).Only search-result, video-detail
chaptersarrayArray of {title, startSeconds} chapter markers; empty when the video has none; present when videoDetail is not "basic".Only video-detail
relatedVideoIdsarrayUp to 20 video IDs shown in the related-videos sidebar; present when videoDetail is not "basic".Only video-detail
commentCountinteger | nullTotal comment count as an integer, exact when available; present when videoDetail is not "basic"; null if unknown.Only video-detail
hasCommentsDisabledbooleanTrue when the video's comment section is turned off; present when videoDetail is not "basic".Only video-detail
publishedTimeTextstringRelative upload time as YouTube's own display text, for example "3 weeks ago" (channel and search cards).Only search-result, video
durationSecondsintegerVideo length in seconds parsed from the duration badge; null when it can't be read.Only search-result, video
isShortbooleanTrue when the card is a YouTube Shorts video.Only search-result, video
channelThumbnailstringURL of the channel's avatar image on a search card, or null (search-result records only).Only search-result
richThumbnailstringURL of the animated hover-preview thumbnail on a search card, or null (search-result records only).Only search-result
descriptionSnippetstringShort description excerpt shown on a search card, or null (search-result records only).Only search-result
badgesarrayLabel strings shown on a search card, such as "CC", "4K" or "Fundraiser" (search-result records only).Only search-result
isNewbooleanTrue when the search card shows a "New" badge (search-result records only).Only search-result
rankinteger1-based position of the video within its search results page (search-result records only).Only search-result
searchQuerystringThe search query string that produced this record (search-result records only).Only search-result
estimatedResultsintegerTotal result count the search page reports for the query, as an integer (search-result records only).Only search-result
pageinteger1-based search results page the record was found on (search-result records only).Only search-result

comment records

One comment, or reply, posted on a YouTube video. Billed as comment. 23 fields. YouTube comments: every field, an example record and the options

transcript records

One video's full caption transcript, optionally with detected sponsor-read segments. Billed as transcript or transcript-sponsor. 23 fields. YouTube transcripts: every field, an example record and the options

channel records

One YouTube channel's profile: its identity, stats and about-page details. Billed as channel-detail. 21 fields. YouTube channels: every field, an example record and the options

playlist records

One playlist hit in YouTube search results. Billed as search-result.

6 fields on playlist records, besides the envelope
FieldTypeWhat it holdsPresent on
titlestringPlaylist title.All
playlistIdstringPlaylist's ID.All
videoCountnullNumber of videos in the playlist, as an integer, or null when the search card shows no count.All
searchQuerystringThe search query string that produced this record.All
estimatedResultsintegerTotal result count the search page reports for the query, as an integer.All
pageinteger1-based search results page the record was found on.All

YouTube data pricing

You pay once for each record you receive, at the price of the event it carries. A request that returns nothing costs nothing.

EventPer 1,000 recordsPer record
comment$1.80$0.00180
channel-detail$3.60$0.00360
search-result$3.60$0.00360
video$3.60$0.00360
video-detail$3.60$0.00360
transcript$5.00$0.00500
transcript-sponsor$6.25$0.00625

Freshness and limits

  • Records are collected when you send the request. Each one carries collectedAt, the UTC time it was read.
  • POST /records/youtube returns up to 500 records in one response. Ask for more and it answers 413; send the same body to POST /jobs/youtube instead.
  • A request without maxItems returns up to 100 records.
  • Your key's rate limit and quotas apply to every source.

Next steps