{"$schema":"https://json-schema.org/draft/2020-12/schema","$id":"https://monitoringroom.com/api/msi/schema","title":"Monitoring Situation Index (MSI) — current reading","description":"The payload served by https://monitoringroom.com/api/msi. One observable index from 0.0 to 10.0 describing how much is happening in markets and the physical world, with the per-input freshness flags that say whether the number is a measurement or arithmetic with a hole in it.","x-formula-version":"v2.1","x-methodology":"https://monitoringroom.com/msi/methodology","x-licence":"https://monitoringroom.com/licence","type":"object","required":["score","trend","delta","band","components","weights","asOf","history","measured","formula_version"],"additionalProperties":true,"properties":{"score":{"type":"number","minimum":0,"maximum":10,"description":"The index, 0.0–10.0, rounded to one decimal. Only a measurement when `measured` is true."},"trend":{"type":"string","enum":["rising","falling","flat"],"description":"Direction against the previous stored sample (±0.15 deadband)."},"delta":{"type":"number","description":"Change against the previous stored sample, one decimal."},"band":{"type":"string","enum":["calm","background","active","escalating","intense"],"description":"Band the score falls in: <2, <4, <6, <8, else intense."},"components":{"type":"object","description":"Each input normalised to 0–1 before weighting.","required":["market","seismic","velocity"],"properties":{"market":{"type":"number","minimum":0,"maximum":1,"description":"Average absolute BTC/ETH 24h move ÷ 8 (CoinGecko)."},"seismic":{"type":"number","minimum":0,"maximum":1,"description":"M4.5+ earthquakes in the last 24h ÷ 40 (USGS)."},"velocity":{"type":"number","minimum":0,"maximum":1,"description":"Drift of the live base against the index's own trailing baseline. 0.5 is neutral and is what is reported until three samples exist."}}},"weights":{"type":"object","description":"Weights applied to `components`. Sum to 1.","required":["market","seismic","velocity"],"properties":{"market":{"type":"number"},"seismic":{"type":"number"},"velocity":{"type":"number"}}},"asOf":{"type":"string","format":"date-time","description":"When this pass was computed. Not when you requested it."},"history":{"type":"array","description":"Recent observed samples, oldest first, for a sparkline. Observed points only — the series pauses rather than backfilling.","items":{"type":"object","required":["t","score"],"properties":{"t":{"type":"integer","description":"Epoch milliseconds."},"score":{"type":"number","minimum":0,"maximum":10}}}},"persistent":{"type":"boolean","description":"True when the history is Redis-backed rather than memory-only."},"measured":{"type":"boolean","description":"TRUE only when every weighted input was observed on this pass. When false, `score` was computed with an input missing and must not be presented as a reading."},"sources":{"type":"array","description":"Per-input freshness, derived at response time.","items":{"type":"object","properties":{"id":{"type":"string"},"label":{"type":"string"},"state":{"type":"string","enum":["fresh","aging","stale","unknown"]},"note":{"type":"string"}}}},"freshness":{"type":"string","enum":["fresh","aging","stale","unknown"],"description":"Worst state across `sources`. An empty set reads unknown, never fresh."},"missingInputs":{"type":"array","items":{"type":"string"},"description":"Labels of inputs that were not observed on this pass."},"formula_version":{"type":"string","const":"v2.1","description":"The formula that produced `score`. The same datum the /msi Dataset structured data publishes; the two are templated from one constant and cannot disagree."},"methodology_url":{"type":"string","format":"uri","description":"Where the formula is written out input by input."},"schema_url":{"type":"string","format":"uri","description":"This document."}}}