YouTube Analytics APIを叩いて403が返ったとき、私は反射的に「スコープが足りない」と判断しました。結論から言うと違いました。原因はGoogle Cloudのそのプロジェクトで API が有効化されていなかっただけです。エラーメッセージをちゃんと読めば最初から書いてありました。
起きたこと:YouTube Analytics APIが403を返す
自分で運用しているツールからYouTube Analytics APIを呼び出したところ、レスポンスが403で返ってきました。認証は通っているのにデータが取れない、という状態です。
返ってきたエラーメッセージには、次の一節が含まれていました。
has not been used in project N
(Nの部分にはプロジェクトの識別子が入ります。)
最初の判断:スコープ不足だと思い込んだ
403という数字を見た瞬間、私は権限(スコープ)の問題だと決めつけました。OAuthのスコープ指定が足りないのだろう、と。これは誤りでした。
403 = 権限不足、と反射で解釈してスコープ側を疑い続けたこと。エラーメッセージ本文を読まずに、ステータスコードだけで原因を推定していました。
認証まわりを疑い始めると、確認すべき箇所が一気に増えます。スコープの文字列、同意画面、トークンの再取得。どれも「怪しく見える」ので、時間だけが溶けていきます。しかも今回は、そのどれも原因ではありませんでした。
実際の原因:プロジェクトでAPIが有効化されていなかった
エラーメッセージの has not been used in project N は、そのまま読めば「このプロジェクトでこのAPIはまだ使われていない」という意味です。権限がどうこうではなく、そもそもGoogle Cloudのそのプロジェクトで YouTube Analytics API が有効化されていなかった、というだけの話でした。
403という数字よりも、メッセージの文面のほうが情報量が多いです。has not been used in project というフレーズは、権限ではなくAPI有効化を指しています。
やったこと:コンソールで有効化するだけ
- エラーメッセージ内のプロジェクト(N)を確認する
- Google Cloud コンソールでそのプロジェクトを開く
- YouTube Analytics API を有効化する
- 再度APIを叩く
作業としては1クリックの有効化で終わりました。その後、同じリクエストがそのまま通りました。コードは一行も変えていません。
Cloudコンソールで YouTube Analytics API を有効化したら、403は消えてリクエストが通りました。スコープもトークンも触っていません。
今回の教訓
- 403が返ったら、まずレスポンスのメッセージ本文を読む
has not been used in projectが入っていたら、権限ではなくAPI有効化を疑う- エラーメッセージに書かれているプロジェクトが、自分が想定しているプロジェクトかを確認する
- ステータスコードだけで原因を推定する
- 「403だからスコープだろう」と、認証まわりから調べ始める
403が常にAPI未有効化だという話ではありません。今回のケースを切り分けたのは、ステータスコードではなくメッセージの文面です。同じ403でも文面が違えば原因は別だと考えたほうが安全です。
分かっていないこと
正直に書いておくと、なぜそのプロジェクトでAPIが有効化されていなかったのか、その経緯までは特定できていません。有効化してリクエストが通ったところで調査を終えているためです。また、権限(スコープ)側の設定が今回のケースで本当に十分だったのかは、有効化によって成功したという事実から逆算しているだけで、個別に検証したわけではありません。
それでも、今回はっきりしたことが一つあります。エラーメッセージは、こちらが読む気になれば原因をそのまま書いてくれているということです。読まずに推測したぶんだけ、遠回りしました。
- YouTube Analytics APIで403。原因は権限ではなく、Google CloudのそのプロジェクトでAPIが有効化されていなかったこと
- 手がかりはエラーメッセージの
has not been used in project Nの一文 - 対応はCloudコンソールでの1クリック有効化のみ。コード変更なしで通った
- 403を見たら「権限不足」と決めつけず、まずメッセージ本文を読むこと
- なぜ有効化されていなかったのかの経緯は未調査で、分かっていない


