{"openapi":"3.1.0","info":{"title":"Reserve Analytics Signals API","version":"v2-beta","description":"Machine-readable contract for Reserve Analytics `/signals/*` endpoints."},"servers":[{"url":"https://reserveanalytics.co","description":"Production"},{"url":"http://localhost:3000","description":"Local development"}],"paths":{"/signals":{"get":{"security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string"},"description":"API key header. Alternatively use Authorization: Bearer <key>."},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string"},"description":"Bearer auth header. Alternatively use x-api-key."}],"responses":{"200":{"description":"Signal index payload","content":{"application/json":{"schema":{"type":"object","required":["signals","count","version"],"properties":{"signals":{"type":"array","items":{"type":"object","required":["slug","signal","name","endpoint","history_endpoint"],"properties":{"slug":{"type":"string"},"signal":{"type":"string"},"name":{"type":"string"},"endpoint":{"type":"string"},"history_endpoint":{"type":"string"},"status":{"type":"string","enum":["live","beta"]}}}},"coming_soon":{"type":"array","items":{"type":"object","required":["slug","signal","name","status"],"properties":{"slug":{"type":"string"},"signal":{"type":"string"},"name":{"type":"string"},"status":{"type":"string","enum":["coming_soon"]}}}},"count":{"type":"number"},"version":{"type":"string"}}}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"403":{"description":"Forbidden (insufficient scope)","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"429":{"description":"Rate limit or quota exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}},"503":{"description":"Temporarily unavailable","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}},"summary":"Signals index","description":"List available signal slugs and endpoint paths. Includes a coming_soon array for signals under development."}},"/signals/digital-liquidity-stress":{"get":{"security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string"},"description":"API key header. Alternatively use Authorization: Bearer <key>."},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string"},"description":"Bearer auth header. Alternatively use x-api-key."}],"responses":{"200":{"description":"Signal payload","content":{"application/json":{"schema":{"type":"object","required":["signal","score","regime","trend","confidence","last_updated","freshness","components","version"],"properties":{"signal":{"type":"string"},"slug":{"type":"string","description":"Hyphenated compatibility alias for signal key."},"score":{"type":["number","null"]},"value":{"type":["number","null"],"description":"Compatibility alias for score."},"regime":{"type":"string"},"trend":{"type":"string","enum":["rising","falling","flat","unknown"]},"confidence":{"type":"number","minimum":0,"maximum":1},"last_updated":{"type":["string","null"],"format":"date-time"},"as_of":{"type":["string","null"],"format":"date-time","description":"Compatibility alias for last_updated."},"freshness":{"type":"object","required":["as_of","expected_update_window_utc","staleness_seconds"],"properties":{"as_of":{"type":["string","null"],"format":"date-time"},"expected_update_window_utc":{"type":"string"},"staleness_seconds":{"type":["number","null"]}}},"components":{"type":"object","additionalProperties":{"type":["number","null"]}},"methodology_note":{"type":"string"},"version":{"type":"string"}}}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"403":{"description":"Forbidden (insufficient scope)","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"429":{"description":"Rate limit or quota exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}},"503":{"description":"Temporarily unavailable","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}},"summary":"Digital Liquidity Stress signal (beta)","description":"Flagship composite stress score (0-100) with 6 sub-components, regime classification, trend, and confidence. Currently in beta."}},"/signals/stablecoin-supply-momentum":{"get":{"security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string"},"description":"API key header. Alternatively use Authorization: Bearer <key>."},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string"},"description":"Bearer auth header. Alternatively use x-api-key."}],"responses":{"200":{"description":"Signal payload","content":{"application/json":{"schema":{"type":"object","required":["signal","score","regime","trend","confidence","last_updated","freshness","components","version"],"properties":{"signal":{"type":"string"},"slug":{"type":"string","description":"Hyphenated compatibility alias for signal key."},"score":{"type":["number","null"]},"value":{"type":["number","null"],"description":"Compatibility alias for score."},"regime":{"type":"string"},"trend":{"type":"string","enum":["rising","falling","flat","unknown"]},"confidence":{"type":"number","minimum":0,"maximum":1},"last_updated":{"type":["string","null"],"format":"date-time"},"as_of":{"type":["string","null"],"format":"date-time","description":"Compatibility alias for last_updated."},"freshness":{"type":"object","required":["as_of","expected_update_window_utc","staleness_seconds"],"properties":{"as_of":{"type":["string","null"],"format":"date-time"},"expected_update_window_utc":{"type":"string"},"staleness_seconds":{"type":["number","null"]}}},"components":{"type":"object","additionalProperties":{"type":["number","null"]}},"methodology_note":{"type":"string"},"version":{"type":"string"}}}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"403":{"description":"Forbidden (insufficient scope)","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"429":{"description":"Rate limit or quota exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}},"503":{"description":"Temporarily unavailable","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}},"summary":"Stablecoin Supply Momentum signal","description":"Signal for stablecoin growth/contracting conditions and liquidity direction using market-cap-weighted aggregate supply."}},"/signals/digital-yield-risk-premium":{"get":{"security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string"},"description":"API key header. Alternatively use Authorization: Bearer <key>."},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string"},"description":"Bearer auth header. Alternatively use x-api-key."}],"responses":{"200":{"description":"Signal payload","content":{"application/json":{"schema":{"type":"object","required":["signal","score","regime","trend","confidence","last_updated","freshness","components","version"],"properties":{"signal":{"type":"string"},"slug":{"type":"string","description":"Hyphenated compatibility alias for signal key."},"score":{"type":["number","null"]},"value":{"type":["number","null"],"description":"Compatibility alias for score."},"regime":{"type":"string"},"trend":{"type":"string","enum":["rising","falling","flat","unknown"]},"confidence":{"type":"number","minimum":0,"maximum":1},"last_updated":{"type":["string","null"],"format":"date-time"},"as_of":{"type":["string","null"],"format":"date-time","description":"Compatibility alias for last_updated."},"freshness":{"type":"object","required":["as_of","expected_update_window_utc","staleness_seconds"],"properties":{"as_of":{"type":["string","null"],"format":"date-time"},"expected_update_window_utc":{"type":"string"},"staleness_seconds":{"type":["number","null"]}}},"components":{"type":"object","additionalProperties":{"type":["number","null"]}},"methodology_note":{"type":"string"},"version":{"type":"string"}}}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"403":{"description":"Forbidden (insufficient scope)","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"429":{"description":"Rate limit or quota exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}},"503":{"description":"Temporarily unavailable","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}},"summary":"Digital Yield Risk Premium signal","description":"Signal comparing digital yields versus short-duration Treasury benchmark with decomposed primary/secondary/tertiary spreads."}},"/signals/{slug}/history":{"get":{"security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string"},"description":"API key header. Alternatively use Authorization: Bearer <key>."},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string"},"description":"Bearer auth header. Alternatively use x-api-key."},{"name":"slug","in":"path","required":true,"schema":{"type":"string","enum":["digital-liquidity-stress","stablecoin-supply-momentum","digital-yield-risk-premium"]}},{"name":"limit","in":"query","required":false,"schema":{"type":"number","minimum":30,"maximum":365}}],"responses":{"200":{"description":"Signal history payload","content":{"application/json":{"schema":{"type":"object","required":["slug","signal","points","count","as_of"],"properties":{"slug":{"type":"string"},"signal":{"type":"string"},"points":{"type":"array","items":{"type":"object","required":["as_of","value"],"properties":{"as_of":{"type":"string","format":"date-time"},"value":{"type":"number"}}}},"count":{"type":"number"},"as_of":{"type":["string","null"],"format":"date-time"}}}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"403":{"description":"Forbidden (insufficient scope)","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"429":{"description":"Rate limit or quota exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}},"503":{"description":"Temporarily unavailable","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}},"summary":"Signal history","description":"Historical values for a signal slug."}}},"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"x-api-key"}},"schemas":{"SignalEnvelope":{"type":"object","required":["signal","score","regime","trend","confidence","last_updated","freshness","components","version"],"properties":{"signal":{"type":"string"},"slug":{"type":"string","description":"Hyphenated compatibility alias for signal key."},"score":{"type":["number","null"]},"value":{"type":["number","null"],"description":"Compatibility alias for score."},"regime":{"type":"string"},"trend":{"type":"string","enum":["rising","falling","flat","unknown"]},"confidence":{"type":"number","minimum":0,"maximum":1},"last_updated":{"type":["string","null"],"format":"date-time"},"as_of":{"type":["string","null"],"format":"date-time","description":"Compatibility alias for last_updated."},"freshness":{"type":"object","required":["as_of","expected_update_window_utc","staleness_seconds"],"properties":{"as_of":{"type":["string","null"],"format":"date-time"},"expected_update_window_utc":{"type":"string"},"staleness_seconds":{"type":["number","null"]}}},"components":{"type":"object","additionalProperties":{"type":["number","null"]}},"methodology_note":{"type":"string"},"version":{"type":"string"}}},"SignalIndex":{"type":"object","required":["signals","count","version"],"properties":{"signals":{"type":"array","items":{"type":"object","required":["slug","signal","name","endpoint","history_endpoint"],"properties":{"slug":{"type":"string"},"signal":{"type":"string"},"name":{"type":"string"},"endpoint":{"type":"string"},"history_endpoint":{"type":"string"},"status":{"type":"string","enum":["live","beta"]}}}},"coming_soon":{"type":"array","items":{"type":"object","required":["slug","signal","name","status"],"properties":{"slug":{"type":"string"},"signal":{"type":"string"},"name":{"type":"string"},"status":{"type":"string","enum":["coming_soon"]}}}},"count":{"type":"number"},"version":{"type":"string"}}},"SignalHistory":{"type":"object","required":["slug","signal","points","count","as_of"],"properties":{"slug":{"type":"string"},"signal":{"type":"string"},"points":{"type":"array","items":{"type":"object","required":["as_of","value"],"properties":{"as_of":{"type":"string","format":"date-time"},"value":{"type":"number"}}}},"count":{"type":"number"},"as_of":{"type":["string","null"],"format":"date-time"}}}}}}