# Get project runtime health

`GET https://api.instacloud.com/projects/{projectId}/runtime-health`

**Token scope:** `account` · `org` · `project` — read-only tokens allowed.

Live runtime health of a branch's compute + postgres + managed database services (one entry each; storage omitted — object storage has no runtime). 'standby' means scaled to zero and waking on request, NOT a failure.

## Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `branch` | query | `string` | no | branch to report on (omit for the project's default branch; must be non-empty) — scoped because a services table is per-branch, so reading every branch would cost a provider call per branch for rows the caller isn't showing |
| `projectId` | path | `string` | yes |  |

## Response 200

Default Response

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `services` | `object[]` | yes |  |
| `services.serviceId` | `string` | yes |  |
| `services.status` | `"healthy" \| "crashed" \| "starting" \| "standby" \| "offline" \| "none" \| "unknown"` | yes | healthy = started and answering (compute: at least one replica ready; postgres: instance running) · crashed = started but the check is critical / the machine or instance is in a failed state · starting = booting, no ready replicas yet · standby = scaled to zero at rest, wakes on request (normal) · offline = held down on purpose and NOT waking on request: stopped by the developer (start it to bring it back), or a reserved identity with no machine behind it yet (deploy to it) — insta-compute only · none = nothing deployed yet · unknown = the provider could not be read, or reported a state we don't recognize |
| `services.machines` | `integer` | yes | machines/instances the provider still knows about |
| `services.failing` | `integer` | yes | machines/instances failed or carrying a critical check |
| `services.lastRequestAt` | `string` | no | insta-compute only — when the plane last saw this service active, the clock its idle sweep consults before suspending. Omitted until the first activity, and on a plane that predates it. Evidence, not liveness: reading it renews nothing. |
| `services.lastActivitySource` | `string` | no | insta-compute only — what the last activity was: inbound_http · inbound_tcp · inbound_ip · outbound (measured egress, e.g. a worker calling a model) · shell_session · ready (a readiness probe) · unknown (recorded before the plane kept provenance). Open vocabulary: the plane may add sources. |
| `services.message` | `string` | no | insta-compute only — set when status is crashed: why the service failed, as the compute plane reported it |
| `services.desiredReplicas` | `integer` | no | compute only — replicas the plane is converging to now (an autoscaled service moves this within its cap) |
| `services.currentReplicas` | `integer` | no | compute only — live non-terminating replicas; omitted when the runtime cannot be read |
| `services.readyReplicas` | `integer` | no | compute only — live ready replicas; omitted when the runtime cannot be read |

## Response 404

Default Response

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `error` | `string` | yes |  |
