{"openapi":"3.1.0","info":{"title":"AirPower Server","description":"IoT Power 服务器端（airpower.luatos.com），规范模式 API v1","version":"1.0.0"},"paths":{"/api/v1/devices/check":{"get":{"tags":["devices"],"summary":"Device Check","description":"封禁检查：devices 计数 +1，返回 ban 状态（客户端 fail-open）。","operationId":"device_check_api_v1_devices_check_get","parameters":[{"name":"id","in":"query","required":true,"schema":{"type":"string","title":"Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/devices/fix":{"post":{"tags":["devices"],"summary":"Fix Report","description":"校准参数上报（校准历史留痕）。","operationId":"fix_report_api_v1_devices_fix_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FixIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/activate":{"post":{"tags":["activate"],"summary":"Activate","description":"量产激活：校验 token/时效/机器码，返回激活码 hex。","operationId":"activate_api_v1_activate_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActivateIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/production":{"post":{"tags":["production"],"summary":"Production Report","description":"量产进度上报：每次事件全量插入，形成完整量产轨迹。","operationId":"production_report_api_v1_production_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductionIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/cc-device":{"get":{"tags":["cc-device"],"summary":"Cc Device","description":"功耗测试工具权限检查：允许清单见配置 POWER_TEST_SNS（空 = 全部拒绝）。","operationId":"cc_device_api_v1_cc_device_get","parameters":[{"name":"sn","in":"query","required":true,"schema":{"type":"string","title":"Sn"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/bug-report":{"post":{"tags":["bug-report"],"summary":"Bug Report","description":"崩溃上报：无鉴权（崩溃路径不能依赖配置），落库留痕。","operationId":"bug_report_api_v1_bug_report_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BugReportIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ads/popup":{"get":{"tags":["ads"],"summary":"Ads Popup","operationId":"ads_popup_api_v1_ads_popup_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/ads/banner":{"get":{"tags":["ads"],"summary":"Ads Banner","operationId":"ads_banner_api_v1_ads_banner_get","parameters":[{"name":"side","in":"query","required":false,"schema":{"type":"string","default":"right","title":"Side"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/stats/hit":{"post":{"tags":["stats"],"summary":"Stats Hit","description":"记录一次使用统计命中（版本/IP/UA）。","operationId":"stats_hit_api_v1_stats_hit_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StatsHitIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/stats":{"get":{"tags":["stats"],"summary":"Stats","description":"聚合统计：总数、按版本、按日（近 14 天）。","operationId":"stats_api_v1_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/share/waveform":{"post":{"tags":["share"],"summary":"Share Waveform","operationId":"share_waveform_api_v1_share_waveform_post","requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_share_waveform_api_v1_share_waveform_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["share"],"summary":"List Waveforms","description":"波形分享文件列表（供截图页展示/下载）。","operationId":"list_waveforms_api_v1_share_waveform_get","parameters":[{"name":"device_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"Device Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"default":200,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/":{"get":{"tags":["pages"],"summary":"Admin Page","operationId":"admin_page_admin__get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/admin/api/overview":{"get":{"tags":["pages"],"summary":"Admin Overview","operationId":"admin_overview_admin_api_overview_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin/api/devices":{"get":{"tags":["pages"],"summary":"Admin Devices","operationId":"admin_devices_admin_api_devices_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"default":200,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/api/devices/{device_id}/ban":{"post":{"tags":["pages"],"summary":"Admin Ban","operationId":"admin_ban_admin_api_devices__device_id__ban_post","parameters":[{"name":"device_id","in":"path","required":true,"schema":{"type":"string","title":"Device Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/api/devices/{device_id}/lifecycle":{"get":{"tags":["pages"],"summary":"Admin Lifecycle","operationId":"admin_lifecycle_admin_api_devices__device_id__lifecycle_get","parameters":[{"name":"device_id","in":"path","required":true,"schema":{"type":"string","title":"Device Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/api/production":{"get":{"tags":["pages"],"summary":"Admin Production","operationId":"admin_production_admin_api_production_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"default":200,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tj.html":{"get":{"tags":["pages"],"summary":"Tj Page","operationId":"tj_page_tj_html_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/LowCurrentDCAnalyzer/latest.txt":{"get":{"tags":["pages"],"summary":"Latest Txt","operationId":"latest_txt_LowCurrentDCAnalyzer_latest_txt_get","responses":{"200":{"description":"Successful Response","content":{"text/plain":{"schema":{"type":"string"}}}}}}},"/LowCurrentDCAnalyzer/{filename}":{"get":{"tags":["pages"],"summary":"Installer File","operationId":"installer_file_LowCurrentDCAnalyzer__filename__get","parameters":[{"name":"filename","in":"path","required":true,"schema":{"type":"string","title":"Filename"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"ActivateIn":{"properties":{"c":{"type":"string","maxLength":32,"minLength":32,"title":"C","description":"机器码 hex（16 字节密文）"}},"type":"object","required":["c"],"title":"ActivateIn"},"Body_share_waveform_api_v1_share_waveform_post":{"properties":{"image":{"type":"string","contentMediaType":"application/octet-stream","title":"Image"},"device_id":{"type":"string","maxLength":128,"title":"Device Id","default":""},"gen_time":{"type":"integer","title":"Gen Time","default":0}},"type":"object","required":["image"],"title":"Body_share_waveform_api_v1_share_waveform_post"},"BugReportIn":{"properties":{"name":{"type":"string","maxLength":64,"title":"Name","default":"iotpower"},"version":{"type":"string","maxLength":32,"title":"Version","default":""},"message":{"type":"string","maxLength":16384,"title":"Message","default":""},"stack":{"type":"string","maxLength":65536,"title":"Stack","default":""}},"type":"object","title":"BugReportIn"},"FixIn":{"properties":{"id":{"type":"string","maxLength":128,"minLength":1,"title":"Id"},"kind":{"type":"string","title":"Kind","default":"fix"},"fix":{"items":{"type":"number"},"type":"array","maxItems":8,"minItems":8,"title":"Fix"}},"type":"object","required":["id","fix"],"title":"FixIn"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ProductionIn":{"properties":{"id":{"type":"string","maxLength":128,"minLength":1,"title":"Id"},"event":{"type":"string","enum":["activate","pass","done"],"title":"Event"},"type":{"type":"string","maxLength":32,"title":"Type","default":"power"}},"type":"object","required":["id","event"],"title":"ProductionIn"},"StatsHitIn":{"properties":{"version":{"type":"string","maxLength":32,"title":"Version","default":""}},"type":"object","title":"StatsHitIn"},"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"}}}}