{"openapi":"3.1.0","info":{"title":"GoRelay API","description":"GoRelay API 接口文档，请使用 Bearer Token 进行认证，格式为 `Authorization: Bearer YOUR_API_KEY`","version":"1.0.0"},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}},"security":[{"bearerAuth":[]}],"servers":[{"url":"/api"}],"paths":{"/tunnel":{"get":{"operationId":"getTunnel","summary":"获取所有规则","tags":["规则"],"responses":{"200":{"description":"成功","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"category":{"type":"string","enum":["port_forward","remote_port_forward"]},"status":{"type":"string","enum":["active","inactive"]},"load_balance_type":{"type":"string","enum":["round","rand","fifo","hash","ll","lc"]},"ip_type":{"type":"string","enum":["auto","ipv4","ipv6"]},"id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"name":{"type":"string"},"listen_ip":{"anyOf":[{"type":"string"},{"type":"null"}]},"listen_port":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"chain_port":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"is_port_used":{"type":"boolean"},"order_by":{"type":"number"},"ip_limit":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"max_clients":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"bandwidth_limit":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"traffic":{"type":"number"},"traffic_cost":{"type":"number"},"proxy_protocol":{"type":"boolean"},"created_at":{"type":"string"},"updated_at":{"type":"string"},"in_node_group_id":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"out_node_group_id":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"user_id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"user":{"type":"object","properties":{"email":{"type":"string"}},"required":["email"]},"in_node_group":{"anyOf":[{"type":"object","properties":{"name":{"type":"string"},"traffic_rate":{"type":"number"},"connect_ip":{"anyOf":[{"type":"string"},{"type":"null"}]},"admission":{"type":"boolean"},"need_client":{"type":"boolean"},"nodes":{"type":"array","items":{"type":"object","properties":{"connect_ip":{"type":"string"}},"required":["connect_ip"]}}},"required":["name","traffic_rate","connect_ip","admission","need_client","nodes"]},{"type":"null"}]},"out_node_group":{"anyOf":[{"type":"object","properties":{"id":{"type":"number"},"name":{"type":"string"},"traffic_rate":{"type":"number"},"node_status":{"anyOf":[{"type":"string","enum":["online","offline","no_device"]},{"type":"null"}]},"connect_endpoints":{"type":"array","items":{"type":"object","properties":{"address":{"type":"string"},"weight":{"type":"number"}},"required":["address","weight"]}}},"required":["id","name","traffic_rate"]},{"type":"null"}]},"connect_fallback":{"anyOf":[{"type":"object","properties":{"ips":{"type":"array","items":{"type":"string"}},"port":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["ips","port"]},{"type":"null"}]},"out_ports":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"number"}},"forward_addresses":{"type":"array","items":{"type":"object","properties":{"address":{"type":"string"},"weight":{"type":"number"},"host":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["address","weight"]}},"tunnel_chains":{"type":"array","items":{"type":"object","properties":{"node_group_id":{"type":"number"},"node_type":{"type":"string","enum":["in","out"]}},"required":["node_group_id","node_type"]}},"listen_protocol":{"anyOf":[{"type":"object","properties":{"type":{"type":"string"},"username":{"type":"string"},"password":{"type":"string"}},"required":["type","username","password"]},{"type":"null"}]},"forward_addresses_protocol":{"anyOf":[{"type":"object","properties":{"type":{"type":"string"},"username":{"type":"string"},"password":{"type":"string"}},"required":["type","username","password"]},{"type":"null"}]}},"required":["category","status","load_balance_type","ip_type","id","name","listen_ip","listen_port","chain_port","is_port_used","order_by","ip_limit","max_clients","bandwidth_limit","traffic","traffic_cost","proxy_protocol","created_at","updated_at","in_node_group_id","out_node_group_id","user_id","user","in_node_group","out_node_group","out_ports","forward_addresses","tunnel_chains","listen_protocol","forward_addresses_protocol"]}},"total":{"type":"number"}},"required":["data","total"]}}}}},"parameters":[{"in":"query","name":"page","schema":{"default":1,"type":"number","exclusiveMinimum":0}},{"in":"query","name":"perPage","schema":{"default":10,"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},{"in":"query","name":"sort","schema":{"anyOf":[{"type":"string"},{"type":"null"}]}},{"in":"query","name":"name","schema":{"anyOf":[{"type":"string"},{"type":"null"}]}},{"in":"query","name":"in_node_group_id","schema":{"anyOf":[{"anyOf":[{"type":"array","items":{"type":"number"}},{"type":"number"}]},{"type":"null"}]}},{"in":"query","name":"out_node_group_id","schema":{"anyOf":[{"anyOf":[{"type":"array","items":{"type":"number"}},{"type":"number"}]},{"type":"null"}]}},{"in":"query","name":"in_tunnel_chain_id","schema":{"anyOf":[{"anyOf":[{"type":"array","items":{"type":"number"}},{"type":"number"}]},{"type":"null"}]}},{"in":"query","name":"out_tunnel_chain_id","schema":{"anyOf":[{"anyOf":[{"type":"array","items":{"type":"number"}},{"type":"number"}]},{"type":"null"}]}},{"in":"query","name":"status","schema":{"anyOf":[{"anyOf":[{"type":"array","items":{"type":"string","enum":["active","inactive"]}},{"type":"string","enum":["active","inactive"]}]},{"type":"null"}]}},{"in":"query","name":"ip_type","schema":{"type":"string","enum":["auto","ipv4","ipv6"]}},{"in":"query","name":"listen_port","schema":{"anyOf":[{"type":"number"},{"type":"null"}]}},{"in":"query","name":"chain_port","schema":{"anyOf":[{"type":"number"},{"type":"null"}]}},{"in":"query","name":"target_ip","schema":{"anyOf":[{"type":"string"},{"type":"null"}]}}]},"post":{"operationId":"postTunnel","summary":"创建新规则","tags":["规则"],"responses":{"204":{"description":"规则创建成功"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"category":{"type":"string","enum":["port_forward","remote_port_forward"]},"status":{"type":"string","enum":["active","inactive"]},"load_balance_type":{"type":"string","enum":["round","rand","fifo","hash","ll","lc"]},"ip_type":{"type":"string","enum":["auto","ipv4","ipv6"]},"name":{"type":"string"},"listen_ip":{"anyOf":[{"type":"string"},{"type":"null"}]},"listen_port":{"anyOf":[{"type":"integer","minimum":1,"maximum":65535},{"type":"null"}]},"ip_limit":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"max_clients":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"bandwidth_limit":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"proxy_protocol":{"type":"boolean"},"in_node_group_id":{"type":"number"},"out_node_group_id":{"anyOf":[{"type":"number"},{"type":"null"}]},"forward_addresses":{"type":"array","items":{"type":"object","properties":{"address":{"type":"string"},"weight":{"type":"number"},"host":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["address","weight"]}},"tunnel_chains":{"type":"array","items":{"type":"object","properties":{"node_group_id":{"type":"number"},"node_type":{"type":"string","enum":["in","out"]}},"required":["node_group_id","node_type"]}},"listen_protocol":{"anyOf":[{"type":"object","properties":{"type":{"anyOf":[{"type":"string"},{"type":"null"}]},"username":{"anyOf":[{"type":"string"},{"type":"null"}]},"password":{"anyOf":[{"type":"string"},{"type":"null"}]}}},{"type":"null"}]},"forward_addresses_protocol":{"anyOf":[{"type":"object","properties":{"type":{"anyOf":[{"type":"string"},{"type":"null"}]},"username":{"anyOf":[{"type":"string"},{"type":"null"}]},"password":{"anyOf":[{"type":"string"},{"type":"null"}]}}},{"type":"null"}]}},"required":["category","status","load_balance_type","ip_type","name","listen_ip","listen_port","ip_limit","max_clients","bandwidth_limit","proxy_protocol","in_node_group_id","out_node_group_id","forward_addresses","listen_protocol","forward_addresses_protocol"]}}}}},"delete":{"operationId":"deleteTunnel","summary":"批量删除规则","tags":["规则"],"responses":{"204":{"description":"规则删除成功"}},"parameters":[{"in":"query","name":"ids","schema":{"type":"string"},"required":true}]}},"/tunnel/summary":{"get":{"operationId":"getTunnelSummary","summary":"获取规则统计","tags":["规则"],"responses":{"200":{"description":"成功","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"status":{"type":"string","enum":["active","inactive"]},"count":{"type":"number"}},"required":["status","count"]}}}}}}}},"/tunnel/import":{"post":{"operationId":"postTunnelImport","summary":"导入规则","tags":["规则"],"responses":{"204":{"description":"规则导入成功"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"in_node_group_id":{"type":"number"},"out_node_group_id":{"anyOf":[{"type":"number"},{"type":"null"}]},"tunnels":{"type":"array","items":{"type":"object","properties":{"dest":{"type":"array","items":{"type":"string"}},"listen_port":{"anyOf":[{"type":"integer","minimum":1,"maximum":65535},{"type":"null"}]},"name":{"type":"string"}},"required":["dest","listen_port","name"]}},"random_port_is_exist":{"type":"boolean"},"overwrite_tunnel_on_port_conflict":{"type":"boolean"}},"required":["in_node_group_id","out_node_group_id","tunnels","random_port_is_exist","overwrite_tunnel_on_port_conflict"]}}}}}},"/tunnel/{id}/status":{"patch":{"operationId":"patchTunnelByIdStatus","summary":"更新转发状态","tags":["规则"],"responses":{"204":{"description":"转发状态更新成功"}},"parameters":[{"in":"path","name":"id","schema":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"required":true}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","enum":["active","inactive"]}},"required":["status"]}}}}}},"/tunnel/{id}/order":{"patch":{"operationId":"patchTunnelByIdOrder","summary":"更新规则排序","tags":["规则"],"responses":{"204":{"description":"规则排序更新成功"}},"parameters":[{"in":"path","name":"id","schema":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"required":true}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"order_by":{"type":"number"}},"required":["order_by"]}}}}}},"/tunnel/{id}":{"patch":{"operationId":"patchTunnelById","summary":"更新规则","tags":["规则"],"responses":{"204":{"description":"规则更新成功"}},"parameters":[{"in":"path","name":"id","schema":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"required":true}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"category":{"type":"string","enum":["port_forward","remote_port_forward"]},"status":{"type":"string","enum":["active","inactive"]},"load_balance_type":{"type":"string","enum":["round","rand","fifo","hash","ll","lc"]},"ip_type":{"type":"string","enum":["auto","ipv4","ipv6"]},"name":{"type":"string"},"listen_ip":{"anyOf":[{"type":"string"},{"type":"null"}]},"listen_port":{"anyOf":[{"type":"integer","minimum":1,"maximum":65535},{"type":"null"}]},"ip_limit":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"max_clients":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"bandwidth_limit":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"proxy_protocol":{"type":"boolean"},"in_node_group_id":{"type":"number"},"out_node_group_id":{"anyOf":[{"type":"number"},{"type":"null"}]},"forward_addresses":{"type":"array","items":{"type":"object","properties":{"address":{"type":"string"},"weight":{"type":"number"},"host":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["address","weight"]}},"tunnel_chains":{"type":"array","items":{"type":"object","properties":{"node_group_id":{"type":"number"},"node_type":{"type":"string","enum":["in","out"]}},"required":["node_group_id","node_type"]}},"listen_protocol":{"anyOf":[{"type":"object","properties":{"type":{"anyOf":[{"type":"string"},{"type":"null"}]},"username":{"anyOf":[{"type":"string"},{"type":"null"}]},"password":{"anyOf":[{"type":"string"},{"type":"null"}]}}},{"type":"null"}]},"forward_addresses_protocol":{"anyOf":[{"type":"object","properties":{"type":{"anyOf":[{"type":"string"},{"type":"null"}]},"username":{"anyOf":[{"type":"string"},{"type":"null"}]},"password":{"anyOf":[{"type":"string"},{"type":"null"}]}}},{"type":"null"}]}},"required":["category","status","load_balance_type","ip_type","name","listen_ip","listen_port","ip_limit","max_clients","bandwidth_limit","proxy_protocol","in_node_group_id","out_node_group_id","forward_addresses","listen_protocol","forward_addresses_protocol"]}}}}}},"/tunnel/batch/update":{"patch":{"operationId":"patchTunnelBatchUpdate","summary":"批量更新规则","tags":["规则"],"responses":{"204":{"description":"规则更新成功"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"ids":{"type":"array","items":{"type":"number"}},"status":{"type":"string","enum":["active","inactive"]},"in_node_group_id":{"type":"number"},"out_node_group_id":{"anyOf":[{"type":"number"},{"type":"null"}]},"ip_type":{"type":"string","enum":["auto","ipv4","ipv6"]},"load_balance_type":{"type":"string","enum":["round","rand","fifo","hash","ll","lc"]},"ip_limit":{"anyOf":[{"type":"number"},{"type":"null"}]},"max_clients":{"anyOf":[{"type":"number"},{"type":"null"}]},"bandwidth_limit":{"anyOf":[{"type":"number"},{"type":"null"}]},"in_tunnel_chains":{"anyOf":[{"type":"array","items":{"type":"number"}},{"type":"null"}]},"out_tunnel_chains":{"anyOf":[{"type":"array","items":{"type":"number"}},{"type":"null"}]}},"required":["ids"]}}}}}},"/tunnel/traffic/stats":{"get":{"operationId":"getTunnelTrafficStats","summary":"获取规则流量统计","tags":["规则"],"responses":{"200":{"description":"转发流量统计获取成功","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"traffic":{"type":"number"},"traffic_cost":{"type":"number"},"date":{"type":"string"}},"required":["traffic","traffic_cost","date"]}}}}}},"parameters":[{"in":"query","name":"start_date","schema":{"type":"string","format":"date-time"}},{"in":"query","name":"end_date","schema":{"type":"string","format":"date-time"}},{"in":"query","name":"in_node_group_id","schema":{"type":"number"}},{"in":"query","name":"out_node_group_id","schema":{"type":"number"}},{"in":"query","name":"aggregate_by","schema":{"default":"day","type":"string","enum":["day","month","year"]}}]}},"/tunnel/whitelist":{"get":{"operationId":"getTunnelWhitelist","summary":"获取 IP 白名单","tags":["规则"],"responses":{"200":{"description":"成功","content":{"application/json":{"schema":{"type":"object","properties":{"whitelist_ips":{"type":"array","items":{"type":"string"}},"whitelist_limit":{"anyOf":[{"type":"number"},{"type":"null"}]},"my_ip":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["whitelist_ips","whitelist_limit","my_ip"]}}}}}},"put":{"operationId":"putTunnelWhitelist","summary":"更新 IP 白名单","tags":["规则"],"responses":{"204":{"description":"IP 白名单更新成功"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"whitelist_ips":{"type":"array","items":{"type":"string"}}},"required":["whitelist_ips"]}}}}}},"/tunnel/{id}/test":{"get":{"operationId":"getTunnelByIdTest","summary":"测试规则","tags":["规则"],"responses":{"200":{"description":"规则测试成功","content":{"application/json":{"schema":{"type":"object","properties":{"in_node_group":{"type":"array","items":{"type":"object","properties":{"node_id":{"type":"string"},"results":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"number"}}},"required":["node_id","results"]}},"out_node_group":{"type":"array","items":{"type":"object","properties":{"node_id":{"type":"string"},"results":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"number"}}},"required":["node_id","results"]}}},"required":["in_node_group","out_node_group"]}}}}},"parameters":[{"in":"path","name":"id","schema":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"required":true}]}},"/tunnel/traffic":{"delete":{"operationId":"deleteTunnelTraffic","summary":"清空转发流量","tags":["规则"],"responses":{"204":{"description":"转发流量清空成功"}},"parameters":[{"in":"query","name":"ids","schema":{"type":"string"},"required":true}]},"get":{"operationId":"getTunnelTraffic","summary":"获取转发流量列表","tags":["规则"],"responses":{"200":{"description":"转发流量获取成功","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"traffic":{"type":"number"},"traffic_cost":{"type":"number"},"date":{"type":"string"}},"required":["traffic","traffic_cost","date"]}}}}}},"parameters":[{"in":"query","name":"page","schema":{"default":1,"type":"number","exclusiveMinimum":0}},{"in":"query","name":"perPage","schema":{"default":10,"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},{"in":"query","name":"sort","schema":{"anyOf":[{"type":"string"},{"type":"null"}]}},{"in":"query","name":"tunnel_name","schema":{"type":"string"}},{"in":"query","name":"in_node_group_id","schema":{"type":"number"}},{"in":"query","name":"out_node_group_id","schema":{"type":"number"}},{"in":"query","name":"start_date","schema":{"type":"string","format":"date-time"}},{"in":"query","name":"end_date","schema":{"type":"string","format":"date-time"}}]}},"/tunnel/stats":{"get":{"operationId":"getTunnelStats","summary":"获取转发状态列表","tags":["规则"],"responses":{"200":{"description":"转发状态获取成功","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"number"},"name":{"type":"string"},"in_node_group":{"anyOf":[{"type":"object","properties":{"id":{"type":"number"},"name":{"type":"string"}},"required":["id","name"]},{"type":"null"}]},"out_node_group":{"anyOf":[{"type":"object","properties":{"id":{"type":"number"},"name":{"type":"string"}},"required":["id","name"]},{"type":"null"}]},"stats":{"anyOf":[{"type":"object","properties":{"totalConns":{"type":"number"},"currentConns":{"type":"number"},"currentClients":{"type":"array","items":{"type":"string"}},"inputBytes":{"type":"number"},"outputBytes":{"type":"number"},"totalErrs":{"type":"number"}},"required":["totalConns","currentConns","inputBytes","outputBytes","totalErrs"]},{"type":"null"}]}},"required":["id","name","in_node_group","out_node_group","stats"]}},"total":{"type":"number"}},"required":["data","total"]}}}}},"parameters":[{"in":"query","name":"page","schema":{"default":1,"type":"number","exclusiveMinimum":0}},{"in":"query","name":"perPage","schema":{"default":10,"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},{"in":"query","name":"sort","schema":{"anyOf":[{"type":"string"},{"type":"null"}]}},{"in":"query","name":"name","schema":{"anyOf":[{"type":"string"},{"type":"null"}]}},{"in":"query","name":"in_node_group_id","schema":{"anyOf":[{"anyOf":[{"type":"array","items":{"type":"number"}},{"type":"number"}]},{"type":"null"}]}},{"in":"query","name":"out_node_group_id","schema":{"anyOf":[{"anyOf":[{"type":"array","items":{"type":"number"}},{"type":"number"}]},{"type":"null"}]}}]}},"/node":{"get":{"operationId":"getNode","summary":"获取用户节点","tags":["用户节点"],"responses":{"200":{"description":"成功","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"status":{"type":"string","enum":["active","inactive"]},"id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"weight":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"node_id":{"type":"string"},"connect_ip":{"type":"string"},"version":{"type":"string"},"backup":{"type":"boolean"},"order_by":{"type":"number"},"custom_line":{"anyOf":[{"type":"string"},{"type":"null"}]},"note":{"anyOf":[{"type":"string"},{"type":"null"}]},"dns_status":{"type":"boolean"},"created_at":{"type":"string"},"updated_at":{"type":"string"},"node_group_id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"node_group":{"type":"object","properties":{"name":{"type":"string"},"traffic_rate":{"type":"number"}},"required":["name","traffic_rate"]},"last_active":{"anyOf":[{"type":"string"},{"type":"null"}]},"online":{"type":"boolean"},"upgradeable":{"type":"boolean"}},"required":["status","id","weight","node_id","connect_ip","version","backup","order_by","custom_line","note","dns_status","created_at","updated_at","node_group_id","node_group","last_active","online","upgradeable"]}},"total":{"type":"number"}},"required":["data","total"]}}}}},"parameters":[{"in":"query","name":"page","schema":{"default":1,"type":"number","exclusiveMinimum":0}},{"in":"query","name":"perPage","schema":{"default":10,"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},{"in":"query","name":"sort","schema":{"anyOf":[{"type":"string"},{"type":"null"}]}},{"in":"query","name":"node_group_id","schema":{"anyOf":[{"anyOf":[{"type":"array","items":{"type":"number"}},{"type":"number"}]},{"type":"null"}]}},{"in":"query","name":"ip","schema":{"anyOf":[{"type":"string"},{"type":"null"}]}},{"in":"query","name":"node_id","schema":{"type":"string"}},{"in":"query","name":"status","schema":{"anyOf":[{"type":"string","enum":["active","inactive"]},{"type":"null"}]}},{"in":"query","name":"node_type","schema":{"anyOf":[{"type":"string","enum":["in","out"]},{"type":"null"}]}},{"in":"query","name":"version","schema":{"anyOf":[{"type":"string"},{"type":"null"}]}},{"in":"query","name":"backup","schema":{"anyOf":[{"type":"string"},{"type":"null"}]}}]},"delete":{"operationId":"deleteNode","summary":"批量删除用户节点","tags":["用户节点"],"responses":{"204":{"description":"节点删除成功"}},"parameters":[{"in":"query","name":"ids","schema":{"type":"string"},"required":true}]}},"/node/{id}":{"patch":{"operationId":"patchNodeById","summary":"更新用户节点","tags":["用户节点"],"responses":{"204":{"description":"节点更新成功"}},"parameters":[{"in":"path","name":"id","schema":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"required":true}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"weight":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"status":{"type":"string","enum":["active","inactive"]},"backup":{"type":"boolean"},"note":{"anyOf":[{"type":"string"},{"type":"null"}]}}}}}}}},"/node/{id}/order":{"patch":{"operationId":"patchNodeByIdOrder","summary":"更新用户节点排序","tags":["用户节点"],"responses":{"204":{"description":"成功"}},"parameters":[{"in":"path","name":"id","schema":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"required":true}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"order_by":{"type":"number"}},"required":["order_by"]}}}}}},"/node/sysinfo/clean":{"delete":{"operationId":"deleteNodeSysinfoClean","summary":"清理用户节点系统信息","tags":["用户节点"],"responses":{"204":{"description":"清理成功"}}}},"/node/upgrade":{"post":{"operationId":"postNodeUpgrade","summary":"升级所有节点","tags":["用户节点"],"responses":{"204":{"description":"升级成功"}}}},"/node/{id}/upgrade":{"post":{"operationId":"postNodeByIdUpgrade","summary":"升级单个节点","tags":["用户节点"],"responses":{"204":{"description":"升级成功"}},"parameters":[{"in":"path","name":"id","schema":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"required":true}]}},"/node/check":{"post":{"operationId":"postNodeCheck","summary":"检查节点 ID 是否唯一","tags":["用户节点"],"responses":{"204":{"description":"成功"},"400":{"description":"节点 ID 已存在"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"node_id":{"type":"string"}},"required":["node_id"]}}}}}},"/node/local":{"get":{"operationId":"getNodeLocal","summary":"获取本地节点列表","tags":["用户节点"],"responses":{"200":{"description":"成功","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"id":{"type":"number"},"node_id":{"type":"string"},"connect_ip":{"type":"string"},"status":{"type":"string"},"version":{"type":"string"},"note":{"anyOf":[{"type":"string"},{"type":"null"}]},"hostname":{"anyOf":[{"type":"string"},{"type":"null"}]},"created_at":{"type":"string"}},"required":["id","node_id","connect_ip","status","version","note","hostname","created_at"]}}}}}}}},"/node/sysinfo/detail":{"get":{"operationId":"getNodeSysinfoDetail","summary":"获取用户个人节点详细系统信息","tags":["用户节点"],"responses":{}}},"/node/sysinfo":{"get":{"operationId":"getNodeSysinfo","summary":"获取用户节点系统信息","tags":["用户节点"],"responses":{}}},"/node/group/summary":{"get":{"operationId":"getNodeGroupSummary","summary":"获取节点组摘要","tags":["节点组"],"responses":{"200":{"description":"成功","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"name":{"type":"string"},"node_type":{"type":"string","enum":["in","out"]},"traffic_rate":{"type":"number"},"need_out_node_group":{"type":"boolean"},"need_client":{"type":"boolean"},"admission":{"type":"boolean"},"node_count":{"type":"number"},"node_status":{"anyOf":[{"type":"string","enum":["online","offline"]},{"type":"null"}]}},"required":["id","name","node_type","traffic_rate","need_out_node_group","need_client","admission","node_count","node_status"]}}}}}}}},"/node/group":{"get":{"operationId":"getNodeGroup","summary":"获取节点组列表","tags":["节点组"],"responses":{"200":{"description":"成功","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"node_type":{"type":"string","enum":["in","out"]},"load_balance_type":{"type":"string","enum":["round","rand","fifo","hash","ll","lc"]},"bypass_type":{"type":"string","enum":["whitelist","blacklist"]},"id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"token":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"},"port_range":{"anyOf":[{"type":"string"},{"type":"null"}]},"connect_ip":{"anyOf":[{"type":"string"},{"type":"null"}]},"allow_listen_protocol":{"type":"boolean"},"admission":{"type":"boolean"},"traffic_rate":{"type":"number"},"show_node_stats":{"type":"boolean"},"is_local":{"type":"boolean"},"need_out_node_group":{"type":"boolean"},"need_client":{"type":"boolean"},"order_by":{"type":"number"},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"},"user_id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"allow_out_node_groups":{"anyOf":[{"type":"array","items":{"type":"number"}},{"type":"null"}]},"allow_in_node_groups":{"anyOf":[{"type":"array","items":{"type":"number"}},{"type":"null"}]},"block_protocols":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}]},"bypass_list":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}]},"plan_ids":{"type":"array","items":{"type":"number"}}},"required":["node_type","load_balance_type","bypass_type","id","token","name","port_range","connect_ip","allow_listen_protocol","admission","traffic_rate","show_node_stats","is_local","need_out_node_group","need_client","order_by","created_at","updated_at","user_id","allow_out_node_groups","allow_in_node_groups","block_protocols","bypass_list","plan_ids"]}},"total":{"type":"number"}},"required":["data","total"]}}}}},"parameters":[{"in":"query","name":"page","schema":{"default":1,"type":"number","exclusiveMinimum":0}},{"in":"query","name":"perPage","schema":{"default":10,"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},{"in":"query","name":"sort","schema":{"anyOf":[{"type":"string"},{"type":"null"}]}},{"in":"query","name":"name","schema":{"type":"string"}},{"in":"query","name":"connect_ip","schema":{"type":"string"}},{"in":"query","name":"node_type","schema":{"type":"string","enum":["in","out"]}},{"in":"query","name":"email","schema":{"type":"string"}}]},"post":{"operationId":"postNodeGroup","summary":"创建节点组","tags":["节点组"],"responses":{"204":{"description":"成功"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"node_type":{"type":"string","enum":["in","out"]},"load_balance_type":{"type":"string","enum":["round","rand","fifo","hash","ll","lc"]},"connect_ip":{"anyOf":[{"type":"string"},{"type":"null"}]},"need_out_node_group":{"type":"boolean"},"need_client":{"type":"boolean"},"port_range":{"anyOf":[{"type":"string"},{"type":"null"}]},"allow_listen_protocol":{"type":"boolean"},"admission":{"type":"boolean"},"traffic_rate":{"type":"number"},"allow_out_node_groups":{"anyOf":[{"type":"array","items":{"type":"number"}},{"type":"null"}]},"allow_in_node_groups":{"anyOf":[{"type":"array","items":{"type":"number"}},{"type":"null"}]},"block_protocols":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}]},"bypass_type":{"default":"blacklist","type":"string","enum":["whitelist","blacklist"]},"bypass_list":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}]},"show_node_stats":{"default":true,"type":"boolean"}},"required":["name","node_type","load_balance_type","connect_ip","need_out_node_group","need_client","port_range","allow_listen_protocol","admission","traffic_rate","allow_out_node_groups","allow_in_node_groups","block_protocols","bypass_list"]}}}}},"delete":{"operationId":"deleteNodeGroup","summary":"批量删除节点组","tags":["节点组"],"responses":{"204":{"description":"成功"}},"parameters":[{"in":"query","name":"ids","schema":{"type":"string"},"required":true}]}},"/node/group/{id}":{"patch":{"operationId":"patchNodeGroupById","summary":"更新节点组","tags":["节点组"],"responses":{"204":{"description":"成功"}},"parameters":[{"in":"path","name":"id","schema":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"required":true}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"node_type":{"type":"string","enum":["in","out"]},"load_balance_type":{"type":"string","enum":["round","rand","fifo","hash","ll","lc"]},"connect_ip":{"anyOf":[{"type":"string"},{"type":"null"}]},"need_out_node_group":{"type":"boolean"},"need_client":{"type":"boolean"},"port_range":{"anyOf":[{"type":"string"},{"type":"null"}]},"allow_listen_protocol":{"type":"boolean"},"admission":{"type":"boolean"},"traffic_rate":{"type":"number"},"allow_out_node_groups":{"anyOf":[{"type":"array","items":{"type":"number"}},{"type":"null"}]},"allow_in_node_groups":{"anyOf":[{"type":"array","items":{"type":"number"}},{"type":"null"}]},"block_protocols":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}]},"bypass_type":{"default":"blacklist","type":"string","enum":["whitelist","blacklist"]},"bypass_list":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}]},"show_node_stats":{"default":true,"type":"boolean"}},"required":["name","node_type","load_balance_type","connect_ip","need_out_node_group","need_client","port_range","allow_listen_protocol","admission","traffic_rate","allow_out_node_groups","allow_in_node_groups","block_protocols","bypass_list"]}}}}}},"/node/group/{id}/order":{"patch":{"operationId":"patchNodeGroupByIdOrder","summary":"更新节点组排序","tags":["节点组"],"responses":{"204":{"description":"成功"}},"parameters":[{"in":"path","name":"id","schema":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"required":true}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"order_by":{"type":"number"}},"required":["order_by"]}}}}}},"/node/group/local":{"post":{"operationId":"postNodeGroupLocal","summary":"获取或创建本地节点组","tags":["节点组"],"responses":{"200":{"description":"成功","content":{"application/json":{"schema":{"type":"object","properties":{"token":{"type":"string"},"node_group_id":{"type":"number"}},"required":["token","node_group_id"]}}}}}}},"/user/info":{"get":{"operationId":"getUserInfo","summary":"获取用户信息","description":"获取用户信息","tags":["用户"],"responses":{"200":{"description":"用户信息","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","enum":["active","inactive"]},"id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"email":{"type":"string"},"balance":{"type":"number"},"commission_balance":{"type":"number"},"tg_id":{"anyOf":[{"type":"string"},{"type":"null"}]},"uid":{"anyOf":[{"type":"string"},{"type":"null"}]},"note":{"anyOf":[{"type":"string"},{"type":"null"}]},"parent_id":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"referral_commission_rate":{"anyOf":[{"type":"number"},{"type":"null"}]},"referral_first_only":{"anyOf":[{"type":"boolean"},{"type":"null"}]},"auto_renew":{"type":"boolean"},"api_key":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"migrated_from":{"anyOf":[{"type":"string"},{"type":"null"}]},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"},"notify_subscriptions":{"type":"object","properties":{"topup":{"type":"object","properties":{"telegram":{"type":"boolean"},"email":{"type":"boolean"}},"required":["telegram","email"]},"subscribe_plan":{"type":"object","properties":{"telegram":{"type":"boolean"},"email":{"type":"boolean"}},"required":["telegram","email"]},"node_register":{"type":"object","properties":{"telegram":{"type":"boolean"},"email":{"type":"boolean"}},"required":["telegram","email"]},"renew_plan_failed":{"type":"object","properties":{"telegram":{"type":"boolean"},"email":{"type":"boolean"}},"required":["telegram","email"]},"node_disconnect":{"type":"object","properties":{"telegram":{"type":"boolean"},"email":{"type":"boolean"}},"required":["telegram","email"]},"node_online":{"type":"object","properties":{"telegram":{"type":"boolean"},"email":{"type":"boolean"}},"required":["telegram","email"]},"plan_expire":{"type":"object","properties":{"telegram":{"type":"boolean"},"email":{"type":"boolean"}},"required":["telegram","email"]},"ticket_created":{"type":"object","properties":{"telegram":{"type":"boolean"},"email":{"type":"boolean"}},"required":["telegram","email"]},"ticket_replied":{"type":"object","properties":{"telegram":{"type":"boolean"},"email":{"type":"boolean"}},"required":["telegram","email"]}}},"plan":{"type":"object","properties":{"billing_cycle":{"type":"string","enum":["month","quarter","half_year","year","lifetime"]},"status":{"type":"string","enum":["active","inactive"]},"id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"name":{"type":"string"},"description":{"anyOf":[{"type":"string"},{"type":"null"}]},"original_price":{"anyOf":[{"type":"number"},{"type":"null"}]},"price":{"type":"number"},"max_tunnels":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"traffic":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"ip_limit":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"max_clients":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"bandwidth_limit":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"whitelist_limit":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"allow_custom_in_node_group":{"type":"boolean"},"allow_custom_out_node_group":{"type":"boolean"},"all_in_node_groups":{"type":"boolean"},"all_out_node_groups":{"type":"boolean"},"setup_fee":{"anyOf":[{"type":"number"},{"type":"null"}]},"renewable":{"type":"boolean"},"stock":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"min_recharge":{"anyOf":[{"type":"number"},{"type":"null"}]},"order_by":{"type":"number"},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"},"user_plan":{"type":"object","properties":{"id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"user_id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"traffic":{"anyOf":[{"type":"number"},{"type":"null"}]},"traffic_used":{"type":"number"},"max_tunnels":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"whitelist_ips":{"anyOf":[{"$ref":"#/components/schemas/__schema0"},{"type":"null"}]},"expired_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}]},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"},"plan_id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["id","user_id","traffic","traffic_used","max_tunnels","whitelist_ips","expired_at","created_at","updated_at","plan_id"]}},"required":["billing_cycle","status","id","name","description","original_price","price","max_tunnels","traffic","ip_limit","max_clients","bandwidth_limit","whitelist_limit","allow_custom_in_node_group","allow_custom_out_node_group","all_in_node_groups","all_out_node_groups","setup_fee","renewable","stock","min_recharge","order_by","created_at","updated_at","user_plan"]},"total_recharge":{"type":"number"},"roles":{"type":"array","items":{"type":"string"}},"permissions":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"array","items":{"type":"string"}}},"has_password":{"type":"boolean"}},"required":["status","id","email","balance","commission_balance","tg_id","uid","note","parent_id","referral_commission_rate","referral_first_only","auto_renew","api_key","migrated_from","created_at","updated_at","notify_subscriptions","plan","total_recharge","roles","permissions","has_password"],"$defs":{"__schema0":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null","const":null},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"$ref":"#/components/schemas/__schema0"}},{"type":"array","items":{"$ref":"#/components/schemas/__schema0"}}]}}}}}}}}},"/user":{"patch":{"operationId":"patchUser","summary":"更新用户信息","description":"更新用户信息","tags":["用户"],"responses":{"204":{"description":"更新用户信息成功"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"notify_subscriptions":{"type":"object","properties":{"topup":{"type":"object","properties":{"telegram":{"type":"boolean"},"email":{"type":"boolean"}},"required":["telegram","email"]},"subscribe_plan":{"type":"object","properties":{"telegram":{"type":"boolean"},"email":{"type":"boolean"}},"required":["telegram","email"]},"node_register":{"type":"object","properties":{"telegram":{"type":"boolean"},"email":{"type":"boolean"}},"required":["telegram","email"]},"renew_plan_failed":{"type":"object","properties":{"telegram":{"type":"boolean"},"email":{"type":"boolean"}},"required":["telegram","email"]},"node_disconnect":{"type":"object","properties":{"telegram":{"type":"boolean"},"email":{"type":"boolean"}},"required":["telegram","email"]},"node_online":{"type":"object","properties":{"telegram":{"type":"boolean"},"email":{"type":"boolean"}},"required":["telegram","email"]},"plan_expire":{"type":"object","properties":{"telegram":{"type":"boolean"},"email":{"type":"boolean"}},"required":["telegram","email"]},"ticket_created":{"type":"object","properties":{"telegram":{"type":"boolean"},"email":{"type":"boolean"}},"required":["telegram","email"]},"ticket_replied":{"type":"object","properties":{"telegram":{"type":"boolean"},"email":{"type":"boolean"}},"required":["telegram","email"]}}},"auto_renew":{"type":"boolean"},"api_key":{"type":"boolean"},"unbind_telegram":{"type":"boolean"}}}}}}}},"/user/balance/log":{"get":{"operationId":"getUserBalanceLog","summary":"获取余额记录","description":"获取余额记录","tags":["用户"],"responses":{"200":{"description":"成功获取余额记录","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string","enum":["topup","plan","plan_renew","plan_renew_manual","plan_renew_auto","plan_upgrade","commission_transfer","migration","admin_adjustment"]},"id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"user_id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"balance":{"type":"number"},"amount":{"type":"number"},"operator_id":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"note":{"anyOf":[{"type":"string"},{"type":"null"}]},"created_at":{"type":"string"},"updated_at":{"type":"string","format":"date-time"},"user":{"type":"object","properties":{"email":{"type":"string"}},"required":["email"]},"operator":{"anyOf":[{"type":"object","properties":{"email":{"type":"string"}},"required":["email"]},{"type":"null"}]}},"required":["type","id","user_id","balance","amount","operator_id","note","created_at","updated_at","user"]}},"total":{"type":"number"}},"required":["data","total"]}}}}},"parameters":[{"in":"query","name":"page","schema":{"default":1,"type":"number","exclusiveMinimum":0}},{"in":"query","name":"perPage","schema":{"default":10,"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},{"in":"query","name":"sort","schema":{"anyOf":[{"type":"string"},{"type":"null"}]}},{"in":"query","name":"type","schema":{"type":"string","enum":["topup","plan","plan_renew","plan_renew_manual","plan_renew_auto","plan_upgrade","commission_transfer","migration","admin_adjustment"]}},{"in":"query","name":"email","schema":{"type":"string"}}]}},"/user/commission/log":{"get":{"operationId":"getUserCommissionLog","summary":"获取佣金记录","description":"获取佣金余额变动记录","tags":["用户"],"responses":{"200":{"description":"成功获取佣金记录","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string","enum":["referral","transfer","withdrawal","withdrawal_refund","admin_adjustment"]},"id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"user_id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"commission_balance":{"type":"number"},"amount":{"type":"number"},"plan_id":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"source_amount":{"anyOf":[{"type":"number"},{"type":"null"}]},"operator_id":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"note":{"anyOf":[{"type":"string"},{"type":"null"}]},"created_at":{"type":"string"},"updated_at":{"type":"string","format":"date-time"},"user":{"type":"object","properties":{"email":{"type":"string"}},"required":["email"]},"operator":{"anyOf":[{"type":"object","properties":{"email":{"type":"string"}},"required":["email"]},{"type":"null"}]},"plan":{"anyOf":[{"type":"object","properties":{"name":{"type":"string"}},"required":["name"]},{"type":"null"}]}},"required":["type","id","user_id","commission_balance","amount","plan_id","source_amount","operator_id","note","created_at","updated_at"]}},"total":{"type":"number"}},"required":["data","total"]}}}}},"parameters":[{"in":"query","name":"page","schema":{"default":1,"type":"number","exclusiveMinimum":0}},{"in":"query","name":"perPage","schema":{"default":10,"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},{"in":"query","name":"sort","schema":{"anyOf":[{"type":"string"},{"type":"null"}]}},{"in":"query","name":"type","schema":{"type":"string","enum":["referral","transfer","withdrawal","withdrawal_refund","admin_adjustment"]}}]}},"/user/referral/info":{"get":{"operationId":"getUserReferralInfo","summary":"获取推广信息","description":"获取推广信息","tags":["用户"],"responses":{"200":{"description":"成功获取推广信息","content":{"application/json":{"schema":{"type":"object","properties":{"referral_url":{"type":"string"},"commission_rate":{"type":"number"},"referral_count":{"type":"number"},"total_earnings":{"type":"number"},"referral_mode":{"type":"string","enum":["topup","plan"]},"referral_first_only":{"type":"boolean"}},"required":["referral_url","commission_rate","referral_count","total_earnings","referral_mode","referral_first_only"]}}}}}}},"/user/referral/stats":{"get":{"operationId":"getUserReferralStats","summary":"获取推广统计","description":"获取推广统计","tags":["用户"],"responses":{"200":{"description":"成功获取推广统计","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"date":{"type":"string"},"referral_count":{"type":"number"},"earnings":{"type":"number"}},"required":["date","referral_count","earnings"]}}}}}},"parameters":[{"in":"query","name":"start_date","schema":{"type":"string","format":"date-time"}},{"in":"query","name":"end_date","schema":{"type":"string","format":"date-time"}},{"in":"query","name":"aggregate_by","schema":{"default":"day","type":"string","enum":["day","month","year"]}}]}},"/user/migrate":{"post":{"operationId":"postUserMigrate","summary":"从旧系统迁移套餐","description":"通过旧系统的用户名密码登录，获取套餐信息并迁移到本系统","tags":["用户"],"responses":{"204":{"description":"迁移成功"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"username":{"type":"string"},"password":{"type":"string"}},"required":["username","password"]}}}}}},"/user/change-email/send-old-otp":{"post":{"operationId":"postUserChangeEmailSendOldOtp","summary":"修改邮箱：发送当前邮箱验证码","description":"向用户当前邮箱发送验证码，用于验证当前邮箱所有权","tags":["用户"],"responses":{"204":{"description":"验证码已发送"}}}},"/user/change-email/verify-old":{"post":{"operationId":"postUserChangeEmailVerifyOld","summary":"修改邮箱：验证当前邮箱验证码","description":"校验当前邮箱验证码，通过后方可发送新邮箱验证码","tags":["用户"],"responses":{"204":{"description":"当前邮箱验证通过"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"otp":{"type":"string","minLength":6,"maxLength":6}},"required":["otp"]}}}}}},"/user/change-email/send-new-otp":{"post":{"operationId":"postUserChangeEmailSendNewOtp","summary":"修改邮箱：发送新邮箱验证码","description":"需先通过当前邮箱验证，再向新邮箱发送验证码","tags":["用户"],"responses":{"204":{"description":"验证码已发送"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"new_email":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"}},"required":["new_email"]}}}}}},"/user/change-email/verify-new":{"post":{"operationId":"postUserChangeEmailVerifyNew","summary":"修改邮箱：验证新邮箱并完成修改","description":"校验新邮箱验证码，通过后将账户邮箱更新为新邮箱","tags":["用户"],"responses":{"204":{"description":"邮箱修改成功"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"otp":{"type":"string","minLength":6,"maxLength":6}},"required":["otp"]}}}}}},"/user/set-password":{"post":{"operationId":"postUserSetPassword","summary":"设置登录密码","description":"为从未设置过密码的账户（如邮箱验证码注册）设置登录密码","tags":["用户"],"responses":{"204":{"description":"密码设置成功"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"password":{"type":"string","minLength":8}},"required":["password"]}}}}}},"/plan":{"get":{"operationId":"getPlan","summary":"获取所有套餐","tags":["套餐"],"responses":{"200":{"description":"成功获取所有套餐","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"billing_cycle":{"type":"string","enum":["month","quarter","half_year","year","lifetime"]},"id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"name":{"type":"string"},"description":{"anyOf":[{"type":"string"},{"type":"null"}]},"original_price":{"anyOf":[{"type":"number"},{"type":"null"}]},"price":{"type":"number"},"max_tunnels":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"traffic":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"ip_limit":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"max_clients":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"bandwidth_limit":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"whitelist_limit":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"allow_custom_in_node_group":{"type":"boolean"},"allow_custom_out_node_group":{"type":"boolean"},"all_in_node_groups":{"type":"boolean"},"all_out_node_groups":{"type":"boolean"},"setup_fee":{"anyOf":[{"type":"number"},{"type":"null"}]},"renewable":{"type":"boolean"},"stock":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"min_recharge":{"anyOf":[{"type":"number"},{"type":"null"}]},"order_by":{"type":"number"}},"required":["billing_cycle","id","name","description","original_price","price","max_tunnels","traffic","ip_limit","max_clients","bandwidth_limit","whitelist_limit","allow_custom_in_node_group","allow_custom_out_node_group","all_in_node_groups","all_out_node_groups","setup_fee","renewable","stock","min_recharge","order_by"]}}}}}}}},"/plan/{id}/detail":{"get":{"operationId":"getPlanByIdDetail","summary":"获取套餐","tags":["套餐"],"responses":{"200":{"description":"成功获取套餐"}},"parameters":[{"in":"path","name":"id","schema":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"required":true}]}},"/plan/{id}/subscribe":{"post":{"operationId":"postPlanByIdSubscribe","summary":"订阅套餐","tags":["套餐"],"responses":{"200":{"description":"成功订阅套餐"}},"parameters":[{"in":"path","name":"id","schema":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"required":true},{"in":"query","name":"code","schema":{"type":"string"}}]}},"/plan/{id}/upgrade-preview":{"get":{"operationId":"getPlanByIdUpgradePreview","summary":"升级套餐预览","description":"计算升级到目标套餐需补齐的套餐差价与设置费，不产生扣费","tags":["套餐"],"responses":{"200":{"description":"成功获取升级预览"}},"parameters":[{"in":"path","name":"id","schema":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"required":true}]}},"/plan/{id}/upgrade":{"post":{"operationId":"postPlanByIdUpgrade","summary":"升级套餐","description":"升级到更高价套餐，扣除全额套餐差价与设置费差额，有效期从当前时间重新计算，已用流量不变","tags":["套餐"],"responses":{"200":{"description":"成功升级套餐"}},"parameters":[{"in":"path","name":"id","schema":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"required":true}]}},"/plan/renew":{"post":{"operationId":"postPlanRenew","summary":"续费套餐","tags":["套餐"],"responses":{"200":{"description":"成功续费套餐"}}}},"/plan/orders":{"get":{"operationId":"getPlanOrders","summary":"获取所有套餐订单","tags":["套餐"],"responses":{"200":{"description":"成功获取所有套餐订单","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"user_id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"plan_id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"price":{"type":"number"},"setup_fee":{"anyOf":[{"type":"number"},{"type":"null"}]},"balance":{"type":"number"},"coupon_id":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"},"coupon":{"type":"object","properties":{"value":{"type":"number"},"type":{"type":"string"}},"required":["value","type"]},"plan":{"type":"object","properties":{"name":{"type":"string"},"price":{"type":"number"}},"required":["name","price"]}},"required":["id","user_id","plan_id","price","setup_fee","balance","coupon_id","created_at","updated_at","coupon","plan"]}},"total":{"type":"number"}},"required":["data","total"]}}}}},"parameters":[{"in":"query","name":"page","schema":{"default":1,"type":"number","exclusiveMinimum":0}},{"in":"query","name":"perPage","schema":{"default":10,"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},{"in":"query","name":"sort","schema":{"anyOf":[{"type":"string"},{"type":"null"}]}},{"in":"query","name":"plan_id","schema":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}}]}},"/plan/summary":{"get":{"operationId":"getPlanSummary","summary":"获取套餐摘要","tags":["套餐"],"responses":{"200":{"description":"成功获取套餐摘要","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"name":{"type":"string"}},"required":["id","name"]}}}}}}}},"/topup/activities":{"get":{"operationId":"getTopupActivities","summary":"获取当前活跃的充值活动","description":"获取当前活跃的充值活动列表","tags":["充值"],"responses":{"200":{"description":"成功获取充值活动","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string","enum":["percentage","fixed"]},"id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"value":{"type":"number"},"min_amount":{"anyOf":[{"type":"number"},{"type":"null"}]},"max_amount":{"anyOf":[{"type":"number"},{"type":"null"}]},"valid_start":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}]},"valid_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}]},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"}},"required":["type","id","value","min_amount","max_amount","valid_start","valid_end","created_at","updated_at"]}}}}}}}},"/topup":{"get":{"operationId":"getTopup","summary":"获取充值记录","description":"获取充值记录","tags":["充值"],"responses":{"200":{"description":"成功获取充值记录","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"status":{"type":"string","enum":["pending","success","cancelled"]},"id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"user_id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"price":{"type":"number"},"balance":{"type":"number"},"bonus":{"type":"number"},"payment_id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"pay_url":{"type":"string"},"order_id":{"type":"string"},"trade_id":{"anyOf":[{"type":"string"},{"type":"null"}]},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"},"payment":{"type":"object","properties":{"name":{"type":"string"}},"required":["name"]},"user":{"type":"object","properties":{"email":{"type":"string"}},"required":["email"]}},"required":["status","id","user_id","price","balance","bonus","payment_id","pay_url","order_id","trade_id","created_at","updated_at","payment","user"]}},"total":{"type":"number"}},"required":["data","total"]}}}}},"parameters":[{"in":"query","name":"page","schema":{"default":1,"type":"number","exclusiveMinimum":0}},{"in":"query","name":"perPage","schema":{"default":10,"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},{"in":"query","name":"sort","schema":{"anyOf":[{"type":"string"},{"type":"null"}]}},{"in":"query","name":"status","schema":{"type":"string","enum":["pending","success","cancelled"]}},{"in":"query","name":"payment","schema":{"type":"number"}},{"in":"query","name":"order_id","schema":{"type":"string"}},{"in":"query","name":"email","schema":{"type":"string"}}]},"post":{"operationId":"postTopup","summary":"创建充值订单","description":"创建充值订单","tags":["充值"],"responses":{"200":{"description":"成功创建充值订单","content":{"application/json":{"schema":{"type":"object","properties":{"pay_url":{"type":"string"}},"required":["pay_url"]}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"price":{"type":"number"},"redirect_url":{"type":"string","format":"uri"},"payment_id":{"type":"integer","minimum":1,"maximum":9007199254740991}},"required":["price","redirect_url","payment_id"]}}}}}},"/topup/{id}/cancel":{"patch":{"operationId":"patchTopupByIdCancel","summary":"取消充值订单","description":"取消充值订单","tags":["充值"],"responses":{"204":{"description":"成功取消充值订单"}},"parameters":[{"in":"path","name":"id","schema":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"required":true}]}},"/pay":{"get":{"operationId":"getPay","summary":"获取支付方式","description":"获取支付方式","tags":["支付"],"responses":{"200":{"description":"成功","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"name":{"type":"string"},"method":{"type":"string","enum":["epay","bepusdt","heleket","stripe"]},"type":{"anyOf":[{"type":"string"},{"type":"null"}]},"fixed_fee":{"anyOf":[{"type":"number"},{"type":"null"}]},"percent_fee":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["id","name","method","type","fixed_fee","percent_fee"]}}}}}}}},"/system/config/site":{"get":{"operationId":"getSystemConfigSite","summary":"获取系统站点配置","tags":["系统站点配置"],"responses":{"200":{"description":"成功","content":{"application/json":{"schema":{"type":"object","propertyNames":{"type":"string","enum":["MIN_TOPUP_AMOUNT","NOTICE","NOTICE_POPUP","NOTICE_POPUP_INTERVAL_HOURS","SITE_NAME","SITE_DESCRIPTION","ALLOW_REGISTER","LOGO_URL","HIDE_NODE_STATUS","AUTO_UPDATE_AGENT","CHATWOOT_BASE_URL","CHATWOOT_TOKEN","TUNNEL_TRAFFIC_RETENTION_DAYS","HIDE_FOOTER","HIDE_DOCS","LANDING_PAGE_URL","REFERRAL_COMMISSION_RATE","REFERRAL_FIRST_ONLY","REFERRAL_MODE","OBSERVER_PERIOD","EMAIL_PROVIDER","SMTP_HOST","SMTP_PORT","SMTP_SECURE","SMTP_USER","SMTP_PASS","SMTP_FROM","RESEND_API_KEY","RESEND_FROM","REQUIRE_EMAIL_VERIFICATION","MIN_WITHDRAWAL_AMOUNT","HIDE_TICKETS","NODE_OFFLINE_MINUTES","NODE_AUTO_CLEANUP_MINUTES"]},"additionalProperties":{},"required":["MIN_TOPUP_AMOUNT","NOTICE","NOTICE_POPUP","NOTICE_POPUP_INTERVAL_HOURS","SITE_NAME","SITE_DESCRIPTION","ALLOW_REGISTER","LOGO_URL","HIDE_NODE_STATUS","AUTO_UPDATE_AGENT","CHATWOOT_BASE_URL","CHATWOOT_TOKEN","TUNNEL_TRAFFIC_RETENTION_DAYS","HIDE_FOOTER","HIDE_DOCS","LANDING_PAGE_URL","REFERRAL_COMMISSION_RATE","REFERRAL_FIRST_ONLY","REFERRAL_MODE","OBSERVER_PERIOD","EMAIL_PROVIDER","SMTP_HOST","SMTP_PORT","SMTP_SECURE","SMTP_USER","SMTP_PASS","SMTP_FROM","RESEND_API_KEY","RESEND_FROM","REQUIRE_EMAIL_VERIFICATION","MIN_WITHDRAWAL_AMOUNT","HIDE_TICKETS","NODE_OFFLINE_MINUTES","NODE_AUTO_CLEANUP_MINUTES"]}}}}}}},"/system/config":{"get":{"operationId":"getSystemConfig","summary":"获取系统配置","tags":["系统配置"],"responses":{"200":{"description":"成功","content":{"application/json":{"schema":{"type":"object","propertyNames":{"type":"string","enum":["MIN_TOPUP_AMOUNT","NOTICE","NOTICE_POPUP","NOTICE_POPUP_INTERVAL_HOURS","SITE_NAME","SITE_DESCRIPTION","ALLOW_REGISTER","LOGO_URL","HIDE_NODE_STATUS","AUTO_UPDATE_AGENT","CHATWOOT_BASE_URL","CHATWOOT_TOKEN","TUNNEL_TRAFFIC_RETENTION_DAYS","HIDE_FOOTER","HIDE_DOCS","LANDING_PAGE_URL","REFERRAL_COMMISSION_RATE","REFERRAL_FIRST_ONLY","REFERRAL_MODE","OBSERVER_PERIOD","EMAIL_PROVIDER","SMTP_HOST","SMTP_PORT","SMTP_SECURE","SMTP_USER","SMTP_PASS","SMTP_FROM","RESEND_API_KEY","RESEND_FROM","REQUIRE_EMAIL_VERIFICATION","MIN_WITHDRAWAL_AMOUNT","HIDE_TICKETS","NODE_OFFLINE_MINUTES","NODE_AUTO_CLEANUP_MINUTES"]},"additionalProperties":{},"required":["MIN_TOPUP_AMOUNT","NOTICE","NOTICE_POPUP","NOTICE_POPUP_INTERVAL_HOURS","SITE_NAME","SITE_DESCRIPTION","ALLOW_REGISTER","LOGO_URL","HIDE_NODE_STATUS","AUTO_UPDATE_AGENT","CHATWOOT_BASE_URL","CHATWOOT_TOKEN","TUNNEL_TRAFFIC_RETENTION_DAYS","HIDE_FOOTER","HIDE_DOCS","LANDING_PAGE_URL","REFERRAL_COMMISSION_RATE","REFERRAL_FIRST_ONLY","REFERRAL_MODE","OBSERVER_PERIOD","EMAIL_PROVIDER","SMTP_HOST","SMTP_PORT","SMTP_SECURE","SMTP_USER","SMTP_PASS","SMTP_FROM","RESEND_API_KEY","RESEND_FROM","REQUIRE_EMAIL_VERIFICATION","MIN_WITHDRAWAL_AMOUNT","HIDE_TICKETS","NODE_OFFLINE_MINUTES","NODE_AUTO_CLEANUP_MINUTES"]}}}}},"parameters":[{"in":"query","name":"name","schema":{"type":"string"},"required":true}]}},"/plan/coupon":{"get":{"operationId":"getPlanCoupon","summary":"获取优惠券","tags":["优惠券"],"responses":{"200":{"description":"优惠券获取成功","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","enum":["percentage","fixed"]},"value":{"type":"number"}},"required":["type","value"]}}}}},"parameters":[{"in":"query","name":"code","schema":{"type":"string","minLength":1},"required":true},{"in":"query","name":"cycle","schema":{"type":"string","enum":["month","quarter","half_year","year","lifetime"]},"required":true}]}},"/bot":{"get":{"operationId":"getBot","summary":"获取 Bot 信息","description":"获取 Bot 信息","tags":["Bot"],"responses":{"200":{"description":"Bot 信息","content":{"application/json":{"schema":{"type":"object","properties":{"username":{"type":"string"}}}}}}}}},"/in_node_group_dns":{"get":{"operationId":"getInNodeGroupDns","summary":"获取入口保活配置列表","tags":["入口保活"],"responses":{"200":{"description":"成功"}},"parameters":[{"in":"query","name":"page","schema":{"default":1,"type":"number","exclusiveMinimum":0}},{"in":"query","name":"perPage","schema":{"default":10,"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},{"in":"query","name":"sort","schema":{"anyOf":[{"type":"string"},{"type":"null"}]}},{"in":"query","name":"in_node_group_id","schema":{"type":"number"}},{"in":"query","name":"dns_provider_id","schema":{"type":"number"}},{"in":"query","name":"status","schema":{"type":"string","enum":["active","inactive"]}}]},"post":{"operationId":"postInNodeGroupDns","summary":"创建入口保活配置","tags":["入口保活"],"responses":{"204":{"description":"成功"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"in_node_group_id":{"type":"number"},"dns_provider_id":{"type":"number"},"ttl":{"default":60,"type":"integer","minimum":1,"maximum":9007199254740991},"custom_line":{"anyOf":[{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}},{"type":"null"}]},"ipv6":{"default":false,"type":"boolean"},"status":{"default":"active","type":"string","enum":["active","inactive"]}},"required":["in_node_group_id","dns_provider_id"]}}}}},"delete":{"operationId":"deleteInNodeGroupDns","summary":"批量删除入口保活配置","tags":["入口保活"],"responses":{"204":{"description":"成功"}},"parameters":[{"in":"query","name":"ids","schema":{"type":"string"},"required":true}]}},"/in_node_group_dns/dns_providers":{"get":{"operationId":"getInNodeGroupDnsDnsProviders","summary":"获取 DNS 授权配置摘要","tags":["入口保活"],"responses":{"200":{"description":"成功"}}}},"/in_node_group_dns/{id}":{"patch":{"operationId":"patchInNodeGroupDnsById","summary":"更新入口保活配置","tags":["入口保活"],"responses":{"204":{"description":"成功"}},"parameters":[{"in":"path","name":"id","schema":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"required":true}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"in_node_group_id":{"type":"number"},"dns_provider_id":{"type":"number"},"ttl":{"default":60,"type":"integer","minimum":1,"maximum":9007199254740991},"custom_line":{"anyOf":[{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}},{"type":"null"}]},"ipv6":{"default":false,"type":"boolean"},"status":{"default":"active","type":"string","enum":["active","inactive"]}},"required":["in_node_group_id","dns_provider_id"]}}}}}},"/in_node_group_dns/{id}/sync":{"post":{"operationId":"postInNodeGroupDnsByIdSync","summary":"同步 DNS 记录","tags":["入口保活"],"responses":{"200":{"description":"成功"}},"parameters":[{"in":"path","name":"id","schema":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"required":true}]}},"/dns_provider":{"get":{"operationId":"getDnsProvider","summary":"获取 DNS 授权配置列表","tags":["DNS 授权配置"],"responses":{"200":{"description":"成功"}},"parameters":[{"in":"query","name":"page","schema":{"default":1,"type":"number","exclusiveMinimum":0}},{"in":"query","name":"perPage","schema":{"default":10,"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},{"in":"query","name":"sort","schema":{"anyOf":[{"type":"string"},{"type":"null"}]}},{"in":"query","name":"name","schema":{"type":"string"}},{"in":"query","name":"type","schema":{"type":"string","enum":["cloudflare","huawei"]}}]},"post":{"operationId":"postDnsProvider","summary":"创建 DNS 授权配置","tags":["DNS 授权配置"],"responses":{"204":{"description":"成功"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1},"type":{"type":"string","enum":["cloudflare","huawei"]},"config":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}}},"required":["name","type","config"]}}}}},"delete":{"operationId":"deleteDnsProvider","summary":"批量删除 DNS 授权配置","tags":["DNS 授权配置"],"responses":{"204":{"description":"成功"}},"parameters":[{"in":"query","name":"ids","schema":{"type":"string"},"required":true}]}},"/dns_provider/summary":{"get":{"operationId":"getDnsProviderSummary","summary":"获取 DNS 授权配置摘要","tags":["DNS 授权配置"],"responses":{"200":{"description":"成功"}}}},"/dns_provider/{id}":{"patch":{"operationId":"patchDnsProviderById","summary":"更新 DNS 授权配置","tags":["DNS 授权配置"],"responses":{"204":{"description":"成功"}},"parameters":[{"in":"path","name":"id","schema":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"required":true}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1},"type":{"type":"string","enum":["cloudflare","huawei"]},"config":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}}},"required":["name","type","config"]}}}}}},"/ticket":{"get":{"operationId":"getTicket","summary":"获取工单列表","tags":["工单"],"responses":{"200":{"description":"工单列表","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"status":{"type":"string","enum":["open","closed"]},"id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"title":{"type":"string"},"content":{"type":"string"},"user_id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"}},"required":["status","id","title","content","user_id","created_at","updated_at"]}},"total":{"type":"number"}},"required":["data","total"]}}}}},"parameters":[{"in":"query","name":"page","schema":{"default":1,"type":"number","exclusiveMinimum":0}},{"in":"query","name":"perPage","schema":{"default":10,"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},{"in":"query","name":"sort","schema":{"anyOf":[{"type":"string"},{"type":"null"}]}},{"in":"query","name":"status","schema":{"anyOf":[{"type":"string","enum":["open","closed"]},{"type":"null"}]}},{"in":"query","name":"title","schema":{"anyOf":[{"type":"string"},{"type":"null"}]}}]},"post":{"operationId":"postTicket","summary":"创建工单","tags":["工单"],"responses":{"201":{"description":"工单创建成功","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","enum":["open","closed"]},"id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"title":{"type":"string"},"content":{"type":"string"},"user_id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"}},"required":["status","id","title","content","user_id","created_at","updated_at"]}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string","minLength":1,"maxLength":255},"content":{"type":"string","minLength":1}},"required":["title","content"]}}}}}},"/ticket/{id}":{"get":{"operationId":"getTicketById","summary":"获取工单详情","tags":["工单"],"responses":{"200":{"description":"工单详情","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","enum":["open","closed"]},"id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"title":{"type":"string"},"content":{"type":"string"},"user_id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"},"replies":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"content":{"type":"string"},"is_admin":{"type":"boolean"},"ticket_id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"user_id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"},"user":{"type":"object","properties":{"email":{"type":"string"}},"required":["email"]}},"required":["id","content","is_admin","ticket_id","user_id","created_at","updated_at","user"]}}},"required":["status","id","title","content","user_id","created_at","updated_at","replies"]}}}}},"parameters":[{"in":"path","name":"id","schema":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"required":true}]},"patch":{"operationId":"patchTicketById","summary":"更新工单状态","tags":["工单"],"responses":{"204":{"description":"更新成功"}},"parameters":[{"in":"path","name":"id","schema":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"required":true}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","enum":["open","closed"]}},"required":["status"]}}}}}},"/ticket/{id}/reply":{"post":{"operationId":"postTicketByIdReply","summary":"回复工单","tags":["工单"],"responses":{"201":{"description":"回复成功","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"content":{"type":"string"},"is_admin":{"type":"boolean"},"ticket_id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"user_id":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"}},"required":["id","content","is_admin","ticket_id","user_id","created_at","updated_at"]}}}}},"parameters":[{"in":"path","name":"id","schema":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"required":true}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"content":{"type":"string","minLength":1}},"required":["content"]}}}}}},"/withdrawal/commission/transfer":{"post":{"operationId":"postWithdrawalCommissionTransfer","summary":"佣金余额划转到余额","description":"将佣金余额划转到可用余额，不可反向操作","tags":["提现"],"responses":{"204":{"description":"划转成功"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"amount":{"type":"number","exclusiveMinimum":0}},"required":["amount"]}}}}}},"/withdrawal/request":{"post":{"operationId":"postWithdrawalRequest","summary":"申请提现","description":"申请佣金余额提现（金额按人民币计，收款地址仅支持 USDT TRC20）","tags":["提现"],"responses":{"200":{"description":"提现申请已提交","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"number"}},"required":["id"]}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"amount":{"type":"number","exclusiveMinimum":0},"wallet_address":{"type":"string","minLength":1}},"required":["amount","wallet_address"]}}}}}},"/withdrawal":{"get":{"operationId":"getWithdrawal","summary":"获取提现记录","description":"获取当前用户的提现申请记录","tags":["提现"],"responses":{"200":{"description":"提现记录列表","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"number"},"user_id":{"type":"number"},"amount":{"type":"number"},"wallet_address":{"type":"string"},"status":{"type":"string","enum":["pending","approved","rejected"]},"reject_reason":{"anyOf":[{"type":"string"},{"type":"null"}]},"created_at":{"type":"string"},"updated_at":{"type":"string"},"user":{"type":"object","properties":{"email":{"type":"string"}},"required":["email"]}},"required":["id","user_id","amount","wallet_address","status","reject_reason","created_at","updated_at"]}},"total":{"type":"number"}},"required":["data","total"]}}}}},"parameters":[{"in":"query","name":"page","schema":{"default":1,"type":"number","exclusiveMinimum":0}},{"in":"query","name":"perPage","schema":{"default":10,"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},{"in":"query","name":"sort","schema":{"anyOf":[{"type":"string"},{"type":"null"}]}},{"in":"query","name":"status","schema":{"type":"string","enum":["pending","approved","rejected"]}}]}}}}