Catalogue health rollup
GET
/v1/catalogue/health
const url = 'https://api.aerandil.com/v1/catalogue/health';const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request GET \ --url https://api.aerandil.com/v1/catalogue/health \ --header 'Authorization: Bearer <token>'Per-tenant read-side aggregations over signals other proposals already write (proposal 0028 §6): consent posture (count of objects with a consent_scope.revoked_at tombstone, grouped by type — 0026), duplicate pressure (open person_merge_candidate count — 0027), and projection staleness (per _computed_at projection: live-row count and oldest refresh timestamp). Not a quality-rules engine; a rollup view.
Authorizations
Section titled “Authorizations”Responses
Section titled “Responses”The per-tenant catalogue health rollup.
Media typeapplication/json
object
consent_posture
required
object
revoked_by_type
required
Array<object>
object
total_revoked
required
integer
duplicate_pressure
required
object
open_person_merge_candidates
required
integer
staleness
required
Array<object>
object
object_type
required
string
oldest_computed_at
string | null format: date-time
projection
required
string
rows
required
integer
Examplegenerated
{ "consent_posture": { "revoked_by_type": [ {} ], "total_revoked": 1 }, "duplicate_pressure": { "open_person_merge_candidates": 1 }, "staleness": [ { "object_type": "example", "oldest_computed_at": "2026-04-15T12:00:00Z", "projection": "example", "rows": 1 } ]}