{"openapi":"3.1.0","info":{"title":"WoW Token Price Tracker","description":"REST API for tracking World of Warcraft token prices with historical data, charts, and Discord alerts.\n\n## REST vs SOAP\n\nThis API is a **REST (Representational State Transfer)** API, not SOAP.\n\n**Key differences:**\n- **REST**: Uses standard HTTP methods (GET, POST, PUT, DELETE) and returns JSON. Lightweight, cacheable, stateless.\n- **SOAP**: Uses XML and custom envelope format. More complex, typically requires WSDL. Better for complex enterprise systems.\n\n**This API uses:**\n- ✅ HTTP GET requests for data retrieval\n- ✅ JSON responses (easy to parse)\n- ✅ Resource-based URLs (/api/history, /api/latest, etc.)\n- ✅ Standard HTTP status codes\n- ✅ Simple, stateless operations\n","version":"1.0.0"},"paths":{"/health":{"get":{"summary":"Health","description":"Lightweight health endpoint used by uptime and service checks.","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthResponse"}}}}}}},"/redoc":{"get":{"summary":"Get Redoc","description":"Serve ReDoc documentation with a pinned CDN version.","operationId":"get_redoc_redoc_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/api/latest":{"get":{"summary":"Get Latest Price","description":"Return the most recent token price row from SQLite.","operationId":"get_latest_price_api_latest_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LatestPriceRow"}}}}}}},"/api/history":{"get":{"summary":"Get Price History","description":"Return token history rows, newest first. Optionally filtered by date range.\n\nIf aggregate='daily', returns one entry per day with average price rounded to whole gold.\n\nPagination:\n- If date range is specified: returns all matching rows (no pagination limit)\n- If no date range: default limit=1000, paginate with offset parameter","operationId":"get_price_history_api_history_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":5000,"minimum":1,"default":1000,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Start Date"}},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"End Date"}},{"name":"aggregate","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Aggregate"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HistoryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/poll-status":{"get":{"summary":"Get Poll Status","description":"Return whether manual polling is currently allowed.","operationId":"get_poll_status_api_poll_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PollStatusResponse"}}}}}}},"/api/poll-schedule":{"get":{"summary":"Get Poll Schedule","description":"Return information about the automatic polling schedule (cron).","operationId":"get_poll_schedule_api_poll_schedule_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PollScheduleResponse"}}}}}}},"/api/poll-health":{"get":{"summary":"Check Poll Health","description":"Check if automatic polling is healthy (cron is actually running).\n\nReturns:\n- healthy: bool - True if last poll was recent (< 10 minutes ago)\n- last_poll_time: str - ISO timestamp of last poll\n- minutes_since_last_poll: int - Gap since last poll\n- warning: str or null - Warning message if unhealthy","operationId":"check_poll_health_api_poll_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PollHealthResponse"}}}}}}},"/api/request-poll":{"post":{"summary":"Request Manual Poll","description":"Trigger one immediate poll run, rate-limited to once every 5 minutes.","operationId":"request_manual_poll_api_request_poll_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RequestPollResponse"}}}}}}},"/api/stats-for-nerds":{"get":{"summary":"Get Stats For Nerds","description":"Return dashboard diagnostics and useful summary stats.","operationId":"get_stats_for_nerds_api_stats_for_nerds_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StatsForNerdsResponse"}}}}}}},"/api/logs":{"get":{"summary":"Get Logs","description":"Return the most recent lines from application logs.\n\nQuery parameters:\n- type: 'polling' (default), 'web_service', or 'test'\n- lines: Number of lines to return (1-2000)\n- contains: Filter lines containing this text (case-insensitive)\n- reverse: Reverse line order (newest first by default)","operationId":"get_logs_api_logs_get","parameters":[{"name":"type","in":"query","required":false,"schema":{"type":"string","pattern":"^(polling|web_service|test)$","default":"polling","title":"Type"}},{"name":"lines","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":200,"title":"Lines"}},{"name":"contains","in":"query","required":false,"schema":{"type":"string","default":"","title":"Contains"}},{"name":"reverse","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Reverse"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LogsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/logs/available":{"get":{"summary":"Get Available Logs","description":"Return list of all available log files.","operationId":"get_available_logs_api_logs_available_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AvailableLogsResponse"}}}}}}},"/api/server-stats":{"get":{"summary":"Get Server Stats","description":"Return host/server diagnostics for the dashboard.","operationId":"get_server_stats_api_server_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerStatsResponse"}}}}}}},"/api/server-stats/all":{"get":{"summary":"Get All Server Stats","description":"Return host/server diagnostics for both Kaylee (live) and Wash (test).","operationId":"get_all_server_stats_api_server_stats_all_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Get All Server Stats Api Server Stats All Get"}}}}}}},"/dashboard":{"get":{"summary":"Dashboard","description":"Serve a minimal HTML dashboard that reads data from API endpoints.","operationId":"dashboard_dashboard_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}}},"components":{"schemas":{"AvailableLogInfo":{"properties":{"type":{"type":"string","title":"Type"},"path":{"type":"string","title":"Path"},"size_bytes":{"type":"integer","title":"Size Bytes"},"size_readable":{"type":"string","title":"Size Readable"}},"type":"object","required":["type","path","size_bytes","size_readable"],"title":"AvailableLogInfo","example":{"path":"/home/ec2-user/Yelirverse/logs/web_service.log","size_bytes":172829,"size_readable":"168.78 KB","type":"web_service"}},"AvailableLogsResponse":{"properties":{"available_logs":{"items":{"$ref":"#/components/schemas/AvailableLogInfo"},"type":"array","title":"Available Logs"}},"type":"object","required":["available_logs"],"title":"AvailableLogsResponse","example":{"available_logs":[{"path":"/home/ec2-user/Yelirverse/logs/web_service.log","size_bytes":172829,"size_readable":"168.78 KB","type":"web_service"}]}},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"HealthResponse":{"properties":{"status":{"type":"string","title":"Status"}},"type":"object","required":["status"],"title":"HealthResponse","example":{"status":"ok"}},"HistoryItem":{"properties":{"id":{"type":"integer","title":"Id"},"timestamp":{"type":"string","title":"Timestamp"},"price":{"type":"integer","title":"Price"},"source":{"type":"string","title":"Source"}},"type":"object","required":["id","timestamp","price","source"],"title":"HistoryItem","example":{"id":43246,"price":261570,"source":"blizzard-api","timestamp":"2026-06-02T03:45:03.064112+00:00"}},"HistoryPoint":{"properties":{"timestamp":{"type":"string","title":"Timestamp"},"price":{"type":"integer","title":"Price"}},"type":"object","required":["timestamp","price"],"title":"HistoryPoint","example":{"price":261570,"timestamp":"2026-06-02T03:45:03.064112+00:00"}},"HistoryResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/HistoryItem"},"type":"array","title":"Items"}},"type":"object","required":["items"],"title":"HistoryResponse","example":{"items":[{"id":43246,"price":261570,"source":"blizzard-api","timestamp":"2026-06-02T03:45:03.064112+00:00"}]}},"HistoryStatsResponse":{"properties":{"last_72":{"$ref":"#/components/schemas/HistoryStatsWindow"},"last_720":{"$ref":"#/components/schemas/HistoryStatsWindow"}},"type":"object","required":["last_72","last_720"],"title":"HistoryStatsResponse","example":{"last_72":{"avg":262381.11,"count":72,"latest":{"price":261570,"timestamp":"2026-06-02T03:45:03.064112+00:00"},"limit":72,"max":271107,"min":250060,"oldest":{"price":257188,"timestamp":"2026-06-01T04:05:02.823848+00:00"}},"last_720":{"avg":258076.93,"count":720,"latest":{"price":261570,"timestamp":"2026-06-02T03:45:03.064112+00:00"},"limit":720,"max":271107,"min":244185,"oldest":{"price":258899,"timestamp":"2026-05-23T02:57:30+00:00"}}}},"HistoryStatsWindow":{"properties":{"limit":{"type":"integer","title":"Limit"},"count":{"type":"integer","title":"Count"},"min":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Min"},"max":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max"},"avg":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg"},"latest":{"anyOf":[{"$ref":"#/components/schemas/HistoryPoint"},{"type":"null"}]},"oldest":{"anyOf":[{"$ref":"#/components/schemas/HistoryPoint"},{"type":"null"}]}},"type":"object","required":["limit","count","min","max","avg","latest","oldest"],"title":"HistoryStatsWindow","example":{"avg":262381.11,"count":72,"latest":{"price":261570,"timestamp":"2026-06-02T03:45:03.064112+00:00"},"limit":72,"max":271107,"min":250060,"oldest":{"price":257188,"timestamp":"2026-06-01T04:05:02.823848+00:00"}}},"LatestPriceRow":{"properties":{"id":{"type":"integer","title":"Id"},"timestamp":{"type":"string","title":"Timestamp"},"price":{"type":"integer","title":"Price"}},"type":"object","required":["id","timestamp","price"],"title":"LatestPriceRow","example":{"id":43246,"price":261570,"timestamp":"2026-06-02T03:45:03.064112+00:00"}},"LogsResponse":{"properties":{"log_type":{"type":"string","title":"Log Type"},"path":{"type":"string","title":"Path"},"requested_lines":{"type":"integer","title":"Requested Lines"},"returned_lines":{"type":"integer","title":"Returned Lines"},"exists":{"type":"boolean","title":"Exists"},"contains":{"type":"string","title":"Contains"},"reverse":{"type":"boolean","title":"Reverse"},"content":{"type":"string","title":"Content"}},"type":"object","required":["log_type","path","requested_lines","returned_lines","exists","contains","reverse","content"],"title":"LogsResponse","example":{"contains":"Error in /api/history","content":"2026-06-02 03:47:05,951 - ERROR - Error in /api/history: ...\n2026-06-02 03:48:19,412 - ERROR - Error in /api/history: ...\n","exists":true,"log_type":"web_service","path":"/home/ec2-user/Yelirverse/logs/web_service.log","requested_lines":200,"returned_lines":2,"reverse":false}},"PollHealthResponse":{"properties":{"healthy":{"type":"boolean","title":"Healthy"},"last_poll_time":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Poll Time"},"minutes_since_last_poll":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Minutes Since Last Poll"},"warning":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Warning"}},"type":"object","required":["healthy","last_poll_time","minutes_since_last_poll","warning"],"title":"PollHealthResponse","example":{"healthy":true,"last_poll_time":"2026-06-02T03:50:02.426000","minutes_since_last_poll":3}},"PollScheduleResponse":{"properties":{"schedule":{"type":"string","title":"Schedule"},"raw_cron":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Raw Cron"},"manage_via":{"type":"string","title":"Manage Via"},"cron_presets":{"additionalProperties":{"type":"string"},"type":"object","title":"Cron Presets"},"manual_poll_cooldown_minutes":{"type":"integer","title":"Manual Poll Cooldown Minutes"}},"type":"object","required":["schedule","raw_cron","manage_via","cron_presets","manual_poll_cooldown_minutes"],"title":"PollScheduleResponse","example":{"cron_presets":{"daily":"0 0 * * *","every10":"*/10 * * * *","every30":"*/30 * * * *","every5":"*/5 * * * *","hourly":"0 * * * *"},"manage_via":"deploy/ec2-manage-cron.ps1","manual_poll_cooldown_minutes":5,"raw_cron":"*/5 * * * *","schedule":"Every 5 minutes"}},"PollStatusResponse":{"properties":{"can_request":{"type":"boolean","title":"Can Request"},"remaining_seconds":{"type":"integer","title":"Remaining Seconds"},"cooldown_seconds":{"type":"integer","title":"Cooldown Seconds"},"last_requested_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Requested At"},"last_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Status"}},"type":"object","required":["can_request","remaining_seconds","cooldown_seconds","last_requested_at","last_status"],"title":"PollStatusResponse","example":{"can_request":true,"cooldown_seconds":300,"last_requested_at":"2026-06-01 11:59:27","last_status":"success","remaining_seconds":0}},"RequestPollResponse":{"properties":{"status":{"type":"string","title":"Status"},"message":{"type":"string","title":"Message"},"cooldown_seconds":{"type":"integer","title":"Cooldown Seconds"}},"type":"object","required":["status","message","cooldown_seconds"],"title":"RequestPollResponse","example":{"cooldown_seconds":300,"message":"Poll request completed.","status":"ok"}},"ServerStatsAppFiles":{"properties":{"token_db_path":{"type":"string","title":"Token Db Path"},"token_db_size_bytes":{"type":"integer","title":"Token Db Size Bytes"},"token_db_size_human":{"type":"string","title":"Token Db Size Human"},"app_state_db_path":{"type":"string","title":"App State Db Path"},"app_state_db_size_bytes":{"type":"integer","title":"App State Db Size Bytes"},"app_state_db_size_human":{"type":"string","title":"App State Db Size Human"},"log_path":{"type":"string","title":"Log Path"},"log_size_bytes":{"type":"integer","title":"Log Size Bytes"},"log_size_human":{"type":"string","title":"Log Size Human"}},"type":"object","required":["token_db_path","token_db_size_bytes","token_db_size_human","app_state_db_path","app_state_db_size_bytes","app_state_db_size_human","log_path","log_size_bytes","log_size_human"],"title":"ServerStatsAppFiles","example":{"app_state_db_path":"/home/ec2-user/Yelirverse/db/traffic_logs.db","app_state_db_size_bytes":16384,"app_state_db_size_human":"16.00 KB","log_path":"/home/ec2-user/Yelirverse/logs/wow_token_tracker.log","log_size_bytes":172829,"log_size_human":"168.78 KB","token_db_path":"/home/ec2-user/Yelirverse/db/wow_token.db","token_db_size_bytes":1200128,"token_db_size_human":"1.14 MB"}},"ServerStatsCommit":{"properties":{"hash":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hash"},"timestamp_iso":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Timestamp Iso"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"}},"type":"object","required":["hash","timestamp_iso","url"],"title":"ServerStatsCommit","example":{"hash":"abc1234","timestamp_iso":"2026-06-02T03:50:31+00:00","url":"https://github.com/timwriley/Yelirverse/commit/abc1234"}},"ServerStatsDisk":{"properties":{"root_path":{"type":"string","title":"Root Path"},"total_bytes":{"type":"integer","title":"Total Bytes"},"used_bytes":{"type":"integer","title":"Used Bytes"},"free_bytes":{"type":"integer","title":"Free Bytes"},"total_human":{"type":"string","title":"Total Human"},"used_human":{"type":"string","title":"Used Human"},"free_human":{"type":"string","title":"Free Human"}},"type":"object","required":["root_path","total_bytes","used_bytes","free_bytes","total_human","used_human","free_human"],"title":"ServerStatsDisk","example":{"free_bytes":6379347968,"free_human":"5.94 GB","root_path":"/home/ec2-user/Yelirverse","total_bytes":8510222336,"total_human":"7.93 GB","used_bytes":2130874368,"used_human":"1.98 GB"}},"ServerStatsHost":{"properties":{"hostname":{"type":"string","title":"Hostname"},"platform":{"type":"string","title":"Platform"},"python_version":{"type":"string","title":"Python Version"},"cpu_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cpu Count"},"load_average_1_5_15":{"anyOf":[{"items":{"type":"number"},"type":"array"},{"type":"null"}],"title":"Load Average 1 5 15"},"uptime_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Uptime Seconds"},"uptime_human":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Uptime Human"}},"type":"object","required":["hostname","platform","python_version","cpu_count","load_average_1_5_15","uptime_seconds","uptime_human"],"title":"ServerStatsHost","example":{"cpu_count":2,"hostname":"ip-172-31-42-229.us-east-2.compute.internal","load_average_1_5_15":[0.0,0.0,0.0],"platform":"Linux-6.1.172-216.329.amzn2023.x86_64-x86_64-with-glibc2.34","python_version":"3.9.25","uptime_human":"1d 23h 41m 10s","uptime_seconds":171670.94}},"ServerStatsMemory":{"properties":{"total_bytes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Bytes"},"available_bytes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Available Bytes"},"used_bytes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Used Bytes"},"total_human":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Total Human"},"available_human":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Available Human"},"used_human":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Used Human"}},"type":"object","required":["total_bytes","available_bytes","used_bytes","total_human","available_human","used_human"],"title":"ServerStatsMemory","example":{"available_bytes":569667584,"available_human":"543.28 MB","total_bytes":961331200,"total_human":"916.80 MB","used_bytes":391663616,"used_human":"373.52 MB"}},"ServerStatsResponse":{"properties":{"generated_at_utc":{"type":"string","title":"Generated At Utc"},"host":{"$ref":"#/components/schemas/ServerStatsHost"},"memory":{"$ref":"#/components/schemas/ServerStatsMemory"},"disk":{"$ref":"#/components/schemas/ServerStatsDisk"},"app_files":{"$ref":"#/components/schemas/ServerStatsAppFiles"},"service":{"$ref":"#/components/schemas/ServerStatsService"},"commit":{"$ref":"#/components/schemas/ServerStatsCommit"}},"type":"object","required":["generated_at_utc","host","memory","disk","app_files","service","commit"],"title":"ServerStatsResponse","example":{"app_files":{"app_state_db_path":"/home/ec2-user/Yelirverse/db/traffic_logs.db","app_state_db_size_bytes":16384,"app_state_db_size_human":"16.00 KB","log_path":"/home/ec2-user/Yelirverse/logs/wow_token_tracker.log","log_size_bytes":172829,"log_size_human":"168.78 KB","token_db_path":"/home/ec2-user/Yelirverse/db/wow_token.db","token_db_size_bytes":1200128,"token_db_size_human":"1.14 MB"},"commit":{"hash":"abc1234","timestamp_iso":"2026-06-02T03:50:31+00:00","url":"https://github.com/timwriley/Yelirverse/commit/abc1234"},"disk":{"free_bytes":6379347968,"free_human":"5.94 GB","root_path":"/home/ec2-user/Yelirverse","total_bytes":8510222336,"total_human":"7.93 GB","used_bytes":2130874368,"used_human":"1.98 GB"},"generated_at_utc":"2026-06-02T03:53:54.711029+00:00","host":{"cpu_count":2,"hostname":"ip-172-31-42-229.us-east-2.compute.internal","load_average_1_5_15":[0.0,0.0,0.0],"platform":"Linux-6.1.172-216.329.amzn2023.x86_64-x86_64-with-glibc2.34","python_version":"3.9.25","uptime_human":"1d 23h 41m 10s","uptime_seconds":171670.94},"memory":{"available_bytes":569667584,"available_human":"543.28 MB","total_bytes":961331200,"total_human":"916.80 MB","used_bytes":391663616,"used_human":"373.52 MB"},"service":{"last_restart_utc":"2026-06-02T03:50:31+00:00","name":"yelirverse","uptime_human":"3m 23s","uptime_seconds":203.71}}},"ServerStatsService":{"properties":{"name":{"type":"string","title":"Name"},"last_restart_utc":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Restart Utc"},"uptime_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Uptime Seconds"},"uptime_human":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Uptime Human"}},"type":"object","required":["name","last_restart_utc","uptime_seconds","uptime_human"],"title":"ServerStatsService","example":{"last_restart_utc":"2026-06-02T03:50:31+00:00","name":"yelirverse","uptime_human":"3m 23s","uptime_seconds":203.71}},"StatsForNerdsDatabase":{"properties":{"token_db_path":{"type":"string","title":"Token Db Path"},"app_state_db_path":{"type":"string","title":"App State Db Path"},"total_price_rows":{"type":"integer","title":"Total Price Rows"}},"type":"object","required":["token_db_path","app_state_db_path","total_price_rows"],"title":"StatsForNerdsDatabase","example":{"app_state_db_path":"/home/ec2-user/Yelirverse/db/traffic_logs.db","token_db_path":"/home/ec2-user/Yelirverse/db/wow_token.db","total_price_rows":13260}},"StatsForNerdsResponse":{"properties":{"generated_at_utc":{"type":"string","title":"Generated At Utc"},"database":{"$ref":"#/components/schemas/StatsForNerdsDatabase"},"latest":{"anyOf":[{"$ref":"#/components/schemas/LatestPriceRow"},{"type":"null"}]},"history_stats":{"$ref":"#/components/schemas/HistoryStatsResponse"},"manual_poll":{"$ref":"#/components/schemas/PollStatusResponse"},"recent_points":{"items":{"$ref":"#/components/schemas/HistoryPoint"},"type":"array","title":"Recent Points"}},"type":"object","required":["generated_at_utc","database","latest","history_stats","manual_poll","recent_points"],"title":"StatsForNerdsResponse","example":{"database":{"app_state_db_path":"/home/ec2-user/Yelirverse/db/traffic_logs.db","token_db_path":"/home/ec2-user/Yelirverse/db/wow_token.db","total_price_rows":13260},"generated_at_utc":"2026-06-02T03:53:13.439461+00:00","history_stats":{"last_72":{"avg":262381.11,"count":72,"latest":{"price":261570,"timestamp":"2026-06-02T03:45:03.064112+00:00"},"limit":72,"max":271107,"min":250060,"oldest":{"price":257188,"timestamp":"2026-06-01T04:05:02.823848+00:00"}},"last_720":{"avg":258076.93,"count":720,"latest":{"price":261570,"timestamp":"2026-06-02T03:45:03.064112+00:00"},"limit":720,"max":271107,"min":244185,"oldest":{"price":258899,"timestamp":"2026-05-23T02:57:30+00:00"}}},"latest":{"id":43246,"price":261570,"timestamp":"2026-06-02T03:45:03.064112+00:00"},"manual_poll":{"can_request":true,"cooldown_seconds":300,"last_requested_at":"2026-06-01 11:59:27","last_status":"success","remaining_seconds":0},"recent_points":[{"price":261570,"timestamp":"2026-06-02T03:45:03.064112+00:00"}]}},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}