Hypereal AIHypereal AI
Video StudioVideo AgentMedia APICoding LLMsMCP
動画 APISeedance 2.0KlingVeo 3.1Gemini Omni VideoHappyHorse 1.0全モデル →
画像 APIGPT Image 2Nano BananaFLUXMidjourney Alternative全モデル →
LLM APIClaude OpusClaude SonnetClaude FableGPT-5.5GPT-5.5 ProGemini 3 ProGemini 3.5 FastGemini 3.5 ThinkingDeepSeek全モデル →
料金
API ReferenceCookbook
エンタープライズAffiliate会社概要更新履歴お問い合わせ

料金

記事一覧に戻る
APITutorialVideo

YouTube Data API:開発者向け完全ガイド (2026)

YouTube コンテンツをプログラムで検索、一覧表示、および管理する方法

Hypereal AI TeamHypereal AI Team
12 min read
2026年2月6日
100以上のAIモデル、1つのAPI

Hyperealで構築を始めよう

Kling、Flux、Sora、Veoなどに単一のAPIでアクセス。無料クレジットで開始、数百万規模まで拡張可能。

無料APIキーを取得ドキュメントを見る

クレジットカード不要 • 10万人以上の開発者 • エンタープライズ対応

YouTube Data API: 開発者完全ガイド (2026年版)

YouTube Data API v3を使用すると、YouTubeの機能をアプリケーションに統合できます。動画の検索、チャンネル情報の取得、プレイリストの管理、コメントの読み取りなどを、すべてプログラムから実行可能です。

このガイドでは、APIアクセスの設定から、最初のリクエスト送信、実践的なコード例を用いた一般的な機能の構築まで、開始に必要なすべてを網羅しています。

はじめに

ステップ 1: Google Cloud プロジェクトの作成

  1. console.cloud.google.com にアクセスします。
  2. 新しいプロジェクトを作成する(または既存のプロジェクトを選択する)
  3. API とサービス > ライブラリ へ移動します。
  4. 「YouTube Data API v3」を検索し、有効にします。

ステップ 2: API 認証情報の作成

ユースケースに応じて2つのオプションがあります:

認証情報の種類 ユースケース アクセス権限
API キー 公開データ(検索、動画詳細) 読み取り専用、ユーザー認証なし
OAuth 2.0 ユーザーデータ(プレイリスト、登録チャンネル、アップロード) ユーザーの同意を得た読み取り/書き込み

API キーの場合:

  1. API とサービス > 認証情報 へ移動します。
  2. 認証情報を作成 > API キー をクリックします。
  3. (任意)キーの使用を YouTube Data API に制限します。

OAuth 2.0 の場合:

  1. API とサービス > 認証情報 へ移動します。
  2. 認証情報を作成 > OAuth クライアント ID をクリックします。
  3. 同意画面を設定します。
  4. アプリケーションの種類(ウェブ、デスクトップなど)を選択します。
  5. クライアント 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

クォータ最適化のヒント

  1. 検索の呼び出しを最小限にする -- search.list は 100 ユニット消費します。結果をキャッシュしましょう。
  2. 動画 ID をバッチ処理する -- videos.list は1回のリクエストで最大50個の ID を受け取れます。
  3. 必要な Part のみリクエストする -- 各 part がコストに加算されます。
  4. fields パラメータを使用する -- レスポンスのサイズを削減します(クォータは直接減りませんが、リクエストが高速化されます)。
# 効率的: 複数の動画をまとめてリクエスト
request = youtube.videos().list(
    part="statistics",  # 必要なデータのみ指定
    id="id1,id2,id3,id4,id5",  # 最大50件まで一括指定
    fields="items(id,statistics/viewCount)"  # 必要なフィールドのみ取得
)

クォータ上限引き上げの申請

1日 10,000 ユニットで不足する場合:

  1. Google Cloud Console > API とサービス > YouTube Data API v3 へ移動します。
  2. クォータ をクリックし、クォータ増加をリクエスト を選択します。
  3. ユースケースを説明するフォームに記入します。
  4. 通常、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 を提供しています。

関連記事

GLM-4.6 API の使い方:開発者向け完全ガイド (2026年版)

11 min read

GLM-4.7 API の使い方:開発者ガイド (2026)

12 min read

Runway API の使い方:料金、機能、および統合ガイド

5 min read

