Send a heartbeat now
const url = 'http://localhost:8080/v1/metering/heartbeat';const options = {method: 'POST'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request POST \ --url http://localhost:8080/v1/metering/heartbeatOperator action: builds the month-to-date heartbeat and posts it to metering.endpoint immediately, even when heartbeats are disabled, the install is air-gapped or setup is not activated; the attempt and its outcome are recorded. Answers with sent: false and the reason (rather than an error) when metering.endpoint is not an absolute URL. Administrators only.
Responses
Section titled “Responses”OK
Outcome of one heartbeat run.
object
object
month for heartbeats (month-to-date), quarter for the air-gapped usage report.
object
What leaves the bank: install id, version, the period, two integers (closed loans, document pages), coarse health, and the license key for Bookend’s receiver to validate. Never loan data. The wire names are the documented snake_case ones on every surface (heartbeat, signed report, REST) so the payload viewer shows exactly what is sent.
object
month for heartbeats (month-to-date), quarter for the air-gapped usage report.
object
Coarse component status words (ok / degraded / unknown); no hostnames, no counts beyond the metered one.
object
Examplegenerated
{ "attempted": true, "delivered": true, "detail": "example", "report": { "id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "deliveryMode": "example", "period": { "kind": "example", "start": "2026-04-15", "end": "2026-04-15" }, "closedLoanCount": 1, "documentPageCount": 1, "payload": { "install_id": "example", "version": "example", "period": { "kind": "example", "start": "2026-04-15", "end": "2026-04-15" }, "closed_loan_count": 1, "document_page_count": 1, "health": { "database": "example", "inference": "example", "core": "example", "evidence": "example" }, "license_key": "example", "generated_at": "2026-04-15T12:00:00Z" }, "signature": "example", "signatureKeyId": "example", "deliveredAt": "2026-04-15T12:00:00Z", "generatedAt": "2026-04-15T12:00:00Z" }}