Response format
Every successful response has the same outer shape:total: implicitCOUNT(*)for the row. Always present.<aggregationKey>: one key per requested aggregation. The key is<type><Column>in camelCase (e.g.countGuardrailName,p99LatencyMs).<groupByKey>: one key pergroupByentry. The key is the lowerCamelCase form of the underlying column. Two special mappings:userEmailandvirtualaccountboth map tocreatedBySubjectSlugin the response.teammaps toteam(the value is a single unnested scalar, not an array). All othergroupBykeys preserve their lowerCamelCase name.
startTimestamp: present only for timeseries responses. Bucket start as an ISO 8601 timestamp string (e.g."2026-04-29T12:00:00.000Z"). Distribution responses omit it.endTimestamp: present only for timeseries responses. Bucket end as an ISO 8601 timestamp string, equal to the next bucket’sstartTimestamp(e.g."2026-04-29T13:00:00.000Z"). Distribution responses omit it.
Distribution response example
Timeseries response example
If
groupBy is empty or omitted, the response collapses to a single row (or one row per timeseries bucket) summarising every guardrail evaluation inside the window.Error responses
A malformed query returns400 Bad Request:
- Operator not allowed on this field, for example,
EQUALonguardrailName(it supports onlyIN,NOT_IN, andSTRING_*operators). - Missing required
value(or wrong shape, e.g. scalar where array is expected forIN/BETWEEN). - Unknown field name for the datasource.
- Invalid
intervalformat (compound expressions, unrecognised unit, non-positive integer). - Missing required
intervalfor a timeseries query.
401 Unauthorized: missing or invalid bearer token.403 Forbidden: caller does not have permission for the requested scope.500 Internal Server Error: unexpected server error while executing the query.