エラーハンドリング
API は標準の HTTP ステータスコードを使用し、RFC 7807 Problem Details 形式でエラーを返します。
エラーレスポンスのフォーマット
{
"type": "https://feed.storyhub.studio/probs/auth",
"title": "Unauthorized",
"status": 401,
"detail": "Invalid or missing API key.",
"instance": "/v1/feed"
}
| フィールド | 説明 |
|---|---|
type | エラータイプを一意に識別する安定した URI |
title | エラータイプの短い概要(人間向け) |
status | HTTP ステータスコード |
detail | エラーの詳細な説明 |
instance | エラーが発生したリクエストパス |
エラーの種類による分岐は type で判定してください。title は type ごとに固定された文言で、表示用途のみを想定しています。発生ごとに変わる情報は detail に含まれます。
ステータスコード
| コード | 意味 | 対応方法 |
|---|---|---|
200 | 成功 | — |
202 | 受理(非同期処理) | イベントおよびプッシュジョブはキューに登録されます |
400 | 不正なリクエスト | リクエストパラメーターを確認してください |
401 | 認証エラー | API Key を確認してください |
402 | 使用量上限超過 | クレジット残高を確認するか、上限を引き上げてください |
403 | アクセス拒否 | API Key にこのリソースへの権限がありません |
404 | リソースが見つかりません | リクエストされたリソースが存在しません |
413 | ペイロード上限超過 | エンドポイント別のリクエストボディサイズおよび配列件数上限を確認してください(例: /v1/push-candidates の user_ids は最大 100,000 件) |
429 | レート制限超過 | 待機してリトライしてください(レート制限 を参照) |
500 | サーバー内部エラー | Backoff 付きでリトライしてください。継続する場合はサポートにお問い合わせください |
503 | サービス一時停止 | 一時的な障害です。Retry-After ヘッダーに従い、Backoff 付きでリトライしてください |
413 レスポンス例
{
"type": "https://feed.storyhub.studio/probs/payload-too-large",
"title": "Payload Too Large",
"status": 413,
"detail": "Request body exceeded the maximum allowed size of 2097152 bytes for this endpoint.",
"instance": "/v1/events"
}
ボディサイズ上限は HTTP プロトコル層で適用されるため、chunked transfer encoding を用いても回避できません。
エラータイプ
API が返す type と、それぞれに対応する title は次のとおりです。
type | title | ステータス | 発生する場面 |
|---|---|---|---|
https://feed.storyhub.studio/probs/validation | Validation Error | 400 | リクエストのパラメーターやボディが制約を満たしていない |
https://feed.storyhub.studio/probs/auth | Unauthorized | 401 | API Key が未指定、または不正・失効している |
https://feed.storyhub.studio/probs/usage-limit-exceeded | Usage Limit Exceeded | 402 | 設定した使用量上限に達した状態でクレジット消費エンドポイントを呼び出した |
https://feed.storyhub.studio/probs/forbidden | Forbidden | 403 | 対象リソースへの権限がない(例. content_id が直近このテナントに配信されていない) |
https://feed.storyhub.studio/probs/tenant-status | Tenant Suspended | 403 | アカウントが停止されている |
https://feed.storyhub.studio/probs/not-found | Resource Not Found | 404 | 指定したリソースが存在しない、またはテナントに設定されていない |
https://feed.storyhub.studio/probs/payload-too-large | Payload Too Large | 413 | リクエストボディがエンドポイントのサイズ上限を超えた |
https://feed.storyhub.studio/probs/rate-limit | Rate Limit Exceeded | 429 | レート制限を超過した |
https://feed.storyhub.studio/probs/push-job-limit | Push Job Limit Exceeded | 429 | 同時実行中のプッシュ候補生成ジョブが上限に達している |
https://feed.storyhub.studio/probs/internal-error | Internal Server Error | 500 | サーバー内部で予期しないエラーが発生した |
https://feed.storyhub.studio/probs/service-unavailable | Service Unavailable | 503 | 一時的な障害によりリクエストを処理できなかった |
https://feed.storyhub.studio/probs/tenant-not-configured | Tenant Not Configured | 503 | テナントのクレジット設定を参照できなかった |
probs/... の URI はエラータイプを識別するための不変の識別子です。ブラウザーで開くとこのページにリダイレクトされますが、これは説明を読むための便宜であり、実装から取得する前提のエンドポイントではありません。エラーの判定は URI の文字列一致で行ってください。
リトライ戦略
一時的なエラー(429、500、503)には、Exponential Backoff を使用してください(503 は Retry-After ヘッダーが付与される場合、その値を優先してください):
wait_time = min(base_delay * 2^attempt, max_delay)
| パラメーター | 推奨値 |
|---|---|
| 基本遅延 | 1 秒 |
| 最大遅延 | 30 秒 |
| 最大リトライ回数 | 3 回 |
400、401、402、403、404 エラーはリトライ しないでください — これらはリクエストの修正が必要です。