YouTube Data APIはvideos.insertを通じて動画をアップロードしますが、それが自分のプロダクトにとって実用的かどうかを決める、文書化された2つの事実があります。2020年7月28日以降に作成された未認証のAPIプロジェクトからアップロードされた動画は、プロジェクトが審査に合格するまで非公開モードに制限されます。そしてvideos.insertは、他のAPIが共有する10,000ユニットのプールとは別の、1日100コールという独自のクォータバケットを消費します。
この2つを合わせて読めば、状況ははっきりします。審査なしでは公開できず、クォータ増枠なしでは頻繁に公開できません。
YouTube Data APIは何を公開でき、審査ゲートとは何か
videos.insertは動画ファイルをアップロードし、タイトル、説明、タグ、カテゴリ、そしてpublic、private、unlistedのいずれかのprivacyStatusを含むメタデータを設定します。文書化された最大ファイルサイズは256GBで、受け付けられるMIMEタイプはvideo/*とapplication/octet-streamです。
そのゲートが審査です。Googleのドキュメントは、2020年7月28日以降に作成された未認証のAPIプロジェクトからアップロードされた動画は、プロジェクトが審査を経るまで非公開モードに制限されると明記しています。実際には、開発中の統合は最初から最後まで動作し、実際の動画IDが生成されますが、その動画はチャンネル所有者以外の誰にも見えません。審査に合格することで初めてこの制限が解除され、privacyStatus: 'public'が有効になります。
注: ここに記載の数値は、2026年9月時点でdevelopers.google.com/youtubeに基づいて確認したものです。プラットフォームは予告なくこれらを変更することがあります。
| 質問 | ドキュメントの回答 |
|---|---|
| アップロードエンドポイント | POST https://www.googleapis.com/upload/youtube/v3/videos |
| スコープ | youtube.upload、youtube、youtubepartner、youtube.force-ssl |
| 最大ファイルサイズ | 256GB |
| MIMEタイプ | video/*、application/octet-stream |
| プライバシー値 | public、private、unlisted |
| 未認証プロジェクト | 審査を受けるまでアップロードは非公開に制限 |
認証モデルはどのようなもので、審査にはどのくらいかかるか
標準的なOAuth 2.0とオフラインアクセスです。チャンネル所有者をGoogleの同意画面にリダイレクトしてhttps://www.googleapis.com/auth/youtube.uploadをリクエストし、コードをアクセストークンとリフレッシュトークンに交換し、期限が切れるたびにアクセストークンを更新します。
アップロードスコープはセンシティブスコープであるため、あなたのプロジェクトはYouTube API審査に加えてGoogleのOAuth検証も通過する必要があります。これらは別々の2つの審査であり、人々はよく混同します。OAuth検証は同意画面と、それを許可できるユーザー数を管理するもので、YouTube審査はあなたのアップロードが非公開以外になれるかどうかを管理するものです。
YouTube API審査の公開されたターンアラウンド期間は公式ドキュメントに見当たらなかったため、こちらでは特定の期間を明言しません。日単位ではなく週単位と見積もり、必要になる前に開始してください。
実際のアップロード手順はどうなっているか
アップロードはレジューム可能です。アップロードセッションを開いてから、バイトをそのセッションURIに送信します。動画はリクエスト完了後、YouTube側で非同期に処理されます。
- レジューム可能セッションを開く。 アップロードエンドポイントに、動画のメタデータをJSONとして、
uploadType=resumableを付けてPOSTします。レスポンスのLocationヘッダーにセッションURIが返されます。なおuploadType=resumableとLocationセッションURIは、YouTube固有のアップロードページが文書化しているものではなく、Googleの一般的なレジューム可能アップロードの仕組みです。YouTube固有のページはPythonクライアントライブラリしか示していません。 - そのセッションURIにバイトをPUTする。 1回のリクエストでも、チャンクに分けてでも構いません。チャンク分割により、ネットワーク障害後に大きなファイルを最初からやり直すのではなく再開できます。
- 最終レスポンスから動画IDを読み取る。 これでアップロードは完了です。
- 処理状況をポーリングする。 YouTubeは非同期でトランスコードします。動画IDは動画が視聴可能になる前から存在し、アップロード成功後に処理が失敗することもあります。
# 1. open the resumable session
curl -X POST \
"https://www.googleapis.com/upload/youtube/v3/videos?uploadType=resumable&part=snippet,status" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-H "X-Upload-Content-Type: video/mp4" \
-d '{"snippet":{"title":"Release notes","categoryId":"28"},
"status":{"privacyStatus":"private"}}' -D -
# 2. PUT the bytes to the Location URI returned above
curl -X PUT "$SESSION_URI" \
-H "Content-Type: video/mp4" --data-binary @video.mp4
# 3. then poll videos.list for processing status using the returned video id
Google自身のアップロードガイドは、resumable=Trueと再試行時の指数バックオフを組み合わせたMediaFileUploadを中心にしたPythonのサンプルで、サンプルスクリプトはエラーハンドリングを一切行わないと明言しています。それを額面通りに受け取ってください。このサンプルは出発点であって、本番用のテンプレートではありません。
注: ここに記載の数値は、2026年9月時点でdevelopers.google.com/youtubeに基づいて確認したものです。プラットフォームは予告なくこれらを変更することがあります。
アップロードはクォータ上いくらかかるか
これはほとんどのYouTube統合計画を終わらせる数字なので、正確に述べる価値があります。
| メソッド | クォータコスト |
|---|---|
videos.insert | 1ユニット。1日100コールの専用バケットに対して |
videos.list | 1ユニット |
thumbnails.set | 50ユニット |
videos.update | 50ユニット |
Googleの表現によるデフォルトの割り当ては「search.listコール100回、videos.insertコール100回、そして他のすべてのエンドポイントを合わせて1日10,000ユニット」です。
したがって公開における制約はユニットの計算ではなく回数です。プロジェクトあたり1日100アップロード。10,000ユニットのプールは別枠で、それらのアップロードの周りにあるステータスポーリング、メタデータ読み取り、サムネイル設定をすべてカバーする必要があり、比較すると余裕があります。クォータは太平洋時間の深夜にリセットされます。一握り以上のチャンネルにサービスを提供するマルチテナント型プロダクトは、Googleへの別途申請となるクォータ増枠リクエストが必要です。
古いガイド(そして今も生きているものもあります)には、videos.insertは共有された10,000ユニットプールに対して1,600ユニットかかると書かれており、これは1日6アップロードに相当していました。これはもうGoogleのクォータドキュメントが述べていることではないので、これに基づいて組んだ予算があれば確認する価値があります。
注: ここに記載の数値は、2026年9月時点でdevelopers.google.com/youtubeに基づいて確認したものです。プラットフォームは予告なくこれらを変更することがあります。
実際に3週間を費やすことになるもの
- 審査は1つではなく2つ。 センシティブなアップロードスコープのためのOAuth検証と、非公開アップロード制限を解除するYouTube API審査です。どちらもターンアラウンド期間を公開しておらず、どちらもローンチをブロックします。
- クォータと、それを引き上げるためのリクエスト。 プロジェクトあたり1日100アップロードは、数十を超えるチャンネルに公開する段階になると本番運用の予算ではなくなります。増枠リクエストはフォームであり、正当化理由であり、待機です。
- Googleに到達する前のトランスコード。 任意のユーザー動画を受け入れるということは、コンテナとコーデックを正規化し、サムネイルを生成し、256GBをメモリにバッファすることなくストリームできる場所にファイルを保持することを意味します。
- アップロード成功後の非同期の失敗。 これが人々を最も驚かせる点です。200と動画IDが返るのはバイトが届いたことを意味するだけで、動画が公開されていることを意味しません。処理はその後失敗することがあり、拒否されたアップロードはHTTPエラーとしてではなく処理ステータスとして表面化します。ポーラー、
processingという投稿状態、そしてAPI呼び出し成功の1時間後にユーザーへ動画が失敗したことを伝える方法が必要です。
同じ縦型動画を他のネットワークにも展開する予定なら、その作業の形はInstagram ReelsからYouTube ShortsへのクロスポストとTikTok、Reels、Shortsに一度に投稿するで扱っています。それぞれのプラットフォームに独自の審査、独自のクォータモデル、独自の非同期失敗モードがあるのがポイントです。
まとめ
videos.insertはhttps://www.googleapis.com/upload/youtube/v3/videosにアップロードし、最大256GB、スコープはyoutube.upload。- 2020年7月28日以降に作成された未認証プロジェクトは、審査されるまで非公開動画しかアップロードできない。
- フローは:レジューム可能セッションを開く、バイトをPUTする、そしてポーリングする。処理は非同期で、アップロード成功後に失敗することもあるため。
videos.insertは1日100コールの専用バケットに対して1ユニットかかる。それ以外の全ては別枠の1日10,000ユニットでカバーされる。- 審査のターンアラウンド期間は公開されていない。必要になる前にレビューを開始すること。
各プラットフォームごとに繰り返すのではなく、一度で済ませる
上記のYouTubeの作業は現実のものであり、そのどれも次のプラットフォームには引き継がれません。Pinterestには別の審査があり、TikTokには独自のContent Posting API審査があり、それぞれ別々のメディアパイプラインを持っています。この繰り返しこそ、私たちのAPIが取り除くものです。BulkPublishは15のプラットフォームに1つのREST エンドポイントから公開し、OAuth、トークンの更新、メディア処理、非同期のステータス追跡はこちら側で処理します。投稿状態にprocessingとpartialが含まれているのは、まさに200が公開を意味しないからです。
開発者向けドキュメントにはエンドポイントの一覧があり、REST API連携ページでは認証と投稿のライフサイクルを扱っています。統合ではなくスケジューリングだけが必要なら、YouTube動画のスケジュール方法がそれを扱っており、無料のYouTube文字数カウンターでタイトルと説明が制限内に収まっているか確認できます。