{"openapi":"3.1.0","info":{"title":"IP Check","description":"\n自建的 IP 检测服务，聚合多个数据源提供 **归属地 / ASN / ISP / 风险检测** 能力。\n\n* `GET /api/me` —— 检测访问者自己的公网 IP\n* `GET /api/lookup?ip=` —— 查询任意 IP\n* `POST /api/batch` —— 批量查询\n* `GET /api/dnsleak` —— DNS 解析出口检测\n\n数据源按 `ip-api.com` -> `ipwho.is` -> `ip.sb` -> `ipinfo.io` 顺序自动降级。\n","version":"1.1.0"},"paths":{"/api/health":{"get":{"tags":["meta"],"summary":"Health","operationId":"health_api_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthResponse"}}}}}}},"/api/diagnostics":{"get":{"tags":["meta"],"summary":"Diagnostics Endpoint","description":"逐个测试上游数据源，返回耗时与原始错误，便于排查网络问题。","operationId":"diagnostics_endpoint_api_diagnostics_get","parameters":[{"name":"ip","in":"query","required":false,"schema":{"type":"string","description":"用于测试各数据源的探测 IP","default":"8.8.8.8","title":"Ip"},"description":"用于测试各数据源的探测 IP"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Diagnostics Endpoint Api Diagnostics Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/config":{"get":{"tags":["meta"],"summary":"Public Config","description":"Bootstrap data for the frontend (no secrets included).","operationId":"public_config_api_config_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Public Config Api Config Get"}}}}}}},"/api/me":{"get":{"tags":["lookup"],"summary":"Me","description":"Detect and analyse the caller's own public address.","operationId":"me_api_me_get","parameters":[{"name":"lang","in":"query","required":false,"schema":{"type":"string","description":"文案语言：zh / en","default":"zh","title":"Lang"},"description":"文案语言：zh / en"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IpReport"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/lookup":{"get":{"tags":["lookup"],"summary":"Lookup","operationId":"lookup_api_lookup_get","parameters":[{"name":"ip","in":"query","required":true,"schema":{"type":"string","description":"要查询的 IPv4 或 IPv6 地址","title":"Ip"},"description":"要查询的 IPv4 或 IPv6 地址"},{"name":"lang","in":"query","required":false,"schema":{"type":"string","description":"文案语言：zh / en","default":"zh","title":"Lang"},"description":"文案语言：zh / en"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IpReport"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/batch":{"post":{"tags":["lookup"],"summary":"Batch","operationId":"batch_api_batch_post","parameters":[{"name":"lang","in":"query","required":false,"schema":{"type":"string","description":"文案语言：zh / en","default":"zh","title":"Lang"},"description":"文案语言：zh / en"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/dnsleak":{"get":{"tags":["leak"],"summary":"Dns Leak","description":"Inspect the DNS resolver that this host's queries egress through.","operationId":"dns_leak_api_dnsleak_get","parameters":[{"name":"ip","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"可选：用于和 DNS 出口对比的公网 IP","title":"Ip"},"description":"可选：用于和 DNS 出口对比的公网 IP"},{"name":"lang","in":"query","required":false,"schema":{"type":"string","description":"文案语言：zh / en","default":"zh","title":"Lang"},"description":"文案语言：zh / en"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DnsLeakReport"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/dnsleak/session":{"get":{"tags":["leak"],"summary":"Dnsleak Session","description":"Optional multi-resolver DNS leak test.\n\nA real multi-resolver leak test needs a wildcard domain whose authoritative\nDNS server logs the resolver IPs. Point ``DNSLEAK_WILDCARD_DOMAIN`` at your\nown zone to enable it; the classic third-party service used for this\n(``bash.ws``) no longer serves a valid wildcard certificate.","operationId":"dnsleak_session_api_dnsleak_session_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Dnsleak Session Api Dnsleak Session Get"}}}}}}},"/api/dnsleak/result":{"get":{"tags":["leak"],"summary":"Dnsleak Result","description":"多解析器 DNS 泄露测试的结果接口。\n\n需要你自己的泛域名权威 DNS 记录解析器 IP，本服务**不收集、不存储**任何 DNS 查询日志。","operationId":"dnsleak_result_api_dnsleak_result_get","parameters":[{"name":"session","in":"query","required":true,"schema":{"type":"string","description":"DNS 泄露测试会话 ID","title":"Session"},"description":"DNS 泄露测试会话 ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Dnsleak Result Api Dnsleak Result Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"BatchRequest":{"properties":{"ips":{"items":{"type":"string"},"type":"array","title":"Ips","description":"要查询的 IP 列表"}},"type":"object","title":"BatchRequest"},"BatchResponse":{"properties":{"count":{"type":"integer","title":"Count"},"results":{"items":{"$ref":"#/components/schemas/IpReport"},"type":"array","title":"Results"},"errors":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Errors","default":[]}},"type":"object","required":["count","results"],"title":"BatchResponse"},"DnsLeakReport":{"properties":{"available":{"type":"boolean","title":"Available"},"method":{"type":"string","title":"Method","description":"edns / wildcard"},"resolver":{"anyOf":[{"$ref":"#/components/schemas/DnsResolverInfo"},{"type":"null"}]},"client_ip":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Ip"},"verdict":{"type":"string","title":"Verdict","default":""},"level":{"type":"string","title":"Level","default":"low"},"notes":{"items":{"type":"string"},"type":"array","title":"Notes","default":[]}},"type":"object","required":["available","method"],"title":"DnsLeakReport"},"DnsResolverInfo":{"properties":{"ip":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ip"},"geo":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Geo"},"isp":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Isp"},"org":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Org"},"asn":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Asn"},"country_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country Code"},"country_flag":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country Flag"},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"}},"type":"object","title":"DnsResolverInfo"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"HealthResponse":{"properties":{"status":{"type":"string","title":"Status"},"version":{"type":"string","title":"Version"},"cache":{"additionalProperties":true,"type":"object","title":"Cache"},"providers":{"additionalProperties":{"type":"boolean"},"type":"object","title":"Providers"},"tor_exit_count":{"type":"integer","title":"Tor Exit Count"}},"type":"object","required":["status","version","cache","providers","tor_exit_count"],"title":"HealthResponse"},"IpReport":{"properties":{"ip":{"type":"string","title":"Ip"},"version":{"type":"string","title":"Version","description":"IPv4 / IPv6"},"valid":{"type":"boolean","title":"Valid","default":true},"scope":{"type":"string","title":"Scope","description":"public / private / cgnat / loopback / link_local / multicast / reserved"},"scope_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scope Label"},"is_public":{"type":"boolean","title":"Is Public","default":false},"location":{"$ref":"#/components/schemas/LocationInfo","default":{}},"network":{"$ref":"#/components/schemas/NetworkInfo","default":{}},"risk":{"$ref":"#/components/schemas/RiskInfo","default":{"level":"low","score":0,"is_proxy":false,"is_vpn":false,"is_tor":false,"is_hosting":false,"is_mobile":false,"tags":[],"checks":[]}},"sources":{"items":{"$ref":"#/components/schemas/SourceStatus"},"type":"array","title":"Sources","default":[]},"primary_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Primary Source"},"cached":{"type":"boolean","title":"Cached","default":false},"elapsed_ms":{"type":"integer","title":"Elapsed Ms","default":0},"queried_at":{"type":"string","title":"Queried At","default":""},"warning":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Warning"},"detected_via":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Detected Via"},"transport_ip":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Transport Ip"}},"type":"object","required":["ip","version","scope"],"title":"IpReport"},"LocationInfo":{"properties":{"continent":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Continent"},"continent_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Continent Code"},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country"},"country_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country Code"},"country_flag":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country Flag"},"region":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region"},"region_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region Code"},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"},"district":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"District"},"postal":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Postal"},"latitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Latitude"},"longitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Longitude"},"timezone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Timezone"},"utc_offset":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Utc Offset"},"currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Currency"}},"type":"object","title":"LocationInfo"},"NetworkInfo":{"properties":{"asn":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Asn"},"as_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"As Name"},"as_domain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"As Domain"},"isp":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Isp"},"org":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Org"},"hostname":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hostname"}},"type":"object","title":"NetworkInfo"},"RiskCheck":{"properties":{"key":{"type":"string","title":"Key"},"label":{"type":"string","title":"Label"},"hit":{"type":"boolean","title":"Hit"},"weight":{"type":"integer","title":"Weight","default":0},"detail":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Detail"}},"type":"object","required":["key","label","hit"],"title":"RiskCheck"},"RiskInfo":{"properties":{"level":{"type":"string","title":"Level","description":"low / medium / high"},"score":{"type":"integer","title":"Score","description":"0-100 风险分"},"is_proxy":{"type":"boolean","title":"Is Proxy","default":false},"is_vpn":{"type":"boolean","title":"Is Vpn","default":false},"is_tor":{"type":"boolean","title":"Is Tor","default":false},"is_hosting":{"type":"boolean","title":"Is Hosting","default":false},"is_mobile":{"type":"boolean","title":"Is Mobile","default":false},"ip_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ip Type"},"native_ip":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Native Ip"},"native_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Native Reason"},"tags":{"items":{"type":"string"},"type":"array","title":"Tags","default":[]},"checks":{"items":{"$ref":"#/components/schemas/RiskCheck"},"type":"array","title":"Checks","default":[]},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary"}},"type":"object","required":["level","score"],"title":"RiskInfo"},"SourceStatus":{"properties":{"name":{"type":"string","title":"Name"},"ok":{"type":"boolean","title":"Ok"},"ms":{"type":"integer","title":"Ms","default":0},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","required":["name","ok"],"title":"SourceStatus"},"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"}}}}