コンテンツにスキップ

トラブルシューティング

このページでは、todoke を利用する際によく遭遇する 5 つの症状について、原因候補・確認方法・対処法をまとめています。エラーコードそのものの意味を調べたい場合はエラーコード・制限値を参照してください。

症状: POST /api/v1/notify などの送信 API・CLI・SDK の呼び出しは成功(またはエラーにならない)のに、ブラウザに通知が表示されない。

原因候補確認方法対処
対象の購読が非アクティブ化されている(Push サービス側で失効し、410 Gone / 404 Not Found を受けて自動的に無効化された)ダッシュボードのアプリ詳細画面、または todoke apps stats <app-id> / GET /api/v1/apps/:id/stats で「アクティブ購読者」「通算送信失敗」の数値を確認する該当ブラウザで購読をやり直す(再度 subscribe を実行する)。非アクティブ化された購読は自動復活しません
Push サービスが一時的なサーバーエラー(5xx)を返し、リトライを使い切った(メッセージ単位で 3 回リトライ後、DLQ に送られその通知は失われる統計の「通算送信失敗」が増えている一方、「アクティブ購読者」は減っていないことを確認する。DLQ に到達した通知は再送されませんPush サービス側の一時障害が原因のため利用者側で防ぐことはできません。届かなかった通知が重要な場合は、時間をおいて再送してください。仕組みの詳細はアーキテクチャと送信の仕組みを参照
Push サービスが 410 / 404 以外の 4xx を返した(配信失敗として記録されるのみで、リトライも購読の無効化も行われない)「通算送信失敗」が増え続けるのに「アクティブ購読者」が減らない場合はこのケースを疑う同じ購読に対して継続的に発生する場合は、該当ブラウザで購読を解除して登録し直してください
Free プランの月間送信上限(30,000 通)を超過しているレスポンスが 429code: "MONTHLY_LIMIT_EXCEEDED" になっていないか確認するプランをアップグレードするか、月が変わるまで待つ。詳細はエラーコード・制限値を参照
送信ペイロードが上限(3,072 バイト)を超えているレスポンスが 413code: "PAYLOAD_TOO_LARGE" になっていないか確認するtitle / body / url / icon / badge の合計サイズを減らす
202 Accepted を「配信完了」と誤解しているレスポンスステータスが 202 であっても、それは Queue への投入が完了しただけであることを確認する送信直後に届いていなくても異常とは限りません。少し時間をおいてから統計(上記)で成功・失敗を確認してください

症状: フロントエンドで subscribe() を呼んでも購読が完了しない、またはエラーになる。

原因候補確認方法対処
HTTPS でないオリジンから呼び出している(Web Push は HTTPS 必須。localhost は例外)ページの URL スキームを確認する。http:// かつ localhost 以外の場合は Push API 自体が利用できません本番相当の環境では必ず HTTPS で配信する。開発中は http://localhost を使う
ブラウザの通知許可がブロックされているブラウザの Notification.permission の値("denied" になっていないか)、またはサイト設定の通知許可状態を確認するサイト設定から通知の許可状態を「許可」に変更してもらう。一度「ブロック」にされた許可はコードから再度ダイアログを出せません
Free プランの購読者数上限(1,000 人)を超過しているレスポンスが 429code: "SUBSCRIBER_LIMIT_EXCEEDED" になっていないか確認するプランをアップグレードするか、既存の非アクティブな購読を整理する。上限に達した場合、新規購読の登録で 429 が返ることがあります
Service Worker が登録されていないnavigator.serviceWorker.getRegistration()undefined を返していないか確認するsubscribe を呼ぶ前に Service Worker の登録(navigator.serviceWorker.register(...))を完了させる

症状: API 呼び出しが認証・認可エラーで失敗する。

原因候補確認方法対処
API キーのスコープが不足している(code: "INSUFFICIENT_SCOPE"、403)呼び出したエンドポイントが要求するスコープと、使用している API キーのスコープを比較する。スコープごとの許可操作はAPI キーを参照より上位のスコープ(notify / full)を持つキーを使用する
API キーが URL の appId と一致していない(code: "APP_MISMATCH"、403)リクエスト URL に含まれる appId と、使用している API キーの発行元アプリが一致しているか確認する正しい組み合わせの appId と API キーを使用する
認証ヘッダーがない・不正、またはキー/セッションが無効(UNAUTHORIZED / INVALID_API_KEY / INVALID_SESSION、401)Authorization: Bearer <API キー> ヘッダーが正しく付与されているか、キーが失効していないか確認するヘッダー形式を修正するか、ダッシュボードでキーを再発行する。セッション切れの場合は再ログインする

各コードの詳細はエラーコード・制限値を参照してください。

症状: 短時間に繰り返しリクエストしたところ、429 エラーで拒否される。

原因候補確認方法対処
ログイン(POST /auth/login)のレート制限(10 回 / 60 秒 / IP)に達している直近 60 秒以内のログイン試行回数(成功・失敗問わず)を確認するレスポンスの Retry-After(秒)だけ待ってから再試行する
ユーザー登録(POST /auth/register)のレート制限(5 回 / 60 秒 / IP)に達している直近 60 秒以内の登録試行回数(成功・失敗問わず)を確認する同上。Retry-After の時間だけ待つ
API キー認証のレート制限(20 回 / 60 秒 / IP)に達している。このエンドポイントは認証失敗のみカウントされる直近 60 秒以内に認証失敗した API リクエストの回数を確認するRetry-After の時間だけ待つ。キーが正しく成功しているリクエストはカウントされないため、キー自体を見直すことで再発を防げる場合もある

症状: ブラウザから直接 fetch で todoke の API を呼び出すと、CORS エラーでリクエストがブロックされる。

原因候補確認方法対処
リクエスト元のオリジンが許可リストに含まれていないページのオリジンが次のいずれかに該当するか確認する: http://localhost(:port) / https://localhost(:port)https://todoke-dashboard.pages.dev*.todoke.dev のサブドメイン許可されたオリジンから呼び出すか、フロントエンドから直接呼ばずに自社サーバー経由で API を呼び出す構成に変更する