---
title: "Find alarms that stopped receiving data"
method: GET
path: "/orgs/{org_id}/alarms/health"
tags: ["alarms"]
---

# Find alarms that stopped receiving data

`GET /orgs/{org_id}/alarms/health`

For every enabled alarm, when the metric series behind it last produced a datapoint.

Answers the one question an alarm's own `state` cannot: is it still watching anything? Under the default `not_breaching` policy an alarm whose metric stopped being emitted — a deleted workforce, a disabled trace filter, a renamed metric — sits at `ok` indefinitely and looks identical to one that is genuinely healthy.

`stale` marks silence lasting ten evaluation windows (minimum one hour), which is long enough that a quiet-but-live series won't trip it. A brand-new alarm reads as stale until its first datapoint, which is accurate: it cannot fire yet.

For a ratio alarm, `last_datapoint_at` is the **older** of the two series, since a period only yields a datapoint where both sides have one. A live numerator over a dead denominator is therefore reported as stale — every period resolves to a missing ratio, so the alarm is blind despite one of its series still flowing. `denominator_last_datapoint_at` tells you which side went quiet.

Covers the same alarms `GET /orgs/{org_id}/alarms` returns for you, so `healthy` and `stale_count` describe your visible subset — a project-scoped caller gets their project's blind spots, not the org's.

## Path parameters

- `org_id` string, required

## Response `200`

Per-alarm data health

- OrgAlarmsHealthResBody — Wrapper for **GET** `/orgs/{org_id}/alarms/health`.
  - `alarms` AlarmDataHealth[], required
    - `denominator_last_datapoint_at` string, date-time, nullable
    - `denominator_metric_name` string, nullable — Set only for ratio alarms, so a caller can tell which side went quiet.
    - `id` integer, required
    - `last_datapoint_at` string, date-time, nullable — When this alarm could last have evaluated a period. For a ratio alarm this is the *older* of the two series, because `ratio_datapoints` yields a datapoint only where both sides have one — reporting the numerator alone would call an alarm healthy while every period actually resolves to missing. `null` = no evaluable period within the metric retention horizon, which for a ratio alarm includes "one of the two series never reported".
    - `metric_name` string, required
    - `name` string, required
    - `stale` boolean, required — The series has been silent long enough that the alarm is almost certainly watching something that no longer exists. Silence is counted from the alarm's creation when that is later than `last_datapoint_at`, so a freshly created alarm is not accused of being blind before it has had a chance to see anything. Same judgement `crate::alarms::staleness` notifies on.
    - `state` 'ok' | 'alarm' | 'insufficient_data', required
  - `healthy` boolean, required — `false` when any enabled alarm is `stale`.
  - `stale_count` integer, required — How many of `alarms` are stale, so a caller can alert on the count without walking the list.

## Other responses

- `403` — Forbidden

---

[API](https://skmtc.net/timbal-ai/apis/timbal-platform-api.md) · [All operations](https://skmtc.net/timbal-ai/apis/timbal-platform-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/timbal-ai/timbal-platform-api/versions/dd7e398ce0d3/schema)