On this page

  • YouTube Data API: 開発者完全ガイド (2026年版)
  • はじめに
  • ステップ 1: Google Cloud プロジェクトの作成
  • ステップ 2: API 認証情報の作成
  • ステップ 3: クライアント ライブラリのインストール
  • API キーによる認証(公開データ)
  • Python
  • JavaScript (Node.js)
  • 動画の検索
  • 基本的な検索
  • JavaScript 版
  • 検索パラメータ
  • 動画詳細の取得
  • 利用可能な Part
  • チャンネル情報の取得
  • プレイリストの操作
  • チャンネルのプレイリスト一覧を取得
  • プレイリスト内の全動画を取得
  • コメントの読み取り
  • ページネーション
  • クォータ管理
  • 操作別のクォータコスト
  • クォータ最適化のヒント
  • クォータ上限引き上げの申請
  • エラーハンドリング
  • 一般的なユースケース
  • 動画ダッシュボードの構築
  • 動画パフォーマンスの時間経過による追跡
  • レート制限とベストプラクティス
  • 結論
Desktop agent

Download Hypereal Agent

Run a local AI media workspace for image generation, video prompts, model selection, credit tracking, and saved artifacts.

MacWindows
v0.1.2Requires a hypereal.cloud API keyRelease manifest
Hypereal Agent desktop app screenshot

今日から構築を開始

今すぐ構築を開始
LogoHypereal AI
全システム正常
LLM API
  • Hypereal SDK
  • MCP Server
  • Enterprise API
  • All LLM Models
  • Claude Fable 5
  • Claude Opus 4.7
  • Claude Sonnet 4.6
  • GPT-5.5
  • Claude Haiku 4.5
  • GPT-5.5 Pro
  • Gemini 3.1 Pro Preview
  • Gemini 3.5 Thinking
  • Gemini 3.5 Fast
  • DeepSeek V4 Pro
  • Kimi K2.6
  • GLM 5.2
  • Claude API in China
  • OpenAI API in China
AI API
  • AI API Overview
  • Seedance 2.0 API
  • Kling 3.0 API
  • Veo 3.1 API
  • FLUX API
  • GPT Image 2 API
  • vs WaveSpeed
  • vs fal.ai
  • vs Replicate
  • vs KIE.ai
  • vs OpenRouter
  • vs Together AI
  • vs SiliconFlow
  • Midjourney Alternative
  • Higgsfield Alternative
  • OpenRouter Alternative
動画モデル
  • Google Veo 3.1 API
  • Kling 3.0 API
  • Kling O3 Pro API
  • Seedance 2.0 API
  • HappyHorse 1.0 API
  • WAN 2.7 API
  • WAN Video API
  • Grok Video API
  • Hunyuan Video API
  • PixVerse V6 API
  • Pika Video API
  • Luma Dream Machine API
  • MiniMax Video API
  • Vidu Video API
  • Gemini Omni Video API
画像モデル
  • NanoBanana 2 API
  • FLUX 2 API
  • GPT Image 1 API
  • Grok Image API
  • SeeDream V5 API
  • Imagen 4 API
  • Ideogram API
  • Recraft API
  • DALL-E 3 API
  • Stable Diffusion API
  • Gemini Image API
ツール
  • Face Swap API
  • Video Face Swap API
  • Virtual Try-On API
  • AI Talking Avatar API
  • Lip Sync API
  • OmniHuman Avatar API
  • Tripo3D H3.1 API
  • ElevenLabs TTS API
  • Fish Audio TTS API
  • Whisper STT API
  • Lyria Music API
ジェネレーター
  • Video Agent
  • AI画像ジェネレーター
  • AI動画ジェネレーター
コレクション
  • ベスト動画モデル
  • ベスト画像モデル
  • Seedance 2.0
  • WAN 2.7
  • Qwen Image 2
  • Grok AI
  • Seedance 1.5
  • モーションコントロール
  • コンテンツ検出
  • オブジェクト検出
会社情報
  • 会社概要
  • ドキュメント
  • Hypereal SDK
  • Cookbook
  • 更新履歴
  • ブログ
  • お問い合わせ
  • よくある質問
  • ロードマップ
  • エンタープライズ
  • アフィリエイトプログラム
  • Be a Creator
  • 開発者プログラム
法的情報
  • プライバシーポリシー
  • 利用規約
  • 返金ポリシー
  • Cookieポリシー
  • 料金
  • 全モデル
  • サイトマップ
  • Status
© 著作権 2026。全著作権所有。
TwitterGitHubLinkedInYouTubeEmail