booklista tech blog

booklista のエンジニアリングに関する情報を公開しています。

YouTube Data API の Quota 上限アップ申請で注意すべき 3 つのこと

アイキャッチ

株式会社ブックリスタ プロダクト開発部の酒井です。

去年の秋頃、推し活アプリ「Oshibana」の新機能として「YouTube ウィジェット」を開発しました。
YouTube ウィジェットでは、ユーザーが登録中の YouTube チャンネル一覧から選択したチャンネルの最新動画および配信情報をウィジェット上に表示できます。
自分が推している YouTuber やゲーム実況者、芸能人、アイドルなどの新着動画や Live 配信を見逃さずに視聴できるので、非常に便利です。
ぜひとも使ってみてください。

YouTubeウィジェット YouTubeウィジェット



概要

ユーザーが登録中の YouTube チャンネル一覧は 「YouTube Data API」 の「Subscriptions: list」を利用して取得しています。
しかし、YouTube Data API では 1 日の API 最大使用量(Quota)が決まっています。
Quota は単純に API を呼び出した回数ではなく、呼び出し回数にコストをかけた数値になります。
API ごとにかかるコストが決まっており、例えば YouTube チャンネルの情報を取得する「channels:list」は 1 コストかかり、YouTube 動画を検索する「search:list」は 100 コストかかります。
デフォルトは 10000 であるため、その日中に「search:list」が 100 回呼ばれたら、次の 101 回目以降はエラーとなり、データが取得できなくなります。
API 実行は全ユーザーのリクエストが合計してカウントされるため、ユーザーが多ければ例え 1 コストだったとしても Quota が 10000 では心許ない数値となります。
※特に Oshibana では iOS のウィジェット上から定期的に API を実行するので、すぐに上限を超えてしまいます。

公式ドキュメント

YouTube Data API の概要 - クォータの使用量
https://developers.google.com/youtube/v3/getting-started?hl=ja#quota

YouTube Data API (v3) - Quota Calculator
https://developers.google.com/youtube/v3/determine_quota_cost

上限を上げるためには、YouTube に申請し、アプリが問題無いものであるか審査を受けて承認される必要があります。
申請内容やアプリ自体に問題があると申請が却下(リジェクト)されてしまい、以降はメールで直接 YouTube とやり取りすることになります。
相手はアメリカの企業であるため、返信メールの文面は全て英語で記述する必要があります。
基本的には Google 翻訳や DeepL 翻訳で大体伝わる内容になると思いますが、翻訳ミスにより内容が正しく伝わらない可能性もあるので、念のため文面に問題がないかある程度は確認しておいた方が良いです。

この記事では、申請を承認してもらうための注意点をできる限りまとめていきますので、これから申請を送る方たちの参考になれば幸いです。

なお、本記事の対象は iOS アプリ(ネイティブアプリ)が前提となります。
Android アプリ、Web アプリは対処法が異なる可能性がありますので、ご注意ください。



前提

この記事では、Google Cloud Platform(GCP)にて以下の作業が完了していることを前提としています。

  • プロジェクトの作成
  • YouTube Data API の有効化、API キーの取得
  • OAuth 同意画面の設定
  • Google OAuth 認証制限の解除



申請方法

申請は以下のページから行います。

YouTube API サービス - 監査と割り当て増加フォーム
https://support.google.com/youtube/contact/yt_api_form

アプリの開発組織の情報、アプリ本体(API クライアント)の情報、利用ユーザー数、API の使用方法などの基本情報を入力し、割り当てリクエストフォームの欄にて、追加割り当て量(デフォルトの 10000 から増やしたい数)、追加したい理由、追加しないとアプリで使えなくなる機能などを入力し、送信ボタンをクリックすれば申請が行われます。

申請画面は日本語でも表示できますが、内容は英語で送った方が良いです。

上限を無制限にはできないので、追加割り当て量は必要量をしっかりと計算し、申請する必要があります。
例えば Oshibana では、申請時点での API リクエストの実測値(アクティブユーザー数、画面の表示数、ウィジェット配置数など)から今後の成長予測を行い、将来の API リクエスト数を割り出し、それにコストをかけた数値を追加割り当て量として申請しています。

