---
title: "Receive daemon heartbeat (DEPRECATED - for backwards compatibility with pre-v0.14.0 daemons)"
method: POST
path: "/api/daemons/{id}/heartbeat"
tags: ["Daemons", "internal", "deprecated"]
---

# Receive daemon heartbeat (DEPRECATED - for backwards compatibility with pre-v0.14.0 daemons)

`POST /api/daemons/{id}/heartbeat`

Internal endpoint for legacy daemons to send periodic heartbeats.
New daemons (v0.14.0+) use the /request-work endpoint which includes heartbeat functionality.
This endpoint is kept for backwards compatibility and will be removed in a future version.

## Path parameters

- `id` string, uuid, required

## Request body

- DaemonHeartbeatPayload — Legacy heartbeat payload for backwards compatibility with pre-v0.14.0 daemons. Old daemons call POST /api/daemons/{id}/heartbeat with this payload.
  - `mode` 'server_poll' | 'daemon_poll', required — Daemon operating mode that determines the communication pattern. - **DaemonPoll** (formerly "Pull"): Daemon makes outbound connections to the server. The daemon registers itself and polls for work. Best for daemons behind NAT/firewall. - **ServerPoll** (formerly "Push"): Server makes connections to the daemon. Server polls daemon for status and discovery results. Best for DMZ deployments where daemon cannot make outbound connections.
  - `name` string, required — Name the daemon reports for itself.
  - `url` string, required — URL the daemon is reachable at, as it sees itself.

## Response `200`

Heartbeat received

- ApiResponse
  - `data` TupleUnit — No payload. Present only so the envelope keeps its shape.
  - `error` string, nullable — Human-readable failure message. Omitted on success.
  - `meta` ApiMeta, required — API metadata included in all responses
    - `api_version` integer, required — API version (integer, increments on breaking changes)
    - `server_version` string, required — Server version (semver)
  - `success` boolean, required — `true` when the request succeeded. `false` responses carry `error` instead of `data`.

## Other responses

- `404` — Daemon not found

---

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