Notion APIが「object_not_found(404)」を返すときの確認手順
スクリプトからNotion APIでページを読もうとしたら、「見つからない」と返ってきた。IDはURLからコピーしたものだし、トークンもほかのページでは動いている。それなのに、なぜか404になる。
私も、すでに動いているトークンを新しい用途に使い回したとき、まさにこの状態で止まりました。しかも自動実行だったので、エラーに気づくまで何日も静かに失敗し続けていました。この記事では、404が出たときに確かめる順番をまとめます。
404(object_not_found)の意味
Notionの公式ドキュメントでは、このエラーは「使ったトークンから見て、そのリソースが存在しない」という意味だと説明されています。そして、「そのリソースがトークンの持ち主に共有されていない」ことを示す場合もある、と添えられています。エラーのメッセージにも、次のような一文が入ります。
"code": "object_not_found",
"message": "… Make sure the relevant pages and databases are shared with your connection."
つまり404は、「本当に無い」だけでなく、「あなたの鍵からは見えない」という意味でもあります。実際には、後者であることがほとんどです。
404が出たときに確かめる順番
- 1. コネクトそのページ(か親ページ)に「コネクトを追加」したか
- 2. IDの種類ビューのIDや、データソースのIDと取り違えていないか
- 3. 元のデータベースリンクドデータベースやリレーション先も共有したか
いちばん多い原因: ページに「コネクトを追加」していない
APIのインテグレーション(コネクト)は、作っただけではどのページも読めません。公式ドキュメントでは、インテグレーションがページを操作する前に、そのページを手動でインテグレーションに共有する必要がある、と説明されています。
共有は、Notionの画面で次のように行います(Notionヘルプセンターの手順)。
- 対象のページを開き、右上の「•••」を選ぶ
- メニューの下のほうにある「コネクトを追加」をクリックする
- 使っているインテグレーションを検索して選ぶ
親のページにコネクトを追加すると、その下にあるページにもまとめてアクセスできるようになります。公式ドキュメントにも、親ページへのアクセスを与えれば、その子ページすべてにアクセスできると書かれています。家の用事に使うページを1つの親ページの下に集めておき、その親ページにだけコネクトを追加しておくと、新しいページを作るたびに設定し直さずに済みます。
私がはまったのは、ここでした。トークンを使い回したので「もう設定済み」と思い込んでいましたが、新しく対象にしたページは別の親ページの下にあり、コネクトが追加されていなかったのです。
そのほかの原因
| 原因 | 確かめ方・直し方 |
|---|---|
| ビューのIDを使っている | データベースのURLの「v=」の後ろはビューのIDで、データベースのIDではありません。「/」の後ろ、「?」の前の32文字を使います |
| データベースのIDとデータソースのIDの取り違え | APIのバージョン2025-09-03以降では、データベースとデータソースは別のIDです。公式ドキュメントでも、互いに置き換えて使えないと説明されています |
| リンクドデータベースを共有している | 別のページに表示しているだけのデータベース(リンクドビュー)を共有しても足りません。元のデータベースを共有します |
| リレーション先のデータベース | リレーションでつながった先のデータベースの情報を取るには、そのデータベースも共有が必要です |
URLのどこがIDなのかは、NotionのID取り出しツールでURLを貼ると確かめられます。ページやデータベースのIDとビューのIDを、区別して表示します。
401・403との違い
似たエラーに401と403があります。公式ドキュメントの説明は次のとおりです。
| 状態 | コード | 意味 |
|---|---|---|
| 401 | unauthorized | トークンが正しくない(コピーの漏れや、古いトークンのままになっている等) |
| 403 | restricted_resource | トークンに必要な権限がない、またはワークスペースのブロック数の上限に達している |
| 404 | object_not_found | トークンから見てリソースが存在しない、または共有されていない |
401ならトークンを、403ならインテグレーションの権限の設定を、404ならまずコネクトを疑う、と覚えておくと切り分けが早くなります。
静かに失敗し続けないために
自動実行のスクリプトでは、404を「データが無かった」と同じに扱ってしまうと、何日も気づけません。私は次の2つで防ぐようにしています。
- 404はエラーとして止める。「該当なし」と区別して、ログやNotionの別ページに失敗を書き残す
- 新しい対象を足したら、最初の1回は手で実行する。コネクトの追加漏れは、手で1回動かせばすぐ分かる
まとめ
- 404(object_not_found)は「存在しない」だけでなく「共有されていない」の意味でもある
- まずページ(か親ページ)の「•••」→「コネクトを追加」を確かめる。親に追加すれば下の階層にも届く
- 次に、ビューのIDやデータソースのIDと取り違えていないか、元のデータベースやリレーション先も共有しているかを確かめる
APIのトークンを使わずに、Claude Codeから自分の権限でNotionを操作する方法もあります。Claude CodeからNotionを読み書きできるようにする(Notion MCPのつなぎ方)で紹介しています。