fleet
POST /v1/fleet/heartbeat
Stamp fleet liveness, ship the host report, collect queued commands.
Authentication
This endpoint does not take an API key. It takes its own credential, issued to the plugin or service that calls it, as a bearer token; see the description above.
This endpoint takes no organisation id. Your key already identifies the organisation it belongs to, and the response is scoped to it.
Try it
Replace anything in angle brackets with your own values, and the key placeholder with a key from your dashboard.
curl -X POST https://api.zinndigital.com/v1/fleet/heartbeat \
-H "Authorization: Bearer zdk_live_…" \
-H "Content-Type: application/json" \
-d '{ "instance_id": <string> }'Signed in? The API console in your dashboard fills in your real organisation id and your own key, and runs the request against the live API so you can see the actual response. Open this endpoint in the API console
Details
Sent every heartbeatIntervalSeconds. Carries the host health report — the same document the console has always shown — because the heartbeat and the report answer the same question, and one call means the report can never be fresher than the heartbeat it is judged against. This is where a declared box becomes real capacity. A host that has never heartbeated is promoted to active and starts accepting deploys on its first successful beat; every beat after that leaves acceptsDeploys untouched, so an operator's drain sticks across an agent restart. A down host that heartbeats again is revived to active or draining according to the operator's existing intent. A decommissioned host gets continue: false and nothing is written. The response carries any commands the engine claimed for this host (bounded per tick). The claim is still SELECT … FOR UPDATE SKIP LOCKED, so exactly-once semantics are unchanged; only who runs the query moved, because a worker box has no database connection.
Request body
| Name | Type | Required | What it is |
|---|---|---|---|
instance_id | string | Yes | — |
agent_version | string | No | — |
report | WorkerHostReport | No | One heartbeat's observed host state. |
claim_commands | boolean | No | False for a probe that reads the host's identity and discards the response (the converge's verify step). It claims no commands, so none is lost to a caller that will never run it. |
Response
| Name | Type | Required | What it is |
|---|---|---|---|
worker_id | string | No | — |
hostname | string | No | — |
status | string<provisioning, active, draining, down, decommissioned> | No | — |
accepts_deploys | boolean | No | — |
region | string | No | — |
pool | string | No | — |
driver | string | No | — |
capacity | integer | No | — |
product_lines | string[] | No | — |
heartbeat_interval_seconds | integer | No | How often to heartbeat, decided engine-side. The box no longer reads its own interval from an env file, so "the host-down window is ten missed beats" stays a fact about the… |
continue_running | boolean | No | False only for an answered "this host is gone" (decommissioned or removed). An error is never reported as one — that distinction is what stops a transient failure retiring a… |
commands | WorkerClaimedCommand[] | No | — |
Errors this endpoint can return
401 · 422 · 429