Read your org's series back over a time range
Answers `{count, series}`, where `count` is the number of matching SERIES and each series carries the samples that fall inside the window.
GET /v1/metrics/query
| Address | https://api.hanzo.ai/v1/metrics/query |
| Method | GET |
| Operation | get_metrics_query |
| Auth | Authorization: Bearer $HANZO_API_KEY |
Answers {count, series}, where count is the number of matching SERIES and each series carries the samples that fall inside the window. name selects one series name, and an absent or empty name returns every series the org holds. match is a k=v,k2=v2 label matcher applied as a SUPERSET test: a series matches when it carries all the named labels with those values, extra labels and all.
start and end are nanoseconds since the Unix epoch, and here is the rule worth knowing: a bound that is absent, empty or unparseable becomes 0, which this store reads as UNBOUNDED. A malformed start therefore silently widens the query instead of failing it. There is no limit parameter — the window and the matcher are the whole of what bounds the answer.
The tenant is the gateway-minted X-Org-Id header, falling back to the deployment brand and then default, so a query can only ever read the org the edge asserted.
Request
GET /v1/metrics/query takes no parameters and no body — the credential is the whole request.
Response
The document declares no response body for this operation. It answers 200 on success and the platform error shape on failure — see Errors.
Examples
hanzo metrics queryimport { Configuration, MetricsApi } from 'hanzoai';
const api = new MetricsApi(new Configuration({ accessToken: process.env.HANZO_API_KEY }));
const { data } = await api.getMetricsQuery();from hanzoai.cloud import ApiClient, Configuration
from hanzoai.cloud.api import MetricsApi
client = ApiClient(Configuration(access_token=os.environ["HANZO_API_KEY"]))
result = MetricsApi(client).get_metrics_query()cfg := cloud.NewConfiguration()
cfg.AddDefaultHeader("Authorization", "Bearer "+os.Getenv("HANZO_API_KEY"))
client := cloud.NewAPIClient(cfg)
resp, _, err := client.MetricsAPI.GetMetricsQuery(context.Background()).Execute()
if err != nil {
return err
}use hanzo_cloud::apis::{configuration::Configuration, metrics_api};
let mut cfg = Configuration::new();
cfg.bearer_access_token = std::env::var("HANZO_API_KEY").ok();
let result = metrics_api::get_metrics_query(&cfg, Default::default()).await?;import ai.hanzo.cloud.ApiClient;
import ai.hanzo.cloud.api.MetricsApi;
ApiClient client = new ApiClient();
client.setRequestInterceptor(b -> b.header("Authorization", "Bearer " + System.getenv("HANZO_API_KEY")));
var result = new MetricsApi(client).getMetricsQuery();curl https://api.hanzo.ai/v1/metrics/query \
-H "Authorization: Bearer $HANZO_API_KEY"The door reaches metrics through the metrics tool, which names its 11 operations with its own verbs — this one among them, under a name only the door declares. describe explains any of them:
curl -X POST https://api.hanzo.ai/v1/mcp \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "describe",
"arguments": {
"op": "get_log_health"
}
}
}'How is this guide?