---
title: "Public uptime stats"
method: GET
path: "/v1/uptime"
tags: ["Account"]
---

# Public uptime stats

`GET /v1/uptime`

## Request

- Base URL: `https://api.puntersedge.online`
- URL: `https://api.puntersedge.online/v1/uptime`
- Auth: API key in header `X-API-Key`

Public uptime stats — no auth required, 0 credits.

**`uptime_30d_pct` is nullable — type `number | null`, not `number`.** It is `null`, with `checks: 0`, whenever the monitor has written no samples inside the window: the buffer file is absent, or every sample in it predates the 30-day cutoff. A missing measurement is never reported as availability.

Guard before any arithmetic or `>=` comparison:

```python
pct = r.get("uptime_30d_pct")
ok = pct is not None and pct >= 99.9   # not: r["uptime_30d_pct"] >= 99.9
```

The no-measurement body in full:

```json
{
  "uptime_30d_pct": null,
  "checks": 0,
  "status": "no data yet",
  "probe_target": "https://puntersedge.online/ping",
  "measures": "puntersedge.online (website), not api.puntersedge.online",
  "note": "..."
}
```

`checks == 0` tests the same condition without touching the nullable field.

## Response `200`

Uptime stats. `uptime_30d_pct` is null — NOT 100 and not absent — when the window holds no samples.

- object
  - `uptime_30d_pct` number, nullable, required: Percentage of successful probes in the window, or NULL when the window contains no samples at all. Null means unmeasured, not 100. Guard before arithmetic or a >= comparison.
  - `checks` integer, required: Samples in the window. 0 is the non-null sentinel for the same condition that makes uptime_30d_pct null, and is always safe to compare.
  - `status` string: Present only in the no-measurement case: 'no data yet'.
  - `last_check` string, date-time, nullable
  - `last_status` 'ok' | 'fail'
  - `monitor_stale` boolean: True when the newest sample is over 15 minutes old.
  - `last_check_age_min` number, nullable
  - `window_first_check` string, date-time
  - `window_span_days` number: Span actually observed, which equals 30 only if the probe never missed a sample.
  - `probe_target` string, required
  - `measures` string, required
  - `note` string, required

## Other responses

- `401`: Missing or invalid API key. Send `X-API-Key`. See https://puntersedge.online/developers/errors
- `402`: Monthly credit allowance exhausted for this plan. Upgrade at https://puntersedge.online/api/pricing
- `429`: Rate limit exceeded for this plan. Honour the `Retry-After` header (seconds) before retrying. See https://puntersedge.online/developers/rate-limits
- `500`: Unexpected server error. Safe to retry with backoff.

---

[API](https://skmtc.dev/puntersedge/apis/puntersedge-odds-api.md) · [All operations](https://skmtc.dev/puntersedge/apis/puntersedge-odds-api/llms.txt) · [OpenAPI document](https://skmtc.dev/puntersedge/apis/puntersedge-odds-api/revisions/f35b6aab1946?raw)
