メインコンテンツまでスキップ

エラー

すべてのエラーレスポンスは同じ形です。

{
"ok": false,
"error": {
"code": "E_UNKNOWN_MATERIAL",
"message": "Material 'allpvs' not found in manifest.",
"at": "materials[0].name"
}
}
  • code — 安定した機械可読エラーコード。クライアントは message ではなく code で分岐すること。
  • message — 人間が読める説明。文言はリリース間で変わる可能性あり。
  • at — リクエストボディ内の該当値への JSON-pointer 風パス。フィールド固有のエラーのときだけ存在。

正式なエラーコード

認証 / 認可

HTTPコード発生条件
401E_UNAUTHORIZEDAuthorization ヘッダが無いか無効
403E_FORBIDDEN認証は成功したが、このユーザーはこの tracking_id にアクセスできない

リクエスト構造

HTTPコード発生条件
400E_INVALID_JSONボディが JSON としてパースできない
400E_MISSING_FIELD必須トップレベルフィールドが無い
400E_UNKNOWN_FIELD認識できないトップレベルキーがある
400E_TIME_REQUIREDtime.start / time.end / time.tz のどれかが無い
400E_INVALID_TZtime.tz が有効な IANA タイムゾーンでない
400E_INVALID_TIME_RANGEtime.end <= time.start、または範囲がありえない値

Materials / Views / Result

HTTPコード発生条件
400E_UNKNOWN_MATERIAL仕様書に存在しないマテリアル名
400E_UNKNOWN_VIEWresult.usemake で定義されていないビューを参照
400E_UNKNOWN_COLUMNkeep / filter / sort がマテリアルに存在しないカラムを参照
400E_DUPLICATE_VIEWmake 内で同名ビューが複数
400E_LIMIT_REQUIREDcount_only でないのに result.limit が無い

機能

HTTPコード発生条件
400E_FEATURE_DISABLEDこのサーバーで enabled: false の機能を使っている
400E_FEATURE_NOT_AVAILABLE機能は存在するが、サーバーの api_update が機能の since より古い

calc バリデーション(2026-05-11+)

HTTPコード発生条件
400E_CALC_COLUMN_UNRESOLVEDcalc 内の material.column 参照がビューのスコープに解決できない: マテリアルが fromjoin.with に登場しない、またはそのマテリアルのスキーマに当該列が存在しない。Since: 2026-05-11。from[0] が事前定義 view を参照するビューチェイニングのビューはこのチェックから意図的に除外され、Material runtime 経路にフォールバックします。

E_CALC_COLUMN_UNRESOLVED は、前バージョン 2025-10-20 でサイレントに 0 行を返していたケースを置き換えるものです。AI クライアントが「成功したけれど結果が間違っている」状態を受け取らずに済むよう、意図的に大きな声で失敗させます。

例:

{
"ok": false,
"error": {
"code": "E_CALC_COLUMN_UNRESOLVED",
"message": "calc references 'click_event.pv_id', but 'click_event' is not in this view's from or join.with scope.",
"at": "make.top_clicks.calc.clicks"
}
}

JOIN バリデーション

HTTPコード発生条件
400E_INVALID_JOINjoin 構造が不正、完全修飾でない、非等値、または on.left / on.right が正しい側に解決しない。2026-05-11 から(もとは 2026-05-10 に 2025-10-20 で追加) エラーレスポンスにどちら側で失敗したかを示す構造化 details が乗ります。
400E_BAD_JOIN宣言されていない JOIN キーで JOIN しようとした
400E_CARDINALITY_GUARDJOIN で行数が安全閾値を超えそう (例: フィルタなしの gscallpv)

E_INVALID_JOINdetails フィールド(2026-05-11 から):

フィールド意味
sidestring該当値が on.left にあるなら "left"on.right にあるなら "right"
received_valuestringリクエストが渡してきたリテラル値(例: "click_event.pv_id""top_pages.pv_id")。
expected_prefixstringバリデータがその側に期待するプレフィックス。on.leftfrom 側の解決済み物理マテリアル名(view chain は事前解決済み)、on.rightjoin.with 文字列と一致。
hintstring人間が読める修復ヒント(例: "use 'allpv.pv_id' — view-name prefixes are not accepted on on.left")。

on.leftfrom 側の解決済み物理マテリアル名と完全一致する必要があります。from[0] がビューチェイニングのときも同様で、バリデータは比較前にビューを元のマテリアル名まで解決します。on.left に素のビュー名プレフィックスを書くと拒否されます。on.rightjoin.with 文字列と完全一致する必要があります。

例:

{
"ok": false,
"error": {
"code": "E_INVALID_JOIN",
"message": "join.on.left must reference the from material, not a view name",
"at": "make.top_clicks.join.on[0].left",
"details": {
"side": "left",
"received_value": "top_pages.pv_id",
"expected_prefix": "allpv",
"hint": "Replace 'top_pages.pv_id' with 'allpv.pv_id'. on.left always uses the physical material name; the view chain is resolved by the validator before comparison."
}
}
}

実行

HTTPコード発生条件
500E_EXECUTOR_FAILED内部実行エラー。ジッター付きで1回だけリトライ可
504E_TIMEOUTクエリがサーバーの時間予算を超えた。time を狭める、フィルタを足す、または高価な JOIN を落とす

リトライ戦略

  • 401/403 — リトライしない。認証情報を直す。
  • 400 (構造系) — 盲目的にリトライしない。クライアント側のバグ。AI クライアントが 400 を受けたら、スキーマが動いている可能性があるので /guide を読み直してクエリを再考する。
  • 500 — ジッター付きで1回リトライ。
  • 504 — 同じクエリをリトライしない。リクエストを狭める。

次に読むページ