Endpoint Health

GET /v1/endpoints/{uuid}/health

Returns the latest health-check verdict plus rolled-up uptime statistics for an endpoint. The data comes from the platform's background health-check worker, which periodically probes the endpoint's public hostname.

Health checks must first be enabled for the endpoint via PUT /v1/endpoints/{uuid}/health-check. Endpoints with health checks disabled still respond to this call but the uptime fields will be 0 and last_check will be null.

Path parameters

uuid string (uuid) Req
Endpoint UUID.

Response (200 OK)

endpoint_uuid string (uuid)
The endpoint's uuid (the {uuid} in the path).
target string
tunnel (served by an agent) or app (an app's endpoint: static, managed, full-stack, WordPress or function).
app_state string
App endpoints only: live, paused (not probed while it lasts) or not_deployed (probed once a deploy is live).
status string
up or down. Down only after two failed probes in a row (or a failed first probe); one failed probe after a good one stays up. Omitted before the first probe.
has_active_agent boolean
true when at least one tunnel-agent is currently connected for this endpoint. For a tunnel target, dashboards typically show "No Agent Connected" instead of the probe verdict when this is false; an app target needs no agent.
uptime_24h number
Percentage of probes in the last 24 hours that were up, healthy or asleep (0–100, rounded to 2 decimals).
uptime_7d number
Same as uptime_24h, over the last 7 days.
uptime_30d number
Same as uptime_24h, over the last 30 days.
avg_latency_ms number
Mean response time of healthy probes over the last 24 hours, in milliseconds.
last_check object | null
The most recent probe result, or null when no probes have run yet. Fields: status (healthy = the endpoint answered 2xx, 3xx, 401 or 403; asleep = an idle function, not woken by the probe, which counts as up; unhealthy = any other HTTP code; error | timeout = no HTTP answer), status_code (HTTP code, or null on error/timeout), latency_ms, error_message, checked_at.
recent_checks array<object>
Up to 50 most-recent probe rows (newest first). Same field shape as last_check. Used by the admin timeline view; user dashboard ignores this.

Deprecated: until the sunset this response also carries the legacy integer endpoint_id and an integer id on each probe. Don't use them; read endpoint_uuid (probes have no public id).

Caching

Uptime aggregates are cached server-side for ~5 minutes; recent probes appear in last_check within seconds because they go through a separate Redis status cache.

Errors

401 Unauthorized
Missing auth.
403 Forbidden
Endpoint exists but belongs to another user.
404 Not Found
Endpoint doesn't exist.
Request
curl "https://api.ngris.com/v1/endpoints/<uuid>/health" \ -H "X-API-KEY: <your_api_key>"
Response — 200 OK
{ "endpoint_uuid": "019bb1e4-e785-77d2-9966-c3cff31d0a0e", "target": "tunnel", "status": "up", "has_active_agent": true, "uptime_24h": 99.86, "uptime_7d": 99.91, "uptime_30d": 99.78, "avg_latency_ms": 47.32, "last_check": { "status": "healthy", "status_code": 200, "latency_ms": 41, "error_message": null, "checked_at": "2026-05-12T13:00:05Z" }, "recent_checks": [ { "status": "healthy", "status_code": 200, "latency_ms": 41, "error_message": null, "checked_at": "2026-05-12T13:00:05Z" }, { "status": "unhealthy", "status_code": 502, "latency_ms": 38, "error_message": "HTTP 502 Bad Gateway", "checked_at": "2026-05-12T12:59:05Z" } ] }
Response — no agent connected
{ "target": "tunnel", "has_active_agent": false, "uptime_24h": 0, "uptime_7d": 99.10, "uptime_30d": 99.50, "avg_latency_ms": 0, "last_check": null, "recent_checks": [] }
Response — app endpoint, function asleep
{ "target": "app", "app_state": "live", "status": "up", "has_active_agent": false, "uptime_24h": 100, "uptime_7d": 100, "uptime_30d": 99.97, "avg_latency_ms": 58.4, "last_check": { "status": "asleep", "status_code": 204, "latency_ms": 31, "error_message": null, "checked_at": "2026-10-28T13:00:05Z" }, "recent_checks": [ { "status": "asleep", "status_code": 204, "latency_ms": 31, "error_message": null, "checked_at": "2026-10-28T13:00:05Z" } ] }
Was this helpful?
On this page
Endpoint Health
Was this helpful?