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
videocommenttranscriptchannelplaylist- 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.
| Mode | What comes back | Inputs | Billed as |
|---|---|---|---|
video | The detail of each video, channel upload or playlist entry. | videoUrls channelUrls playlistUrls videoDetail | video-detail |
channel | Each channel's profile, plus one record per video it lists. | channelUrls playlistUrls includeChannelAbout | channel-detail video |
comments | One record per comment, with replies if you ask for them. | videoUrls channelUrls includeReplies commentSort | comment |
transcript | The transcript of each video, with timestamped segments. With | videoUrls channelUrls languages allowGenerated allowTranslation includeSegments | transcript |
search | One record per video, channel or playlist that matches each query. | searchQueries searchType searchUploadDate searchSort | search-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.
| Dataset | One record is | Fields | From, per 1,000 |
|---|---|---|---|
| Transcripts | One video's full caption transcript, optionally with detected sponsor-read segments. | 23 | $5.00 |
| Comments | One comment, or reply, posted on a YouTube video. | 23 | $1.80 |
| Channels | One 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();{ "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.
| Field | Type | What it holds | Present on |
|---|---|---|---|
videoId | string | YouTube's 11-character video ID. | All |
embedUrl | string | https://www.youtube.com/embed/<videoId> embed URL. | Only video-detail |
title | string | Video title. | All |
description | string | Full video description text, or null. | Only video-detail |
keywords | array | Array of the uploader's hidden tag keywords; empty when there are none. | Only video-detail |
category | string | Video category name from the player response, for example "Music"; null when absent. | Only video-detail |
lengthSeconds | integer | Video length in seconds, as an integer. | Only video-detail |
viewCount | integer | null | View count as an integer. | All |
likeCount | integer | Like count as an integer, exact when available; null when unavailable. | Only video-detail |
channelId | string | ID of the uploading channel. | All |
channelName | string | Uploading channel's display name. | All |
channelUrl | string | Full https URL of the uploading channel. | Only search-result, video-detail |
channelHandle | string | The uploading channel's @handle, or null when its channel URL carries none. | All |
publishDate | string | Original publish date, ISO 8601, null when unknown. | Only video-detail |
uploadDate | string | Date the video file was uploaded, ISO 8601, null when unknown; can differ from publishDate for a scheduled premiere. | Only video-detail |
isLive | boolean | True when the video is or was broadcast as a livestream. | Only search-result, video-detail |
isFamilySafe | boolean | True when the video is marked safe for all audiences, null when unknown. | Only video-detail |
isUnlisted | boolean | True when the video's visibility is set to unlisted, null when unknown. | Only video-detail |
isMembersOnly | boolean | True when the video is restricted to channel members; present when videoDetail is not "basic". | Only video-detail |
isShortsEligible | boolean | True when the video is eligible to appear as a Short, null when unknown. | Only video-detail |
isPrivate | boolean | True when the video is private. | Only video-detail |
hasPaidPromotion | boolean | True when the uploader marked the video as containing paid promotion, null when unknown. | Only video-detail |
availableCountries | integer | Number of countries the video is available in, or null when the count is unknown. | Only video-detail |
thumbnail | string | URL of the largest available thumbnail image. | All |
thumbnails | array | Array of {url, width, height} thumbnail image renditions. | Only video-detail |
playability | string | Player's playability status string, for example "OK" or "UNPLAYABLE", or null. | Only video-detail |
playabilityReason | string | Human-readable reason for the playability status, or null. | Only video-detail |
viewCountText | null | string | View count as YouTube's own display text, for example "108,853,431 views"; present when videoDetail is not "basic". | Only video-detail |
publishDateText | string | Publish date as YouTube's own display text, for example "Sep 5, 2026"; present when videoDetail is not "basic". | Only video-detail |
hashtags | array | Array of hashtag strings shown above the title; present when videoDetail is not "basic". | Only video-detail |
location | null | Place name linked above the title as a location search, or null; present when videoDetail is not "basic". | Only video-detail |
series | null | {title, playlistId} of the playlist the video's super-title links to, or null; present when videoDetail is not "basic". | Only video-detail |
descriptionLinks | array | Array of {text, url} links parsed from the description; present when videoDetail is not "basic". | Only video-detail |
channelSubscriberCount | integer | Subscriber count shown on the watch page, as an integer; present when videoDetail is not "basic". | Only video-detail |
channelIsVerified | boolean | True when the uploading channel has YouTube's verified badge (search and full-detail records). | Only search-result, video-detail |
chapters | array | Array of {title, startSeconds} chapter markers; empty when the video has none; present when videoDetail is not "basic". | Only video-detail |
relatedVideoIds | array | Up to 20 video IDs shown in the related-videos sidebar; present when videoDetail is not "basic". | Only video-detail |
commentCount | integer | null | Total comment count as an integer, exact when available; present when videoDetail is not "basic"; null if unknown. | Only video-detail |
hasCommentsDisabled | boolean | True when the video's comment section is turned off; present when videoDetail is not "basic". | Only video-detail |
publishedTimeText | string | Relative upload time as YouTube's own display text, for example "3 weeks ago" (channel and search cards). | Only search-result, video |
durationSeconds | integer | Video length in seconds parsed from the duration badge; null when it can't be read. | Only search-result, video |
isShort | boolean | True when the card is a YouTube Shorts video. | Only search-result, video |
channelThumbnail | string | URL of the channel's avatar image on a search card, or null (search-result records only). | Only search-result |
richThumbnail | string | URL of the animated hover-preview thumbnail on a search card, or null (search-result records only). | Only search-result |
descriptionSnippet | string | Short description excerpt shown on a search card, or null (search-result records only). | Only search-result |
badges | array | Label strings shown on a search card, such as "CC", "4K" or "Fundraiser" (search-result records only). | Only search-result |
isNew | boolean | True when the search card shows a "New" badge (search-result records only). | Only search-result |
rank | integer | 1-based position of the video within its search results page (search-result records only). | Only search-result |
searchQuery | string | The search query string that produced this record (search-result records only). | Only search-result |
estimatedResults | integer | Total result count the search page reports for the query, as an integer (search-result records only). | Only search-result |
page | integer | 1-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.
| Field | Type | What it holds | Present on |
|---|---|---|---|
title | string | Playlist title. | All |
playlistId | string | Playlist's ID. | All |
videoCount | null | Number of videos in the playlist, as an integer, or null when the search card shows no count. | All |
searchQuery | string | The search query string that produced this record. | All |
estimatedResults | integer | Total result count the search page reports for the query, as an integer. | All |
page | integer | 1-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.
| Event | Per 1,000 records | Per 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/youtubereturns up to 500 records in one response. Ask for more and it answers413; send the same body toPOST /jobs/youtubeinstead.- A request without
maxItemsreturns up to 100 records. - Your key's rate limit and quotas apply to every source.