YouTube Data API:開発者向け完全ガイド (2026)
YouTube コンテンツをプログラムで検索、一覧表示、および管理する方法
Hyperealで構築を始めよう
Kling、Flux、Sora、Veoなどに単一のAPIでアクセス。無料クレジットで開始、数百万規模まで拡張可能。
クレジットカード不要 • 10万人以上の開発者 • エンタープライズ対応
YouTube Data API: 開発者完全ガイド (2026年版)
YouTube Data API v3を使用すると、YouTubeの機能をアプリケーションに統合できます。動画の検索、チャンネル情報の取得、プレイリストの管理、コメントの読み取りなどを、すべてプログラムから実行可能です。
このガイドでは、APIアクセスの設定から、最初のリクエスト送信、実践的なコード例を用いた一般的な機能の構築まで、開始に必要なすべてを網羅しています。
はじめに
ステップ 1: Google Cloud プロジェクトの作成
- console.cloud.google.com にアクセスします。
- 新しいプロジェクトを作成する(または既存のプロジェクトを選択する)
- API とサービス > ライブラリ へ移動します。
- 「YouTube Data API v3」を検索し、有効にします。
ステップ 2: API 認証情報の作成
ユースケースに応じて2つのオプションがあります:
| 認証情報の種類 | ユースケース | アクセス権限 |
|---|---|---|
| API キー | 公開データ(検索、動画詳細) | 読み取り専用、ユーザー認証なし |
| OAuth 2.0 | ユーザーデータ(プレイリスト、登録チャンネル、アップロード) | ユーザーの同意を得た読み取り/書き込み |
API キーの場合:
- API とサービス > 認証情報 へ移動します。
- 認証情報を作成 > API キー をクリックします。
- (任意)キーの使用を YouTube Data API に制限します。
OAuth 2.0 の場合:
- API とサービス > 認証情報 へ移動します。
- 認証情報を作成 > OAuth クライアント ID をクリックします。
- 同意画面を設定します。
- アプリケーションの種類(ウェブ、デスクトップなど)を選択します。
- クライアント ID とクライアント シークレットを控えておきます。
ステップ 3: クライアント ライブラリのインストール
# Python
pip install google-api-python-client google-auth-oauthlib
# Node.js
npm install googleapis
# Go
go get google.golang.org/api/youtube/v3
API キーによる認証(公開データ)
動画の検索やチャンネル情報の取得など、公開データの読み取りには API キーで十分です。
Python
from googleapiclient.discovery import build
API_KEY = "YOUR_API_KEY"
youtube = build("youtube", "v3", developerKey=API_KEY)
JavaScript (Node.js)
import { google } from "googleapis";
const youtube = google.youtube({
version: "v3",
auth: "YOUR_API_KEY",
});
動画の検索
search.list エンドポイントは最も頻繁に使用されます。キーワード、チャンネル、場所などによる検索をサポートしています。
基本的な検索
def search_videos(query, max_results=10):
request = youtube.search().list(
part="snippet",
q=query,
type="video",
maxResults=max_results,
order="relevance"
)
response = request.execute()
videos = []
for item in response["items"]:
videos.append({
"title": item["snippet"]["title"],
"videoId": item["id"]["videoId"],
"channel": item["snippet"]["channelTitle"],
"published": item["snippet"]["publishedAt"],
"thumbnail": item["snippet"]["thumbnails"]["high"]["url"],
})
return videos
# 使用例
results = search_videos("python tutorial 2026")
for video in results:
print(f"{video['title']} - https://youtube.com/watch?v={video['videoId']}")
JavaScript 版
async function searchVideos(query, maxResults = 10) {
const response = await youtube.search.list({
part: "snippet",
q: query,
type: "video",
maxResults: maxResults,
order: "relevance",
});
return response.data.items.map((item) => ({
title: item.snippet.title,
videoId: item.id.videoId,
channel: item.snippet.channelTitle,
published: item.snippet.publishedAt,
thumbnail: item.snippet.thumbnails.high.url,
}));
}
const results = await searchVideos("javascript tutorial 2026");
検索パラメータ
| パラメータ | 説明 | 例 |
|---|---|---|
q |
検索クエリ | "python machine learning" |
type |
リソースタイプ | "video", "channel", "playlist" |
order |
並び替え順 | "relevance", "date", "viewCount", "rating" |
maxResults |
1ページあたりの結果数 (1-50) | 25 |
publishedAfter |
日付によるフィルタリング | "2026-01-01T00:00:00Z" |
channelId |
チャンネル内検索 | "UCxxxxxxxx" |
videoDuration |
動画の長さによるフィルタリング | "short", "medium", "long" |
regionCode |
地域別の結果 | "US", "GB", "JP" |
relevanceLanguage |
言語の優先設定 | "en", "es" |
動画詳細の取得
videos.list エンドポイントは、特定の動画に関する詳細情報を提供します。
def get_video_details(video_ids):
"""1つまたは複数の動画の詳細情報を取得します。"""
request = youtube.videos().list(
part="snippet,statistics,contentDetails",
id=",".join(video_ids)
)
response = request.execute()
videos = []
for item in response["items"]:
videos.append({
"title": item["snippet"]["title"],
"description": item["snippet"]["description"],
"channel": item["snippet"]["channelTitle"],
"published": item["snippet"]["publishedAt"],
"duration": item["contentDetails"]["duration"],
"views": int(item["statistics"].get("viewCount", 0)),
"likes": int(item["statistics"].get("likeCount", 0)),
"comments": int(item["statistics"].get("commentCount", 0)),
"tags": item["snippet"].get("tags", []),
})
return videos
# 使用例
details = get_video_details(["dQw4w9WgXcQ"])
print(f"Views: {details[0]['views']:,}")
利用可能な Part
| Part | 含まれるデータ | クォータコスト |
|---|---|---|
snippet |
タイトル、説明、サムネイル、タグ | 2 |
statistics |
視聴回数、高評価数、コメント数 | 2 |
contentDetails |
動画の長さ、解像度、字幕の有無 | 2 |
status |
公開設定、ライセンス、埋め込み可否 | 2 |
player |
埋め込み用 HTML | 0 |
topicDetails |
トピックのカテゴリ | 2 |
チャンネル情報の取得
def get_channel_info(channel_id):
request = youtube.channels().list(
part="snippet,statistics,brandingSettings",
id=channel_id
)
response = request.execute()
if not response["items"]:
return None
channel = response["items"][0]
return {
"name": channel["snippet"]["title"],
"description": channel["snippet"]["description"],
"subscribers": int(channel["statistics"].get("subscriberCount", 0)),
"totalViews": int(channel["statistics"].get("viewCount", 0)),
"videoCount": int(channel["statistics"].get("videoCount", 0)),
"thumbnail": channel["snippet"]["thumbnails"]["high"]["url"],
"customUrl": channel["snippet"].get("customUrl", ""),
}
# 使用例
channel = get_channel_info("UC_x5XG1OV2P6uZZ5FSM9Ttw") # Google Developers
print(f"{channel['name']}: {channel['subscribers']:,} subscribers")
プレイリストの操作
チャンネルのプレイリスト一覧を取得
def get_channel_playlists(channel_id, max_results=25):
request = youtube.playlists().list(
part="snippet,contentDetails",
channelId=channel_id,
maxResults=max_results
)
response = request.execute()
return [{
"title": item["snippet"]["title"],
"playlistId": item["id"],
"videoCount": item["contentDetails"]["itemCount"],
"description": item["snippet"]["description"],
} for item in response["items"]]
プレイリスト内の全動画を取得
def get_playlist_videos(playlist_id):
videos = []
next_page_token = None
while True:
request = youtube.playlistItems().list(
part="snippet",
playlistId=playlist_id,
maxResults=50,
pageToken=next_page_token
)
response = request.execute()
for item in response["items"]:
videos.append({
"title": item["snippet"]["title"],
"videoId": item["snippet"]["resourceId"]["videoId"],
"position": item["snippet"]["position"],
})
next_page_token = response.get("nextPageToken")
if not next_page_token:
break
return videos
# 使用例: プレイリストからすべての動画を取得
videos = get_playlist_videos("PLRqwX-V7Uu6ZiZxtDDRCi6uhfTH4FilpH")
print(f"Found {len(videos)} videos in playlist")
コメントの読み取り
def get_video_comments(video_id, max_results=20):
request = youtube.commentThreads().list(
part="snippet",
videoId=video_id,
maxResults=max_results,
order="relevance",
textFormat="plainText"
)
response = request.execute()
comments = []
for item in response["items"]:
comment = item["snippet"]["topLevelComment"]["snippet"]
comments.append({
"author": comment["authorDisplayName"],
"text": comment["textDisplay"],
"likes": comment["likeCount"],
"published": comment["publishedAt"],
})
return comments
# 使用例
comments = get_video_comments("dQw4w9WgXcQ")
for c in comments[:5]:
print(f"{c['author']}: {c['text'][:100]}")
ページネーション
YouTube API のレスポンスはページ分割されています。追加のページを取得するには nextPageToken を使用します。
def search_all_videos(query, max_total=100):
"""自動ページネーション付きの検索。"""
all_results = []
next_page_token = None
while len(all_results) < max_total:
request = youtube.search().list(
part="snippet",
q=query,
type="video",
maxResults=min(50, max_total - len(all_results)),
pageToken=next_page_token
)
response = request.execute()
for item in response["items"]:
all_results.append({
"title": item["snippet"]["title"],
"videoId": item["id"]["videoId"],
})
next_page_token = response.get("nextPageToken")
if not next_page_token:
break
return all_results
クォータ管理
YouTube Data API はクォータ(割当量)制を採用しています。最初は 1日あたり 10,000 ユニット(無料枠)から開始します。
操作別のクォータコスト
| 操作 | クォータコスト |
|---|---|
search.list |
100 |
videos.list |
1 (partごと) |
channels.list |
1 (partごと) |
playlists.list |
1 (partごと) |
playlistItems.list |
1 (partごと) |
commentThreads.list |
1 |
videos.insert (アップロード) |
1,600 |
videos.update |
50 |
videos.delete |
50 |
クォータ最適化のヒント
- 検索の呼び出しを最小限にする --
search.listは 100 ユニット消費します。結果をキャッシュしましょう。 - 動画 ID をバッチ処理する --
videos.listは1回のリクエストで最大50個の ID を受け取れます。 - 必要な Part のみリクエストする -- 各
partがコストに加算されます。 fieldsパラメータを使用する -- レスポンスのサイズを削減します(クォータは直接減りませんが、リクエストが高速化されます)。
# 効率的: 複数の動画をまとめてリクエスト
request = youtube.videos().list(
part="statistics", # 必要なデータのみ指定
id="id1,id2,id3,id4,id5", # 最大50件まで一括指定
fields="items(id,statistics/viewCount)" # 必要なフィールドのみ取得
)
クォータ上限引き上げの申請
1日 10,000 ユニットで不足する場合:
- Google Cloud Console > API とサービス > YouTube Data API v3 へ移動します。
- クォータ をクリックし、クォータ増加をリクエスト を選択します。
- ユースケースを説明するフォームに記入します。
- 通常、Google から数営業日以内に回答があります。
エラーハンドリング
from googleapiclient.errors import HttpError
def safe_search(query):
try:
request = youtube.search().list(
part="snippet",
q=query,
type="video",
maxResults=10
)
return request.execute()
except HttpError as e:
status = e.resp.status
if status == 403:
error_reason = e.error_details[0]["reason"] if e.error_details else ""
if error_reason == "quotaExceeded":
print("Daily quota exceeded. Try again tomorrow.")
else:
print(f"Forbidden: {error_reason}")
elif status == 400:
print(f"Bad request: {e}")
elif status == 404:
print("Resource not found")
else:
print(f"HTTP {status}: {e}")
return None
一般的なユースケース
動画ダッシュボードの構築
def get_channel_dashboard(channel_id):
"""YouTube チャンネルの完全なダッシュボード情報を取得します。"""
# チャンネル情報を取得
channel = get_channel_info(channel_id)
# 最近のアップロード動画を取得 (uploads playlist = "UU" + channel_id[2:])
uploads_playlist_id = "UU" + channel_id[2:]
recent_videos = get_playlist_videos(uploads_playlist_id)[:10]
# 最近のアップロード動画の詳細を取得
video_ids = [v["videoId"] for v in recent_videos]
video_details = get_video_details(video_ids)
return {
"channel": channel,
"recentVideos": video_details,
"totalViews": sum(v["views"] for v in video_details),
"avgViews": sum(v["views"] for v in video_details) // len(video_details),
}
動画パフォーマンスの時間経過による追跡
import json
from datetime import datetime
def track_video_stats(video_id, output_file="stats.json"):
"""トレンド分析のために動画の統計情報を記録します。"""
details = get_video_details([video_id])[0]
entry = {
"timestamp": datetime.now().isoformat(),
"views": details["views"],
"likes": details["likes"],
"comments": details["comments"],
}
# JSON ファイルに追記
try:
with open(output_file, "r") as f:
data = json.load(f)
except FileNotFoundError:
data = []
data.append(entry)
with open(output_file, "w") as f:
json.dump(data, f, indent=2)
print(f"Recorded: {entry['views']:,} views, {entry['likes']:,} likes")
レート制限とベストプラクティス
| ベストプラクティス | 説明 |
|---|---|
| レスポンスをキャッシュする | 重複した API 呼び出しを避けるため、検索結果をローカルに保存する |
| ETag を使用する | 条件付きリクエストのために If-None-Match ヘッダーを含める |
| リクエストをまとめる | 複数の動画 ID を単一の videos.list 呼び出しに統合する |
| ページネーションを賢く扱う | 必要な場合のみ追加のページを取得する |
| クォータ使用状況を監視する | Google Cloud Console のクォータダッシュボードを毎日確認する |
| 変更には Webhook を使用する | リアルタイムの更新には YouTube Push Notifications を検討する |
結論
YouTube Data API は強力でドキュメントも充実していますが、クォータ管理が非常に重要です。キャッシュ、バッチ処理、および必要な Part の選択的なリクエストを通じて、API 呼び出しを最小限に抑えるようにアプリケーションを設計してください。
動画関連のアプリケーションを構築する開発者にとって、YouTube Data API は AI 動画生成ツールと非常に相性が良いです。Hypereal AI では、YouTube にアップロードしたり、アプリケーション内で YouTube コンテンツと一緒に使用したりできる、AI 動画、AI アバター、画像コンテンツを生成するための API を提供しています。