追加理由や上限突破で使用不可になる機能についても細かく記述しました。
追加理由については、上記の追加割り当て量の算出方法も含めてしっかりと明記した方が伝わりやすいです。



注意すべき 3 つのこと

1.デモ動画の作り方

Quota 上限アップの申請後、YouTube から「Quota の上限増加申請の理由と申請内容の根拠、および追加した Quota がどのようにアプリで利用されるのかを英語で解説した動画を準備せよ」という内容のメールが届くことがあります。
おそらく申請フォームに入力された内容だけでは判断がつかないため、実際にアプリを操作して、どのように API が呼び出されているのか、なぜ多量のリクエストが発生するのかを解説して欲しいということだと思われます。

動画は iPhone の画面録画機能を使って撮影し、YouTube へ投稿後、字幕機能を使って英語の字幕を付けました。
公開設定は「限定公開」にしており、動画の URL を返信メールで伝えています。

Oshibana のデモ動画では以下の内容を撮影しました。

  • Google OAuth 認証の手順
  • YouTube ウィジェットの作成方法およびホーム画面への配置方法
    → この時、各画面やウィジェットで実行されている API の種類や実行頻度について字幕で解説しています。
  • YouTube ウィジェットの削除方法
  • Google OAuth 認証の解除手順

特に 以下の 2 つは重要なポイントであるため、字幕でも個別に解説を入れています。

API スコープについて

API スコープとは、GCP の OAuth 同意画面で登録する「OAuth 認証の際にアプリのユーザーに許可を求める権限の範囲設定」のことです。
YouTube Data API の Subscriptions:list は「機密性の高いスコープ」に該当するため、API スコープの登録が必要となります。

「.../auth/youtube」のスコープは登録や更新等、表示以外にできることが多くなるため、「YouTube API サービス利用規約」に引っかかってリジェクトされるリスクが高くなります。
よって、API の取得結果を表示するだけなら「.../auth/youtube.readonly」で登録するのがオススメです。

GCP APIスコープ

Oshibana のデモ動画では、Google OAuth 認証の際に表示される YouTube アクセス許可ページで YouTube API が readonly のスコープであることを確認する内容を撮影しています。

アラートのメッセージが「View your videos and playlists (動画とプレイリストの表示)」となっていれば、readonly のスコープで登録されています。

ここでスコープが readonly であることをアピールすれば、YouTube からポリシー違反を指摘されるリスクが減ります。

APIスコープ APIスコープ

別件ですが、OAuth 同意画面は英語で表示されている必要があるので、表示言語を「English(United States)」に変更し、言語を切り替えている様子も撮影する必要があります。

言語変更 言語変更

API の実行方法について

YouTube API サービス利用規約 では「ユーザーの認証と認可」に関する規約があり、認証における制約やトークンの失効に関する内容が定められています。
アプリが規約を満たしていると判断されなければ、リジェクトされてしまいます。

例えば Oshibana では、「Subscriptions: list」を実行するために Google アカウントで OAuth 認証し、トークンを発行しています。
このトークンが OAuth 認証の解除処理で失効され、API が実行できなくなっていることを示す必要があります。
よって、デモ動画で Google OAuth 認証の解除手順を撮影し、トークンが失効されたことで API が実行できなくなった旨を字幕で説明しています。

ただし、API 実行に OAuth 認証を使っていない場合はその限りではありません。
Oshibana では、ホームに配置した YouTube ウィジェット上で「PlaylistItems: list」「Videos: list」「Channels: list」の API を実行していますが、これらは「非機密スコープ」の API であるため、OAuth のトークンを必要とせず API キーで実行しています。
よって、ウィジェットは OAuth 認証の解除後も API を実行し続けますが、認証不要で動く API であるためポリシーに違反してないことを字幕で説明しています。

認証の解除後も API が動いているので規約違反だと認識されないよう、API の実行箇所ごとに認証が必要なのかどうかをしっかりと解説するのがポイントです。


2.プライバシーポリシーの記載内容

