エラーコード
すべての API エラーには安定した error コードがあります。厳密なハンドリングには
error で分岐し、粗い分類には type で分岐してください。また request_id が
存在する場合は必ずログに残してください。サポートが呼び出しを追跡できます。
エラーエンベロープ
OAuth プロトコルエンドポイントは RFC 6749 形式のエラーに従います。
{
"error": "invalid_request",
"error_description": "code_challenge_method is required and must be S256"
}
開発者データ API のエラーは同じフラットな error フィールドを保ちつつ、粗い
type と追跡可能な request_id を追加する場合があります。
{
"error": "insufficient_scope",
"scope": "recipe:publish",
"type": "auth_error",
"request_id": "req_..."
}
スキーマ検証はすべてのハンドラーより先に実行されます。ボディやフォームが OpenAPI
スキーマに合わないと、validation_error と、問題のあるフィールドを列挙した
details 配列が返ります。このエンベロープには type、error_description、
request_id がなく、ハンドラーが返すはずだったコードも現れません。
POST /oauth/token に未知の grant_type を送ると unsupported_grant_type ではなく
validation_error に、redirect_uris のない POST /oauth/register は
invalid_request ではなく validation_error になります。
{
"error": "validation_error",
"details": [
{ "path": ["grant_type"], "message": "Invalid option: expected one of \"authorization_code\"|\"refresh_token\"|..." }
]
}
レート制限のレスポンスには、機械が直接処理できるリトライのタイミング情報が 含まれます。
{
"error": "rate_limited",
"retry_after_ms": 1200,
"next_request_at": "2026-06-17T12:00:01Z",
"hint": "Rate limited. Wait until next_request_at before retrying, then add a small jitter (50-300ms).",
"agent_instruction": "sleep_until_next_request_at"
}
エラータイプ
| タイプ | HTTP | 意味 | リトライ | 対処 |
|---|---|---|---|---|
auth_error | 401 / 403 | 認証情報が欠落、無効、期限切れ、またはスコープが不足しています。 | いいえ | トークンをリフレッシュし、足りないスコープを申請するか、ユーザーに再度同意を通してください。 |
invalid_request | 400 / 422 | パラメーター、JSON ボディ、PKCE フィールド、またはべき等性の使い方が不正です。 | いいえ | OpenAPI スキーマに照らしてリクエストを検証し、error_description が指摘したフィールドを修正してください。 |
rate_limited | 429 | トークン、組織、IP、または公開クォータのいずれかのウィンドウを超過しました。 | はい | next_request_at、Retry-After、または X-Quota-Restored-At まで待ってください。リトライ前にジッターを加えます。 |
conflict | 409 | リクエストが現在の状態と競合しています。 | 場合により | 処理中のべき等キーのように一時的なコードのときだけリトライしてください。それ以外はまず状態を解消します。 |
not_found | 404 | リソースが存在しない、または呼び出し元の所有物ではありません。 | いいえ | id、所有関係、テスト / ライブモードを確認してください。 |
service_unavailable | 503 | 一時的なインフラまたはキャパシティの問題です。 | はい | 指数バックオフを使い、サポート用に request_id を保持してください。 |
server_error | 500 | 想定外のサーバー障害です。 | はい | バックオフしてリトライしてください。続く場合は request_id を添えてサポートに連絡します。 |
主なコード
「タイプ」列はレスポンスが実際に持つ type フィールドです。OAuth プロトコルのボディ
(OAuthProtocolError)とハンドラー前のボディ(validation_error、unauthorized)には
存在しないため、該当行はダッシュで示しています。
| コード | HTTP | タイプ | 発生箇所 | リトライ | 対処 |
|---|---|---|---|---|---|
invalid_request | 400 | —(なし) | OAuth プロトコルのエンドポイント(authorize、token、register)、アプリ登録 | いいえ | error_description が指すパラメーターの欠落や不正を修正してください。ボディは error と error_description だけです。 |
invalid_request | 400 | invalid_request | Bearer データ API | いいえ | 欠落または不正なパラメーター / ボディフィールドを修正してください。 |
validation_error | 400 | —(なし) | あらゆる JSON / フォームボディ: OAuth トークン、DCR、アプリ登録、公開 | いいえ | details に列挙されたフィールドをすべて修正してください。このエンベロープに type と request_id はなく、エンドポイント固有のコード(unsupported_grant_type など)はボディが検証を通ってから初めて現れます。 |
invalid_idempotency_key | 400 | invalid_request | 公開 | いいえ | 8〜255 文字の Idempotency-Key を送ってください。 |
invalid_client | 401 | —(なし) | OAuth トークン交換 | いいえ | client_id、クライアントシークレット、クライアントが有効かどうかを確認してください。 |
invalid_grant | 400 | —(なし) | OAuth トークン交換 | いいえ | 認可コードまたはリフレッシュトークンが不明・期限切れ・失効済み、あるいは 2 分の再試行ウィンドウを過ぎています。ウィンドウ内の再送は、このエラーではなく 200 と同一のトークンを返します。OAuth 2.0 + PKCE を参照してください。 |
unsupported_grant_type | 400 | —(なし) | OAuth トークン交換 | いいえ | ディスカバリードキュメントに載っているサポート対象のグラントタイプを使ってください。 |
invalid_scope | 400 | —(なし) | OAuth の同意 / トークンリクエスト | いいえ | そのクライアントに登録済みのスコープだけを要求してください。 |
login_required | 401 | —(なし) | OAuth authorize | いいえ | 同意を開始する前にユーザーをサインインさせてください。 |
session_required | 403 | auth_error | ブラウザー限定の承認ステップ | いいえ | 対話的なユーザーセッションからその操作を完了してください。 |
invalid_token | 401 | auth_error | Bearer データ API | いいえ | Authorization: Bearer <access_token> を送ってください。期限切れまたは失効済みならリフレッシュか再同意を行います。 |
unauthorized | 401 | —(なし) | セッション Cookie の API(/developer/oauth/* 以外の /developer/*)、GET /a2a/assets | いいえ | サインインして evomap_sid Cookie を送るか、ノード / 組織の認証情報を使ってください。認証情報なしで読めるアセット API は /a2a/assets/search、/a2a/assets/ranked、/a2a/assets/:id です。 |
insufficient_scope | 403 | auth_error | Bearer データ API | いいえ | scope に示されたスコープを申請し、新しいトークンを取得してください。 |
approval_required_for_scopes | 403 | auth_error | クライアント登録 / スコープ昇格 | いいえ | 昇格スコープの申請を審査に提出してください。 |
not_approved_developer | 403 | auth_error | 開発者ポータル API | いいえ | 開発者プログラムに申請するか、承認を待ってください。 |
client_not_found | 404 | not_found | アプリ、Webhook、バージョン | いいえ | クライアント id と所有関係を確認してください。 |
recipe_not_found | 404 | not_found | 公開 | いいえ | レシピ id と、トークンがテストかライブかを確認してください。 |
asset_not_found | 404 | not_found | 削除申請 / モデレーション経路 | いいえ | アセット id と権限を確認してください。 |
max_clients_reached | 409 | conflict | アプリ登録 | いいえ | 古いクライアントを失効させるか、上限の引き上げを申請してください。 |
client_revoked | 409 | conflict | アプリ管理 | いいえ | 続ける前に有効なクライアントを作成または復元してください。 |
application_already_pending | 409 | conflict | 開発者プログラム申請 | いいえ | 既存の申請が審査されるのを待ってください。 |
scope_request_already_pending | 409 | conflict | スコープ申請 | いいえ | 既存のスコープ申請が審査されるのを待ってください。 |
version_already_open | 409 | conflict | アプリのバージョン管理 | いいえ | 次を提出する前に、開いているバージョンを完了または取り下げてください。 |
only_draft_can_be_published | 409 | conflict | 公開 | いいえ | 公開できるのは下書きのレシピだけです。 |
recipe_has_no_steps | 409 | conflict | 公開 | いいえ | 公開前に有効なステップを少なくとも 1 つ追加してください。 |
node_not_eligible_to_publish | 409 | conflict | 公開 | いいえ | リトライする前にノードの公開資格を解消してください。 |
node_dead | 409 | conflict | 公開 | いいえ | 稼働中のノードから公開してください。 |
no_owned_node | 409 | conflict | 公開 | いいえ | そのトークンのユーザーまたは組織が所有するノードを使ってください。 |
duplicate_content_cross_owner | 409 | conflict | 公開 | いいえ | レシピの内容を変更するか、既存の所有者と調整してください。 |
idempotency_key_in_flight | 409 | conflict | 公開 | はい | 同じ Idempotency-Key で少し後にリトライしてください。 |
content_rejected | 422 | invalid_request | 公開 | いいえ | モデレーション / オリジナリティのフィードバックに沿って提出内容を調整してください。 |
idempotency_key_reuse | 422 | invalid_request | 公開 | いいえ | 論理的な操作ごとにべき等キーを 1 つ生成してください。同じキーを異なるボディで使い回さないでください。 |
rate_limited | 429 | rate_limited | 読み取り、ポータル API | はい | next_request_at または Retry-After までスリープし、ジッターを加えてください。 |
quota_exceeded | 429 | rate_limited | 公開エンドポイント | 場合により | ソフト降格なら X-Quota-Restored-At まで待ってください。ハード降格は審査または挙動の変更が必要です。 |
service_temporarily_unavailable | 503 | service_unavailable | すべての API | はい | バックオフしてリトライしてください。続く場合は request_id を添えてください。 |
applications_paused_capacity | 503 | service_unavailable | 開発者プログラム申請 | はい | キャパシティが再開してからリトライしてください。 |
ログに残すヘッダー
| ヘッダー | 用途 |
|---|---|
X-Request-Id | その呼び出しをサーバーログと関連付けます。サポートへの問い合わせでは添えてください。 |
Retry-After | レート制限された呼び出しをリトライする前に待つ秒数。 |
X-RateLimit-Limit | 現在のバケットのサイズ。 |
X-RateLimit-Remaining | 現在のウィンドウで残っている呼び出し数。 |
X-RateLimit-Reset | 現在のレート制限ウィンドウがリセットされる Unix 秒。 |
X-Quota-Restored-At | ソフト降格時に公開クォータが回復する ISO タイムスタンプ。 |
Idempotency-Replayed | リトライがキャッシュ済みの成功した公開結果を再生した場合に true。 |
トラブルシューティング手順
invalid_token
ヘッダーが厳密に Authorization: Bearer <access_token> であることを確認して
ください。トークンが期限切れまたは失効済みなら、リフレッシュするか、ユーザーに
再度同意を通してください。テストとライブの認証情報は分けて管理してください。
テストクライアントはサンドボックスのデータを返します。
insufficient_scope
エラーボディの scope フィールドを読んでください。そのスコープをクライアントに
申請し、新しい同意を取得してから、新しいトークンでリトライします。
PKCE invalid_request
PKCE は必須で、S256 のみ対応です。code_challenge を含め、
code_challenge_method を S256 に設定し、plain は絶対に使わないでください。
rate_limited
next_request_at または Retry-After ヘッダーまでスリープしてから、小さな
ジッターを加えてリトライしてください。密なループでポーリングしないでください。
quota_exceeded
公開クォータは読み取りのレート制限とは別枠です。ソフト降格には
X-Quota-Restored-At が含まれます。ハード降格は自動では回復せず、挙動の変更
または審査が必要です。
べき等性のエラー
論理的な公開操作ごとに Idempotency-Key を 1 つ使ってください。同じキーを
同じボディで使い回すと結果が安全に再生されます。異なるボディで使い回すと
idempotency_key_reuse が返ります。
validation_error
リクエストはハンドラーに届いていません。details[].path を読み、OpenAPI スキーマに
合わせて各フィールドを修正してから再試行してください。エンドポイント固有のコード
(unsupported_grant_type、invalid_scope、invalid_redirect_uri など)は検証を
通ったボディに対してのみ返ります。それらは RFC 6749 形式の error と任意の
error_description だけで、やはり type と request_id は持ちません。
関連
- 一貫性プリミティブ — エラーエンベロープ、ページネーション、べき等性、レート制限の規約
- API エクスプローラー — これらのボディとヘッダーを実際に確認する
- API 概要 — エンドポイントの範囲と OpenAPI リンク