[{"data":1,"prerenderedAt":164},["ShallowReactive",2],{"doc:\u002Fsdks":3},{"page":4,"toc":161},{"path":5,"title":6,"description":7,"blocks":8},"\u002Fsdks","Official Server SDKs","Eight production-ready server-side client libraries for Python, Node.js, Go, Rust, Java, .NET, Ruby and PHP.",[9,12,60,65,113,116,123,125],{"type":10,"text":11},"p","Every official IPScope SDK wraps the [REST API](\u002Fapi-reference) with zero-bloat transport, bounded O(1) in-memory LRU caching, automatic batch deduplication, memory-bounded streaming for 10,000+ IP lists, and exponential backoff with jitter on `429` and `5xx` responses.",{"type":13,"columns":14,"rows":20},"table",[15,16,17,18,19],"Language","Package","Runtime","Install","Status",[21,27,32,37,41,46,51,55],[22,23,24,25,26],"[Python](\u002Fsdks\u002Fpython)","`ipscope`","Python 3.10+ (asyncio & sync)","`pip install ipscope`","Stable",[28,29,30,31,26],"[Node.js](\u002Fsdks\u002Fnode)","`@ipscope\u002Fsdk-node`","Node.js 18+, Bun, Deno & Edge Workers","`npm install @ipscope\u002Fsdk-node`",[33,34,35,36,26],"[Go](\u002Fsdks\u002Fgo)","`github.com\u002Fipscope-io\u002Fipscope-go`","Go 1.22+","`go get github.com\u002Fipscope-io\u002Fipscope-go`",[38,23,39,40,26],"[Rust](\u002Fsdks\u002Frust)","Rust 1.75+ (2021 edition, Tokio async & blocking)","`cargo add ipscope`",[42,43,44,45,26],"[Java](\u002Fsdks\u002Fjava)","`io.ipscope:ipscope-sdk`","Java 17+ (Java 21 Virtual Threads ready)","`io.ipscope:ipscope-sdk:1.0.0`",[47,48,49,50,26],"[.NET](\u002Fsdks\u002Fdotnet)","`IpScope.Sdk`",".NET 8.0+ (C# 12)","`dotnet add package IpScope.Sdk`",[52,23,53,54,26],"[Ruby](\u002Fsdks\u002Fruby)","Ruby 3.1+ (Puma, Sidekiq & Falcon Fiber-safe)","`gem install ipscope`",[56,57,58,59,26],"[PHP](\u002Fsdks\u002Fphp)","`ipscope\u002Fipscope-php`","PHP 8.2+ (PHP-FPM, FrankenPHP, RoadRunner & Swoole)","`composer require ipscope\u002Fipscope-php`",{"type":61,"level":62,"text":63,"id":64},"heading",2,"Compare a single lookup across languages","compare-a-single-lookup-across-languages",{"type":66,"samples":67},"code",[68,73,78,83,88,93,98,103,108],{"label":69,"lang":70,"code":71,"html":72},"curl","bash","curl -sS \"https:\u002F\u002Fapi.ipscope.io\u002Fv1\u002Fip\u002F198.51.100.7\" \\\n  -H \"Authorization: Bearer $IPSCOPE_KEY\"","\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\u002F198.51.100.7\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> \\\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-string)\">  -H\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\"> \"Authorization: Bearer $IPSCOPE_KEY\"\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>",{"label":74,"lang":75,"code":76,"html":77},"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_ip(\"198.51.100.7\")\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_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-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":79,"lang":80,"code":81,"html":82},"Node.js","ts","import { IpScopeClient } from '@ipscope\u002Fsdk-node';\n\nconst client = new IpScopeClient({ apiKey: process.env.IPSCOPE_KEY });\nconst record = await client.lookupIp('198.51.100.7');\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)\">.lookupIp\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">(\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">'198.51.100.7'\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":84,"lang":85,"code":86,"html":87},"Go","go","client := ipscope.NewClient(ipscope.Config{APIKey: os.Getenv(\"IPSCOPE_KEY\")})\ndefer client.Close()\n\nrecord, err := client.LookupIP(ctx, \"198.51.100.7\")\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)\">LookupIP\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">(ctx, \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">\"198.51.100.7\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">)\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":89,"lang":90,"code":91,"html":92},"Rust","rust","use ipscope::{AsyncIpScopeClient, ClientConfig};\n\nlet client = AsyncIpScopeClient::new(ClientConfig::new(std::env::var(\"IPSCOPE_KEY\")?))?;\nlet record = client.lookup_ip(\"198.51.100.7\").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_ip\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">(\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">\"198.51.100.7\"\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":94,"lang":95,"code":96,"html":97},"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.lookupIp(\"198.51.100.7\");\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)\">lookupIp\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">(\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">\"198.51.100.7\"\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":99,"lang":100,"code":101,"html":102},".NET","csharp","using IpScope.Sdk;\n\nusing var client = new IpScopeClient(new IpScopeClientOptions {\n    ApiKey = Environment.GetEnvironmentVariable(\"IPSCOPE_KEY\")\n});\nvar record = await client.LookupIpAsync(\"198.51.100.7\");\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)\">LookupIpAsync\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">(\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">\"198.51.100.7\"\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":104,"lang":105,"code":106,"html":107},"Ruby","ruby","require \"ipscope\"\n\nclient = IpScope::Client.new(api_key: ENV.fetch(\"IPSCOPE_KEY\"))\nrecord = client.lookup_ip(\"198.51.100.7\")\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_ip\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">(\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">\"198.51.100.7\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">)\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":109,"lang":110,"code":111,"html":112},"PHP","php","\u003C?php\nuse IpScope\\Sdk\\IpScopeClient;\n\n$client = new IpScopeClient(apiKey: getenv('IPSCOPE_KEY') ?: '');\n$record = $client->lookupIp('198.51.100.7');\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)\">lookupIp\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>\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":61,"level":62,"text":114,"id":115},"What every official SDK guarantees","what-every-official-sdk-guarantees",{"type":117,"items":118},"list",[119,120,121,122],"**Scoped strictly to IP intelligence**: single IP (`\u002Fv1\u002Fip\u002F{ip}`), caller IP (`\u002Fv1\u002Fip\u002Fme`), batch (`\u002Fv1\u002Fip\u002Fbatch`), network CIDR (`\u002Fv1\u002Fnetwork\u002F{cidr}`), dataset catalog (`\u002Fv1\u002Fdatasets`), and geolocation feedback (`\u002Fv1\u002Ffeedback`).","**Bounded O(1) LRU cache**: hot IP addresses are served from memory (`2,048` entries by default) and automatically reused across `lookupBatch` calls so duplicate IPs in a batch never consume quota twice.","**Constant-memory batch streaming**: `lookup_batch_stream` \u002F `lookupBatchStream` chunks arbitrarily large iterables into 100-IP requests with constant `\u003C 400 KB` heap overhead.","**Resilient retry policy**: honours `Retry-After` headers on `429` and retries transient `502`\u002F`503`\u002F`504` errors with exponential backoff + jitter.",{"type":10,"text":124},"For air-gapped or local zero-latency lookups, our `.mmdb` files open directly in standard MaxMind readers in every language. See [Reading MMDB](\u002Fdatabases\u002Freading-mmdb).",{"type":126,"columns":62,"cards":127},"cards",[128,133,137,141,145,149,153,157],{"title":129,"text":130,"href":131,"icon":132,"badge":26},"Python SDK","Python 3.10+ (asyncio & sync) · `pip install ipscope`","\u002Fsdks\u002Fpython","package",{"title":134,"text":135,"href":136,"icon":132,"badge":26},"Node.js SDK","Node.js 18+, Bun, Deno & Edge Workers · `npm install @ipscope\u002Fsdk-node`","\u002Fsdks\u002Fnode",{"title":138,"text":139,"href":140,"icon":132,"badge":26},"Go SDK","Go 1.22+ · `go get github.com\u002Fipscope-io\u002Fipscope-go`","\u002Fsdks\u002Fgo",{"title":142,"text":143,"href":144,"icon":132,"badge":26},"Rust SDK","Rust 1.75+ (2021 edition, Tokio async & blocking) · `cargo add ipscope`","\u002Fsdks\u002Frust",{"title":146,"text":147,"href":148,"icon":132,"badge":26},"Java SDK","Java 17+ (Java 21 Virtual Threads ready) · `io.ipscope:ipscope-sdk:1.0.0`","\u002Fsdks\u002Fjava",{"title":150,"text":151,"href":152,"icon":132,"badge":26},".NET SDK",".NET 8.0+ (C# 12) · `dotnet add package IpScope.Sdk`","\u002Fsdks\u002Fdotnet",{"title":154,"text":155,"href":156,"icon":132,"badge":26},"Ruby SDK","Ruby 3.1+ (Puma, Sidekiq & Falcon Fiber-safe) · `gem install ipscope`","\u002Fsdks\u002Fruby",{"title":158,"text":159,"href":160,"icon":132,"badge":26},"PHP SDK","PHP 8.2+ (PHP-FPM, FrankenPHP, RoadRunner & Swoole) · `composer require ipscope\u002Fipscope-php`","\u002Fsdks\u002Fphp",[162,163],{"id":64,"text":63,"level":62},{"id":115,"text":114,"level":62},1793226505921]