以下の内容がアプリのプライバシーポリシーに記載されていないとリジェクトされます。

  • YouTube の利用規約への言及
  • アプリが YouTube API Services を使用していることの明記
  • Google のプライバシーポリシーへのリンク
  • Google のセキュリティ設定ページでアプリからのアクセス権が取り消せることについての言及

よって、Oshibana では以下のような内容をプライバシーポリシーに記載しています。

YouTube API サービスの利用
本アプリでは、動画情報などを取得するために YouTube API サービスを利用しています。
YouTube API サービスは、Google 社のプライバシーポリシー、YouTube の利用規約に基づいて提供されています。
YouTube の利用規約、YouTube API サービス利用規約、Google プライバシーポリシーについては以下をご覧ください。
Google プライバシーポリシー( https://www.google.com/intl/ja/policies/privacy/
YouTube( https://www.youtube.com/t/terms
YouTube API サービス利用規約( https://developers.google.com/youtube/terms/api-services-terms-of-service

また、ユーザーは、Google セキュリティ設定ページ( https://security.google.com/settings/security/permissions )から本アプリケーションのアクセス権を削除することで、本アプリケーションによるユーザーの Google アカウントへの接続を無効にすることができます。
ただしこれらの場合、本アプリケーションの一部の機能が使用できなくなる、または一部のページが正しく表示されなくなる場合があることをあらかじめご了承ください。

なお、プライバシーポリシーを修正した場合、本番環境にリリースしてから YouTube に返信してください。
ユーザーがプライバシーポリシーを確認できる状態になっている必要があるらしく、プライバシーポリシーの原文をファイルで送ったり、開発環境に掲載したものを共有するなどは許容されませんでした。
社内の法務確認などで時間を要する場合は早めの対応が必要です。


3.返信メールの文面

前述の通り、申請がリジェクトされ YouTube からメールが届いた場合は、指摘を解消後、英語でメールを返信する必要があります。
指摘の内容に対して、修正結果や対応方法などが明確に伝わるよう工夫すると、やり取りが少なくなります。

例えば Oshibana では、以下のような内容でメールを返信しています。

デモ動画について

指摘内容について解説した箇所を動画の再生時間を記載するなどで伝わりやすくしました。

[Response to Policy D Violations]
The application has been modified.
The points we would like to ask you to reconfirm are explained in the video.
Please turn on subtitles to confirm.
https://www.youtube.com/watch?v=XXXXXXXXXX

  • The scope of the YouTube API used was changed to readonly. (2:51〜)
  • The application connects to the YouTube API with an OAuth token, but the acquired user data is used only for display and is not stored in the DB. (3:52〜)
  • The iOS widget also calls the YouTube API, but only the YouTube API that can be executed in a non-confidential scope. The API key is then used to access the YouTube API. (5:14〜)
  • We added a button to disconnect YouTube account. (7:00〜)
    →This is in response to your point "Add an option to disconnect your YouTube account".
  • After disconnecting your YouTube account, you can switch to another YouTube account when reassociating. (8:53〜)

プライバシーポリシーについて

プライバシーポリシーは日本語で掲載しているため、英語に翻訳した状態でキャプチャを取り、追記した部分を赤枠で囲み、修正結果をわかりやすくしました。
公開されているプライバシーポリシーが日本語でも、ここで英訳した内容を伝えることができれば問題ありません。

[Response to Policy A Violations]
We have updated our Privacy Policy regarding Policy A.
https://oshibana.fun/privacy_policy.html

The red framed area in the following screenshot is the content added in this revision.

プライバシーポリシー



やってみた感想

海外の企業を相手にメールでやり取りするのは非常に大変でしたが、YouTube の字幕の付け方を覚えられたり、YouTube API サービス利用規約の内容に詳しくなったりと、申請以外にも色々なノウハウを得ることができたと思っています。
記事では全てを記載していませんが、YouTube とは実に半年近くやり取りをしており、特に後半は YouTube から指摘されたポリシー違反がなかなか解消できず、苦労しました。
やり取りが長くなると、実は過去に返答していた内容が誤って伝わっていたり、説明不足のままやり取りが進んでしまっているケースがあるので、その時は一度最初から振り返ってみるのも良いかもしれません。

長くなりましたが、本記事が皆さんの申請作業の役に立てば幸いです。