{"openapi":"3.1.0","info":{"title":"Bulgarian Pension Fund Data API","description":"Read-only API for Bulgarian pension fund portfolio holdings data (2006-2025)","version":"1.0.0"},"paths":{"/api/auth/login":{"post":{"tags":["Authentication"],"summary":"Login","description":"Login with email and password.\n\nReturns JWT token and sets HTTP-only cookie for browser clients.","operationId":"login_api_auth_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserLogin"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json; charset=utf-8":{"schema":{"$ref":"#/components/schemas/TokenResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/logout":{"post":{"tags":["Authentication"],"summary":"Logout","description":"Logout - clears the session cookie.","operationId":"logout_api_auth_logout_post","responses":{"200":{"description":"Successful Response","content":{"application/json; charset=utf-8":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}}}}},"/api/auth/guest-token":{"post":{"tags":["Authentication"],"summary":"Get Guest Token","description":"Get a temporary guest token for frontend access.\n\nNo authentication required. Issues a short-lived JWT token (30 minutes)\nthat allows the frontend to make API calls on behalf of anonymous users.\n\nThis enables:\n- Public website access without user registration\n- Protection against direct API abuse (tokens expire quickly)\n- Rate limiting per session\n\nFrontend should:\n1. Call this endpoint on app load\n2. Store the token (localStorage/memory)\n3. Include in all API requests: Authorization: Bearer <token>\n4. Refresh before expiration (tokens expire in 30 minutes)","operationId":"get_guest_token_api_auth_guest_token_post","responses":{"200":{"description":"Successful Response","content":{"application/json; charset=utf-8":{"schema":{"$ref":"#/components/schemas/TokenResponse"}}}}}}},"/api/auth/me":{"get":{"tags":["Authentication"],"summary":"Get Current User","description":"Get current authenticated user info.","operationId":"get_current_user_api_auth_me_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json; charset=utf-8":{"schema":{"$ref":"#/components/schemas/UserResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/register":{"post":{"tags":["Authentication"],"summary":"Register","description":"Register a new user account.\n\nNote: In production, you may want to restrict this or add email verification.","operationId":"register_api_auth_register_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json; charset=utf-8":{"schema":{"$ref":"#/components/schemas/UserResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/api-keys":{"get":{"tags":["Authentication"],"summary":"List Api Keys","description":"List all API keys (admin only).","operationId":"list_api_keys_api_auth_api_keys_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json; charset=utf-8":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/APIKeyResponse"},"title":"Response List Api Keys Api Auth Api Keys Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Authentication"],"summary":"Create Api Key","description":"Create a new API key (admin only).\n\n**Important:** The full API key is only returned once. Store it securely!","operationId":"create_api_key_api_auth_api_keys_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIKeyCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json; charset=utf-8":{"schema":{"$ref":"#/components/schemas/APIKeyCreatedResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/api-keys/{key_id}":{"delete":{"tags":["Authentication"],"summary":"Revoke Api Key","description":"Revoke an API key (admin only).","operationId":"revoke_api_key_api_auth_api_keys__key_id__delete","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"integer","title":"Key Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json; charset=utf-8":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/newsletter/subscribe":{"post":{"tags":["Newsletter"],"summary":"Subscribe","operationId":"subscribe_api_newsletter_subscribe_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscribeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json; charset=utf-8":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/chat/stream":{"post":{"tags":["Chat"],"summary":"Chat Stream","description":"Stream a chat completion with MCP tool calling.\n\nAccepts AI SDK v4 message format:\n{\n    \"messages\": [\n        {\"role\": \"user\", \"parts\": [{\"type\": \"text\", \"text\": \"...\"}]},\n        {\"role\": \"assistant\", \"parts\": [{\"type\": \"text\", \"text\": \"...\"}]}\n    ]\n}","operationId":"chat_stream_api_chat_stream_post","responses":{"200":{"description":"Successful Response","content":{"application/json; charset=utf-8":{"schema":{}}}}}}},"/api/v1/managers":{"get":{"tags":["Managers"],"summary":"List Managers","description":"List all pension managers.\n\nReturns all pension fund management companies in the database.","operationId":"list_managers_api_v1_managers_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json; charset=utf-8":{"schema":{"$ref":"#/components/schemas/ManagerListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/managers/{identifier}":{"get":{"tags":["Managers"],"summary":"Get Manager","description":"Get a pension manager by ID or slug.\n\n- **identifier**: Manager ID (integer) or slug (string like 'dskrodina')\n\nReturns detailed information including available schemes and date range.","operationId":"get_manager_api_v1_managers__identifier__get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"identifier","in":"path","required":true,"schema":{"type":"string","title":"Identifier"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json; charset=utf-8":{"schema":{"$ref":"#/components/schemas/ManagerDetailResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/schemes":{"get":{"tags":["Schemes"],"summary":"List Schemes","description":"List all pension schemes.\n\nReturns all pension scheme types (Universal, Professional, Voluntary, etc.).","operationId":"list_schemes_api_v1_schemes_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json; charset=utf-8":{"schema":{"$ref":"#/components/schemas/SchemeListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/schemes/{identifier}":{"get":{"tags":["Schemes"],"summary":"Get Scheme","description":"Get a pension scheme by ID or code.\n\n- **identifier**: Scheme ID (integer) or code (string like 'upf', 'ppf', 'dpf')","operationId":"get_scheme_api_v1_schemes__identifier__get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"identifier","in":"path","required":true,"schema":{"type":"string","title":"Identifier"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json; charset=utf-8":{"schema":{"$ref":"#/components/schemas/SchemeResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/holdings":{"get":{"tags":["Holdings"],"summary":"List Holdings","description":"Query portfolio holdings with filters.\n\nData is quarterly portfolio holdings from 2006-2025 for Bulgarian pension funds.\n\n**Filters:**\n- Use `manager_slug` (e.g., 'dskrodina', 'saglasie') or `manager_id`\n- Use `scheme_code` (e.g., 'upf', 'ppf', 'dpf') or `scheme_id`\n- Use `date_from` and `date_to` to specify date range\n- Use `min_share` to filter holdings with minimum portfolio share\n\n**Pagination:**\n- Default page size is 100, max is 1000\n- Results are sorted by `as_of_date` descending by default","operationId":"list_holdings_api_v1_holdings_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"manager_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Filter by manager ID","title":"Manager Id"},"description":"Filter by manager ID"},{"name":"manager_slug","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by manager slug (e.g., 'dskrodina')","title":"Manager Slug"},"description":"Filter by manager slug (e.g., 'dskrodina')"},{"name":"scheme_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Filter by scheme ID","title":"Scheme Id"},"description":"Filter by scheme ID"},{"name":"scheme_code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by scheme code (e.g., 'upf', 'ppf')","title":"Scheme Code"},"description":"Filter by scheme code (e.g., 'upf', 'ppf')"},{"name":"date_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Start date (YYYY-MM-DD)","title":"Date From"},"description":"Start date (YYYY-MM-DD)"},{"name":"date_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"End date (YYYY-MM-DD)","title":"Date To"},"description":"End date (YYYY-MM-DD)"},{"name":"instrument_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by instrument type name","title":"Instrument Type"},"description":"Filter by instrument type name"},{"name":"issuer_name","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by issuer name (partial match)","title":"Issuer Name"},"description":"Filter by issuer name (partial match)"},{"name":"min_share","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":100,"minimum":0},{"type":"null"}],"description":"Minimum portfolio share (%)","title":"Min Share"},"description":"Minimum portfolio share (%)"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Page number","default":1,"title":"Page"},"description":"Page number"},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"description":"Items per page","default":100,"title":"Page Size"},"description":"Items per page"},{"name":"sort_by","in":"query","required":false,"schema":{"type":"string","description":"Sort field","default":"as_of_date","title":"Sort By"},"description":"Sort field"},{"name":"sort_order","in":"query","required":false,"schema":{"type":"string","pattern":"^(asc|desc)$","description":"Sort order","default":"desc","title":"Sort Order"},"description":"Sort order"},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json; charset=utf-8":{"schema":{"$ref":"#/components/schemas/HoldingsListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/holdings/dates":{"get":{"tags":["Holdings"],"summary":"List Available Dates","description":"List all available reporting dates.\n\nReturns dates for which portfolio data is available, optionally filtered by manager and/or scheme.\nDates are returned in descending order (most recent first).","operationId":"list_available_dates_api_v1_holdings_dates_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"manager_slug","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by manager slug","title":"Manager Slug"},"description":"Filter by manager slug"},{"name":"scheme_code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by scheme code","title":"Scheme Code"},"description":"Filter by scheme code"},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json; charset=utf-8":{"schema":{"$ref":"#/components/schemas/DateListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/holdings/top":{"get":{"tags":["Holdings"],"summary":"Get Top Holdings","description":"Get top N holdings by portfolio share for a specific portfolio date.\n\nHoldings are aggregated by issuer and ranked by total portfolio share.\n\n**Required parameters:**\n- `manager_slug`: e.g., 'dskrodina', 'saglasie'\n- `scheme_code`: e.g., 'upf', 'ppf', 'dpf'\n- `as_of_date`: Portfolio date in YYYY-MM-DD format","operationId":"get_top_holdings_api_v1_holdings_top_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"manager_slug","in":"query","required":true,"schema":{"type":"string","description":"Manager slug (required)","title":"Manager Slug"},"description":"Manager slug (required)"},{"name":"scheme_code","in":"query","required":true,"schema":{"type":"string","description":"Scheme code (required)","title":"Scheme Code"},"description":"Scheme code (required)"},{"name":"as_of_date","in":"query","required":true,"schema":{"type":"string","format":"date","description":"Portfolio date (required)","title":"As Of Date"},"description":"Portfolio date (required)"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"description":"Number of top holdings","default":10,"title":"Limit"},"description":"Number of top holdings"},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json; charset=utf-8":{"schema":{"$ref":"#/components/schemas/TopHoldingsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/holdings/source-pdf":{"get":{"tags":["Holdings"],"summary":"Get Source Pdf","description":"Download source PDF used for holdings parsing.","operationId":"get_source_pdf_api_v1_holdings_source_pdf_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"manager_slug","in":"query","required":true,"schema":{"type":"string","description":"Manager slug (required)","title":"Manager Slug"},"description":"Manager slug (required)"},{"name":"scheme_code","in":"query","required":true,"schema":{"type":"string","description":"Scheme code (required)","title":"Scheme Code"},"description":"Scheme code (required)"},{"name":"as_of_date","in":"query","required":true,"schema":{"type":"string","format":"date","description":"Portfolio date (required)","title":"As Of Date"},"description":"Portfolio date (required)"},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json; charset=utf-8":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/instrument-types":{"get":{"tags":["Instrument Types"],"summary":"List Instrument Types","description":"List all financial instrument types.\n\nReturns hierarchical instrument types with parent-child relationships.\nParent types are 'equity' and 'debt', with specific types as children.\n\n**Equity types:**\n- public equity\n- ADSIC equity\n- collective investment scheme\n\n**Debt types:**\n- government bond\n- mortgage bond\n- corporate bond\n- secured corporate bond\n- european institution bond","operationId":"list_instrument_types_api_v1_instrument_types_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json; charset=utf-8":{"schema":{"$ref":"#/components/schemas/InstrumentTypeListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/instrument-types/{identifier}":{"get":{"tags":["Instrument Types"],"summary":"Get Instrument Type","description":"Get an instrument type by ID or name.\n\n- **identifier**: Type ID (integer) or name (string like 'government bond')","operationId":"get_instrument_type_api_v1_instrument_types__identifier__get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"identifier","in":"path","required":true,"schema":{"type":"string","title":"Identifier"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json; charset=utf-8":{"schema":{"$ref":"#/components/schemas/InstrumentTypeResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/nav":{"get":{"tags":["NAV"],"summary":"List Nav Data","description":"Query NAV (Net Asset Value) data with filters.\n\nDaily NAV data from 2005-2026 for Bulgarian pension funds (~312K records).\n\n**Filters:**\n- Use `manager_slug` (e.g., 'dskrodina', 'saglasie') or `manager_id`\n- Use `scheme_code` (e.g., 'upf', 'ppf', 'dpf') or `scheme_id`\n- Use `date_from` and `date_to` to specify date range\n\n**Tip:** For charting, use the `/nav/timeseries` endpoint instead.","operationId":"list_nav_data_api_v1_nav_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"manager_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Filter by manager ID","title":"Manager Id"},"description":"Filter by manager ID"},{"name":"manager_slug","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by manager slug (e.g., 'dskrodina')","title":"Manager Slug"},"description":"Filter by manager slug (e.g., 'dskrodina')"},{"name":"scheme_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Filter by scheme ID","title":"Scheme Id"},"description":"Filter by scheme ID"},{"name":"scheme_code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by scheme code (e.g., 'upf', 'ppf')","title":"Scheme Code"},"description":"Filter by scheme code (e.g., 'upf', 'ppf')"},{"name":"date_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Start date (YYYY-MM-DD)","title":"Date From"},"description":"Start date (YYYY-MM-DD)"},{"name":"date_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"End date (YYYY-MM-DD)","title":"Date To"},"description":"End date (YYYY-MM-DD)"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Page number","default":1,"title":"Page"},"description":"Page number"},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"description":"Items per page","default":100,"title":"Page Size"},"description":"Items per page"},{"name":"sort_order","in":"query","required":false,"schema":{"type":"string","pattern":"^(asc|desc)$","description":"Sort order by date","default":"desc","title":"Sort Order"},"description":"Sort order by date"},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json; charset=utf-8":{"schema":{"$ref":"#/components/schemas/NavListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/nav/timeseries":{"get":{"tags":["NAV"],"summary":"Get Nav Timeseries","description":"Get NAV time series for charting.\n\nReturns an optimized response with just dates and values for a specific\nmanager/scheme combination. Ideal for rendering charts.\n\n**Required parameters:**\n- `manager_slug`: e.g., 'dskrodina', 'saglasie'\n- `scheme_code`: e.g., 'upf', 'ppf', 'dpf'\n\n**Optional date range:**\n- `date_from`: Start date\n- `date_to`: End date","operationId":"get_nav_timeseries_api_v1_nav_timeseries_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"manager_slug","in":"query","required":true,"schema":{"type":"string","description":"Manager slug (required)","title":"Manager Slug"},"description":"Manager slug (required)"},{"name":"scheme_code","in":"query","required":true,"schema":{"type":"string","description":"Scheme code (required)","title":"Scheme Code"},"description":"Scheme code (required)"},{"name":"date_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Start date (YYYY-MM-DD)","title":"Date From"},"description":"Start date (YYYY-MM-DD)"},{"name":"date_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"End date (YYYY-MM-DD)","title":"Date To"},"description":"End date (YYYY-MM-DD)"},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json; charset=utf-8":{"schema":{"$ref":"#/components/schemas/NavTimeSeriesResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/analytics/summary":{"get":{"tags":["Analytics"],"summary":"Analytics Summary","description":"Get analytics summary with computed metrics for a specific fund.\n\nReturns NAV-based metrics (returns, volatility, drawdown) and\nholdings-based metrics (allocation, top holding).","operationId":"analytics_summary_api_v1_analytics_summary_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"manager_slug","in":"query","required":true,"schema":{"type":"string","description":"Manager slug (e.g. 'dskrodina')","title":"Manager Slug"},"description":"Manager slug (e.g. 'dskrodina')"},{"name":"scheme_code","in":"query","required":true,"schema":{"type":"string","description":"Scheme code (e.g. 'upf')","title":"Scheme Code"},"description":"Scheme code (e.g. 'upf')"},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json; charset=utf-8":{"schema":{"$ref":"#/components/schemas/AnalyticsSummaryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/analytics/similarity-network":{"get":{"tags":["Analytics"],"summary":"Similarity Network","description":"Get manager similarity network for a scheme based on 1Y EWMA return correlation.","operationId":"similarity_network_api_v1_analytics_similarity_network_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"scheme_code","in":"query","required":true,"schema":{"type":"string","description":"Scheme code (e.g. 'upf')","title":"Scheme Code"},"description":"Scheme code (e.g. 'upf')"},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json; charset=utf-8":{"schema":{"$ref":"#/components/schemas/SimilarityNetworkResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/analytics/risk-return-scatter":{"get":{"tags":["Analytics"],"summary":"Risk Return Scatter","description":"Get risk/return scatter data for managers in a scheme.\n\nX-axis: annualized return from monthly returns.\nY-axis: standard deviation of monthly returns.\nUses full available NAV history for each manager.","operationId":"risk_return_scatter_api_v1_analytics_risk_return_scatter_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"scheme_code","in":"query","required":true,"schema":{"type":"string","description":"Scheme code (e.g. 'upf')","title":"Scheme Code"},"description":"Scheme code (e.g. 'upf')"},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json; charset=utf-8":{"schema":{"$ref":"#/components/schemas/RiskReturnScatterResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/analytics/transfer-probability":{"get":{"tags":["Analytics"],"summary":"Transfer Probability","description":"Get manager-to-manager transfer probabilities for a scheme.\n\nProbability is computed as:\n  moved_count(from -> to) / total_outgoing(from)","operationId":"transfer_probability_api_v1_analytics_transfer_probability_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"scheme_code","in":"query","required":true,"schema":{"type":"string","description":"Scheme code (e.g. 'upf')","title":"Scheme Code"},"description":"Scheme code (e.g. 'upf')"},{"name":"mode","in":"query","required":false,"schema":{"type":"string","pattern":"^(latest_quarterly|latest|all)$","description":"Aggregation mode: latest_quarterly | latest | all","default":"latest_quarterly","title":"Mode"},"description":"Aggregation mode: latest_quarterly | latest | all"},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json; charset=utf-8":{"schema":{"$ref":"#/components/schemas/TransferProbabilityResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/benchmarks":{"get":{"tags":["Benchmarks"],"summary":"List Benchmark Assets","description":"List all benchmark assets available for comparison.","operationId":"list_benchmark_assets_api_v1_benchmarks_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json; charset=utf-8":{"schema":{"$ref":"#/components/schemas/BenchmarkAssetListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/benchmarks/timeseries":{"get":{"tags":["Benchmarks"],"summary":"Get Benchmark Timeseries","description":"Get benchmark time series in EUR for charting.","operationId":"get_benchmark_timeseries_api_v1_benchmarks_timeseries_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"asset_slug","in":"query","required":true,"schema":{"type":"string","description":"Benchmark asset slug","title":"Asset Slug"},"description":"Benchmark asset slug"},{"name":"date_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Start date (YYYY-MM-DD)","title":"Date From"},"description":"Start date (YYYY-MM-DD)"},{"name":"date_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"End date (YYYY-MM-DD)","title":"Date To"},"description":"End date (YYYY-MM-DD)"},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json; charset=utf-8":{"schema":{"$ref":"#/components/schemas/BenchmarkTimeSeriesResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/reports":{"get":{"tags":["Reports"],"summary":"List Reports","description":"List available markdown holdings reports.","operationId":"list_reports_api_v1_reports_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"manager_slug","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by manager slug (e.g., 'dskrodina')","title":"Manager Slug"},"description":"Filter by manager slug (e.g., 'dskrodina')"},{"name":"fund_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by fund type (e.g., 'ppf', 'upf')","title":"Fund Type"},"description":"Filter by fund type (e.g., 'ppf', 'upf')"},{"name":"date_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Start date filter (YYYY-MM-DD)","title":"Date From"},"description":"Start date filter (YYYY-MM-DD)"},{"name":"date_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"End date filter (YYYY-MM-DD)","title":"Date To"},"description":"End date filter (YYYY-MM-DD)"},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json; charset=utf-8":{"schema":{"$ref":"#/components/schemas/ReportListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/reports/index":{"get":{"tags":["Reports"],"summary":"Get Index","description":"Get a lightweight summary index of all reports with allocation metadata.","operationId":"get_index_api_v1_reports_index_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"manager_slug","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by manager slug","title":"Manager Slug"},"description":"Filter by manager slug"},{"name":"fund_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by fund type","title":"Fund Type"},"description":"Filter by fund type"},{"name":"date_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Start date filter (YYYY-MM-DD)","title":"Date From"},"description":"Start date filter (YYYY-MM-DD)"},{"name":"date_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"End date filter (YYYY-MM-DD)","title":"Date To"},"description":"End date filter (YYYY-MM-DD)"},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json; charset=utf-8":{"schema":{"$ref":"#/components/schemas/IndexResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/reports/{manager_slug}/{fund_type}/{date}":{"get":{"tags":["Reports"],"summary":"Read Report","description":"Read a specific markdown holdings report by manager, fund type, and date.","operationId":"read_report_api_v1_reports__manager_slug___fund_type___date__get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"manager_slug","in":"path","required":true,"schema":{"type":"string","title":"Manager Slug"}},{"name":"fund_type","in":"path","required":true,"schema":{"type":"string","title":"Fund Type"}},{"name":"date","in":"path","required":true,"schema":{"type":"string","title":"Date"}},{"name":"summary_only","in":"query","required":false,"schema":{"type":"boolean","description":"Return only metadata, omit full content","default":false,"title":"Summary Only"},"description":"Return only metadata, omit full content"},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json; charset=utf-8":{"schema":{"$ref":"#/components/schemas/ReportResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/health":{"get":{"tags":["Health"],"summary":"Health Check","description":"Health check endpoint.","operationId":"health_check_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json; charset=utf-8":{"schema":{}}}}}}}},"components":{"schemas":{"APIKeyCreate":{"properties":{"name":{"type":"string","title":"Name"},"owner_email":{"anyOf":[{"type":"string","format":"email"},{"type":"null"}],"title":"Owner Email"},"rate_limit":{"type":"integer","title":"Rate Limit","default":1000}},"type":"object","required":["name"],"title":"APIKeyCreate"},"APIKeyCreatedResponse":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"api_key":{"type":"string","title":"Api Key"},"key_prefix":{"type":"string","title":"Key Prefix"},"message":{"type":"string","title":"Message","default":"Store this API key securely. It won't be shown again."}},"type":"object","required":["id","name","api_key","key_prefix"],"title":"APIKeyCreatedResponse","description":"Response when creating a new API key - includes the full key (only shown once)."},"APIKeyResponse":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"key_prefix":{"type":"string","title":"Key Prefix"},"owner_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Owner Email"},"is_active":{"type":"boolean","title":"Is Active"},"rate_limit":{"type":"integer","title":"Rate Limit"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"last_used":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Used"},"request_count":{"type":"integer","title":"Request Count"}},"type":"object","required":["id","name","key_prefix","owner_email","is_active","rate_limit","created_at","last_used","request_count"],"title":"APIKeyResponse"},"AllocationInfo":{"properties":{"equity_pct":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Equity Pct"},"debt_pct":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Debt Pct"},"other_pct":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Other Pct"}},"type":"object","title":"AllocationInfo"},"AnalyticsSummaryResponse":{"properties":{"manager":{"$ref":"#/components/schemas/api__v1__analytics__schemas__ManagerRef"},"scheme":{"$ref":"#/components/schemas/api__v1__analytics__schemas__SchemeRef"},"nav_metrics":{"$ref":"#/components/schemas/NavMetrics"},"holdings_metrics":{"$ref":"#/components/schemas/HoldingsMetrics"},"labels":{"items":{"$ref":"#/components/schemas/FundLabel"},"type":"array","title":"Labels"},"similar_funds":{"items":{"$ref":"#/components/schemas/SimilarFundInfo"},"type":"array","title":"Similar Funds"}},"type":"object","required":["manager","scheme","nav_metrics","holdings_metrics"],"title":"AnalyticsSummaryResponse"},"BenchmarkAssetListResponse":{"properties":{"data":{"items":{"$ref":"#/components/schemas/BenchmarkAssetResponse"},"type":"array","title":"Data"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["data","total"],"title":"BenchmarkAssetListResponse"},"BenchmarkAssetResponse":{"properties":{"id":{"type":"integer","title":"Id"},"slug":{"type":"string","title":"Slug"},"name":{"type":"string","title":"Name"},"category":{"type":"string","title":"Category"},"native_currency":{"type":"string","title":"Native Currency"},"source_name":{"type":"string","title":"Source Name"},"source_symbol":{"type":"string","title":"Source Symbol"}},"type":"object","required":["id","slug","name","category","native_currency","source_name","source_symbol"],"title":"BenchmarkAssetResponse"},"BenchmarkTimeSeriesPoint":{"properties":{"date":{"type":"string","format":"date","title":"Date"},"value":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Value"}},"type":"object","required":["date","value"],"title":"BenchmarkTimeSeriesPoint"},"BenchmarkTimeSeriesResponse":{"properties":{"asset":{"$ref":"#/components/schemas/BenchmarkAssetResponse"},"data":{"items":{"$ref":"#/components/schemas/BenchmarkTimeSeriesPoint"},"type":"array","title":"Data"},"date_range":{"additionalProperties":true,"type":"object","title":"Date Range"},"total_points":{"type":"integer","title":"Total Points"}},"type":"object","required":["asset","date_range","total_points"],"title":"BenchmarkTimeSeriesResponse"},"DateListResponse":{"properties":{"data":{"items":{"type":"string","format":"date"},"type":"array","title":"Data"},"total":{"type":"integer","title":"Total"},"date_range":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Date Range"}},"type":"object","required":["data","total"],"title":"DateListResponse","description":"Response for listing available dates."},"FundLabel":{"properties":{"code":{"type":"string","title":"Code"},"name":{"type":"string","title":"Name"},"emoji":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Emoji"},"as_of_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"As Of Date"}},"type":"object","required":["code","name"],"title":"FundLabel"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"HoldingResponse":{"properties":{"id":{"type":"integer","title":"Id"},"as_of_date":{"type":"string","format":"date","title":"As Of Date"},"manager":{"$ref":"#/components/schemas/api__v1__holdings__schemas__ManagerRef"},"scheme":{"$ref":"#/components/schemas/api__v1__holdings__schemas__SchemeRef"},"issuer":{"$ref":"#/components/schemas/IssuerRef"},"instrument_type":{"$ref":"#/components/schemas/InstrumentTypeRef"},"security_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Security Type"},"value":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Value"},"value_unit":{"type":"string","title":"Value Unit","default":"thousands"},"value_currency":{"type":"string","title":"Value Currency"},"share_in_portfolio":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Share In Portfolio"}},"type":"object","required":["id","as_of_date","manager","scheme","issuer","instrument_type","value","value_currency"],"title":"HoldingResponse","description":"Portfolio holding response schema."},"HoldingsListResponse":{"properties":{"data":{"items":{"$ref":"#/components/schemas/HoldingResponse"},"type":"array","title":"Data"},"pagination":{"$ref":"#/components/schemas/PaginationMeta"},"filters_applied":{"additionalProperties":true,"type":"object","title":"Filters Applied"}},"type":"object","required":["data","pagination"],"title":"HoldingsListResponse","description":"Response for listing holdings."},"HoldingsMetrics":{"properties":{"as_of_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"As Of Date"},"total_holdings":{"type":"integer","title":"Total Holdings","default":0},"top_holding":{"anyOf":[{"$ref":"#/components/schemas/TopHoldingInfo"},{"type":"null"}]},"allocation":{"$ref":"#/components/schemas/AllocationInfo"}},"type":"object","title":"HoldingsMetrics"},"IndexEntry":{"properties":{"manager_slug":{"type":"string","title":"Manager Slug"},"fund_type":{"type":"string","title":"Fund Type"},"date":{"type":"string","title":"Date"},"fund_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fund Name"},"equity_total":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Equity Total"},"funds_total":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Funds Total"},"pct_domestic":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Pct Domestic"},"top_domestic":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Top Domestic"},"top_foreign":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Top Foreign"}},"type":"object","required":["manager_slug","fund_type","date"],"title":"IndexEntry","description":"Summary entry in the report index."},"IndexResponse":{"properties":{"data":{"items":{"$ref":"#/components/schemas/IndexEntry"},"type":"array","title":"Data"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["data","total"],"title":"IndexResponse","description":"Response for the report index."},"InstrumentTypeChild":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"section_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Section Number"}},"type":"object","required":["id","name"],"title":"InstrumentTypeChild","description":"Child instrument type schema."},"InstrumentTypeListResponse":{"properties":{"data":{"items":{"$ref":"#/components/schemas/InstrumentTypeResponse"},"type":"array","title":"Data"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["data","total"],"title":"InstrumentTypeListResponse","description":"Response for listing instrument types."},"InstrumentTypeRef":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"parent_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Type"}},"type":"object","required":["id","name"],"title":"InstrumentTypeRef","description":"Reference to an instrument type."},"InstrumentTypeResponse":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"parent_type_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Parent Type Id"},"section_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Section Number"},"children":{"items":{"$ref":"#/components/schemas/InstrumentTypeChild"},"type":"array","title":"Children","default":[]}},"type":"object","required":["id","name"],"title":"InstrumentTypeResponse","description":"Instrument type response schema with hierarchy."},"IssuerRef":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"country_of_risk":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country Of Risk"},"country_of_risk_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country Of Risk Source"},"country_of_risk_confidence":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Country Of Risk Confidence"}},"type":"object","required":["id","name"],"title":"IssuerRef","description":"Reference to an issuer."},"ManagerDetailResponse":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"slug":{"type":"string","title":"Slug"},"is_active":{"type":"boolean","title":"Is Active","default":true},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date"},"schemes":{"items":{"type":"string"},"type":"array","title":"Schemes","description":"List of scheme codes available for this manager"},"holdings_count":{"type":"integer","title":"Holdings Count","description":"Total number of portfolio holdings","default":0},"date_range":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Date Range","description":"Earliest and latest holding dates"}},"type":"object","required":["id","name","slug"],"title":"ManagerDetailResponse","description":"Detailed manager response with additional stats."},"ManagerListResponse":{"properties":{"data":{"items":{"$ref":"#/components/schemas/ManagerResponse"},"type":"array","title":"Data"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["data","total"],"title":"ManagerListResponse","description":"Response for listing all managers."},"ManagerResponse":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"slug":{"type":"string","title":"Slug"},"is_active":{"type":"boolean","title":"Is Active","default":true},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date"},"total_aum_thousands":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Total Aum Thousands"},"aum_by_scheme":{"anyOf":[{"additionalProperties":{"type":"number"},"type":"object"},{"type":"null"}],"title":"Aum By Scheme","description":"AUM in thousands by scheme code (upf, ppf, dpf, etc.)"},"aum_as_of_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Aum As Of Date","description":"Most recent as-of date for AUM data (YYYY-MM-DD format)"},"upf_return_1y_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Upf Return 1Y Pct","description":"UPF return over the past 1 year in percent"}},"type":"object","required":["id","name","slug"],"title":"ManagerResponse","description":"Manager response schema."},"MessageResponse":{"properties":{"message":{"type":"string","title":"Message"}},"type":"object","required":["message"],"title":"MessageResponse"},"NavListResponse":{"properties":{"data":{"items":{"$ref":"#/components/schemas/NavResponse"},"type":"array","title":"Data"},"pagination":{"$ref":"#/components/schemas/PaginationMeta"},"filters_applied":{"additionalProperties":true,"type":"object","title":"Filters Applied"}},"type":"object","required":["data","pagination"],"title":"NavListResponse","description":"Response for listing NAV data."},"NavMetrics":{"properties":{"latest_value":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Latest Value"},"latest_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Latest Date"},"earliest_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Earliest Date"},"total_data_points":{"type":"integer","title":"Total Data Points","default":0},"ytd_return_pct":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Ytd Return Pct"},"return_1y_pct":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Return 1Y Pct"},"return_3y_pct":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Return 3Y Pct"},"return_5y_pct":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Return 5Y Pct"},"return_all_time_pct":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Return All Time Pct"},"annualized_return_pct":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Annualized Return Pct"},"max_drawdown_pct":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Max Drawdown Pct"},"volatility_annualized_pct":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Volatility Annualized Pct"}},"type":"object","title":"NavMetrics"},"NavResponse":{"properties":{"id":{"type":"integer","title":"Id"},"as_of_date":{"type":"string","format":"date","title":"As Of Date"},"manager":{"$ref":"#/components/schemas/api__v1__nav__schemas__ManagerRef"},"scheme":{"$ref":"#/components/schemas/api__v1__nav__schemas__SchemeRef"},"value":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Value"}},"type":"object","required":["id","as_of_date","manager","scheme","value"],"title":"NavResponse","description":"NAV response schema."},"NavTimeSeriesPoint":{"properties":{"date":{"type":"string","format":"date","title":"Date"},"value":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Value"}},"type":"object","required":["date","value"],"title":"NavTimeSeriesPoint","description":"Single point in NAV time series."},"NavTimeSeriesResponse":{"properties":{"manager":{"$ref":"#/components/schemas/api__v1__nav__schemas__ManagerRef"},"scheme":{"$ref":"#/components/schemas/api__v1__nav__schemas__SchemeRef"},"data":{"items":{"$ref":"#/components/schemas/NavTimeSeriesPoint"},"type":"array","title":"Data"},"date_range":{"additionalProperties":true,"type":"object","title":"Date Range"},"total_points":{"type":"integer","title":"Total Points"}},"type":"object","required":["manager","scheme","data","date_range","total_points"],"title":"NavTimeSeriesResponse","description":"Response for NAV time series (optimized for charts)."},"PaginationMeta":{"properties":{"page":{"type":"integer","title":"Page"},"page_size":{"type":"integer","title":"Page Size"},"total_items":{"type":"integer","title":"Total Items"},"total_pages":{"type":"integer","title":"Total Pages"},"has_next":{"type":"boolean","title":"Has Next"},"has_prev":{"type":"boolean","title":"Has Prev"}},"type":"object","required":["page","page_size","total_items","total_pages","has_next","has_prev"],"title":"PaginationMeta","description":"Pagination metadata."},"ReportEntry":{"properties":{"manager_slug":{"type":"string","title":"Manager Slug"},"fund_type":{"type":"string","title":"Fund Type"},"date":{"type":"string","title":"Date"},"r2_key":{"type":"string","title":"R2 Key"}},"type":"object","required":["manager_slug","fund_type","date","r2_key"],"title":"ReportEntry","description":"A single available markdown report."},"ReportListResponse":{"properties":{"data":{"items":{"$ref":"#/components/schemas/ReportEntry"},"type":"array","title":"Data"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["data","total"],"title":"ReportListResponse","description":"Response for listing available reports."},"ReportMetadata":{"properties":{"fund_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fund Name"},"fund_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fund Date"},"equity_total":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Equity Total"},"funds_total":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Funds Total"},"bonds_total":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Bonds Total"},"pct_domestic":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Pct Domestic"},"pct_international":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Pct International"},"top_domestic":{"items":{"type":"string"},"type":"array","title":"Top Domestic"},"top_international":{"items":{"type":"string"},"type":"array","title":"Top International"}},"type":"object","title":"ReportMetadata","description":"Parsed YAML frontmatter metadata from a report."},"ReportResponse":{"properties":{"manager_slug":{"type":"string","title":"Manager Slug"},"fund_type":{"type":"string","title":"Fund Type"},"date":{"type":"string","title":"Date"},"metadata":{"$ref":"#/components/schemas/ReportMetadata"},"content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content"}},"type":"object","required":["manager_slug","fund_type","date","metadata"],"title":"ReportResponse","description":"Response for reading a single report."},"RiskReturnPoint":{"properties":{"manager_name":{"type":"string","title":"Manager Name"},"manager_slug":{"type":"string","title":"Manager Slug"},"annual_return_pct":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Annual Return Pct"},"yearly_stddev_pct":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Yearly Stddev Pct"},"observations_years":{"type":"integer","title":"Observations Years","default":0},"date_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date From"},"date_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date To"}},"type":"object","required":["manager_name","manager_slug"],"title":"RiskReturnPoint"},"RiskReturnScatterResponse":{"properties":{"scheme":{"$ref":"#/components/schemas/api__v1__analytics__schemas__SchemeRef"},"points":{"items":{"$ref":"#/components/schemas/RiskReturnPoint"},"type":"array","title":"Points"}},"type":"object","required":["scheme"],"title":"RiskReturnScatterResponse"},"SchemeListResponse":{"properties":{"data":{"items":{"$ref":"#/components/schemas/SchemeResponse"},"type":"array","title":"Data"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["data","total"],"title":"SchemeListResponse","description":"Response for listing all schemes."},"SchemeResponse":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"code":{"type":"string","title":"Code"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"creation_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Creation Date"}},"type":"object","required":["id","name","code"],"title":"SchemeResponse","description":"Scheme response schema."},"SimilarFundInfo":{"properties":{"manager_name":{"type":"string","title":"Manager Name"},"manager_slug":{"type":"string","title":"Manager Slug"},"correlation":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Correlation"},"observations":{"type":"integer","title":"Observations","default":0},"date_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date From"},"date_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date To"}},"type":"object","required":["manager_name","manager_slug"],"title":"SimilarFundInfo"},"SimilarityEdge":{"properties":{"source_slug":{"type":"string","title":"Source Slug"},"target_slug":{"type":"string","title":"Target Slug"},"correlation":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Correlation"},"observations":{"type":"integer","title":"Observations","default":0},"date_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date From"},"date_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date To"}},"type":"object","required":["source_slug","target_slug"],"title":"SimilarityEdge"},"SimilarityNetworkResponse":{"properties":{"scheme":{"$ref":"#/components/schemas/api__v1__analytics__schemas__SchemeRef"},"lambda_value":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Lambda Value"},"window_days":{"type":"integer","title":"Window Days"},"nodes":{"items":{"$ref":"#/components/schemas/SimilarityNode"},"type":"array","title":"Nodes"},"edges":{"items":{"$ref":"#/components/schemas/SimilarityEdge"},"type":"array","title":"Edges"}},"type":"object","required":["scheme","lambda_value","window_days"],"title":"SimilarityNetworkResponse"},"SimilarityNode":{"properties":{"manager_name":{"type":"string","title":"Manager Name"},"manager_slug":{"type":"string","title":"Manager Slug"}},"type":"object","required":["manager_name","manager_slug"],"title":"SimilarityNode"},"SubscribeRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"}},"type":"object","required":["email"],"title":"SubscribeRequest"},"TokenResponse":{"properties":{"access_token":{"type":"string","title":"Access Token"},"token_type":{"type":"string","title":"Token Type","default":"bearer"},"expires_in":{"type":"integer","title":"Expires In"}},"type":"object","required":["access_token","expires_in"],"title":"TokenResponse"},"TopHoldingInfo":{"properties":{"issuer_name":{"type":"string","title":"Issuer Name"},"share_pct":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Share Pct"},"instrument_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Instrument Type"}},"type":"object","required":["issuer_name"],"title":"TopHoldingInfo"},"TopHoldingResponse":{"properties":{"rank":{"type":"integer","title":"Rank"},"issuer_name":{"type":"string","title":"Issuer Name"},"total_value":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Total Value"},"total_share":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Total Share"},"instrument_types":{"items":{"type":"string"},"type":"array","title":"Instrument Types"},"value_currency":{"type":"string","title":"Value Currency"}},"type":"object","required":["rank","issuer_name","total_value","total_share","instrument_types","value_currency"],"title":"TopHoldingResponse","description":"Top holding response."},"TopHoldingsResponse":{"properties":{"data":{"items":{"$ref":"#/components/schemas/TopHoldingResponse"},"type":"array","title":"Data"},"metadata":{"additionalProperties":true,"type":"object","title":"Metadata"}},"type":"object","required":["data","metadata"],"title":"TopHoldingsResponse","description":"Response for top holdings endpoint."},"TransferProbabilityCell":{"properties":{"from_manager_slug":{"type":"string","title":"From Manager Slug"},"to_manager_slug":{"type":"string","title":"To Manager Slug"},"moved_count":{"type":"integer","title":"Moved Count","default":0},"probability_pct":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Probability Pct"}},"type":"object","required":["from_manager_slug","to_manager_slug"],"title":"TransferProbabilityCell"},"TransferProbabilityManager":{"properties":{"manager_name":{"type":"string","title":"Manager Name"},"manager_slug":{"type":"string","title":"Manager Slug"},"total_moved_count":{"type":"integer","title":"Total Moved Count","default":0},"share_of_all_moved_pct":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Share Of All Moved Pct"}},"type":"object","required":["manager_name","manager_slug"],"title":"TransferProbabilityManager"},"TransferProbabilityResponse":{"properties":{"scheme":{"$ref":"#/components/schemas/api__v1__analytics__schemas__SchemeRef"},"mode":{"type":"string","title":"Mode"},"period_start":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Period Start"},"period_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Period End"},"period_kind":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Period Kind"},"period_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Period Label"},"observations":{"type":"integer","title":"Observations","default":0},"managers":{"items":{"$ref":"#/components/schemas/TransferProbabilityManager"},"type":"array","title":"Managers"},"cells":{"items":{"$ref":"#/components/schemas/TransferProbabilityCell"},"type":"array","title":"Cells"}},"type":"object","required":["scheme","mode"],"title":"TransferProbabilityResponse"},"UserCreate":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"password":{"type":"string","title":"Password"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"}},"type":"object","required":["email","password"],"title":"UserCreate"},"UserLogin":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"password":{"type":"string","title":"Password"}},"type":"object","required":["email","password"],"title":"UserLogin"},"UserResponse":{"properties":{"id":{"type":"integer","title":"Id"},"email":{"type":"string","title":"Email"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"is_active":{"type":"boolean","title":"Is Active"},"is_admin":{"type":"boolean","title":"Is Admin"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","email","name","is_active","is_admin","created_at"],"title":"UserResponse"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"api__v1__analytics__schemas__ManagerRef":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"slug":{"type":"string","title":"Slug"}},"type":"object","required":["id","name","slug"],"title":"ManagerRef"},"api__v1__analytics__schemas__SchemeRef":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"code":{"type":"string","title":"Code"}},"type":"object","required":["id","name","code"],"title":"SchemeRef"},"api__v1__holdings__schemas__ManagerRef":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"slug":{"type":"string","title":"Slug"}},"type":"object","required":["id","name","slug"],"title":"ManagerRef","description":"Reference to a pension manager."},"api__v1__holdings__schemas__SchemeRef":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"code":{"type":"string","title":"Code"}},"type":"object","required":["id","name","code"],"title":"SchemeRef","description":"Reference to a pension scheme."},"api__v1__nav__schemas__ManagerRef":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"slug":{"type":"string","title":"Slug"}},"type":"object","required":["id","name","slug"],"title":"ManagerRef","description":"Reference to a pension manager."},"api__v1__nav__schemas__SchemeRef":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"code":{"type":"string","title":"Code"}},"type":"object","required":["id","name","code"],"title":"SchemeRef","description":"Reference to a pension scheme."}},"securitySchemes":{"APIKeyHeader":{"type":"apiKey","in":"header","name":"X-API-Key"}}}}