List observations

Lists gen_ai spans as LLM observations — each an LLM call with its model, token counts, cost and latency projected from gen_ai.* attributes, newest first, over the query window.

GET /v1/o11y/llm/observations

Addresshttps://api.hanzo.ai/v1/o11y/llm/observations
MethodGET
OperationListLLMObservations
AuthAuthorization: Bearer $HANZO_API_KEY

Lists gen_ai spans as LLM observations — each an LLM call with its model, token counts, cost and latency projected from gen_ai.* attributes, newest first, over the query window.

Callers need the viewer role; the runtime's own gate enforces it, and scopes the read to the caller's validated tenant.

Request

9 fields.

FieldInTypeRequiredDescription
startqueryinteger—Start is the start of the window as a unix-millisecond epoch.
endqueryinteger—End is the end of the window as a unix-millisecond epoch.
traceIdquerystring—TraceID narrows the view to one trace.
sessionIdquerystring—SessionID narrows the view to one conversation.
userIdquerystring—UserID narrows the view to one end user.
namequerystring—Name narrows the view to observations of one name.
modelquerystring—Model narrows the view to one model.
offsetqueryinteger—Offset is how many rows to skip, for paging.
limitqueryinteger—Limit caps how many rows come back.

Response

StatusBodyMeaning
200o11y.O11yLLMObservationsOutok
202Approvalheld for approval
defaultproblem-detailsrefused

200 body — 22 fields.

FieldInTypeAlwaysDescription
databodyo11y.O11yLLMObservationsPage—
data.itemsbodyo11y.O11yLLMObservation[]—Items are the observations, newest first.
data.items[].completionTokensbodyinteger (int64)—CompletionTokens is the output token count.
data.items[].idbodystring—ID is the observation's id (the span id).
data.items[].latencyMsbodynumber (double)—LatencyMs is how long it took, in milliseconds.
data.items[].modelbodystring—Model is the model that served it.
data.items[].namebodystring—Name is the observation's name.
data.items[].parentObservationIdbodystring—ParentID is the parent observation, when the span has one.
data.items[].promptTokensbodyinteger (int64)—PromptTokens is the input token count.
data.items[].providerbodystring—Provider is the model's provider.
data.items[].serviceNamebodystring—ServiceName is the app that emitted it.
data.items[].sessionIdbodystring—SessionID is the conversation the observation belongs to.
data.items[].startTimebodystring (date-time)—StartTime is when the observation started.
data.items[].statusCodebodystring—StatusCode is the observation's status, e.g. OK, ERROR.
data.items[].totalCostbodynumber (double)—TotalCost is the observation's cost.
data.items[].totalTokensbodyinteger (int64)—TotalTokens is the sum of prompt and completion tokens.
data.items[].traceIdbodystring—TraceID is the trace the observation belongs to.
data.items[].typebodystring—Type is the observation kind, e.g. chat, embeddings, tool.
data.items[].userIdbodystring—UserID is the end user the observation is attributed to.
data.limitbodyinteger (int64)—Limit is the page cap the read ran with.
data.offsetbodyinteger (int64)—Offset is the row offset this page started at.
statusbodystring—Status is "success".

Failure carries the platform error shape — see Errors.

Examples

hanzo o11y llm observations
import { Configuration, O11yApi } from 'hanzoai';

const api = new O11yApi(new Configuration({ accessToken: process.env.HANZO_API_KEY }));
const { data } = await api.listLLMObservations();
from hanzoai.cloud import ApiClient, Configuration
from hanzoai.cloud.api import O11yApi

client = ApiClient(Configuration(access_token=os.environ["HANZO_API_KEY"]))
result = O11yApi(client).list_llm_observations()
cfg := hanzoai.NewConfiguration()
cfg.AddDefaultHeader("Authorization", "Bearer "+os.Getenv("HANZO_API_KEY"))
client := hanzoai.NewAPIClient(cfg)

resp, _, err := client.O11yAPI.ListLLMObservations(context.Background()).Execute()
if err != nil {
	return err
}
use hanzo_client::apis::{configuration::Configuration, o11y_api};

let mut cfg = Configuration::new();
cfg.bearer_access_token = std::env::var("HANZO_API_KEY").ok();

let result = o11y_api::list_llm_observations(&cfg, Default::default()).await?;
import ai.hanzo.cloud.ApiClient;
import ai.hanzo.cloud.api.O11yApi;

ApiClient client = new ApiClient();
client.setBearerToken(System.getenv("HANZO_API_KEY"));

var result = new O11yApi(client).listLLMObservations();
curl https://api.hanzo.ai/v1/o11y/llm/observations \
  -H "Authorization: Bearer $HANZO_API_KEY"

Tool o11y, op ListLLMObservations — POST the JSON-RPC envelope to https://api.hanzo.ai/v1/mcp.

curl -X POST https://api.hanzo.ai/v1/mcp \
  -H "Authorization: Bearer $HANZO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
       "jsonrpc": "2.0",
       "id": 1,
       "method": "tools/call",
       "params": {
         "name": "o11y",
         "arguments": {
           "op": "ListLLMObservations",
           "input": {}
         }
       }
     }'

O11y API · All Hanzo APIs · Interactive reference

Was this page useful?