events table you query with SQL. The gateway forces an organization predicate
from your verified identity, so the SQL you write is organization-agnostic and only ever reads your own
rows. Only a single SELECT runs; there’s a row cap and a timeout.
CLI
The pragmatic scoping flags build aSELECT over a compact default column set — event id, time,
signal, name, run identity, principal, and payload size; pass --fields <col,col,…> to choose
columns, or --fields '*' for every column. Return LLM events for a run:
--sql (inline, @file, or - for stdin):
lineage_path — the path itself, plus
everything below it:
API
Send a singleSELECT to POST /v1/telemetry/sql:
{"rows": [ {col: value, …}, … ], "columns": [ … ]} — a list of plain JSON object
rows, with null columns omitted per row and 64-bit integer columns (ts_wall_ns, counts) encoded
as decimal strings, plus the declared column names in projection order (so a column that is NULL
in every row is still visible).
What you can query
SELECT over the events columns: identity and time (run_id, lineage_path, signal, name,
ts_wall_ns, …), promoted network columns (http_status_code, http_host, …), and arbitrary
attributes via hiloop_json_get(attributes_json, '$.path.to.key'). Model-shaped fields (model,
token counts, messages) derive from the captured payload bodies through a
data view like otel_genai_calls. Aggregates (COUNT, SUM, AVG,
MIN, MAX, approx_percentile_cont), GROUP BY, and ORDER BY all work.
Every signal is queryable the same way — captured workload
events (llm, net, log, exec, span), available producer observations (metric resource
samples), the platform’s own records (runtime lifecycle),
future runtime-native egress decisions, and annotations you wrote.
Unknown columns are rejected with an error that names the offending identifier. DDL, DML, and
multi-statement SQL are rejected — only one SELECT runs. See Event model
for the columns and the API reference for the exact request and response schemas.
Save a query you run often as a reusable data view.