Skip to main content

Errors

Every error response has the same shape:

{
"ok": false,
"error": {
"code": "E_UNKNOWN_MATERIAL",
"message": "Material 'allpvs' not found in manifest.",
"at": "materials[0].name"
}
}
  • code — a stable, machine-readable error code. Clients should branch on this, not on message.
  • message — a human-readable explanation. The wording can change between releases.
  • at — a JSON-pointer-ish path into the request body showing where the offending value lives. Optional; present when the error is tied to a specific field.

Canonical error codes

Authentication / authorization

HTTPCodeWhen
401E_UNAUTHORIZEDMissing or invalid Authorization header.
403E_FORBIDDENAuth succeeded but the user cannot access this tracking_id.

Request structure

HTTPCodeWhen
400E_INVALID_JSONBody did not parse as JSON.
400E_MISSING_FIELDA required top-level field is absent.
400E_UNKNOWN_FIELDAn unrecognized top-level key appeared.
400E_TIME_REQUIREDtime.start, time.end, or time.tz is missing.
400E_INVALID_TZtime.tz is not a valid IANA timezone.
400E_INVALID_TIME_RANGEtime.end <= time.start, or the range is implausible.

Materials, views, result

HTTPCodeWhen
400E_UNKNOWN_MATERIALA material name is not in the manifest.
400E_UNKNOWN_VIEWresult.use does not reference a view defined in make.
400E_UNKNOWN_COLUMNA keep, filter, or sort entry references a column not in the target material.
400E_DUPLICATE_VIEWTwo views in make share a name.
400E_LIMIT_REQUIREDresult.limit is missing and count_only is not set.

Features

HTTPCodeWhen
400E_FEATURE_DISABLEDThe request uses a feature whose enabled is false on this server.
400E_FEATURE_NOT_AVAILABLEThe feature exists but the server's api_update is older than the feature's since.

Execution

HTTPCodeWhen
400E_BAD_JOINJOIN attempted on a column that is not a declared join key.
400E_CARDINALITY_GUARDA JOIN would explode row count beyond the safety threshold (e.g. unfiltered gscallpv).
500E_EXECUTOR_FAILEDInternal execution error. Retry with backoff.
504E_TIMEOUTQuery exceeded the server's time budget. Narrow time, add filters, or drop expensive JOINs.

Retry strategy

  • 401/403 — do not retry. Fix credentials.
  • 400 (structural) — do not retry blindly. The client has a bug. If an AI client gets a 400, it should re-read /guide in case the schema moved, then rethink the query.
  • 500 — retry once, with jitter.
  • 504 — do not retry the same query. Narrow the request.

Where to go next

  • /query reference — the request shape error codes refer to.
  • Examples — working requests you can use as a baseline when debugging.