[{"data":1,"prerenderedAt":321},["ShallowReactive",2],{"doc:\u002Fapi-reference\u002Fendpoints\u002Fme":3},{"page":4,"toc":317},{"path":5,"title":6,"description":7,"blocks":8},"\u002Fapi-reference\u002Fendpoints\u002Fme","Caller IP lookup","Look up the connecting visitor’s public IPv4 or IPv6 address without an API key, with proxy-aware Cloudflare edge header resolution.",[9,15,18,21,26,74,77,302,305,307,313],{"type":10,"method":11,"path":12,"auth":13,"plan":14},"endpoint","GET","\u002Fv1\u002Fip\u002Fme","none","Public · 120 req\u002Fmin",{"type":10,"method":11,"path":16,"auth":13,"plan":17},"\u002Fv1\u002Fpublic\u002Fip","Alias · 120 req\u002Fmin",{"type":19,"text":20},"p","Returns the full `IpLookupResponse` for the client IP address that initiated the HTTP request. Both `GET \u002Fv1\u002Fip\u002Fme` and `GET \u002Fv1\u002Fpublic\u002Fip` are public, keyless endpoints designed for CLI diagnostics, health scripts, and interactive browser\u002Fedge tools.",{"type":22,"level":23,"text":24,"id":25},"heading",2,"Code examples","code-examples",{"type":27,"samples":28},"code",[29,34,39,44,49,54,59,64,69],{"label":30,"lang":31,"code":32,"html":33},"curl","bash","curl -sS \"https:\u002F\u002Fapi.ipscope.io\u002Fv1\u002Fip\u002Fme\"","\u003Cpre class=\"shiki ipscope\" style=\"background-color:var(--shiki-background);color:var(--shiki-foreground)\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-function)\">curl\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string)\"> -sS\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\"> \"https:\u002F\u002Fapi.ipscope.io\u002Fv1\u002Fip\u002Fme\"\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>",{"label":35,"lang":36,"code":37,"html":38},"Python","python","import asyncio, os\nfrom ipscope import AsyncIpScopeClient\n\nasync def main() -> None:\n    async with AsyncIpScopeClient(api_key=os.environ[\"IPSCOPE_KEY\"]) as client:\n        record = await client.lookup_caller_ip()\n        print(record[\"ip\"], record[\"geo\"][\"country_code\"], record[\"security\"][\"is_vpn\"])\n\nasyncio.run(main())","\u003Cpre class=\"shiki ipscope\" style=\"background-color:var(--shiki-background);color:var(--shiki-foreground)\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">import\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> asyncio\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">,\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> os\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">from\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> ipscope \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">import\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> AsyncIpScopeClient\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">async\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\"> def\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\"> main\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">() \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">->\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> None\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">:\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">    async\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\"> with\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\"> AsyncIpScopeClient\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">(api_key\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">=\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">os.environ[\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">\"IPSCOPE_KEY\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">])\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\"> as\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> client\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">:\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">        record \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">=\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\"> await\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> client\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">lookup_caller_ip\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">()\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-function)\">        print\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">(record[\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">\"ip\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">], record[\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">\"geo\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">][\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">\"country_code\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">], record[\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">\"security\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">][\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">\"is_vpn\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">])\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">asyncio\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">run\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">(\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">main\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">())\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>",{"label":40,"lang":41,"code":42,"html":43},"Node.js","ts","import { IpScopeClient } from '@ipscope\u002Fsdk-node';\n\nconst client = new IpScopeClient({ apiKey: process.env.IPSCOPE_KEY });\nconst record = await client.lookupCallerIp();\nconsole.log(record.ip, record.geo?.country_code, record.security?.is_vpn);","\u003Cpre class=\"shiki ipscope\" style=\"background-color:var(--shiki-background);color:var(--shiki-foreground)\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">import\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> { IpScopeClient } \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">from\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\"> '@ipscope\u002Fsdk-node'\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">const\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> client\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\"> =\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\"> new\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\"> IpScopeClient\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">({ apiKey\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">:\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> process\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\">env\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\">IPSCOPE_KEY\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> });\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">const\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> record\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\"> =\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\"> await\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> client\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">.lookupCallerIp\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">();\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-constant)\">console\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">.log\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">(\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\">record\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">.ip\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">,\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> record\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\">geo\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">?.country_code\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">,\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> record\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\">security\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">?.is_vpn);\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>",{"label":45,"lang":46,"code":47,"html":48},"Go","go","client := ipscope.NewClient(ipscope.Config{APIKey: os.Getenv(\"IPSCOPE_KEY\")})\ndefer client.Close()\n\nrecord, err := client.LookupCallerIP(ctx)\nif err != nil {\n\treturn err\n}\nfmt.Println(record.IP, record.Security.IsVPN)","\u003Cpre class=\"shiki ipscope\" style=\"background-color:var(--shiki-background);color:var(--shiki-foreground)\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">client \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">:=\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> ipscope.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">NewClient\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">(\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">ipscope\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">Config\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">{APIKey: os.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">Getenv\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">(\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">\"IPSCOPE_KEY\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">)})\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">defer\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> client.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">Close\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">()\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">record, err \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">:=\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> client.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">LookupCallerIP\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">(ctx)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">if\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> err \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">!=\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> nil\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">\treturn\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> err\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">}\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">fmt.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">Println\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">(record.IP, record.Security.IsVPN)\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>",{"label":50,"lang":51,"code":52,"html":53},"Rust","rust","use ipscope::{AsyncIpScopeClient, ClientConfig};\n\nlet client = AsyncIpScopeClient::new(ClientConfig::new(std::env::var(\"IPSCOPE_KEY\")?))?;\nlet record = client.lookup_caller_ip().await?;\nprintln!(\"{} VPN={}\", record.ip, record.security.is_vpn);","\u003Cpre class=\"shiki ipscope\" style=\"background-color:var(--shiki-background);color:var(--shiki-foreground)\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">use\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> ipscope\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">::\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">{\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">AsyncIpScopeClient\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">, \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">ClientConfig\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">};\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">let\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> client \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">=\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\"> AsyncIpScopeClient\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">::\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">new\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">(ClientConfig\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">::\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">new\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">(std\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">::\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">env\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">::\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">var\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">(\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">\"IPSCOPE_KEY\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">)\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">?\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">))\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">?\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">let\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> record \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">=\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> client\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">lookup_caller_ip\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">()\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">.await?\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-function)\">println!\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">(\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">\"{} VPN={}\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">, record\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">ip, record\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">security\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">is_vpn);\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>",{"label":55,"lang":56,"code":57,"html":58},"Java","java","import io.ipscope.sdk.IpScopeClient;\nimport io.ipscope.sdk.IpScopeConfig;\n\nIpScopeConfig config = IpScopeConfig.builder().apiKey(System.getenv(\"IPSCOPE_KEY\")).build();\ntry (IpScopeClient client = new IpScopeClient(config)) {\n    var record = client.lookupCallerIp();\n    System.out.println(record.ip() + \" \" + record.geo().countryCode());\n}","\u003Cpre class=\"shiki ipscope\" style=\"background-color:var(--shiki-background);color:var(--shiki-foreground)\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">import\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\"> io\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">ipscope\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">sdk\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">IpScopeClient\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">import\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\"> io\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">ipscope\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">sdk\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">IpScopeConfig\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">IpScopeConfig\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> config \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">=\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> IpScopeConfig\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">builder\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">()\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">apiKey\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">(\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\">System\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">getenv\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">(\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">\"IPSCOPE_KEY\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">))\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">build\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">();\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">try\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> (\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">IpScopeClient\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> client \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">=\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\"> new\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\"> IpScopeClient(config)\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">) {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">    var\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> record \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">=\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> client\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">lookupCallerIp\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">();\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-constant)\">    System\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\">out\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">println\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">(\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\">record\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">ip\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">() \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">+\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\"> \" \"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\"> +\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> record\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">geo\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">()\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">countryCode\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">());\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">}\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>",{"label":60,"lang":61,"code":62,"html":63},".NET","csharp","using IpScope.Sdk;\n\nusing var client = new IpScopeClient(new IpScopeClientOptions {\n    ApiKey = Environment.GetEnvironmentVariable(\"IPSCOPE_KEY\")\n});\nvar record = await client.LookupCallerIpAsync();\nConsole.WriteLine($\"{record.Ip} {record.Geo?.CountryCode} VPN={record.Security?.IsVpn}\");","\u003Cpre class=\"shiki ipscope\" style=\"background-color:var(--shiki-background);color:var(--shiki-foreground)\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">using\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\"> IpScope\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">Sdk\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">using\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\"> var\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> client \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">=\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\"> new\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\"> IpScopeClient\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">(\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">new\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\"> IpScopeClientOptions\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">    ApiKey \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">=\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> Environment\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">GetEnvironmentVariable\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">(\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">\"IPSCOPE_KEY\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">});\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">var\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> record \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">=\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\"> await\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> client\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">LookupCallerIpAsync\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">();\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-constant)\">Console\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">WriteLine\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">(\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">$\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">{\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\">record\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\">Ip\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">}\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\"> {\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\">record\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\">Geo\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">?\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\">CountryCode\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">}\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\"> VPN=\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">{\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\">record\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\">Security\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">?\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\">IsVpn\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">}\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">);\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>",{"label":65,"lang":66,"code":67,"html":68},"Ruby","ruby","require \"ipscope\"\n\nclient = IpScope::Client.new(api_key: ENV.fetch(\"IPSCOPE_KEY\"))\nrecord = client.lookup_caller_ip\nputs \"#{record.ip} #{record.geo.country_code} VPN=#{record.security.is_vpn}\"","\u003Cpre class=\"shiki ipscope\" style=\"background-color:var(--shiki-background);color:var(--shiki-foreground)\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">require\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\"> \"ipscope\"\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">client \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">=\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> IpScope\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">::\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\">Client\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">new\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">(\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\">api_key:\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> ENV\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">fetch\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">(\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">\"IPSCOPE_KEY\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">))\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">record \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">=\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> client\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">lookup_caller_ip\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-function)\">puts\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\"> \"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">#{record\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">ip\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">}\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\"> #{record\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">geo\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">country_code\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">}\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\"> VPN=\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">#{record\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">security\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">is_vpn\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">}\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">\"\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>",{"label":70,"lang":71,"code":72,"html":73},"PHP","php","\u003C?php\nuse IpScope\\Sdk\\IpScopeClient;\n\n$client = new IpScopeClient(apiKey: getenv('IPSCOPE_KEY') ?: '');\n$record = $client->lookupCallerIp();\necho $record->ip . \" \" . $record->geo->countryCode . PHP_EOL;","\u003Cpre class=\"shiki ipscope\" style=\"background-color:var(--shiki-background);color:var(--shiki-foreground)\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">&#x3C;?\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">php\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">use\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> IpScope\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">\\\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\">Sdk\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">\\\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\">IpScopeClient\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">$client \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">=\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\"> new\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> IpScopeClient\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">(\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">apiKey\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">:\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\"> getenv\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">(\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">'IPSCOPE_KEY'\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">)\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\"> ?:\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\"> ''\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">)\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">$record \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">=\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> $client\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">->\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">lookupCallerIp\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">()\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-function)\">echo\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> $record\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">->\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">ip \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\"> \" \"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\"> .\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> $record\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">->\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">geo\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">->\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">countryCode \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> PHP_EOL\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">;\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>",{"type":22,"level":23,"text":75,"id":76},"Responses","responses",{"type":76,"responses":78},[79,271,290],{"code":80,"name":81,"description":82,"schema":83,"example":258,"defaultOpen":88,"exampleHtml":270},"200","IpLookupResponse","Full IPv4\u002FIPv6 intelligence record for the connecting visitor IP.",[84,91,98,103,155,168,195,232,249,253],{"name":85,"type":86,"description":87,"required":88,"format":89,"example":90},"ip","string","Canonical normalized representation of the queried IPv4 or IPv6 address.",true,"ipv4 | ipv6","198.51.100.7",{"name":92,"type":93,"description":94,"required":88,"enum":95,"example":96},"ip_version","integer","Protocol family (`4` for IPv4, `6` for IPv6).",[96,97],4,6,{"name":99,"type":86,"description":100,"nullable":88,"format":101,"example":102},"matched_network","Longest-matching routed CIDR prefix in the active Radix\u002FLPM snapshot.","cidr","198.51.100.0\u002F24",{"name":104,"type":105,"description":106,"isRef":88,"children":107},"geo","GeoLocation","Country and city geolocation record (`geo_country` and `geo_city` families).",[108,112,115,118,123,132,138,142,146,150],{"name":109,"type":86,"description":110,"nullable":88,"example":111},"country_code","Effective ISO 3166-1 alpha-2 country code (`\"US\"`, `\"DE\"`, `\"TR\"`).","US",{"name":113,"type":86,"description":114,"nullable":88,"example":111},"declared_country_code","Country code registered in RIR WHOIS\u002FRDAP allocation records or RFC 8805 geofeed.",{"name":116,"type":86,"description":117,"nullable":88,"example":111},"physical_country_code","Country code where active BGP routing and latency triangulation place the infrastructure.",{"name":119,"type":120,"description":121,"required":88,"example":122},"is_virtual_location","boolean","`true` when `declared_country_code` differs from `physical_country_code` (cross-border routed or geofeed-relocated prefix).",false,{"name":124,"type":86,"description":125,"required":88,"enum":126,"example":127},"location_type","How the effective location was resolved by the lookup engine.",[127,128,129,130,131],"physical","declared","virtual","anycast","unknown",{"name":133,"type":134,"description":135,"nullable":88,"range":136,"example":137},"confidence","number","Calibrated geolocation confidence score.","0.0 … 1.0",0.94,{"name":139,"type":86,"description":140,"nullable":88,"example":141},"subdivision","First-level administrative region or state. Included when `geo_city` is licensed.","Virginia",{"name":143,"type":86,"description":144,"nullable":88,"example":145},"city","Resolved city name. Included when `geo_city` is licensed.","Ashburn",{"name":147,"type":93,"description":148,"nullable":88,"example":149},"accuracy_radius_km","Estimated accuracy radius in kilometres around the city centroid. Included when `geo_city` is licensed.",10,{"name":151,"type":86,"description":152,"nullable":88,"format":153,"example":154},"timezone","IANA time zone identifier. Included when `geo_city` is licensed.","iana-tz","America\u002FNew_York",{"name":156,"type":157,"description":158,"isRef":88,"children":159},"network","NetworkInfo","BGP origin autonomous system metadata (`network` family).",[160,164],{"name":161,"type":93,"description":162,"nullable":88,"example":163},"asn","Origin Autonomous System Number without the `AS` prefix.",64501,{"name":165,"type":86,"description":166,"nullable":88,"example":167},"organization","Canonical autonomous system or operator organization name.","Example Cloud LLC",{"name":169,"type":170,"description":171,"isRef":88,"children":172},"connection","ConnectionInfo","Access network classification (`connection` and `hosting` families).",[173,183,186,189,192],{"name":174,"type":86,"description":175,"required":88,"enum":176,"example":180},"connection_type","Primary access network classification.",[177,178,179,180,181,182,131],"residential","mobile","business","hosting","education","government",{"name":184,"type":120,"description":185,"required":88,"example":122},"is_residential","`true` for consumer FTTH, cable, and DSL broadband ISPs.",{"name":187,"type":120,"description":188,"required":88,"example":122},"is_mobile","`true` for cellular carrier gateways (4G\u002F5G CGNAT pools).",{"name":190,"type":120,"description":191,"required":88,"example":122},"is_business","`true` for enterprise leased lines and corporate autonomous systems.",{"name":193,"type":120,"description":194,"required":88,"example":88},"is_hosting","`true` for cloud providers, colocation facilities, and VPS networks.",{"name":196,"type":197,"description":198,"isRef":88,"children":199},"security","SecurityInfo","VPN, proxy, Tor, and hosting anonymizer classification (`anonymity` and `hosting` families).",[200,203,205,208,211,222,225],{"name":201,"type":120,"description":202,"required":88,"example":88},"is_vpn","`true` when the IP is an active commercial or self-hosted VPN exit node.",{"name":193,"type":120,"description":204,"required":88,"example":88},"`true` when routed by a datacenter, cloud, or hosting ASN.",{"name":206,"type":120,"description":207,"required":88,"example":122},"is_tor_exit","`true` when listed in the active Tor Project exit consensus.",{"name":209,"type":120,"description":210,"required":88,"example":122},"is_proxy","`true` for open HTTP\u002FSOCKS proxies and residential proxy relays.",{"name":212,"type":86,"description":213,"required":88,"enum":214,"example":215},"anonymizer_type","Primary anonymizer classification.",[215,216,217,218,219,220,221,13,131],"vpn","proxy","tor_exit","tor_relay","hosting_proxy","apple_private_relay","other_relay",{"name":133,"type":134,"description":223,"nullable":88,"range":136,"example":224},"Calibrated anonymity confidence score.",0.96,{"name":226,"type":227,"description":228,"required":88,"example":229},"reason_codes","string[]","Deterministic evidence codes explaining why the IP was flagged.",[230,231],"vpn_handshake_confirmed","datacenter_asn_range",{"name":233,"type":234,"description":235,"isRef":88,"children":236},"security_extensions","SecurityExtensions","Extended threat telemetry and scanner recency (`security_extensions` family).",[237,242,245],{"name":238,"type":134,"description":239,"nullable":88,"range":240,"example":241},"abuse_velocity_score","Normalized abuse velocity score from active honeypot and darknet observations.","0 … 100",18,{"name":243,"type":120,"description":244,"nullable":88,"example":122},"is_known_scanner","`true` when the IP has been observed performing internet-wide port or vulnerability scanning.",{"name":246,"type":93,"description":247,"nullable":88,"example":248},"observation_recency_hours","Hours elapsed since the most recent active security or anonymizer observation.",12,{"name":250,"type":86,"description":251,"required":88,"example":252},"dataset_version","Version identifier of the compiled IPScope dataset snapshot serving the response.","2026-10-27T00:00:00Z.crawl-1793088000000",{"name":254,"type":86,"description":255,"nullable":88,"format":256,"example":257},"updated_at","ISO 8601 UTC timestamp when the active dataset snapshot was published.","date-time","2026-10-27T00:00:00Z",{"ip":90,"ip_version":96,"matched_network":102,"geo":259,"network":263,"connection":264,"security":265,"security_extensions":267,"dataset_version":252,"updated_at":257},{"country_code":111,"declared_country_code":111,"physical_country_code":111,"is_virtual_location":122,"location_type":127,"confidence":137,"subdivision":141,"city":145,"postal_code":260,"latitude":261,"longitude":262,"accuracy_radius_km":149,"timezone":154},"20147",39.0438,-77.4874,{"asn":163,"organization":167},{"connection_type":180,"is_hosting":88,"is_residential":122,"is_mobile":122,"is_business":122},{"is_vpn":88,"is_hosting":88,"is_tor_exit":122,"is_proxy":122,"anonymizer_type":215,"confidence":224,"reason_codes":266},[230,231],{"abuse_velocity_score":241,"is_known_scanner":122,"observation_recency_hours":248,"anonymizer_reason":230,"threat_level":268,"abuse_velocity":269,"confidence":224},"medium","low","\u003Cpre class=\"shiki ipscope\" style=\"background-color:var(--shiki-background);color:var(--shiki-foreground)\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">{\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">  \"ip\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">:\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\"> \"198.51.100.7\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">  \"ip_version\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">:\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> 4\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">  \"matched_network\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">:\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\"> \"198.51.100.0\u002F24\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">  \"geo\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">:\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">    \"country_code\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">:\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\"> \"US\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">    \"declared_country_code\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">:\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\"> \"US\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">    \"physical_country_code\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">:\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\"> \"US\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">    \"is_virtual_location\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">:\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> false\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">    \"location_type\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">:\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\"> \"physical\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">    \"confidence\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">:\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> 0.94\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">    \"subdivision\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">:\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\"> \"Virginia\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">    \"city\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">:\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\"> \"Ashburn\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">    \"postal_code\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">:\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\"> \"20147\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">    \"latitude\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">:\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> 39.0438\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">    \"longitude\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">:\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> -77.4874\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">    \"accuracy_radius_km\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">:\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> 10\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">    \"timezone\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">:\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\"> \"America\u002FNew_York\"\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">  }\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">  \"network\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">:\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">    \"asn\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">:\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> 64501\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">    \"organization\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">:\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\"> \"Example Cloud LLC\"\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">  }\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">  \"connection\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">:\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">    \"connection_type\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">:\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\"> \"hosting\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">    \"is_hosting\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">:\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> true\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">    \"is_residential\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">:\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> false\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">    \"is_mobile\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">:\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> false\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">    \"is_business\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">:\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> false\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">  }\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">  \"security\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">:\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">    \"is_vpn\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">:\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> true\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">    \"is_hosting\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">:\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> true\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">    \"is_tor_exit\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">:\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> false\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">    \"is_proxy\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">:\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> false\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">    \"anonymizer_type\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">:\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\"> \"vpn\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">    \"confidence\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">:\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> 0.96\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">    \"reason_codes\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">:\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> [\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-string-expression)\">      \"vpn_handshake_confirmed\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-string-expression)\">      \"datacenter_asn_range\"\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">    ]\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">  }\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">  \"security_extensions\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">:\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">    \"abuse_velocity_score\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">:\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> 18\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">    \"is_known_scanner\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">:\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> false\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">    \"observation_recency_hours\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">:\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> 12\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">    \"anonymizer_reason\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">:\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\"> \"vpn_handshake_confirmed\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">    \"threat_level\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">:\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\"> \"medium\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">    \"abuse_velocity\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">:\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\"> \"low\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">    \"confidence\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">:\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> 0.96\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">  }\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">  \"dataset_version\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">:\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\"> \"2026-10-27T00:00:00Z.crawl-1793088000000\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">  \"updated_at\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">:\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\"> \"2026-10-27T00:00:00Z\"\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">}\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>",{"code":272,"name":273,"description":274,"schema":275,"example":288,"exampleHtml":289},"429","ApiError","Public caller IP rate limit exceeded (120 req\u002Fmin per visitor IP).",[276,280,284],{"name":277,"type":93,"description":278,"required":88,"example":279},"statusCode","HTTP status code returned by the API gateway.",429,{"name":281,"type":86,"description":282,"required":88,"example":283},"message","Human-readable diagnostic message describing the error condition.","Public IP lookup rate limit exceeded (120 req\u002Fmin). Retry after 12s.",{"name":285,"type":86,"description":286,"required":88,"example":287},"error","Canonical HTTP error classification.","Too Many Requests",{"statusCode":279,"message":283,"error":287},"\u003Cpre class=\"shiki ipscope\" style=\"background-color:var(--shiki-background);color:var(--shiki-foreground)\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">{\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">  \"statusCode\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">:\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> 429\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">  \"message\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">:\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\"> \"Public IP lookup rate limit exceeded (120 req\u002Fmin). Retry after 12s.\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">  \"error\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">:\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\"> \"Too Many Requests\"\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">}\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>",{"code":291,"name":273,"description":292,"schema":293,"example":300,"exampleHtml":301},"503","No active dataset snapshot loaded on the API node.",[294,296,298],{"name":277,"type":93,"description":278,"required":88,"example":295},503,{"name":281,"type":86,"description":282,"required":88,"example":297},"No active dataset snapshot loaded",{"name":285,"type":86,"description":286,"required":88,"example":299},"Service Unavailable",{"statusCode":295,"message":297,"error":299},"\u003Cpre class=\"shiki ipscope\" style=\"background-color:var(--shiki-background);color:var(--shiki-foreground)\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">{\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">  \"statusCode\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">:\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> 503\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">  \"message\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">:\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\"> \"No active dataset snapshot loaded\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">  \"error\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">:\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\"> \"Service Unavailable\"\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">}\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>",{"type":22,"level":23,"text":303,"id":304},"Proxy-aware IP extraction & anti-spoofing","proxy-aware-ip-extraction-and-anti-spoofing",{"type":19,"text":306},"To prevent `X-Forwarded-For` header spoofing while supporting reverse-proxy and Cloudflare deployments, `LookupController` inspects the `TRUST_PROXY` environment configuration:",{"type":308,"items":309},"list",[310,311,312],"**When `TRUST_PROXY=true`**: The service extracts the visitor’s real public IP in priority order from `cf-connecting-ip`, the first hop of `x-forwarded-for`, or `x-real-ip`, falling back to the socket peer `req.ip`.","**When `TRUST_PROXY=false` (default direct mode)**: Forwarded headers are ignored and only the verified TCP\u002FQUIC socket address (`req.ip`) is used.","**Cloudflare edge hint fallback**: When behind Cloudflare (`TRUST_PROXY=true`), the service also reads `cf-ipcountry`, `cf-ipcity`, `cf-region`, and `cf-ray` as fallback hints if a newly allocated prefix has no city record in the local snapshot.",{"type":314,"tone":315,"text":316},"callout","note","Calling `\u002Fv1\u002Fip\u002Fme` from your own backend microservice resolves your server’s egress IP. To enrich a customer connecting to your backend, read their IP from your load balancer and call [`GET \u002Fv1\u002Fip\u002F{ip}`](\u002Fapi-reference\u002Fendpoints\u002Fip).",[318,319,320],{"id":25,"text":24,"level":23},{"id":76,"text":75,"level":23},{"id":304,"text":303,"level":23},1793226505568]