manifest

index/manifest.json: the entry point. Small, regenerated on every run, and the only thing a client needs to read to know what exists and how fresh it is.

SELECT schema_version,
       freshness.last_successful_run AS last_successful_run
FROM read_json('https://data.quartercall.com/index/manifest.json');
examples/tables/manifest/freshness.sql

The fields a client reads:

  • schema_version: refuse a major version you do not recognise; minors are safe to ignore.
  • quarters: every quarter from 2019Q1, newest first. For each: accounts_path, which means readable (how it's organised); status and updated_at (quarter status); profiles_missing, the winning filings with no profile row (gotcha 3).
  • submission_count and cu_count: what callbase holds, not what is published. Count the file (gotcha 6).
  • freshness.last_successful_run says the collector ran; freshness.service_watermark says how new the newest filing it collected is. Watch both: a collector that runs while NCUA is unreachable stays alive while the data ages.
  • quarters[].quorum: whether enough credit unions have filed the quarter to analyse it, as evidence and as a status under each policy in quorum_policies, with the per-filer rows in quorum. Absent for a quarter whose prior quarter is not held. It is as of the last callbase curate run (daily), so a sweep since can have moved cu_count past it.
  • index: where the submissions index is, how many rows it has, and first_seen_from.
  • inventory describes the collector, not the data. Its universe.record_count counts every credit union NCUA has ever held an id for, merged and liquidated ones included: it is not a denominator.

A field that describes something not built yet is omitted, not written as null. Test for a key's presence. The full field contract is §2 of the contract.

Contract schema 1.2 · docs built 2026-10-29 from platform 4894823