RoomScope

最終更新

エラー

2xx 以外のレスポンスはすべて、同じ 4 つのフィールドを持つ JSON エンベロープです。code で分岐し、message は人に向けて表示し、requestId はログに残し、retryable が true のときだけリトライしてください。

エンベロープ

429 Too Many Requests
{  "code": "rate_limit_exceeded",  "message": "API key rate limit exceeded.",  "requestId": "3f2b6c1e-8a4d-4f0e-9b7a-2d5c1e6f8a90",  "retryable": true}
フィールド型意味
codestringsnake_case の安定した機械可読の識別子です。分岐にはこちらを使い、message では分岐しないでください。
messagestring英語による人が読める説明です。運用担当者に表示しても問題ありませんが、文言は変わる可能性があります。
requestIdstringサーバーが生成するリクエストの UUID です。サポートへの問い合わせ時に添えてください。ログからリクエストを特定する唯一の手がかりです。
retryableboolean同じリクエストが変更なしで後に成功しうる場合(レート制限、一時的な障害)は true です。それ以外は、リクエストの内容を変える必要があります。
ステータスコードも重要です
HTTP ステータスは大まかな分類(4xx はクライアント側、5xx はこちら側)で、code が詳しい理由です。ステータスだけを見るクライアントは、スコープ不足とモジュールを含まないプラン(どちらも 403)を区別できません。

エラーの扱い方

以下は RoomScope のダッシュボード自身が使っているパターンです。エンベロープを解析し、ボディが JSON でない場合は http_error にフォールバックし、サーバーがリトライ可能と示したエラーだけを指数バックオフでリトライします。

class ApiError extends Error {  constructor(status, { code, message, requestId, retryable }) {    super(message);    Object.assign(this, { status, code, requestId, retryable: Boolean(retryable) });  }} async function call(path, init) {  const res = await fetch(`https://api.toktokdata.live${path}`, init);  if (res.ok) return res.status === 204 ? undefined : res.json();  let envelope = {};  try { envelope = await res.json(); } catch {}  throw new ApiError(res.status, { code: "http_error", message: `Request failed (${res.status})`, ...envelope });} // Retry only when the server says so.async function withRetry(fn, attempts = 3) {  for (let i = 0; ; i++) {    try { return await fn(); }    catch (e) {      if (!(e instanceof ApiError) || !e.retryable || i === attempts - 1) throw e;      await new Promise((r) => setTimeout(r, 500 * 2 ** i));    }  }}

ステータス別のコード

コードは安定していますが、新しいコードが追加されることがあります。未知のコードはステータスに基づいて扱ってください。リファレンスの各エンドポイントには、返しうるコードが記載されています。

ステータスコード発生条件リトライ可否
400validation_errorボディまたはパラメーターの形式が不正です。メッセージに該当するフィールド名が含まれます。不可
400invalid_rankings_inputランキング:board がない、128 文字を超える値がある、または limit、leagueTier、period、liveOnly の値が不正です。不可
400invalid_cursor · invalid_region · invalid_trend_typeエンドポイントが受け付けないカーソル、地域(insights では 2 文字)、またはトレンドの種類です。不可
400invalid_live_history_input · invalid_alert_input · invalid_dataset · invalid_formatエンドポイント固有の入力エラーです。修正すべき点はメッセージに記載されます。不可
401unauthorizedキーがない、形式が不正、不明、失効済み、期限切れ、またはワークスペースが無効です。WWW-Authenticate: Bearer ヘッダーとともに返されます。不可
402credit_cap_exceededこのリクエストにより、期間内の消費がクレジット上限を超えます。不可
403insufficient_scopeキーに必要なスコープがない、またはダッシュボード専用のルートです。不可
403module_not_entitledワークスペースのプランに LIVE モジュールまたは検索モジュールが含まれていません。不可
403export_format_not_entitledプランにそのエクスポート形式が含まれていません。不可
404not_foundメソッドとパスに一致するルートがありません。不可
404creator_not_found · video_not_found · live_session_not_found · alert_not_found · export_not_foundリソースが存在しないか、別のワークスペースに属しています。不可
409export_not_ready · api_key_limit_reachedエクスポートがまだ作成中か、プランのキー数の上限に達しています。不可
429rate_limit_exceededキーの 1 秒あたりのリクエスト数を超えました。Retry-After に従ってください。可
429daily_quota_exceededキーの 1 日あたりの上限を使い切りました。Retry-After は UTC の午前 0 時までの秒数です。可
503rate_limit_unavailable · metering_unavailable · webhook_unavailable依存するサービスが停止しています。バックオフを入れてリトライしてください。可
500internal_errorこちら側で問題が発生しました。バックオフを入れてリトライし、報告の際は requestId を添えてください。可

エラーではないケース

  • ランキングで不明な region や対象外の地域を指定してもエラーにはなりません。200 とともに publishable: false、空の entries 一覧、そして理由を示す provenance が返ります。
  • 収集中のフォロー中、フォロワー、コメントは、202 とともに status: "collecting"、jobId、Retry-After ヘッダーを返します。指定された秒数が経過してから再度呼び出してください。

レート制限については専用のページがあります:レート制限。

このページは役に立ちましたか?