Skip to content
sigiro
Esc
navigateopen⌘Jpreview

GET /v1/anomalies — the precomputed anomalies table, ALL signals, biggest shift first by the UNIT-FREE magnitude (after − before) / (after + before), computed at read, raw |after − before| breaking zero-baseline ties. Unit-free so shifts of different signals are comparable — raw deltas would let a µs latency shift dwarf every percentage shift. Ranking, not a threshold — every detected shift is returned. Rows are written continuously by the scheduled anomaly pass (BOCPD changepoints over each entity's persisted series — no thresholds), so reading here costs one table scan, never a detection run. The same rows drive `is_anomalous` and the anomaly findings in /v1/investigate.

Precomputed anomalies: worsening regime shifts (BOCPD changepoints, threshold-free) detected continuously over persisted 5-minute series of every signal — error_rate and latency_p95 per operation, log_volume, error_log_rate and profile_cost (the service’s total profiled cost) per service (the operation field holds the entity) — and persisted to the sigiro_anomalies table. Ordered by the unit-free shift magnitude (after - before) / (after + before) descending (1.0 = appeared from a zero baseline, 1/3 = doubled), so the most significant shifts lead regardless of the signal’s units — nothing is filtered out; judge significance from before/after (raw signal units: %, µs, logs, profile cost). Optionally filter by service and a from_ts/to_ts window (microseconds since the Unix epoch) over the shift time. Each row carries a ready-to-run drill_down_sql for POST /v1/query. Rows whose shifts fall in the same or adjacent 5-minute detection bucket on the same service share an incident_id — one incident across signals, not N independent anomalies (the correlation window is the detection pass’s own bucket resolution, never a tuned threshold); incident_id is null for uncorrelated rows.

GET/v1/anomalies
Authorization
AuthorizationBearer token (prefixed-api-key) · headerrequired
Path parameters
servicestringrequired
Filter to one service.
from_tsinteger<int64>required
Only shifts at or after this time (microseconds since the Unix epoch).
to_tsinteger<int64>required
Only shifts at or before this time (microseconds since the Unix epoch).
Responses
200Anomaly rows, biggest shift first
anomaliesAnomalyEntry[]required
Show properties
Array of AnomalyEntry
afternumber<double>required
Series mean from the shift onward.
beforenumber<double>required
Series mean before the shift, raw signal units (error %, p95 µs, logs per bucket, summed profile cost per bucket).
detected_atstringrequired
When the scheduled pass wrote this row (ISO timestamp).
directionstringrequired
Always "worsening" — improvements are never persisted.
drill_down_sqlstring | null
Ready-to-run SQL for POST /v1/query: the raw telemetry behind the shift (spans, logs, or profile samples, per the signal).
incident_idstring | null
Cross-signal correlation id. Rows sharing an id shifted in the same or adjacent 5-minute detection bucket on the same service — one incident, not N independent anomalies (the window is the detection pass's own bucket resolution, not a threshold). `null` when the row correlates with no other returned row. Computed over the rows this request returns, so `service`/window filters scope the grouping.
kindstringrequired
Detection kind, e.g. "changepoint" (BOCPD).
operationstringrequired
The entity the shifted series is keyed by: the derived operation identity (error_rate / latency_p95 — matches `operation_summaries[].operation` in /v1/investigate) or the service name (log_volume / error_log_rate / profile_cost).
service_namestringrequired
signalstringrequired
Which health series shifted: "error_rate", "latency_p95", "log_volume", "error_log_rate", or "profile_cost".
ts_shiftstringrequired
First bucket of the NEW regime (ISO timestamp).
ts_shift_usinteger<int64>required
`ts_shift` as µs since the Unix epoch — the value incident correlation buckets on.
401Missing or invalid bearer token
Request
curl -X GET "/v1/anomalies" \
  -H "Authorization: Bearer YOUR_TOKEN"
Response
{
  "anomalies": [
    {
      "after": 0,
      "before": 0,
      "detected_at": "string",
      "direction": "string",
      "drill_down_sql": "string",
      "incident_id": "string",
      "kind": "string",
      "operation": "string",
      "service_name": "string",
      "signal": "string",
      "ts_shift": "string",
      "ts_shift_us": 0
    }
  ]
}