Skip to content

Get metering status and preview

GET
/v1/metering/report
curl --request GET \
--url http://localhost:8080/v1/metering/report

Returns the metering status (heartbeat enabled, air-gapped, endpoint, install id, last delivery and attempt, missed-heartbeat flag, license state) and the exact month-to-date heartbeat payload that would be sent now; nothing is sent. A heartbeat carries only the install id, version, period, closed-loan count and component health, never loan data. Admin or manager.

OK

Media typeapplication/json

GET /v1/metering/report: the status and the exact payload a heartbeat would send now.

object
status
required

Where metering stands for the operator screens: mode, last successful heartbeat, whether one has been missed (> 7 days), and the license.

object
heartbeatEnabled
required
boolean
airGapped
required
boolean
endpoint
required
string
installId
required
string
lastDeliveredAt
required
null | string format: date-time
lastAttemptAt
required
null | string format: date-time
lastError
required
null | string
missedHeartbeat
required
boolean
missedHeartbeatAfterDays
required
integer | string format: int32
/^-?(?:0|[1-9]\d*)$/
license
required

What the installed license currently allows.

object
installed
required
boolean
valid
required
boolean
expired
required
boolean
license
required
One of:
null
error
required
null | string
checkedAt
required
string format: date-time
intakeWritable

Intake is read-only once the license has expired; everything already in the system stays reachable.

boolean
payload
required

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
install_id
required
string
version
required
string
period
required

month for heartbeats (month-to-date), quarter for the air-gapped usage report.

object
kind
required
string
start
required
string format: date
end
required
string format: date
closed_loan_count
required
integer | string format: int32
/^-?(?:0|[1-9]\d*)$/
document_page_count
required
integer | string format: int32
/^-?(?:0|[1-9]\d*)$/
health
required

Coarse component status words (ok / degraded / unknown); no hostnames, no counts beyond the metered one.

object
database
required
string
inference
required
string
core
required
string
evidence
required
string
license_key
required
null | string
generated_at
required
string format: date-time
Examplegenerated
{
"status": {
"heartbeatEnabled": true,
"airGapped": true,
"endpoint": "example",
"installId": "example",
"lastDeliveredAt": "2026-04-15T12:00:00Z",
"lastAttemptAt": "2026-04-15T12:00:00Z",
"lastError": "example",
"missedHeartbeat": true,
"missedHeartbeatAfterDays": 1,
"license": {
"installed": true,
"valid": true,
"expired": true,
"license": {
"institution": "example",
"tier": "example",
"airGapped": true,
"expiresAt": "2026-04-15T12:00:00Z",
"installId": "example"
},
"error": "example",
"checkedAt": "2026-04-15T12:00:00Z",
"intakeWritable": true
}
},
"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"
}
}