Generate a signed usage report
const url = 'http://localhost:8080/v1/metering/usage-report';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/usage-reportAir-gapped path: builds the usage payload for a quarter (quarter like 2026Q3; default the current quarter), signs its canonical JSON with the install’s RS256 key and stores it for manual delivery. Administrators only. 400 for a malformed quarter.
Parameters
Section titled “Parameters”Query Parameters
Section titled “Query Parameters”Responses
Section titled “Responses”OK
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
{ "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"}