{"openapi":"3.1.0","info":{"title":"Bella Ciao Partner Data API","version":"1.0.0","description":"Bella Ciao Partner Data API v1 — read-only market-intelligence products (Layer-2 composite indices, El Profesor verdicts and crew consensus, agent reads, bilingual narratives, Market Lens snapshot) plus attributed public time-series. Every 2xx body is {data, meta}; every error is {detail, error_code, request_id}. Anonymous callers get Tier 0 (60 req/min per IP); send `X-API-Key` for Tier 1. Start with GET /api/v1/data/llms.txt. Not financial advice; paper-mode system.","termsOfService":"https://bellaciao.live/api-docs","contact":{"name":"Bella Ciao / Coinmania partner support","url":"https://bellaciao.live/api-docs"}},"servers":[{"url":"https://bellaciao.live","description":"Production"}],"paths":{"/api/v1/data/health":{"get":{"tags":["data"],"summary":"Partner liveness probe","description":"Liveness probe for partners. Served from a 60 s snapshot: overall status, last trading cycle and cadence, store health, per-product freshness. Anonymous; rate-limited under the /api/v1/data/ bucket.","operationId":"data_health","responses":{"200":{"description":"Success envelope {data, meta}","headers":{"X-Request-ID":{"description":"Trace id (echoes the caller's X-Request-ID when supplied)","schema":{"type":"string"}},"ETag":{"description":"Content hash of data+as_of; send back as If-None-Match for 304","schema":{"type":"string"}},"Last-Modified":{"description":"HTTP-date of meta.as_of","schema":{"type":"string"}},"Cache-Control":{"description":"public, max-age=N (60 latest · 300 catalog) or private, no-store (/me)","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests allowed per minute (per key, or per IP when anonymous)","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Requests left in the current minute","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Seconds until the window resets","schema":{"type":"string"}},"X-RateLimit-Policy":{"description":"e.g. 300;w=60, 100000;w=86400","schema":{"type":"string"}},"X-Quota-Limit":{"description":"Daily quota for keyed callers ('unlimited' when none)","schema":{"type":"string"}},"X-Quota-Remaining":{"description":"Daily quota left","schema":{"type":"string"}},"X-Quota-Reset":{"description":"ISO-8601 time the daily quota resets","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_HealthData_"}}}},"401":{"description":"API_KEY_REQUIRED or API_KEY_INVALID","headers":{"WWW-Authenticate":{"description":"X-API-Key","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"429":{"description":"RATE_LIMITED or QUOTA_EXCEEDED; honour Retry-After","headers":{"Retry-After":{"description":"Seconds to wait","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"503":{"description":"DATA_API_DISABLED (surface switched off), STORE_UNAVAILABLE, NARRATIVE_STORE_UNAVAILABLE; honour Retry-After","headers":{"Retry-After":{"description":"Seconds to wait","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}}},"security":[{},{"ApiKeyAuth":[]}]}},"/api/v1/data/catalog":{"get":{"tags":["data"],"summary":"Machine-readable product catalog","description":"Machine-readable product catalog: every product with tier/scope, cadence, history depth per tier, licence class, attribution and known gaps. `entitled` reflects the caller's key. Cache 300 s.","operationId":"data_catalog","security":[{},{"ApiKeyAuth":[]}],"parameters":[{"name":"kind","in":"query","required":false,"schema":{"anyOf":[{"enum":["composite","verdict","narrative","series"],"type":"string"},{"type":"null"}],"description":"Filter by product kind.","title":"Kind"},"description":"Filter by product kind."}],"responses":{"200":{"description":"Success envelope {data, meta}","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_CatalogData_"}}},"headers":{"X-Request-ID":{"schema":{"type":"string"},"description":"Trace id (echoes the caller's X-Request-ID when supplied)"},"ETag":{"schema":{"type":"string"},"description":"Content hash of data+as_of; send back as If-None-Match for 304"},"Last-Modified":{"schema":{"type":"string"},"description":"HTTP-date of meta.as_of"},"Cache-Control":{"schema":{"type":"string"},"description":"public, max-age=N (60 latest · 300 catalog) or private, no-store (/me)"},"X-RateLimit-Limit":{"schema":{"type":"string"},"description":"Requests allowed per minute (per key, or per IP when anonymous)"},"X-RateLimit-Remaining":{"schema":{"type":"string"},"description":"Requests left in the current minute"},"X-RateLimit-Reset":{"schema":{"type":"string"},"description":"Seconds until the window resets"},"X-RateLimit-Policy":{"schema":{"type":"string"},"description":"e.g. 300;w=60, 100000;w=86400"},"X-Quota-Limit":{"schema":{"type":"string"},"description":"Daily quota for keyed callers ('unlimited' when none)"},"X-Quota-Remaining":{"schema":{"type":"string"},"description":"Daily quota left"},"X-Quota-Reset":{"schema":{"type":"string"},"description":"ISO-8601 time the daily quota resets"}}},"400":{"description":"Bad request: UNKNOWN_ASSET, UNKNOWN_INDEX, INVALID_CURSOR, INVALID_RANGE, RANGE_TOO_LARGE, TOO_MANY_IDS","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"401":{"description":"API_KEY_REQUIRED or API_KEY_INVALID","headers":{"WWW-Authenticate":{"schema":{"type":"string"},"description":"X-API-Key"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"403":{"description":"SCOPE_MISSING, TIER_INSUFFICIENT, RANGE_EXCEEDS_TIER, SERIES_NOT_LICENSED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"404":{"description":"PRODUCT_NOT_FOUND, SOURCE_NOT_FOUND, METRIC_NOT_FOUND, CYCLE_NOT_FOUND, NARRATIVE_NOT_FOUND, AGENT_NOT_FOUND","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"422":{"description":"VALIDATION_ERROR (detail = first message; errors[] kept)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"429":{"description":"RATE_LIMITED or QUOTA_EXCEEDED; honour Retry-After","headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds to wait"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"503":{"description":"DATA_API_DISABLED (surface switched off), STORE_UNAVAILABLE, NARRATIVE_STORE_UNAVAILABLE; honour Retry-After","headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds to wait"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}}}}},"/api/v1/data/catalog/{product_id}":{"get":{"tags":["data"],"summary":"Full contract of one product","description":"Full contract of one product: field-level schema, allowed dimension values, methodology (component weights and anchor RANGES for composites), earliest available date and a sample URL.","operationId":"data_catalog_product","security":[{},{"ApiKeyAuth":[]}],"parameters":[{"name":"product_id","in":"path","required":true,"schema":{"type":"string","description":"Product id from GET /catalog, e.g. composite.derivatives or series.","title":"Product Id"},"description":"Product id from GET /catalog, e.g. composite.derivatives or series."}],"responses":{"200":{"description":"Success envelope {data, meta}","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_CatalogProductDetail_"}}},"headers":{"X-Request-ID":{"schema":{"type":"string"},"description":"Trace id (echoes the caller's X-Request-ID when supplied)"},"ETag":{"schema":{"type":"string"},"description":"Content hash of data+as_of; send back as If-None-Match for 304"},"Last-Modified":{"schema":{"type":"string"},"description":"HTTP-date of meta.as_of"},"Cache-Control":{"schema":{"type":"string"},"description":"public, max-age=N (60 latest · 300 catalog) or private, no-store (/me)"},"X-RateLimit-Limit":{"schema":{"type":"string"},"description":"Requests allowed per minute (per key, or per IP when anonymous)"},"X-RateLimit-Remaining":{"schema":{"type":"string"},"description":"Requests left in the current minute"},"X-RateLimit-Reset":{"schema":{"type":"string"},"description":"Seconds until the window resets"},"X-RateLimit-Policy":{"schema":{"type":"string"},"description":"e.g. 300;w=60, 100000;w=86400"},"X-Quota-Limit":{"schema":{"type":"string"},"description":"Daily quota for keyed callers ('unlimited' when none)"},"X-Quota-Remaining":{"schema":{"type":"string"},"description":"Daily quota left"},"X-Quota-Reset":{"schema":{"type":"string"},"description":"ISO-8601 time the daily quota resets"}}},"400":{"description":"Bad request: UNKNOWN_ASSET, UNKNOWN_INDEX, INVALID_CURSOR, INVALID_RANGE, RANGE_TOO_LARGE, TOO_MANY_IDS","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"401":{"description":"API_KEY_REQUIRED or API_KEY_INVALID","headers":{"WWW-Authenticate":{"schema":{"type":"string"},"description":"X-API-Key"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"403":{"description":"SCOPE_MISSING, TIER_INSUFFICIENT, RANGE_EXCEEDS_TIER, SERIES_NOT_LICENSED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"404":{"description":"PRODUCT_NOT_FOUND, SOURCE_NOT_FOUND, METRIC_NOT_FOUND, CYCLE_NOT_FOUND, NARRATIVE_NOT_FOUND, AGENT_NOT_FOUND","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"422":{"description":"VALIDATION_ERROR (detail = first message; errors[] kept)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"429":{"description":"RATE_LIMITED or QUOTA_EXCEEDED; honour Retry-After","headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds to wait"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"503":{"description":"DATA_API_DISABLED (surface switched off), STORE_UNAVAILABLE, NARRATIVE_STORE_UNAVAILABLE; honour Retry-After","headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds to wait"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}}}}},"/api/v1/data/sources":{"get":{"tags":["data"],"summary":"Per-source freshness board","description":"Per-source freshness board for all raw lake tables (80 today): status against the EFFECTIVE cadence, degraded reasons, ts_semantics, which products a source feeds. Metadata only — no raw values. Deliberately paused sources are hidden unless include_paused=true; `total_sources`, `listed` and `excluded_paused` make the counts explicit. Filters: provider, product, status (comma list), include_paused.","operationId":"data_sources","security":[{},{"ApiKeyAuth":[]}],"parameters":[{"name":"provider","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Provider name or key, e.g. FRED, binance, coinglass.","title":"Provider"},"description":"Provider name or key, e.g. FRED, binance, coinglass."},{"name":"product","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Only sources feeding this product id, e.g. composite.derivatives.","title":"Product"},"description":"Only sources feeding this product id, e.g. composite.derivatives."},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Comma-separated statuses: fresh,aging,stale,degraded,unavailable,never,paused.","title":"Status"},"description":"Comma-separated statuses: fresh,aging,stale,degraded,unavailable,never,paused."},{"name":"include_paused","in":"query","required":false,"schema":{"type":"boolean","description":"Include deliberately paused sources.","default":false,"title":"Include Paused"},"description":"Include deliberately paused sources."}],"responses":{"200":{"description":"Success envelope {data, meta}","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_SourcesData_"}}},"headers":{"X-Request-ID":{"schema":{"type":"string"},"description":"Trace id (echoes the caller's X-Request-ID when supplied)"},"ETag":{"schema":{"type":"string"},"description":"Content hash of data+as_of; send back as If-None-Match for 304"},"Last-Modified":{"schema":{"type":"string"},"description":"HTTP-date of meta.as_of"},"Cache-Control":{"schema":{"type":"string"},"description":"public, max-age=N (60 latest · 300 catalog) or private, no-store (/me)"},"X-RateLimit-Limit":{"schema":{"type":"string"},"description":"Requests allowed per minute (per key, or per IP when anonymous)"},"X-RateLimit-Remaining":{"schema":{"type":"string"},"description":"Requests left in the current minute"},"X-RateLimit-Reset":{"schema":{"type":"string"},"description":"Seconds until the window resets"},"X-RateLimit-Policy":{"schema":{"type":"string"},"description":"e.g. 300;w=60, 100000;w=86400"},"X-Quota-Limit":{"schema":{"type":"string"},"description":"Daily quota for keyed callers ('unlimited' when none)"},"X-Quota-Remaining":{"schema":{"type":"string"},"description":"Daily quota left"},"X-Quota-Reset":{"schema":{"type":"string"},"description":"ISO-8601 time the daily quota resets"}}},"400":{"description":"Bad request: UNKNOWN_ASSET, UNKNOWN_INDEX, INVALID_CURSOR, INVALID_RANGE, RANGE_TOO_LARGE, TOO_MANY_IDS","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"401":{"description":"API_KEY_REQUIRED or API_KEY_INVALID","headers":{"WWW-Authenticate":{"schema":{"type":"string"},"description":"X-API-Key"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"403":{"description":"SCOPE_MISSING, TIER_INSUFFICIENT, RANGE_EXCEEDS_TIER, SERIES_NOT_LICENSED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"404":{"description":"PRODUCT_NOT_FOUND, SOURCE_NOT_FOUND, METRIC_NOT_FOUND, CYCLE_NOT_FOUND, NARRATIVE_NOT_FOUND, AGENT_NOT_FOUND","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"422":{"description":"VALIDATION_ERROR (detail = first message; errors[] kept)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"429":{"description":"RATE_LIMITED or QUOTA_EXCEEDED; honour Retry-After","headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds to wait"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"503":{"description":"DATA_API_DISABLED (surface switched off), STORE_UNAVAILABLE, NARRATIVE_STORE_UNAVAILABLE; honour Retry-After","headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds to wait"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}}}}},"/api/v1/data/sources/{source_id}":{"get":{"tags":["data"],"summary":"One source's contract + freshness","description":"One source's contract and freshness plus the plain-language exposure rule (what partners may receive from it) and attribution.","operationId":"data_source_detail","security":[{},{"ApiKeyAuth":[]}],"parameters":[{"name":"source_id","in":"path","required":true,"schema":{"type":"string","description":"Raw source id from GET /sources, e.g. alt_fear_greed.","title":"Source Id"},"description":"Raw source id from GET /sources, e.g. alt_fear_greed."}],"responses":{"200":{"description":"Success envelope {data, meta}","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_SourceDetailData_"}}},"headers":{"X-Request-ID":{"schema":{"type":"string"},"description":"Trace id (echoes the caller's X-Request-ID when supplied)"},"ETag":{"schema":{"type":"string"},"description":"Content hash of data+as_of; send back as If-None-Match for 304"},"Last-Modified":{"schema":{"type":"string"},"description":"HTTP-date of meta.as_of"},"Cache-Control":{"schema":{"type":"string"},"description":"public, max-age=N (60 latest · 300 catalog) or private, no-store (/me)"},"X-RateLimit-Limit":{"schema":{"type":"string"},"description":"Requests allowed per minute (per key, or per IP when anonymous)"},"X-RateLimit-Remaining":{"schema":{"type":"string"},"description":"Requests left in the current minute"},"X-RateLimit-Reset":{"schema":{"type":"string"},"description":"Seconds until the window resets"},"X-RateLimit-Policy":{"schema":{"type":"string"},"description":"e.g. 300;w=60, 100000;w=86400"},"X-Quota-Limit":{"schema":{"type":"string"},"description":"Daily quota for keyed callers ('unlimited' when none)"},"X-Quota-Remaining":{"schema":{"type":"string"},"description":"Daily quota left"},"X-Quota-Reset":{"schema":{"type":"string"},"description":"ISO-8601 time the daily quota resets"}}},"400":{"description":"Bad request: UNKNOWN_ASSET, UNKNOWN_INDEX, INVALID_CURSOR, INVALID_RANGE, RANGE_TOO_LARGE, TOO_MANY_IDS","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"401":{"description":"API_KEY_REQUIRED or API_KEY_INVALID","headers":{"WWW-Authenticate":{"schema":{"type":"string"},"description":"X-API-Key"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"403":{"description":"SCOPE_MISSING, TIER_INSUFFICIENT, RANGE_EXCEEDS_TIER, SERIES_NOT_LICENSED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"404":{"description":"PRODUCT_NOT_FOUND, SOURCE_NOT_FOUND, METRIC_NOT_FOUND, CYCLE_NOT_FOUND, NARRATIVE_NOT_FOUND, AGENT_NOT_FOUND","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"422":{"description":"VALIDATION_ERROR (detail = first message; errors[] kept)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"429":{"description":"RATE_LIMITED or QUOTA_EXCEEDED; honour Retry-After","headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds to wait"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"503":{"description":"DATA_API_DISABLED (surface switched off), STORE_UNAVAILABLE, NARRATIVE_STORE_UNAVAILABLE; honour Retry-After","headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds to wait"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}}}}},"/api/v1/data/changelog":{"get":{"tags":["data"],"summary":"Machine-readable partner changelog","description":"Machine-readable partner changelog: additions, changes, deprecations (with sunset), methodology bumps and data notes. Filter with since=YYYY-MM-DD and type.","operationId":"data_changelog","security":[{},{"ApiKeyAuth":[]}],"parameters":[{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},{"type":"null"}],"description":"Only entries on/after this date (YYYY-MM-DD).","examples":["2026-09-01"],"title":"Since"},"description":"Only entries on/after this date (YYYY-MM-DD)."},{"name":"type","in":"query","required":false,"schema":{"anyOf":[{"enum":["added","changed","deprecated","removed","methodology","data-note"],"type":"string"},{"type":"null"}],"description":"Filter by entry type.","title":"Type"},"description":"Filter by entry type."}],"responses":{"200":{"description":"Success envelope {data, meta}","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_ChangelogData_"}}},"headers":{"X-Request-ID":{"schema":{"type":"string"},"description":"Trace id (echoes the caller's X-Request-ID when supplied)"},"ETag":{"schema":{"type":"string"},"description":"Content hash of data+as_of; send back as If-None-Match for 304"},"Last-Modified":{"schema":{"type":"string"},"description":"HTTP-date of meta.as_of"},"Cache-Control":{"schema":{"type":"string"},"description":"public, max-age=N (60 latest · 300 catalog) or private, no-store (/me)"},"X-RateLimit-Limit":{"schema":{"type":"string"},"description":"Requests allowed per minute (per key, or per IP when anonymous)"},"X-RateLimit-Remaining":{"schema":{"type":"string"},"description":"Requests left in the current minute"},"X-RateLimit-Reset":{"schema":{"type":"string"},"description":"Seconds until the window resets"},"X-RateLimit-Policy":{"schema":{"type":"string"},"description":"e.g. 300;w=60, 100000;w=86400"},"X-Quota-Limit":{"schema":{"type":"string"},"description":"Daily quota for keyed callers ('unlimited' when none)"},"X-Quota-Remaining":{"schema":{"type":"string"},"description":"Daily quota left"},"X-Quota-Reset":{"schema":{"type":"string"},"description":"ISO-8601 time the daily quota resets"}}},"400":{"description":"Bad request: UNKNOWN_ASSET, UNKNOWN_INDEX, INVALID_CURSOR, INVALID_RANGE, RANGE_TOO_LARGE, TOO_MANY_IDS","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"401":{"description":"API_KEY_REQUIRED or API_KEY_INVALID","headers":{"WWW-Authenticate":{"schema":{"type":"string"},"description":"X-API-Key"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"403":{"description":"SCOPE_MISSING, TIER_INSUFFICIENT, RANGE_EXCEEDS_TIER, SERIES_NOT_LICENSED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"404":{"description":"PRODUCT_NOT_FOUND, SOURCE_NOT_FOUND, METRIC_NOT_FOUND, CYCLE_NOT_FOUND, NARRATIVE_NOT_FOUND, AGENT_NOT_FOUND","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"422":{"description":"VALIDATION_ERROR (detail = first message; errors[] kept)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"429":{"description":"RATE_LIMITED or QUOTA_EXCEEDED; honour Retry-After","headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds to wait"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"503":{"description":"DATA_API_DISABLED (surface switched off), STORE_UNAVAILABLE, NARRATIVE_STORE_UNAVAILABLE; honour Retry-After","headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds to wait"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}}}}},"/api/v1/data/me":{"get":{"tags":["data"],"summary":"Key self-service: entitlements + own consumption","description":"Key self-service (Tier ≥ 1): entitlements, effective scopes, limits, today's consumption and daily aggregates of your own usage. Private, no-store.","operationId":"data_me","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":30,"minimum":1,"description":"Days of daily usage aggregates to return.","default":7,"title":"Days"},"description":"Days of daily usage aggregates to return."}],"responses":{"200":{"description":"Success envelope {data, meta}","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_MeData_"}}},"headers":{"X-Request-ID":{"schema":{"type":"string"},"description":"Trace id (echoes the caller's X-Request-ID when supplied)"},"ETag":{"schema":{"type":"string"},"description":"Content hash of data+as_of; send back as If-None-Match for 304"},"Last-Modified":{"schema":{"type":"string"},"description":"HTTP-date of meta.as_of"},"Cache-Control":{"schema":{"type":"string"},"description":"public, max-age=N (60 latest · 300 catalog) or private, no-store (/me)"},"X-RateLimit-Limit":{"schema":{"type":"string"},"description":"Requests allowed per minute (per key, or per IP when anonymous)"},"X-RateLimit-Remaining":{"schema":{"type":"string"},"description":"Requests left in the current minute"},"X-RateLimit-Reset":{"schema":{"type":"string"},"description":"Seconds until the window resets"},"X-RateLimit-Policy":{"schema":{"type":"string"},"description":"e.g. 300;w=60, 100000;w=86400"},"X-Quota-Limit":{"schema":{"type":"string"},"description":"Daily quota for keyed callers ('unlimited' when none)"},"X-Quota-Remaining":{"schema":{"type":"string"},"description":"Daily quota left"},"X-Quota-Reset":{"schema":{"type":"string"},"description":"ISO-8601 time the daily quota resets"}}},"400":{"description":"Bad request: UNKNOWN_ASSET, UNKNOWN_INDEX, INVALID_CURSOR, INVALID_RANGE, RANGE_TOO_LARGE, TOO_MANY_IDS","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"401":{"description":"API_KEY_REQUIRED or API_KEY_INVALID","headers":{"WWW-Authenticate":{"schema":{"type":"string"},"description":"X-API-Key"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"403":{"description":"SCOPE_MISSING, TIER_INSUFFICIENT, RANGE_EXCEEDS_TIER, SERIES_NOT_LICENSED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"404":{"description":"PRODUCT_NOT_FOUND, SOURCE_NOT_FOUND, METRIC_NOT_FOUND, CYCLE_NOT_FOUND, NARRATIVE_NOT_FOUND, AGENT_NOT_FOUND","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"422":{"description":"VALIDATION_ERROR (detail = first message; errors[] kept)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"429":{"description":"RATE_LIMITED or QUOTA_EXCEEDED; honour Retry-After","headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds to wait"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"503":{"description":"DATA_API_DISABLED (surface switched off), STORE_UNAVAILABLE, NARRATIVE_STORE_UNAVAILABLE; honour Retry-After","headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds to wait"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}}}}},"/api/v1/data/composites/latest":{"get":{"tags":["data"],"summary":"Latest Layer-2 indices per asset","description":"Latest Layer-2 indices (0–100) per asset: sentiment, onchain, derivatives, macro, fundamental. Each index reports methodology version, contributing components, input freshness, `degraded` and warnings. Components (5-point buckets) need Tier 1 + data:components and the legal flag. Poll ≥ 60 s; data changes once per trading cycle.","operationId":"data_composites_latest","security":[{},{"ApiKeyAuth":[]}],"parameters":[{"name":"asset","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Comma-separated tickers, subset of BTC,ETH,SOL. Default: all three.","examples":["ETH","BTC,ETH"],"title":"Asset"},"description":"Comma-separated tickers, subset of BTC,ETH,SOL. Default: all three."},{"name":"index","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Comma-separated index names, subset of sentiment,onchain,derivatives,macro,fundamental. Default: all.","examples":["derivatives","sentiment,onchain"],"title":"Index"},"description":"Comma-separated index names, subset of sentiment,onchain,derivatives,macro,fundamental. Default: all."}],"responses":{"200":{"description":"Success envelope {data, meta}","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_CompositesLatestData_"}}},"headers":{"X-Request-ID":{"schema":{"type":"string"},"description":"Trace id (echoes the caller's X-Request-ID when supplied)"},"ETag":{"schema":{"type":"string"},"description":"Content hash of data+as_of; send back as If-None-Match for 304"},"Last-Modified":{"schema":{"type":"string"},"description":"HTTP-date of meta.as_of"},"Cache-Control":{"schema":{"type":"string"},"description":"public, max-age=N (60 latest · 300 catalog) or private, no-store (/me)"},"X-RateLimit-Limit":{"schema":{"type":"string"},"description":"Requests allowed per minute (per key, or per IP when anonymous)"},"X-RateLimit-Remaining":{"schema":{"type":"string"},"description":"Requests left in the current minute"},"X-RateLimit-Reset":{"schema":{"type":"string"},"description":"Seconds until the window resets"},"X-RateLimit-Policy":{"schema":{"type":"string"},"description":"e.g. 300;w=60, 100000;w=86400"},"X-Quota-Limit":{"schema":{"type":"string"},"description":"Daily quota for keyed callers ('unlimited' when none)"},"X-Quota-Remaining":{"schema":{"type":"string"},"description":"Daily quota left"},"X-Quota-Reset":{"schema":{"type":"string"},"description":"ISO-8601 time the daily quota resets"}}},"400":{"description":"Bad request: UNKNOWN_ASSET, UNKNOWN_INDEX, INVALID_CURSOR, INVALID_RANGE, RANGE_TOO_LARGE, TOO_MANY_IDS","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"401":{"description":"API_KEY_REQUIRED or API_KEY_INVALID","headers":{"WWW-Authenticate":{"schema":{"type":"string"},"description":"X-API-Key"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"403":{"description":"SCOPE_MISSING, TIER_INSUFFICIENT, RANGE_EXCEEDS_TIER, SERIES_NOT_LICENSED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"404":{"description":"PRODUCT_NOT_FOUND, SOURCE_NOT_FOUND, METRIC_NOT_FOUND, CYCLE_NOT_FOUND, NARRATIVE_NOT_FOUND, AGENT_NOT_FOUND","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"422":{"description":"VALIDATION_ERROR (detail = first message; errors[] kept)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"429":{"description":"RATE_LIMITED or QUOTA_EXCEEDED; honour Retry-After","headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds to wait"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"503":{"description":"DATA_API_DISABLED (surface switched off), STORE_UNAVAILABLE, NARRATIVE_STORE_UNAVAILABLE; honour Retry-After","headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds to wait"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}}}}},"/api/v1/data/verdicts/latest":{"get":{"tags":["data"],"summary":"El Profesor verdict + weighted consensus","description":"El Profesor's verdict for the latest cycle with the deterministic weighted crew consensus, vote tally and per-agent votes. Never carries trade instructions. `mode` says paper/live. Per-agent summaries and consensus breakdown need Tier 1 + data:agents.","operationId":"data_verdicts_latest","responses":{"200":{"description":"Success envelope {data, meta}","headers":{"X-Request-ID":{"description":"Trace id (echoes the caller's X-Request-ID when supplied)","schema":{"type":"string"}},"ETag":{"description":"Content hash of data+as_of; send back as If-None-Match for 304","schema":{"type":"string"}},"Last-Modified":{"description":"HTTP-date of meta.as_of","schema":{"type":"string"}},"Cache-Control":{"description":"public, max-age=N (60 latest · 300 catalog) or private, no-store (/me)","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests allowed per minute (per key, or per IP when anonymous)","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Requests left in the current minute","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Seconds until the window resets","schema":{"type":"string"}},"X-RateLimit-Policy":{"description":"e.g. 300;w=60, 100000;w=86400","schema":{"type":"string"}},"X-Quota-Limit":{"description":"Daily quota for keyed callers ('unlimited' when none)","schema":{"type":"string"}},"X-Quota-Remaining":{"description":"Daily quota left","schema":{"type":"string"}},"X-Quota-Reset":{"description":"ISO-8601 time the daily quota resets","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_VerdictLatestData_"}}}},"400":{"description":"Bad request: UNKNOWN_ASSET, UNKNOWN_INDEX, INVALID_CURSOR, INVALID_RANGE, RANGE_TOO_LARGE, TOO_MANY_IDS","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"401":{"description":"API_KEY_REQUIRED or API_KEY_INVALID","headers":{"WWW-Authenticate":{"description":"X-API-Key","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"403":{"description":"SCOPE_MISSING, TIER_INSUFFICIENT, RANGE_EXCEEDS_TIER, SERIES_NOT_LICENSED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"404":{"description":"PRODUCT_NOT_FOUND, SOURCE_NOT_FOUND, METRIC_NOT_FOUND, CYCLE_NOT_FOUND, NARRATIVE_NOT_FOUND, AGENT_NOT_FOUND","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"422":{"description":"VALIDATION_ERROR (detail = first message; errors[] kept)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"429":{"description":"RATE_LIMITED or QUOTA_EXCEEDED; honour Retry-After","headers":{"Retry-After":{"description":"Seconds to wait","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"503":{"description":"DATA_API_DISABLED (surface switched off), STORE_UNAVAILABLE, NARRATIVE_STORE_UNAVAILABLE; honour Retry-After","headers":{"Retry-After":{"description":"Seconds to wait","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}}},"security":[{},{"ApiKeyAuth":[]}]}},"/api/v1/data/verdicts/history":{"get":{"tags":["data"],"summary":"Verdict/consensus series","description":"Verdict/consensus series, newest first. Anonymous: fixed last 24 cycles. Tier 1 + data:history: from/to ranges (≤ 365 d) with keyset cursor pagination; `meta.gaps` lists known outages overlapping the window.","operationId":"data_verdicts_history","security":[{},{"ApiKeyAuth":[]}],"parameters":[{"name":"from","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Window start, ISO-8601 UTC (inclusive). Ranges need Tier 1 + data:history; anonymous callers get the fixed last 24 cycles.","examples":["2026-08-01T00:00:00+00:00"],"title":"From"},"description":"Window start, ISO-8601 UTC (inclusive). Ranges need Tier 1 + data:history; anonymous callers get the fixed last 24 cycles."},{"name":"to","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Window end, ISO-8601 UTC (exclusive). Default now.","examples":["2026-09-01T00:00:00+00:00"],"title":"To"},"description":"Window end, ISO-8601 UTC (exclusive). Default now."},{"name":"signal","in":"query","required":false,"schema":{"anyOf":[{"enum":["bullish","bearish","neutral","monitoring"],"type":"string"},{"type":"null"}],"description":"Only cycles with this verdict signal.","title":"Signal"},"description":"Only cycles with this verdict signal."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"description":"Page size. Anonymous callers must leave the default 24.","default":24,"title":"Limit"},"description":"Page size. Anonymous callers must leave the default 24."},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Opaque cursor from meta.next_cursor (Tier 1).","title":"Cursor"},"description":"Opaque cursor from meta.next_cursor (Tier 1)."},{"name":"include_agents","in":"query","required":false,"schema":{"type":"boolean","description":"Add per-agent votes to each cycle (Tier 1 + data:agents).","default":false,"title":"Include Agents"},"description":"Add per-agent votes to each cycle (Tier 1 + data:agents)."}],"responses":{"200":{"description":"Success envelope {data, meta}","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_VerdictHistoryData_"}}},"headers":{"X-Request-ID":{"schema":{"type":"string"},"description":"Trace id (echoes the caller's X-Request-ID when supplied)"},"ETag":{"schema":{"type":"string"},"description":"Content hash of data+as_of; send back as If-None-Match for 304"},"Last-Modified":{"schema":{"type":"string"},"description":"HTTP-date of meta.as_of"},"Cache-Control":{"schema":{"type":"string"},"description":"public, max-age=N (60 latest · 300 catalog) or private, no-store (/me)"},"X-RateLimit-Limit":{"schema":{"type":"string"},"description":"Requests allowed per minute (per key, or per IP when anonymous)"},"X-RateLimit-Remaining":{"schema":{"type":"string"},"description":"Requests left in the current minute"},"X-RateLimit-Reset":{"schema":{"type":"string"},"description":"Seconds until the window resets"},"X-RateLimit-Policy":{"schema":{"type":"string"},"description":"e.g. 300;w=60, 100000;w=86400"},"X-Quota-Limit":{"schema":{"type":"string"},"description":"Daily quota for keyed callers ('unlimited' when none)"},"X-Quota-Remaining":{"schema":{"type":"string"},"description":"Daily quota left"},"X-Quota-Reset":{"schema":{"type":"string"},"description":"ISO-8601 time the daily quota resets"}}},"400":{"description":"Bad request: UNKNOWN_ASSET, UNKNOWN_INDEX, INVALID_CURSOR, INVALID_RANGE, RANGE_TOO_LARGE, TOO_MANY_IDS","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"401":{"description":"API_KEY_REQUIRED or API_KEY_INVALID","headers":{"WWW-Authenticate":{"schema":{"type":"string"},"description":"X-API-Key"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"403":{"description":"SCOPE_MISSING, TIER_INSUFFICIENT, RANGE_EXCEEDS_TIER, SERIES_NOT_LICENSED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"404":{"description":"PRODUCT_NOT_FOUND, SOURCE_NOT_FOUND, METRIC_NOT_FOUND, CYCLE_NOT_FOUND, NARRATIVE_NOT_FOUND, AGENT_NOT_FOUND","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"422":{"description":"VALIDATION_ERROR (detail = first message; errors[] kept)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"429":{"description":"RATE_LIMITED or QUOTA_EXCEEDED; honour Retry-After","headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds to wait"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"503":{"description":"DATA_API_DISABLED (surface switched off), STORE_UNAVAILABLE, NARRATIVE_STORE_UNAVAILABLE; honour Retry-After","headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds to wait"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}}}}},"/api/v1/data/agents/{agent}/latest":{"get":{"tags":["data"],"summary":"Latest read of one persona","description":"Latest read of one persona (tokio, berlin, nairobi, helsinki, denver, marseille, profesor): signal, confidence, short summary, headline, risk flags and neutral data categories.","operationId":"data_agent_latest","security":[{},{"ApiKeyAuth":[]}],"parameters":[{"name":"agent","in":"path","required":true,"schema":{"type":"string","description":"Persona id: tokio, berlin, nairobi, helsinki, denver, marseille or profesor (case-insensitive).","title":"Agent"},"description":"Persona id: tokio, berlin, nairobi, helsinki, denver, marseille or profesor (case-insensitive)."},{"name":"lang","in":"query","required":false,"schema":{"enum":["ka","en"],"type":"string","description":"Card language for headline and summary_short (ka|en); summary_lang reports what was served.","default":"ka","title":"Lang"},"description":"Card language for headline and summary_short (ka|en); summary_lang reports what was served."}],"responses":{"200":{"description":"Success envelope {data, meta}","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_AgentLatestData_"}}},"headers":{"X-Request-ID":{"schema":{"type":"string"},"description":"Trace id (echoes the caller's X-Request-ID when supplied)"},"ETag":{"schema":{"type":"string"},"description":"Content hash of data+as_of; send back as If-None-Match for 304"},"Last-Modified":{"schema":{"type":"string"},"description":"HTTP-date of meta.as_of"},"Cache-Control":{"schema":{"type":"string"},"description":"public, max-age=N (60 latest · 300 catalog) or private, no-store (/me)"},"X-RateLimit-Limit":{"schema":{"type":"string"},"description":"Requests allowed per minute (per key, or per IP when anonymous)"},"X-RateLimit-Remaining":{"schema":{"type":"string"},"description":"Requests left in the current minute"},"X-RateLimit-Reset":{"schema":{"type":"string"},"description":"Seconds until the window resets"},"X-RateLimit-Policy":{"schema":{"type":"string"},"description":"e.g. 300;w=60, 100000;w=86400"},"X-Quota-Limit":{"schema":{"type":"string"},"description":"Daily quota for keyed callers ('unlimited' when none)"},"X-Quota-Remaining":{"schema":{"type":"string"},"description":"Daily quota left"},"X-Quota-Reset":{"schema":{"type":"string"},"description":"ISO-8601 time the daily quota resets"}}},"400":{"description":"Bad request: UNKNOWN_ASSET, UNKNOWN_INDEX, INVALID_CURSOR, INVALID_RANGE, RANGE_TOO_LARGE, TOO_MANY_IDS","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"401":{"description":"API_KEY_REQUIRED or API_KEY_INVALID","headers":{"WWW-Authenticate":{"schema":{"type":"string"},"description":"X-API-Key"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"403":{"description":"SCOPE_MISSING, TIER_INSUFFICIENT, RANGE_EXCEEDS_TIER, SERIES_NOT_LICENSED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"404":{"description":"PRODUCT_NOT_FOUND, SOURCE_NOT_FOUND, METRIC_NOT_FOUND, CYCLE_NOT_FOUND, NARRATIVE_NOT_FOUND, AGENT_NOT_FOUND","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"422":{"description":"VALIDATION_ERROR (detail = first message; errors[] kept)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"429":{"description":"RATE_LIMITED or QUOTA_EXCEEDED; honour Retry-After","headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds to wait"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"503":{"description":"DATA_API_DISABLED (surface switched off), STORE_UNAVAILABLE, NARRATIVE_STORE_UNAVAILABLE; honour Retry-After","headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds to wait"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}}}}},"/api/v1/data/narratives/cycle/{cycle_number}/agents":{"get":{"tags":["data"],"summary":"Per-agent bilingual narratives for one cycle","description":"Per-agent bilingual narratives for one cycle (lang=ka|en). Headlines are free; prose requires Tier 1 + data:narratives and include_prose=true. Metric labels have paid-provider values redacted.","operationId":"data_narrative_agents","security":[{},{"ApiKeyAuth":[]}],"parameters":[{"name":"cycle_number","in":"path","required":true,"schema":{"type":"integer","description":"Trading cycle number (see /verdicts/latest data.cycle_number).","title":"Cycle Number"},"description":"Trading cycle number (see /verdicts/latest data.cycle_number)."},{"name":"lang","in":"query","required":false,"schema":{"enum":["ka","en"],"type":"string","description":"Headline/prose language.","default":"ka","title":"Lang"},"description":"Headline/prose language."},{"name":"include_prose","in":"query","required":false,"schema":{"type":"boolean","description":"Include the narrative prose (Tier 1 + data:narratives).","default":false,"title":"Include Prose"},"description":"Include the narrative prose (Tier 1 + data:narratives)."}],"responses":{"200":{"description":"Success envelope {data, meta}","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_NarrativeAgentsData_"}}},"headers":{"X-Request-ID":{"schema":{"type":"string"},"description":"Trace id (echoes the caller's X-Request-ID when supplied)"},"ETag":{"schema":{"type":"string"},"description":"Content hash of data+as_of; send back as If-None-Match for 304"},"Last-Modified":{"schema":{"type":"string"},"description":"HTTP-date of meta.as_of"},"Cache-Control":{"schema":{"type":"string"},"description":"public, max-age=N (60 latest · 300 catalog) or private, no-store (/me)"},"X-RateLimit-Limit":{"schema":{"type":"string"},"description":"Requests allowed per minute (per key, or per IP when anonymous)"},"X-RateLimit-Remaining":{"schema":{"type":"string"},"description":"Requests left in the current minute"},"X-RateLimit-Reset":{"schema":{"type":"string"},"description":"Seconds until the window resets"},"X-RateLimit-Policy":{"schema":{"type":"string"},"description":"e.g. 300;w=60, 100000;w=86400"},"X-Quota-Limit":{"schema":{"type":"string"},"description":"Daily quota for keyed callers ('unlimited' when none)"},"X-Quota-Remaining":{"schema":{"type":"string"},"description":"Daily quota left"},"X-Quota-Reset":{"schema":{"type":"string"},"description":"ISO-8601 time the daily quota resets"}}},"400":{"description":"Bad request: UNKNOWN_ASSET, UNKNOWN_INDEX, INVALID_CURSOR, INVALID_RANGE, RANGE_TOO_LARGE, TOO_MANY_IDS","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"401":{"description":"API_KEY_REQUIRED or API_KEY_INVALID","headers":{"WWW-Authenticate":{"schema":{"type":"string"},"description":"X-API-Key"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"403":{"description":"SCOPE_MISSING, TIER_INSUFFICIENT, RANGE_EXCEEDS_TIER, SERIES_NOT_LICENSED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"404":{"description":"PRODUCT_NOT_FOUND, SOURCE_NOT_FOUND, METRIC_NOT_FOUND, CYCLE_NOT_FOUND, NARRATIVE_NOT_FOUND, AGENT_NOT_FOUND","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"422":{"description":"VALIDATION_ERROR (detail = first message; errors[] kept)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"429":{"description":"RATE_LIMITED or QUOTA_EXCEEDED; honour Retry-After","headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds to wait"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"503":{"description":"DATA_API_DISABLED (surface switched off), STORE_UNAVAILABLE, NARRATIVE_STORE_UNAVAILABLE; honour Retry-After","headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds to wait"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}}}}},"/api/v1/data/market-lens/snapshot":{"get":{"tags":["data"],"summary":"Partner-safe Market Lens snapshot","description":"Embed-ready snapshot: verdict, agent headlines, the five composites for BTC and attributed public context cards (Fear & Greed, Fed funds rate, Binance long/short 5m, prices). No raw paid-provider values.","operationId":"data_market_lens_snapshot","security":[{},{"ApiKeyAuth":[]}],"parameters":[{"name":"lang","in":"query","required":false,"schema":{"enum":["ka","en"],"type":"string","description":"Headline language.","default":"ka","title":"Lang"},"description":"Headline language."}],"responses":{"200":{"description":"Success envelope {data, meta}","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_MarketLensData_"}}},"headers":{"X-Request-ID":{"schema":{"type":"string"},"description":"Trace id (echoes the caller's X-Request-ID when supplied)"},"ETag":{"schema":{"type":"string"},"description":"Content hash of data+as_of; send back as If-None-Match for 304"},"Last-Modified":{"schema":{"type":"string"},"description":"HTTP-date of meta.as_of"},"Cache-Control":{"schema":{"type":"string"},"description":"public, max-age=N (60 latest · 300 catalog) or private, no-store (/me)"},"X-RateLimit-Limit":{"schema":{"type":"string"},"description":"Requests allowed per minute (per key, or per IP when anonymous)"},"X-RateLimit-Remaining":{"schema":{"type":"string"},"description":"Requests left in the current minute"},"X-RateLimit-Reset":{"schema":{"type":"string"},"description":"Seconds until the window resets"},"X-RateLimit-Policy":{"schema":{"type":"string"},"description":"e.g. 300;w=60, 100000;w=86400"},"X-Quota-Limit":{"schema":{"type":"string"},"description":"Daily quota for keyed callers ('unlimited' when none)"},"X-Quota-Remaining":{"schema":{"type":"string"},"description":"Daily quota left"},"X-Quota-Reset":{"schema":{"type":"string"},"description":"ISO-8601 time the daily quota resets"}}},"400":{"description":"Bad request: UNKNOWN_ASSET, UNKNOWN_INDEX, INVALID_CURSOR, INVALID_RANGE, RANGE_TOO_LARGE, TOO_MANY_IDS","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"401":{"description":"API_KEY_REQUIRED or API_KEY_INVALID","headers":{"WWW-Authenticate":{"schema":{"type":"string"},"description":"X-API-Key"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"403":{"description":"SCOPE_MISSING, TIER_INSUFFICIENT, RANGE_EXCEEDS_TIER, SERIES_NOT_LICENSED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"404":{"description":"PRODUCT_NOT_FOUND, SOURCE_NOT_FOUND, METRIC_NOT_FOUND, CYCLE_NOT_FOUND, NARRATIVE_NOT_FOUND, AGENT_NOT_FOUND","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"422":{"description":"VALIDATION_ERROR (detail = first message; errors[] kept)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"429":{"description":"RATE_LIMITED or QUOTA_EXCEEDED; honour Retry-After","headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds to wait"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"503":{"description":"DATA_API_DISABLED (surface switched off), STORE_UNAVAILABLE, NARRATIVE_STORE_UNAVAILABLE; honour Retry-After","headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds to wait"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}}}}},"/api/v1/data/latest":{"get":{"tags":["data"],"summary":"Batch latest point for ≤ 25 ids","description":"Batch latest-point read for up to 25 ids in one call. Id forms: composite.<index>:<ASSET>, verdict, series:<metric_id>, signal:<SYMBOL>. Unresolvable ids come back in `missing`; disabled features in `meta.unavailable`.","operationId":"data_latest_batch","security":[{},{"ApiKeyAuth":[]}],"parameters":[{"name":"ids","in":"query","required":true,"schema":{"type":"string","description":"1–25 comma-separated ids. Grammar: composite.<index>:<ASSET> (ASSET default BTC), verdict, series:<metric_id>, signal:<SYMBOL>.","examples":["composite.derivatives:ETH,verdict,series:fred.fed_rate"],"title":"Ids"},"description":"1–25 comma-separated ids. Grammar: composite.<index>:<ASSET> (ASSET default BTC), verdict, series:<metric_id>, signal:<SYMBOL>."}],"responses":{"200":{"description":"Success envelope {data, meta}","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_LatestData_"}}},"headers":{"X-Request-ID":{"schema":{"type":"string"},"description":"Trace id (echoes the caller's X-Request-ID when supplied)"},"ETag":{"schema":{"type":"string"},"description":"Content hash of data+as_of; send back as If-None-Match for 304"},"Last-Modified":{"schema":{"type":"string"},"description":"HTTP-date of meta.as_of"},"Cache-Control":{"schema":{"type":"string"},"description":"public, max-age=N (60 latest · 300 catalog) or private, no-store (/me)"},"X-RateLimit-Limit":{"schema":{"type":"string"},"description":"Requests allowed per minute (per key, or per IP when anonymous)"},"X-RateLimit-Remaining":{"schema":{"type":"string"},"description":"Requests left in the current minute"},"X-RateLimit-Reset":{"schema":{"type":"string"},"description":"Seconds until the window resets"},"X-RateLimit-Policy":{"schema":{"type":"string"},"description":"e.g. 300;w=60, 100000;w=86400"},"X-Quota-Limit":{"schema":{"type":"string"},"description":"Daily quota for keyed callers ('unlimited' when none)"},"X-Quota-Remaining":{"schema":{"type":"string"},"description":"Daily quota left"},"X-Quota-Reset":{"schema":{"type":"string"},"description":"ISO-8601 time the daily quota resets"}}},"400":{"description":"Bad request: UNKNOWN_ASSET, UNKNOWN_INDEX, INVALID_CURSOR, INVALID_RANGE, RANGE_TOO_LARGE, TOO_MANY_IDS","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"401":{"description":"API_KEY_REQUIRED or API_KEY_INVALID","headers":{"WWW-Authenticate":{"schema":{"type":"string"},"description":"X-API-Key"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"403":{"description":"SCOPE_MISSING, TIER_INSUFFICIENT, RANGE_EXCEEDS_TIER, SERIES_NOT_LICENSED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"404":{"description":"PRODUCT_NOT_FOUND, SOURCE_NOT_FOUND, METRIC_NOT_FOUND, CYCLE_NOT_FOUND, NARRATIVE_NOT_FOUND, AGENT_NOT_FOUND","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"422":{"description":"VALIDATION_ERROR (detail = first message; errors[] kept)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"429":{"description":"RATE_LIMITED or QUOTA_EXCEEDED; honour Retry-After","headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds to wait"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"503":{"description":"DATA_API_DISABLED (surface switched off), STORE_UNAVAILABLE, NARRATIVE_STORE_UNAVAILABLE; honour Retry-After","headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds to wait"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}}}}},"/api/v1/data/series/{metric_id}":{"get":{"tags":["data"],"summary":"Attributed public time-series (Class C only)","description":"Time-series read for attributed PUBLIC facts only (licence class C: FRED, Alternative.me, DefiLlama aggregates, Blockchain.com, mempool.space, GitHub commits, ExchangeRate-API, Binance long/short 24 h and latest price). Paid-provider ids answer 403 SERIES_NOT_LICENSED; unknown ids 404 METRIC_NOT_FOUND. Anonymous: trailing 7 days / ≤ 100 rows. Tier 1 + data:series + data:history: from/to ranges ≤ 365 d, cursor pagination. interval=raw only for now.","operationId":"data_series","security":[{},{"ApiKeyAuth":[]}],"parameters":[{"name":"metric_id","in":"path","required":true,"schema":{"type":"string","description":"Metric id from GET /catalog/series dimensions.metric_id, e.g. fred.fed_rate.","title":"Metric Id"},"description":"Metric id from GET /catalog/series dimensions.metric_id, e.g. fred.fed_rate."},{"name":"asset","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Dimension value for asset-dimensioned metrics, e.g. defillama.tvl_chain?asset=ethereum.","title":"Asset"},"description":"Dimension value for asset-dimensioned metrics, e.g. defillama.tvl_chain?asset=ethereum."},{"name":"symbol","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Dimension value for symbol-dimensioned metrics, e.g. binance.ls_ratio?symbol=BTCUSDT.","title":"Symbol"},"description":"Dimension value for symbol-dimensioned metrics, e.g. binance.ls_ratio?symbol=BTCUSDT."},{"name":"dimension","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Generic alias for asset/symbol.","title":"Dimension"},"description":"Generic alias for asset/symbol."},{"name":"from","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Window start, ISO-8601 UTC. Ranges need Tier 1 + data:series + data:history; anonymous callers get the trailing 7 days.","examples":["2026-06-01T00:00:00+00:00"],"title":"From"},"description":"Window start, ISO-8601 UTC. Ranges need Tier 1 + data:series + data:history; anonymous callers get the trailing 7 days."},{"name":"to","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Window end, ISO-8601 UTC (exclusive). Default now.","title":"To"},"description":"Window end, ISO-8601 UTC (exclusive). Default now."},{"name":"interval","in":"query","required":false,"schema":{"const":"raw","type":"string","description":"Only raw points in v1 (time_bucket intervals arrive later).","default":"raw","title":"Interval"},"description":"Only raw points in v1 (time_bucket intervals arrive later)."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"description":"Max points; anonymous callers ≤ 100.","default":100,"title":"Limit"},"description":"Max points; anonymous callers ≤ 100."},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Opaque cursor from meta.next_cursor; keep filters and order unchanged.","title":"Cursor"},"description":"Opaque cursor from meta.next_cursor; keep filters and order unchanged."},{"name":"order","in":"query","required":false,"schema":{"enum":["desc","asc"],"type":"string","description":"Sort by event time.","default":"desc","title":"Order"},"description":"Sort by event time."},{"name":"dedupe","in":"query","required":false,"schema":{"type":"boolean","description":"Collapse consecutive identical values for fetch-semantics series.","default":true,"title":"Dedupe"},"description":"Collapse consecutive identical values for fetch-semantics series."}],"responses":{"200":{"description":"Success envelope {data, meta}","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_SeriesData_"}}},"headers":{"X-Request-ID":{"schema":{"type":"string"},"description":"Trace id (echoes the caller's X-Request-ID when supplied)"},"ETag":{"schema":{"type":"string"},"description":"Content hash of data+as_of; send back as If-None-Match for 304"},"Last-Modified":{"schema":{"type":"string"},"description":"HTTP-date of meta.as_of"},"Cache-Control":{"schema":{"type":"string"},"description":"public, max-age=N (60 latest · 300 catalog) or private, no-store (/me)"},"X-RateLimit-Limit":{"schema":{"type":"string"},"description":"Requests allowed per minute (per key, or per IP when anonymous)"},"X-RateLimit-Remaining":{"schema":{"type":"string"},"description":"Requests left in the current minute"},"X-RateLimit-Reset":{"schema":{"type":"string"},"description":"Seconds until the window resets"},"X-RateLimit-Policy":{"schema":{"type":"string"},"description":"e.g. 300;w=60, 100000;w=86400"},"X-Quota-Limit":{"schema":{"type":"string"},"description":"Daily quota for keyed callers ('unlimited' when none)"},"X-Quota-Remaining":{"schema":{"type":"string"},"description":"Daily quota left"},"X-Quota-Reset":{"schema":{"type":"string"},"description":"ISO-8601 time the daily quota resets"}}},"400":{"description":"Bad request: UNKNOWN_ASSET, UNKNOWN_INDEX, INVALID_CURSOR, INVALID_RANGE, RANGE_TOO_LARGE, TOO_MANY_IDS","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"401":{"description":"API_KEY_REQUIRED or API_KEY_INVALID","headers":{"WWW-Authenticate":{"schema":{"type":"string"},"description":"X-API-Key"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"403":{"description":"SCOPE_MISSING, TIER_INSUFFICIENT, RANGE_EXCEEDS_TIER, SERIES_NOT_LICENSED","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"404":{"description":"PRODUCT_NOT_FOUND, SOURCE_NOT_FOUND, METRIC_NOT_FOUND, CYCLE_NOT_FOUND, NARRATIVE_NOT_FOUND, AGENT_NOT_FOUND","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"422":{"description":"VALIDATION_ERROR (detail = first message; errors[] kept)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"429":{"description":"RATE_LIMITED or QUOTA_EXCEEDED; honour Retry-After","headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds to wait"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"503":{"description":"DATA_API_DISABLED (surface switched off), STORE_UNAVAILABLE, NARRATIVE_STORE_UNAVAILABLE; honour Retry-After","headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds to wait"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}}}}}},"components":{"schemas":{"AgentLatestData":{"properties":{"agent":{"type":"string","enum":["tokio","berlin","nairobi","helsinki","denver","marseille","profesor"],"title":"Agent","description":"Persona id"},"cycle_number":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cycle Number","description":"Cycle of the latest read"},"symbol":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Symbol","description":"Symbol the read was about"},"signal":{"type":"string","enum":["bullish","bearish","neutral","monitoring"],"title":"Signal","description":"Agent's latest signal"},"confidence":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Confidence","description":"0–1"},"summary_short":{"type":"string","title":"Summary Short","description":"≤ 200 chars: the narrator's 'interpretation and signal' section in the requested language when archived, else the agent's own reasoning (English). For profesor: the 'Top 3 today' block of his synthesis"},"summary_lang":{"anyOf":[{"type":"string","enum":["ka","en"]},{"type":"null"}],"title":"Summary Lang","description":"Language actually served in summary_short (null when empty)"},"headline":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Headline","description":"Narrator headline in the requested language (falls back to Georgian)"},"market_regime":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Market Regime","description":"Regime label when recorded"},"risk_flags":{"items":{"type":"string"},"type":"array","title":"Risk Flags","description":"Agent risk flags"},"data_categories":{"items":{"type":"string"},"type":"array","title":"Data Categories","description":"Neutral input categories (derivatives, on-chain, social, macro, market, fundamental)"},"decided_at":{"type":"string","title":"Decided At","description":"Event time of the decision, ISO-8601 UTC"}},"additionalProperties":false,"type":"object","required":["agent","cycle_number","symbol","signal","confidence","summary_short","headline","market_regime","risk_flags","data_categories","decided_at"],"title":"AgentLatestData"},"AgentVote":{"properties":{"agent":{"type":"string","title":"Agent","description":"tokio | berlin | nairobi | helsinki | denver | marseille"},"signal":{"type":"string","enum":["bullish","bearish","neutral","monitoring"],"title":"Signal","description":"Agent's vote"},"confidence":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Confidence","description":"0–1"},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary","description":"≤ 500 chars, Tier 1 (data:agents) only"},"risk_flags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Risk Flags","description":"Tier 1 (data:agents) only"}},"additionalProperties":false,"type":"object","required":["agent","signal","confidence"],"title":"AgentVote"},"AttributionModel":{"properties":{"source":{"type":"string","title":"Source","description":"Data provider name to credit"},"text":{"type":"string","title":"Text","description":"Attribution text to display verbatim next to the data"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url","description":"Link the attribution should point to"}},"additionalProperties":false,"type":"object","required":["source","text"],"title":"AttributionModel"},"CatalogData":{"properties":{"api_version":{"type":"string","title":"Api Version","description":"API major version","default":"v1"},"products":{"items":{"$ref":"#/components/schemas/CatalogProduct"},"type":"array","title":"Products","description":"All products, with entitlement for the caller"},"deprecations":{"items":{"$ref":"#/components/schemas/Deprecation"},"type":"array","title":"Deprecations","description":"Announced deprecations"}},"additionalProperties":false,"type":"object","required":["products","deprecations"],"title":"CatalogData"},"CatalogProduct":{"properties":{"id":{"type":"string","title":"Id","description":"Product id, e.g. composite.derivatives"},"path":{"type":"string","title":"Path","description":"Route that serves it"},"kind":{"type":"string","title":"Kind","description":"composite | verdict | narrative | series"},"category":{"type":"string","title":"Category","description":"Grouping label"},"tier_required":{"type":"string","enum":["tier0","tier1","tier2"],"title":"Tier Required","description":"Minimum tier"},"scope_required":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scope Required","description":"Scope needed beyond the tier, if any"},"entitled":{"type":"boolean","title":"Entitled","description":"Whether the caller's key (or anonymous access) may read it"},"preview":{"type":"boolean","title":"Preview","description":"True while the product is in Tier-0 preview"},"description":{"type":"string","title":"Description","description":"What the product is"},"schema_version":{"type":"string","title":"Schema Version","description":"Schema version of its `data` block"},"methodology_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Methodology Version","description":"For composites: weights/anchors version"},"cadence_seconds":{"type":"integer","title":"Cadence Seconds","description":"How often the product changes"},"history_depth_days":{"$ref":"#/components/schemas/HistoryDepth","description":"History available per tier"},"assets":{"items":{"type":"string"},"type":"array","title":"Assets","description":"Assets covered"},"license_class":{"type":"string","enum":["A","B","C","D"],"title":"License Class","description":"D = Bella Ciao derived (licensable); C = public facts with attribution"},"attribution":{"items":{"$ref":"#/components/schemas/AttributionModel"},"type":"array","title":"Attribution","description":"Attributions to display"},"known_gaps":{"items":{"$ref":"#/components/schemas/GapModel"},"type":"array","title":"Known Gaps","description":"Documented data gaps"}},"additionalProperties":false,"type":"object","required":["id","path","kind","category","tier_required","scope_required","entitled","preview","description","schema_version","cadence_seconds","history_depth_days","assets","license_class","attribution","known_gaps"],"title":"CatalogProduct"},"CatalogProductDetail":{"properties":{"id":{"type":"string","title":"Id","description":"Product id, e.g. composite.derivatives"},"path":{"type":"string","title":"Path","description":"Route that serves it"},"kind":{"type":"string","title":"Kind","description":"composite | verdict | narrative | series"},"category":{"type":"string","title":"Category","description":"Grouping label"},"tier_required":{"type":"string","enum":["tier0","tier1","tier2"],"title":"Tier Required","description":"Minimum tier"},"scope_required":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scope Required","description":"Scope needed beyond the tier, if any"},"entitled":{"type":"boolean","title":"Entitled","description":"Whether the caller's key (or anonymous access) may read it"},"preview":{"type":"boolean","title":"Preview","description":"True while the product is in Tier-0 preview"},"description":{"type":"string","title":"Description","description":"What the product is"},"schema_version":{"type":"string","title":"Schema Version","description":"Schema version of its `data` block"},"methodology_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Methodology Version","description":"For composites: weights/anchors version"},"cadence_seconds":{"type":"integer","title":"Cadence Seconds","description":"How often the product changes"},"history_depth_days":{"$ref":"#/components/schemas/HistoryDepth","description":"History available per tier"},"assets":{"items":{"type":"string"},"type":"array","title":"Assets","description":"Assets covered"},"license_class":{"type":"string","enum":["A","B","C","D"],"title":"License Class","description":"D = Bella Ciao derived (licensable); C = public facts with attribution"},"attribution":{"items":{"$ref":"#/components/schemas/AttributionModel"},"type":"array","title":"Attribution","description":"Attributions to display"},"known_gaps":{"items":{"$ref":"#/components/schemas/GapModel"},"type":"array","title":"Known Gaps","description":"Documented data gaps"},"fields":{"items":{"$ref":"#/components/schemas/FieldModel"},"type":"array","title":"Fields","description":"Field-level contract of `data`"},"dimensions":{"additionalProperties":{"items":{"type":"string"},"type":"array"},"type":"object","title":"Dimensions","description":"Allowed values per query dimension"},"methodology":{"anyOf":[{"$ref":"#/components/schemas/MethodologyModel"},{"type":"null"}],"description":"Composite methodology, when applicable"},"history_available_from":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"History Available From","description":"Earliest date with data"},"sample_url":{"type":"string","title":"Sample Url","description":"A ready-to-call example path"}},"additionalProperties":false,"type":"object","required":["id","path","kind","category","tier_required","scope_required","entitled","preview","description","schema_version","cadence_seconds","history_depth_days","assets","license_class","attribution","known_gaps","fields","dimensions","history_available_from","sample_url"],"title":"CatalogProductDetail"},"ChangelogData":{"properties":{"entries":{"items":{"$ref":"#/components/schemas/ChangelogEntry"},"type":"array","title":"Entries","description":"Newest first"}},"additionalProperties":false,"type":"object","required":["entries"],"title":"ChangelogData"},"ChangelogEntry":{"properties":{"date":{"type":"string","title":"Date","description":"YYYY-MM-DD"},"type":{"type":"string","title":"Type","description":"added | changed | deprecated | removed | methodology | data-note"},"scope":{"items":{"type":"string"},"type":"array","title":"Scope","description":"Affected areas"},"summary":{"type":"string","title":"Summary","description":"What changed"},"sunset_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sunset At","description":"For deprecations"}},"additionalProperties":false,"type":"object","required":["date","type","scope","summary"],"title":"ChangelogEntry"},"CompositeAsset":{"properties":{"asset":{"type":"string","enum":["BTC","ETH","SOL"],"title":"Asset","description":"Ticker"},"indices":{"items":{"$ref":"#/components/schemas/CompositeIndex"},"type":"array","title":"Indices","description":"Indices available for this asset (onchain and macro are BTC/market-wide)"}},"additionalProperties":false,"type":"object","required":["asset","indices"],"title":"CompositeAsset"},"CompositeIndex":{"properties":{"index":{"type":"string","enum":["sentiment","onchain","derivatives","macro","fundamental"],"title":"Index","description":"Which Layer-2 index this is"},"score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Score","description":"0–100 health score, 1 decimal; null when no input was available. 100 = healthy/calm/cheap side, 0 = overheated/crowded/risk side (see catalog methodology)"},"label":{"type":"string","title":"Label","description":"Human label for the score band, e.g. neutral, greed, fear, calm"},"methodology_version":{"type":"string","title":"Methodology Version","description":"e.g. derivatives/v3 — changes only when weights/anchors change"},"variant":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Variant","description":"alt_sources | market_wide | null — computation variant in effect"},"contributing":{"items":{"type":"string"},"type":"array","title":"Contributing","description":"Component names actually present in this computation (weights renormalised over them)"},"components":{"anyOf":[{"additionalProperties":{"type":"integer"},"type":"object"},{"type":"null"}],"title":"Components","description":"Tier 1 + legal flag only: component → normalised value rounded to 5-point buckets; never raw provider values"},"inputs_freshness":{"$ref":"#/components/schemas/InputsFreshness","description":"Freshness of the underlying inputs"},"degraded":{"type":"boolean","title":"Degraded","description":"True when stale/degraded inputs exceed 50 % of the renormalised weight — score still served, read with care","default":false},"warnings":{"items":{"type":"string"},"type":"array","title":"Warnings","description":"Plain-language caveats"}},"additionalProperties":false,"type":"object","required":["index","score","label","methodology_version","inputs_freshness"],"title":"CompositeIndex"},"CompositesLatestData":{"properties":{"cycle_number":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cycle Number","description":"Latest recorded trading cycle for context; indices are computed on demand, not archived per cycle"},"cycle_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cycle At","description":"Latest recorded cycle event time, ISO-8601 UTC; not the indices' computation time"},"assets":{"items":{"$ref":"#/components/schemas/CompositeAsset"},"type":"array","title":"Assets","description":"One entry per requested asset"}},"additionalProperties":false,"type":"object","required":["cycle_number","cycle_at","assets"],"title":"CompositesLatestData"},"ConsensusBlock":{"properties":{"signal":{"type":"string","enum":["bullish","bearish","neutral","monitoring"],"title":"Signal","description":"Weighted consensus direction"},"score":{"type":"number","title":"Score","description":"−1 … +1 weighted sum"},"confidence":{"type":"number","title":"Confidence","description":"0–1"},"contributing_weight":{"type":"number","title":"Contributing Weight","description":"Fraction of crew weight that voted"},"abstained":{"type":"boolean","title":"Abstained","description":"True when too little weight voted for a directional call"},"breakdown":{"anyOf":[{"items":{"$ref":"#/components/schemas/ConsensusBreakdown"},"type":"array"},{"type":"null"}],"title":"Breakdown","description":"Per-agent contributions (Tier 1, data:agents)"}},"additionalProperties":false,"type":"object","required":["signal","score","confidence","contributing_weight","abstained"],"title":"ConsensusBlock"},"ConsensusBreakdown":{"properties":{"agent":{"type":"string","title":"Agent","description":"Voting agent"},"weight":{"type":"number","title":"Weight","description":"Fixed weight in the deterministic consensus"},"signal":{"type":"string","enum":["bullish","bearish","neutral","monitoring"],"title":"Signal","description":"Agent's vote"},"confidence":{"type":"number","title":"Confidence","description":"0–1"},"contribution":{"type":"number","title":"Contribution","description":"weight × direction × confidence"}},"additionalProperties":false,"type":"object","required":["agent","weight","signal","confidence","contribution"],"title":"ConsensusBreakdown"},"ContextCard":{"properties":{"id":{"type":"string","title":"Id","description":"fear_greed | fed_funds_rate_pct | ls_ratio | price"},"symbol":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Symbol","description":"Symbol for symbol-scoped cards"},"period":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Period","description":"Bucket period for ls_ratio (5m)"},"value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Value","description":"Card value"},"last":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Last","description":"Last price (price cards)"},"change_24h_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Change 24H Pct","description":"24h change when known"},"classification":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Classification","description":"Provider classification text (Fear & Greed)"},"event_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Event At","description":"Event time, ISO-8601 UTC"},"age_seconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Age Seconds","description":"Seconds since event_at"},"status":{"type":"string","enum":["fresh","aging","stale","degraded","unavailable","never","paused"],"title":"Status","description":"Freshness of this card"},"attribution":{"anyOf":[{"$ref":"#/components/schemas/AttributionModel"},{"type":"null"}],"description":"Attribution to display for this card"}},"additionalProperties":false,"type":"object","required":["id","status"],"title":"ContextCard"},"Deprecation":{"properties":{"path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Path","description":"Deprecated route"},"field":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Field","description":"Deprecated field"},"deprecated_at":{"type":"string","title":"Deprecated At","description":"Date announced"},"sunset_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sunset At","description":"Date it stops working"},"replacement":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Replacement","description":"What to use instead"}},"additionalProperties":false,"type":"object","required":["deprecated_at","sunset_at","replacement"],"title":"Deprecation"},"Envelope_AgentLatestData_":{"properties":{"data":{"$ref":"#/components/schemas/AgentLatestData","description":"Route-specific payload"},"meta":{"$ref":"#/components/schemas/Meta","description":"Freshness, attribution, pagination, tier and request tracing"}},"additionalProperties":false,"type":"object","required":["data","meta"],"title":"Envelope[AgentLatestData]"},"Envelope_CatalogData_":{"properties":{"data":{"$ref":"#/components/schemas/CatalogData","description":"Route-specific payload"},"meta":{"$ref":"#/components/schemas/Meta","description":"Freshness, attribution, pagination, tier and request tracing"}},"additionalProperties":false,"type":"object","required":["data","meta"],"title":"Envelope[CatalogData]"},"Envelope_CatalogProductDetail_":{"properties":{"data":{"$ref":"#/components/schemas/CatalogProductDetail","description":"Route-specific payload"},"meta":{"$ref":"#/components/schemas/Meta","description":"Freshness, attribution, pagination, tier and request tracing"}},"additionalProperties":false,"type":"object","required":["data","meta"],"title":"Envelope[CatalogProductDetail]"},"Envelope_ChangelogData_":{"properties":{"data":{"$ref":"#/components/schemas/ChangelogData","description":"Route-specific payload"},"meta":{"$ref":"#/components/schemas/Meta","description":"Freshness, attribution, pagination, tier and request tracing"}},"additionalProperties":false,"type":"object","required":["data","meta"],"title":"Envelope[ChangelogData]"},"Envelope_CompositesLatestData_":{"properties":{"data":{"$ref":"#/components/schemas/CompositesLatestData","description":"Route-specific payload"},"meta":{"$ref":"#/components/schemas/Meta","description":"Freshness, attribution, pagination, tier and request tracing"}},"additionalProperties":false,"type":"object","required":["data","meta"],"title":"Envelope[CompositesLatestData]"},"Envelope_HealthData_":{"properties":{"data":{"$ref":"#/components/schemas/HealthData","description":"Route-specific payload"},"meta":{"$ref":"#/components/schemas/Meta","description":"Freshness, attribution, pagination, tier and request tracing"}},"additionalProperties":false,"type":"object","required":["data","meta"],"title":"Envelope[HealthData]"},"Envelope_LatestData_":{"properties":{"data":{"$ref":"#/components/schemas/LatestData","description":"Route-specific payload"},"meta":{"$ref":"#/components/schemas/Meta","description":"Freshness, attribution, pagination, tier and request tracing"}},"additionalProperties":false,"type":"object","required":["data","meta"],"title":"Envelope[LatestData]"},"Envelope_MarketLensData_":{"properties":{"data":{"$ref":"#/components/schemas/MarketLensData","description":"Route-specific payload"},"meta":{"$ref":"#/components/schemas/Meta","description":"Freshness, attribution, pagination, tier and request tracing"}},"additionalProperties":false,"type":"object","required":["data","meta"],"title":"Envelope[MarketLensData]"},"Envelope_MeData_":{"properties":{"data":{"$ref":"#/components/schemas/MeData","description":"Route-specific payload"},"meta":{"$ref":"#/components/schemas/Meta","description":"Freshness, attribution, pagination, tier and request tracing"}},"additionalProperties":false,"type":"object","required":["data","meta"],"title":"Envelope[MeData]"},"Envelope_NarrativeAgentsData_":{"properties":{"data":{"$ref":"#/components/schemas/NarrativeAgentsData","description":"Route-specific payload"},"meta":{"$ref":"#/components/schemas/Meta","description":"Freshness, attribution, pagination, tier and request tracing"}},"additionalProperties":false,"type":"object","required":["data","meta"],"title":"Envelope[NarrativeAgentsData]"},"Envelope_SeriesData_":{"properties":{"data":{"$ref":"#/components/schemas/SeriesData","description":"Route-specific payload"},"meta":{"$ref":"#/components/schemas/Meta","description":"Freshness, attribution, pagination, tier and request tracing"}},"additionalProperties":false,"type":"object","required":["data","meta"],"title":"Envelope[SeriesData]"},"Envelope_SourceDetailData_":{"properties":{"data":{"$ref":"#/components/schemas/SourceDetailData","description":"Route-specific payload"},"meta":{"$ref":"#/components/schemas/Meta","description":"Freshness, attribution, pagination, tier and request tracing"}},"additionalProperties":false,"type":"object","required":["data","meta"],"title":"Envelope[SourceDetailData]"},"Envelope_SourcesData_":{"properties":{"data":{"$ref":"#/components/schemas/SourcesData","description":"Route-specific payload"},"meta":{"$ref":"#/components/schemas/Meta","description":"Freshness, attribution, pagination, tier and request tracing"}},"additionalProperties":false,"type":"object","required":["data","meta"],"title":"Envelope[SourcesData]"},"Envelope_VerdictHistoryData_":{"properties":{"data":{"$ref":"#/components/schemas/VerdictHistoryData","description":"Route-specific payload"},"meta":{"$ref":"#/components/schemas/Meta","description":"Freshness, attribution, pagination, tier and request tracing"}},"additionalProperties":false,"type":"object","required":["data","meta"],"title":"Envelope[VerdictHistoryData]"},"Envelope_VerdictLatestData_":{"properties":{"data":{"$ref":"#/components/schemas/VerdictLatestData","description":"Route-specific payload"},"meta":{"$ref":"#/components/schemas/Meta","description":"Freshness, attribution, pagination, tier and request tracing"}},"additionalProperties":false,"type":"object","required":["data","meta"],"title":"Envelope[VerdictLatestData]"},"ErrorBody":{"properties":{"detail":{"type":"string","title":"Detail","description":"Human-readable message (always a string)"},"error_code":{"type":"string","title":"Error Code","description":"Stable machine code, e.g. API_KEY_REQUIRED, RATE_LIMITED, SERIES_NOT_LICENSED, DATA_API_DISABLED"},"request_id":{"type":"string","title":"Request Id","description":"Echo of X-Request-ID"}},"additionalProperties":false,"type":"object","required":["detail","error_code","request_id"],"title":"ErrorBody","description":"Every 4xx/5xx on /api/v1/data/*."},"FieldModel":{"properties":{"name":{"type":"string","title":"Name","description":"Field path inside `data`"},"type":{"type":"string","title":"Type","description":"JSON type"},"unit":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Unit","description":"Unit when numeric"},"description":{"type":"string","title":"Description","description":"Meaning"}},"additionalProperties":false,"type":"object","required":["name","type","description"],"title":"FieldModel"},"FreshnessMeta":{"properties":{"status":{"type":"string","enum":["fresh","aging","stale","degraded","unavailable","never","paused"],"title":"Status","description":"fresh ≤ 2× cadence · aging ≤ 5× · stale > 5× · degraded = source known-broken regardless of age · unavailable = feature off · never = no data yet · paused = ingestion deliberately off"},"age_seconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Age Seconds","description":"Seconds since the data was last fetched/produced (operational age, not event age)"},"cadence_seconds":{"type":"integer","title":"Cadence Seconds","description":"Effective update cadence the status is measured against"},"stale":{"type":"boolean","title":"Stale","description":"True whenever status is not 'fresh'; treat the payload with caution"},"degraded_reason":{"anyOf":[{"type":"string","enum":["quota_exhausted","plan_gated","provider_unreachable","ingest_gap","worker_disabled","db_outage"]},{"type":"null"}],"title":"Degraded Reason","description":"Why a source is degraded, when status == 'degraded'"},"source":{"type":"string","title":"Source","description":"Store that served the payload: postgres | redis | computed | static","default":"postgres"}},"additionalProperties":false,"type":"object","required":["status","cadence_seconds","stale"],"title":"FreshnessMeta"},"GapModel":{"properties":{"start":{"type":"string","title":"Start","description":"Gap start, ISO-8601 UTC"},"end":{"type":"string","title":"End","description":"Gap end, ISO-8601 UTC"},"reason":{"type":"string","enum":["quota_exhausted","plan_gated","provider_unreachable","ingest_gap","worker_disabled","db_outage"],"title":"Reason","description":"Why data is missing in this window"},"note":{"type":"string","title":"Note","description":"Operator note","default":""}},"additionalProperties":false,"type":"object","required":["start","end","reason"],"title":"GapModel"},"HealthCycle":{"properties":{"last_cycle_number":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Last Cycle Number","description":"Most recent trading cycle number"},"last_cycle_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Cycle At","description":"Its event time, ISO-8601 UTC"},"cadence_minutes":{"type":"integer","title":"Cadence Minutes","description":"Configured cycle cadence (data changes at this rate)"},"stale":{"type":"boolean","title":"Stale","description":"True when now − last_cycle_at > 2 × cadence"},"next_expected_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Expected At","description":"last_cycle_at + cadence"}},"additionalProperties":false,"type":"object","required":["last_cycle_number","last_cycle_at","cadence_minutes","stale","next_expected_at"],"title":"HealthCycle"},"HealthData":{"properties":{"status":{"type":"string","title":"Status","description":"ok | degraded | down"},"api_version":{"type":"string","title":"Api Version","description":"API major version","default":"v1"},"build":{"additionalProperties":{"type":"string"},"type":"object","title":"Build","description":"{version, codename} of the deployed build"},"cycle":{"$ref":"#/components/schemas/HealthCycle","description":"Trading-cycle heartbeat"},"stores":{"additionalProperties":{"type":"string"},"type":"object","title":"Stores","description":"{postgres: ok|down, redis: ok|down}"},"products":{"items":{"$ref":"#/components/schemas/HealthProduct"},"type":"array","title":"Products","description":"Per-product status"}},"additionalProperties":false,"type":"object","required":["status","build","cycle","stores","products"],"title":"HealthData"},"HealthProduct":{"properties":{"id":{"type":"string","title":"Id","description":"Product id from the catalog"},"status":{"type":"string","enum":["fresh","aging","stale","degraded","unavailable","never","paused"],"title":"Status","description":"Product-level freshness"}},"additionalProperties":false,"type":"object","required":["id","status"],"title":"HealthProduct"},"HistoryDepth":{"properties":{"tier0":{"type":"integer","title":"Tier0","description":"Days of history for anonymous callers"},"tier1":{"type":"integer","title":"Tier1","description":"Days of history for Tier-1 keys"},"tier2":{"type":"integer","title":"Tier2","description":"Days of history for Tier-2 keys"}},"additionalProperties":false,"type":"object","required":["tier0","tier1","tier2"],"title":"HistoryDepth"},"InputsFreshness":{"properties":{"status":{"type":"string","enum":["fresh","aging","stale","degraded","unavailable","never","paused"],"title":"Status","description":"Worst freshness status among the inputs that fed this index"},"oldest_input_event_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Oldest Input Event At","description":"Event time of the oldest input used, ISO-8601 UTC"},"stale_inputs":{"items":{"type":"string"},"type":"array","title":"Stale Inputs","description":"Component names whose source is stale/degraded/never"},"delayed_inputs":{"items":{"type":"string"},"type":"array","title":"Delayed Inputs","description":"Component names whose provider publishes with a known lag (see the source's lag_days); informational — does not affect status or degraded"}},"additionalProperties":false,"type":"object","required":["status"],"title":"InputsFreshness"},"LatestData":{"properties":{"items":{"items":{"$ref":"#/components/schemas/LatestItem"},"type":"array","title":"Items","description":"Resolved items in request order"},"missing":{"items":{"type":"string"},"type":"array","title":"Missing","description":"Ids that could not be resolved"}},"additionalProperties":false,"type":"object","required":["items","missing"],"title":"LatestData"},"LatestItem":{"properties":{"id":{"type":"string","title":"Id","description":"Requested id, e.g. composite.derivatives:ETH, verdict, series:fred.fed_rate"},"kind":{"type":"string","title":"Kind","description":"composite | verdict | series | signal"},"asset":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Asset","description":"Asset when applicable"},"value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Value","description":"Numeric value for series/verdict confidence"},"score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Score","description":"0–100 for composites"},"signal":{"anyOf":[{"type":"string","enum":["bullish","bearish","neutral","monitoring"]},{"type":"null"}],"title":"Signal","description":"Signal for verdict items"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label","description":"Label for composites"},"event_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Event At","description":"Event time"},"fetched_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fetched At","description":"Fetch/compute time"},"age_seconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Age Seconds","description":"Operational age"},"status":{"type":"string","enum":["fresh","aging","stale","degraded","unavailable","never","paused"],"title":"Status","description":"Freshness of this item"}},"additionalProperties":false,"type":"object","required":["id","kind","status"],"title":"LatestItem"},"LensAgent":{"properties":{"agent":{"type":"string","title":"Agent","description":"Persona id"},"signal":{"type":"string","enum":["bullish","bearish","neutral","monitoring"],"title":"Signal","description":"Agent signal"},"confidence_pct":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Confidence Pct","description":"0–100"},"headline":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Headline","description":"Agent headline"}},"additionalProperties":false,"type":"object","required":["agent","signal","confidence_pct","headline"],"title":"LensAgent"},"LensComposite":{"properties":{"index":{"type":"string","enum":["sentiment","onchain","derivatives","macro","fundamental"],"title":"Index","description":"Index name"},"score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Score","description":"0–100"},"label":{"type":"string","title":"Label","description":"Score band label"},"degraded":{"type":"boolean","title":"Degraded","description":"Inputs mostly stale"}},"additionalProperties":false,"type":"object","required":["index","score","label","degraded"],"title":"LensComposite"},"LensVerdict":{"properties":{"signal":{"type":"string","enum":["bullish","bearish","neutral","monitoring"],"title":"Signal","description":"Verdict signal"},"confidence_pct":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Confidence Pct","description":"0–100"},"headline":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Headline","description":"El Profesor headline"}},"additionalProperties":false,"type":"object","required":["signal","confidence_pct","headline"],"title":"LensVerdict"},"MarketLensData":{"properties":{"cycle_number":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cycle Number","description":"Cycle number"},"cycle_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cycle At","description":"Cycle event time"},"verdict":{"anyOf":[{"$ref":"#/components/schemas/LensVerdict"},{"type":"null"}],"description":"Latest verdict"},"agents":{"items":{"$ref":"#/components/schemas/LensAgent"},"type":"array","title":"Agents","description":"Agent headlines"},"composites":{"items":{"$ref":"#/components/schemas/LensComposite"},"type":"array","title":"Composites","description":"Five indices for BTC"},"context":{"items":{"$ref":"#/components/schemas/ContextCard"},"type":"array","title":"Context","description":"Attributed public facts"}},"additionalProperties":false,"type":"object","required":["cycle_number","cycle_at","verdict","agents","composites","context"],"title":"MarketLensData"},"MeDaily":{"properties":{"date":{"type":"string","title":"Date","description":"UTC date"},"requests":{"type":"integer","title":"Requests","description":"Requests that day"},"errors_4xx":{"type":"integer","title":"Errors 4Xx","description":"Client errors"},"errors_5xx":{"type":"integer","title":"Errors 5Xx","description":"Server errors"},"p95_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"P95 Ms","description":"p95 latency"}},"additionalProperties":false,"type":"object","required":["date","requests","errors_4xx","errors_5xx","p95_ms"],"title":"MeDaily"},"MeData":{"properties":{"partner_name":{"type":"string","title":"Partner Name","description":"Key owner"},"key_prefix":{"type":"string","title":"Key Prefix","description":"First characters of the key"},"tier":{"type":"string","enum":["tier0","tier1","tier2"],"title":"Tier","description":"Entitlement tier"},"scopes":{"items":{"type":"string"},"type":"array","title":"Scopes","description":"Effective scopes"},"rate_limit_per_min":{"type":"integer","title":"Rate Limit Per Min","description":"Per-minute limit"},"quota_per_day":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Quota Per Day","description":"Daily quota; null when unlimited"},"expires_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expires At","description":"Key expiry (null until per-key expiry ships)"},"grace_until":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Grace Until","description":"Grace period end"},"today":{"$ref":"#/components/schemas/MeToday","description":"Today's consumption"},"daily":{"items":{"$ref":"#/components/schemas/MeDaily"},"type":"array","title":"Daily","description":"Per-day aggregates"},"top_endpoints":{"items":{"$ref":"#/components/schemas/MeEndpoint"},"type":"array","title":"Top Endpoints","description":"Most-used routes"}},"additionalProperties":false,"type":"object","required":["partner_name","key_prefix","tier","scopes","rate_limit_per_min","quota_per_day","expires_at","grace_until","today","daily","top_endpoints"],"title":"MeData"},"MeEndpoint":{"properties":{"endpoint":{"type":"string","title":"Endpoint","description":"Route"},"requests":{"type":"integer","title":"Requests","description":"Requests in the window"}},"additionalProperties":false,"type":"object","required":["endpoint","requests"],"title":"MeEndpoint"},"MeToday":{"properties":{"requests":{"type":"integer","title":"Requests","description":"Requests today (UTC)"},"remaining_quota":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Remaining Quota","description":"Remaining daily quota; null when unlimited"},"resets_at":{"type":"string","title":"Resets At","description":"Next UTC midnight"}},"additionalProperties":false,"type":"object","required":["requests","remaining_quota","resets_at"],"title":"MeToday"},"Meta":{"properties":{"api_version":{"type":"string","title":"Api Version","description":"API major version","default":"v1"},"schema_version":{"type":"string","title":"Schema Version","description":"Schema version of `data`, e.g. composites/1 — bumps on breaking shape changes"},"request_id":{"type":"string","title":"Request Id","description":"Echo of X-Request-ID; quote it when reporting problems"},"generated_at":{"type":"string","title":"Generated At","description":"When this response was produced, ISO-8601 UTC"},"as_of":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"As Of","description":"Event time of the newest item in `data` (when the fact was true), ISO-8601 UTC"},"freshness":{"$ref":"#/components/schemas/FreshnessMeta","description":"Operational freshness of the payload"},"attribution":{"items":{"$ref":"#/components/schemas/AttributionModel"},"type":"array","title":"Attribution","description":"Attributions the consumer must display"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor","description":"Opaque keyset cursor for the next page; null when exhausted"},"gaps":{"items":{"$ref":"#/components/schemas/GapModel"},"type":"array","title":"Gaps","description":"Known data gaps overlapping the requested window"},"mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mode","description":"paper | live — trading mode the verdicts were produced in"},"generated_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Generated By","description":"'llm' on narrative products; null otherwise"},"tier_served":{"type":"string","enum":["tier0","tier1","tier2"],"title":"Tier Served","description":"Entitlement tier the response was rendered for","default":"tier0"},"disclaimer":{"type":"string","title":"Disclaimer","description":"Always present; not financial advice","default":"Bella Ciao outputs are decision inputs, not financial advice. Paper-mode system; past signals do not guarantee future performance."},"unavailable":{"items":{"$ref":"#/components/schemas/UnavailableModel"},"type":"array","title":"Unavailable","description":"Requested items that were not served, with reasons (never silently omitted)"}},"additionalProperties":false,"type":"object","required":["schema_version","request_id","generated_at","freshness"],"title":"Meta"},"MethodologyComponentModel":{"properties":{"name":{"type":"string","title":"Name","description":"Component name"},"weight":{"type":"number","title":"Weight","description":"Weight before renormalisation"},"source_class":{"type":"string","enum":["A","B","C","D"],"title":"Source Class","description":"Licence class of the input"},"anchor_range":{"type":"string","title":"Anchor Range","description":"How the raw input maps to 0–100, published as a range"}},"additionalProperties":false,"type":"object","required":["name","weight","source_class","anchor_range"],"title":"MethodologyComponentModel"},"MethodologyModel":{"properties":{"version":{"type":"string","title":"Version","description":"Methodology version"},"effective_from":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Effective From","description":"Date the version took effect"},"components":{"items":{"$ref":"#/components/schemas/MethodologyComponentModel"},"type":"array","title":"Components","description":"Weighted inputs"}},"additionalProperties":false,"type":"object","required":["version","effective_from","components"],"title":"MethodologyModel"},"NarrativeAgent":{"properties":{"agent":{"type":"string","title":"Agent","description":"Persona id"},"signal":{"type":"string","enum":["bullish","bearish","neutral","monitoring"],"title":"Signal","description":"Agent's signal for the cycle"},"confidence_pct":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Confidence Pct","description":"0–100"},"headline":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Headline","description":"Headline in the requested language (falls back to Georgian)"},"headline_lang":{"anyOf":[{"type":"string","enum":["ka","en"]},{"type":"null"}],"title":"Headline Lang","description":"Language actually served in headline"},"narrative":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Narrative","description":"Prose (Tier 1, data:narratives, include_prose=true). For profesor: the cycle synthesis without its entry-plan / risk-calculation sections — never a trade instruction"},"narrative_lang":{"anyOf":[{"type":"string","enum":["ka","en"]},{"type":"null"}],"title":"Narrative Lang","description":"Language actually served in narrative (null when prose is not included)"},"data_categories":{"items":{"type":"string"},"type":"array","title":"Data Categories","description":"Neutral input categories"},"key_metrics_labels":{"items":{"type":"string"},"type":"array","title":"Key Metrics Labels","description":"Metric labels with paid-provider values redacted"},"risk_flags":{"items":{"type":"string"},"type":"array","title":"Risk Flags","description":"Agent risk flags"}},"additionalProperties":false,"type":"object","required":["agent","signal","confidence_pct","headline","data_categories","key_metrics_labels","risk_flags"],"title":"NarrativeAgent"},"NarrativeAgentsData":{"properties":{"cycle_number":{"type":"integer","title":"Cycle Number","description":"Cycle number"},"generated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Generated At","description":"When the narrator produced it, ISO-8601 UTC"},"lang":{"type":"string","title":"Lang","description":"ka | en"},"agents":{"items":{"$ref":"#/components/schemas/NarrativeAgent"},"type":"array","title":"Agents","description":"One entry per agent; 'profesor' is synthesised from the cycle synthesis and listed first"}},"additionalProperties":false,"type":"object","required":["cycle_number","generated_at","lang","agents"],"title":"NarrativeAgentsData"},"NarrativeRef":{"properties":{"cycle_number":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cycle Number","description":"Cycle the narrative belongs to"},"available":{"type":"boolean","title":"Available","description":"Whether a bilingual narrative exists for this cycle"},"path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Path","description":"Path of the narrative endpoint (Narrative API), when available"}},"additionalProperties":false,"type":"object","required":["cycle_number","available","path"],"title":"NarrativeRef"},"SeriesData":{"properties":{"metric_id":{"type":"string","title":"Metric Id","description":"Metric id from the catalog, e.g. fred.fed_rate"},"asset":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Asset","description":"Asset or 'market'"},"dimension":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dimension","description":"Dimension value filtered on, if any"},"unit":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Unit","description":"Unit of value"},"ts_semantics":{"type":"string","enum":["event","bar_open","publication","fetch"],"title":"Ts Semantics","description":"event | bar_open | publication | fetch — what event_at means for this source"},"interval":{"type":"string","title":"Interval","description":"raw (time_bucket intervals arrive in P1)"},"points":{"items":{"$ref":"#/components/schemas/SeriesPoint"},"type":"array","title":"Points","description":"Ordered per `order` (default newest first)"}},"additionalProperties":false,"type":"object","required":["metric_id","asset","dimension","unit","ts_semantics","interval","points"],"title":"SeriesData"},"SeriesPoint":{"properties":{"event_at":{"type":"string","title":"Event At","description":"Event time per the source's ts_semantics, ISO-8601 UTC"},"value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Value","description":"Metric value"},"fetched_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fetched At","description":"When Bella observed it"},"dimension":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dimension","description":"Dimension value (chain, symbol) when the series is dimensioned"}},"additionalProperties":false,"type":"object","required":["event_at","value"],"title":"SeriesPoint"},"SourceBoardEntry":{"properties":{"source_id":{"type":"string","title":"Source Id","description":"Raw lake table name"},"provider":{"type":"string","title":"Provider","description":"Data provider"},"category":{"type":"string","title":"Category","description":"spot_market | derivatives | macro | on_chain | sentiment_social | fundamental_adoption | events_news | dev_activity | fx_commodities"},"license_class":{"type":"string","enum":["A","B","C","D"],"title":"License Class","description":"A never · B paid/restricted (transform-only) · C public with attribution · D derived"},"exposure":{"type":"string","title":"Exposure","description":"never | transform_only | series | latest_only | window_24h | aggregates_only"},"poll_cadence_seconds":{"type":"integer","title":"Poll Cadence Seconds","description":"How often the worker polls"},"effective_cadence_seconds":{"type":"integer","title":"Effective Cadence Seconds","description":"How often new values can appear (freshness is measured against this)"},"source_update_cadence":{"type":"string","title":"Source Update Cadence","description":"Human cadence: 1m, 5m, hourly, 4h, daily, weekly, monthly"},"ts_semantics":{"type":"string","enum":["event","bar_open","publication","fetch"],"title":"Ts Semantics","description":"What event_at means for this source"},"last_event_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Event At","description":"Newest event time in the lake"},"last_fetched_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Fetched At","description":"Last successful fetch"},"age_seconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Age Seconds","description":"Seconds since last_fetched_at"},"status":{"type":"string","enum":["fresh","aging","stale","degraded","unavailable","never","paused"],"title":"Status","description":"Freshness status"},"degraded_reason":{"anyOf":[{"type":"string","enum":["quota_exhausted","plan_gated","provider_unreachable","ingest_gap","worker_disabled","db_outage"]},{"type":"null"}],"title":"Degraded Reason","description":"Set when status == degraded"},"expected_stale":{"type":"boolean","title":"Expected Stale","description":"True when a calendar rule explains the gap (market hours, weekends, monthly releases)"},"expected_stale_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expected Stale Reason","description":"us_market_hours | cme_weekend | etf_trading_days | monthly_release | source_daily | weekly_buckets"},"note":{"type":"string","title":"Note","description":"Operator note"},"feeds_products":{"items":{"type":"string"},"type":"array","title":"Feeds Products","description":"Product ids this source feeds"},"lag_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Lag Days","description":"Provider publication lag, when known"},"value_period":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Value Period","description":"daily when the value changes once a day although rows may be hourly"},"metric_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Metric Id","description":"Id to use with GET /series/{metric_id}; null when the source is not row-readable (licence class A/B)"}},"additionalProperties":false,"type":"object","required":["source_id","provider","category","license_class","exposure","poll_cadence_seconds","effective_cadence_seconds","source_update_cadence","ts_semantics","last_event_at","last_fetched_at","age_seconds","status","degraded_reason","expected_stale","expected_stale_reason","note","feeds_products"],"title":"SourceBoardEntry"},"SourceDetailData":{"properties":{"source_id":{"type":"string","title":"Source Id","description":"Raw lake table name"},"provider":{"type":"string","title":"Provider","description":"Data provider"},"category":{"type":"string","title":"Category","description":"spot_market | derivatives | macro | on_chain | sentiment_social | fundamental_adoption | events_news | dev_activity | fx_commodities"},"license_class":{"type":"string","enum":["A","B","C","D"],"title":"License Class","description":"A never · B paid/restricted (transform-only) · C public with attribution · D derived"},"exposure":{"type":"string","title":"Exposure","description":"never | transform_only | series | latest_only | window_24h | aggregates_only"},"poll_cadence_seconds":{"type":"integer","title":"Poll Cadence Seconds","description":"How often the worker polls"},"effective_cadence_seconds":{"type":"integer","title":"Effective Cadence Seconds","description":"How often new values can appear (freshness is measured against this)"},"source_update_cadence":{"type":"string","title":"Source Update Cadence","description":"Human cadence: 1m, 5m, hourly, 4h, daily, weekly, monthly"},"ts_semantics":{"type":"string","enum":["event","bar_open","publication","fetch"],"title":"Ts Semantics","description":"What event_at means for this source"},"last_event_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Event At","description":"Newest event time in the lake"},"last_fetched_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Fetched At","description":"Last successful fetch"},"age_seconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Age Seconds","description":"Seconds since last_fetched_at"},"status":{"type":"string","enum":["fresh","aging","stale","degraded","unavailable","never","paused"],"title":"Status","description":"Freshness status"},"degraded_reason":{"anyOf":[{"type":"string","enum":["quota_exhausted","plan_gated","provider_unreachable","ingest_gap","worker_disabled","db_outage"]},{"type":"null"}],"title":"Degraded Reason","description":"Set when status == degraded"},"expected_stale":{"type":"boolean","title":"Expected Stale","description":"True when a calendar rule explains the gap (market hours, weekends, monthly releases)"},"expected_stale_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expected Stale Reason","description":"us_market_hours | cme_weekend | etf_trading_days | monthly_release | source_daily | weekly_buckets"},"note":{"type":"string","title":"Note","description":"Operator note"},"feeds_products":{"items":{"type":"string"},"type":"array","title":"Feeds Products","description":"Product ids this source feeds"},"lag_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Lag Days","description":"Provider publication lag, when known"},"value_period":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Value Period","description":"daily when the value changes once a day although rows may be hourly"},"metric_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Metric Id","description":"Id to use with GET /series/{metric_id}; null when the source is not row-readable (licence class A/B)"},"exposure_rule":{"type":"string","title":"Exposure Rule","description":"Plain-language rule for what partners may receive from this source"},"attribution":{"items":{"$ref":"#/components/schemas/AttributionModel"},"type":"array","title":"Attribution","description":"Attributions when the source is served"},"unit":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Unit","description":"Unit of the value column"},"description":{"type":"string","title":"Description","description":"What one row is"}},"additionalProperties":false,"type":"object","required":["source_id","provider","category","license_class","exposure","poll_cadence_seconds","effective_cadence_seconds","source_update_cadence","ts_semantics","last_event_at","last_fetched_at","age_seconds","status","degraded_reason","expected_stale","expected_stale_reason","note","feeds_products","exposure_rule","attribution","unit","description"],"title":"SourceDetailData"},"SourcesData":{"properties":{"snapshot_at":{"type":"string","title":"Snapshot At","description":"When the board was computed, ISO-8601 UTC"},"summary":{"additionalProperties":{"type":"integer"},"type":"object","title":"Summary","description":"Count of ALL raw sources per status (unfiltered)"},"total_sources":{"type":"integer","title":"Total Sources","description":"Number of raw sources on the board before any filter"},"listed":{"type":"integer","title":"Listed","description":"Number of entries in `sources` after filters"},"excluded_paused":{"type":"integer","title":"Excluded Paused","description":"Deliberately paused sources hidden from `sources` because include_paused=false"},"sources":{"items":{"$ref":"#/components/schemas/SourceBoardEntry"},"type":"array","title":"Sources","description":"One entry per raw source (filtered)"}},"additionalProperties":false,"type":"object","required":["snapshot_at","summary","total_sources","listed","excluded_paused","sources"],"title":"SourcesData"},"UnavailableModel":{"properties":{"product_id":{"type":"string","title":"Product Id","description":"Product or item id that could not be served"},"reason":{"type":"string","title":"Reason","description":"feature_disabled | not_entitled | store_unavailable"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note","description":"Human-readable explanation"}},"additionalProperties":false,"type":"object","required":["product_id","reason"],"title":"UnavailableModel"},"VerdictBlock":{"properties":{"signal":{"type":"string","enum":["bullish","bearish","neutral","monitoring"],"title":"Signal","description":"El Profesor's final read of the market"},"confidence":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Confidence","description":"0–1, 4 decimals"},"confidence_pct":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Confidence Pct","description":"0–100"},"market_regime":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Market Regime","description":"Regime label when recorded (e.g. trending_up, ranging)"}},"additionalProperties":false,"type":"object","required":["signal","confidence","confidence_pct"],"title":"VerdictBlock"},"VerdictHistoryData":{"properties":{"cycles":{"items":{"$ref":"#/components/schemas/VerdictHistoryItem"},"type":"array","title":"Cycles","description":"Newest first"}},"additionalProperties":false,"type":"object","required":["cycles"],"title":"VerdictHistoryData"},"VerdictHistoryItem":{"properties":{"cycle_number":{"type":"integer","title":"Cycle Number","description":"Trading cycle number"},"cycle_at":{"type":"string","title":"Cycle At","description":"Cycle event time, ISO-8601 UTC"},"verdict":{"$ref":"#/components/schemas/VerdictBlock","description":"Verdict at that cycle"},"consensus":{"anyOf":[{"$ref":"#/components/schemas/ConsensusBlock"},{"type":"null"}],"description":"Recomputed consensus; null when votes were not stored"},"votes":{"$ref":"#/components/schemas/VotesBlock","description":"Vote tally"},"backfilled":{"type":"boolean","title":"Backfilled","description":"True for rows reconstructed by a backfill script","default":false},"agents":{"anyOf":[{"items":{"$ref":"#/components/schemas/AgentVote"},"type":"array"},{"type":"null"}],"title":"Agents","description":"Per-agent votes when include_agents=true (Tier 1)"}},"additionalProperties":false,"type":"object","required":["cycle_number","cycle_at","verdict","consensus","votes"],"title":"VerdictHistoryItem"},"VerdictLatestData":{"properties":{"cycle_number":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cycle Number","description":"Trading cycle number"},"cycle_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cycle At","description":"Cycle event time, ISO-8601 UTC"},"mode":{"type":"string","title":"Mode","description":"paper | live"},"symbols":{"items":{"type":"string"},"type":"array","title":"Symbols","description":"Symbols analysed in this cycle, slash form e.g. ETH/USDT"},"verdict":{"$ref":"#/components/schemas/VerdictBlock","description":"El Profesor's verdict. Never carries trade instructions"},"consensus":{"anyOf":[{"$ref":"#/components/schemas/ConsensusBlock"},{"type":"null"}],"description":"Deterministic weighted crew consensus; null when it could not be recomputed"},"veto":{"$ref":"#/components/schemas/VetoBlock","description":"Marseille risk veto"},"votes":{"$ref":"#/components/schemas/VotesBlock","description":"Vote tally across the crew"},"agents":{"items":{"$ref":"#/components/schemas/AgentVote"},"type":"array","title":"Agents","description":"Per-agent votes"},"narrative":{"$ref":"#/components/schemas/NarrativeRef","description":"Pointer to the bilingual narrative for this cycle"}},"additionalProperties":false,"type":"object","required":["cycle_number","cycle_at","mode","symbols","verdict","consensus","veto","votes","agents","narrative"],"title":"VerdictLatestData"},"VetoBlock":{"properties":{"marseille_veto":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Marseille Veto","description":"Risk veto by Marseille; null until persisted (P0b)"}},"additionalProperties":false,"type":"object","title":"VetoBlock"},"VotesBlock":{"properties":{"bullish":{"type":"integer","title":"Bullish","description":"Number of crew votes","default":0},"bearish":{"type":"integer","title":"Bearish","description":"Number of crew votes","default":0},"neutral":{"type":"integer","title":"Neutral","description":"Number of crew votes","default":0},"monitoring":{"type":"integer","title":"Monitoring","description":"Number of crew votes","default":0}},"additionalProperties":false,"type":"object","title":"VotesBlock"}},"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key","description":"Partner API key (Tier 1+). Optional on Tier-0 routes: anonymous callers are served under per-IP limits."}}},"tags":[{"name":"data","description":"Partner Data API v1 (ADR-009)"}],"externalDocs":{"description":"llms.txt — read this first","url":"https://bellaciao.live/api/v1/data/llms.txt"}}