{"openapi":"3.1.0","info":{"title":"IPU IP lookup API","version":"1.0.0","description":"Read-only IPv4 and IPv6 network, ASN and approximate geolocation lookup. No API key. Missing JSON fields are null; plain text uses Unavailable. Omitted IP means the caller's connection, not the end user's device."},"servers":[{"url":"https://ipu.revue.ir"}],"externalDocs":{"url":"https://ipu.revue.ir/docs"},"security":[],"paths":{"/":{"get":{"summary":"Summary for the caller IP (or ?ip override)","parameters":[{"name":"ip","in":"query","description":"Optional IPv4 or IPv6 address. Without an explicit IP, the caller is the agent/server making the request.","schema":{"type":"string"}}],"responses":{"200":{"description":"Plain text by default; Accept: application/json returns the full lookup. Summary routes return HTML for Accept: text/html (takes precedence over JSON).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Lookup"}},"text/plain":{"schema":{"type":"string"}},"text/html":{"schema":{"type":"string"}}}},"400":{"description":"Request failed. Inspect the error field.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"}}}}}},"404":{"description":"Request failed. Inspect the error field.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"}}}}}},"405":{"description":"Only GET and HEAD are supported.","content":{"text/plain":{"schema":{"type":"string"}}}},"503":{"description":"Request failed. Inspect the error field.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"}}}}}}},"operationId":"callerSummary"},"head":{"summary":"Summary for the caller IP (or ?ip override) (headers only)","operationId":"callerSummaryHead","parameters":[{"name":"ip","in":"query","description":"Optional IPv4 or IPv6 address. Without an explicit IP, the caller is the agent/server making the request.","schema":{"type":"string"}}],"responses":{"200":{"description":"Plain text by default; Accept: application/json returns the full lookup. Summary routes return HTML for Accept: text/html (takes precedence over JSON)."},"400":{"description":"Request failed. Inspect the error field."},"404":{"description":"Request failed. Inspect the error field."},"405":{"description":"Only GET and HEAD are supported."},"503":{"description":"Request failed. Inspect the error field."}}}},"/json":{"get":{"summary":"json for the caller IP (or ?ip override)","parameters":[{"name":"ip","in":"query","description":"Optional IPv4 or IPv6 address. Without an explicit IP, the caller is the agent/server making the request.","schema":{"type":"string"}}],"responses":{"200":{"description":"Full JSON lookup.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Lookup"}}}},"400":{"description":"Request failed. Inspect the error field.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"}}}}}},"404":{"description":"Request failed. Inspect the error field.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"}}}}}},"405":{"description":"Only GET and HEAD are supported.","content":{"text/plain":{"schema":{"type":"string"}}}},"503":{"description":"Request failed. Inspect the error field.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"}}}}}}},"operationId":"callerjson"},"head":{"summary":"json for the caller IP (or ?ip override) (headers only)","operationId":"callerjsonHead","parameters":[{"name":"ip","in":"query","description":"Optional IPv4 or IPv6 address. Without an explicit IP, the caller is the agent/server making the request.","schema":{"type":"string"}}],"responses":{"200":{"description":"Full JSON lookup."},"400":{"description":"Request failed. Inspect the error field."},"404":{"description":"Request failed. Inspect the error field."},"405":{"description":"Only GET and HEAD are supported."},"503":{"description":"Request failed. Inspect the error field."}}}},"/ip":{"get":{"summary":"ip for the caller IP (or ?ip override)","parameters":[{"name":"ip","in":"query","description":"Optional IPv4 or IPv6 address. Without an explicit IP, the caller is the agent/server making the request.","schema":{"type":"string"}}],"responses":{"200":{"description":"Plain text by default; Accept: application/json returns the full lookup. Summary routes return HTML for Accept: text/html (takes precedence over JSON).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Lookup"}},"text/plain":{"schema":{"type":"string"}}}},"400":{"description":"Request failed. Inspect the error field.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"}}}}}},"404":{"description":"Request failed. Inspect the error field.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"}}}}}},"405":{"description":"Only GET and HEAD are supported.","content":{"text/plain":{"schema":{"type":"string"}}}},"503":{"description":"Request failed. Inspect the error field.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"}}}}}}},"operationId":"callerip"},"head":{"summary":"ip for the caller IP (or ?ip override) (headers only)","operationId":"calleripHead","parameters":[{"name":"ip","in":"query","description":"Optional IPv4 or IPv6 address. Without an explicit IP, the caller is the agent/server making the request.","schema":{"type":"string"}}],"responses":{"200":{"description":"Plain text by default; Accept: application/json returns the full lookup. Summary routes return HTML for Accept: text/html (takes precedence over JSON)."},"400":{"description":"Request failed. Inspect the error field."},"404":{"description":"Request failed. Inspect the error field."},"405":{"description":"Only GET and HEAD are supported."},"503":{"description":"Request failed. Inspect the error field."}}}},"/country":{"get":{"summary":"country for the caller IP (or ?ip override)","parameters":[{"name":"ip","in":"query","description":"Optional IPv4 or IPv6 address. Without an explicit IP, the caller is the agent/server making the request.","schema":{"type":"string"}}],"responses":{"200":{"description":"Plain text by default; Accept: application/json returns the full lookup. Summary routes return HTML for Accept: text/html (takes precedence over JSON).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Lookup"}},"text/plain":{"schema":{"type":"string"}}}},"400":{"description":"Request failed. Inspect the error field.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"}}}}}},"404":{"description":"Request failed. Inspect the error field.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"}}}}}},"405":{"description":"Only GET and HEAD are supported.","content":{"text/plain":{"schema":{"type":"string"}}}},"503":{"description":"Request failed. Inspect the error field.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"}}}}}}},"operationId":"callercountry"},"head":{"summary":"country for the caller IP (or ?ip override) (headers only)","operationId":"callercountryHead","parameters":[{"name":"ip","in":"query","description":"Optional IPv4 or IPv6 address. Without an explicit IP, the caller is the agent/server making the request.","schema":{"type":"string"}}],"responses":{"200":{"description":"Plain text by default; Accept: application/json returns the full lookup. Summary routes return HTML for Accept: text/html (takes precedence over JSON)."},"400":{"description":"Request failed. Inspect the error field."},"404":{"description":"Request failed. Inspect the error field."},"405":{"description":"Only GET and HEAD are supported."},"503":{"description":"Request failed. Inspect the error field."}}}},"/network":{"get":{"summary":"network for the caller IP (or ?ip override)","parameters":[{"name":"ip","in":"query","description":"Optional IPv4 or IPv6 address. Without an explicit IP, the caller is the agent/server making the request.","schema":{"type":"string"}}],"responses":{"200":{"description":"Plain text by default; Accept: application/json returns the full lookup. Summary routes return HTML for Accept: text/html (takes precedence over JSON).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Lookup"}},"text/plain":{"schema":{"type":"string"}}}},"400":{"description":"Request failed. Inspect the error field.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"}}}}}},"404":{"description":"Request failed. Inspect the error field.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"}}}}}},"405":{"description":"Only GET and HEAD are supported.","content":{"text/plain":{"schema":{"type":"string"}}}},"503":{"description":"Request failed. Inspect the error field.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"}}}}}}},"operationId":"callernetwork"},"head":{"summary":"network for the caller IP (or ?ip override) (headers only)","operationId":"callernetworkHead","parameters":[{"name":"ip","in":"query","description":"Optional IPv4 or IPv6 address. Without an explicit IP, the caller is the agent/server making the request.","schema":{"type":"string"}}],"responses":{"200":{"description":"Plain text by default; Accept: application/json returns the full lookup. Summary routes return HTML for Accept: text/html (takes precedence over JSON)."},"400":{"description":"Request failed. Inspect the error field."},"404":{"description":"Request failed. Inspect the error field."},"405":{"description":"Only GET and HEAD are supported."},"503":{"description":"Request failed. Inspect the error field."}}}},"/asn":{"get":{"summary":"asn for the caller IP (or ?ip override)","parameters":[{"name":"ip","in":"query","description":"Optional IPv4 or IPv6 address. Without an explicit IP, the caller is the agent/server making the request.","schema":{"type":"string"}}],"responses":{"200":{"description":"Plain text by default; Accept: application/json returns the full lookup. Summary routes return HTML for Accept: text/html (takes precedence over JSON).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Lookup"}},"text/plain":{"schema":{"type":"string"}}}},"400":{"description":"Request failed. Inspect the error field.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"}}}}}},"404":{"description":"Request failed. Inspect the error field.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"}}}}}},"405":{"description":"Only GET and HEAD are supported.","content":{"text/plain":{"schema":{"type":"string"}}}},"503":{"description":"Request failed. Inspect the error field.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"}}}}}}},"operationId":"callerasn"},"head":{"summary":"asn for the caller IP (or ?ip override) (headers only)","operationId":"callerasnHead","parameters":[{"name":"ip","in":"query","description":"Optional IPv4 or IPv6 address. Without an explicit IP, the caller is the agent/server making the request.","schema":{"type":"string"}}],"responses":{"200":{"description":"Plain text by default; Accept: application/json returns the full lookup. Summary routes return HTML for Accept: text/html (takes precedence over JSON)."},"400":{"description":"Request failed. Inspect the error field."},"404":{"description":"Request failed. Inspect the error field."},"405":{"description":"Only GET and HEAD are supported."},"503":{"description":"Request failed. Inspect the error field."}}}},"/{ip}":{"get":{"summary":"Summary for an explicit IP","parameters":[{"name":"ip","in":"path","required":true,"description":"IPv4 or IPv6 address. Takes precedence over ?ip.","schema":{"type":"string"},"example":"1.1.1.1"},{"name":"ip","in":"query","description":"Optional IPv4 or IPv6 address. Without an explicit IP, the caller is the agent/server making the request.","schema":{"type":"string"}}],"responses":{"200":{"description":"Plain text by default; Accept: application/json returns the full lookup. Summary routes return HTML for Accept: text/html (takes precedence over JSON).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Lookup"}},"text/plain":{"schema":{"type":"string"}},"text/html":{"schema":{"type":"string"}}}},"400":{"description":"Request failed. Inspect the error field.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"}}}}}},"404":{"description":"Request failed. Inspect the error field.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"}}}}}},"405":{"description":"Only GET and HEAD are supported.","content":{"text/plain":{"schema":{"type":"string"}}}},"503":{"description":"Request failed. Inspect the error field.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"}}}}}}},"operationId":"lookupSummary"},"head":{"summary":"Summary for an explicit IP (headers only)","operationId":"lookupSummaryHead","parameters":[{"name":"ip","in":"path","required":true,"description":"IPv4 or IPv6 address. Takes precedence over ?ip.","schema":{"type":"string"},"example":"1.1.1.1"},{"name":"ip","in":"query","description":"Optional IPv4 or IPv6 address. Without an explicit IP, the caller is the agent/server making the request.","schema":{"type":"string"}}],"responses":{"200":{"description":"Plain text by default; Accept: application/json returns the full lookup. Summary routes return HTML for Accept: text/html (takes precedence over JSON)."},"400":{"description":"Request failed. Inspect the error field."},"404":{"description":"Request failed. Inspect the error field."},"405":{"description":"Only GET and HEAD are supported."},"503":{"description":"Request failed. Inspect the error field."}}}},"/{ip}/json":{"get":{"summary":"json for an explicit IP","parameters":[{"name":"ip","in":"path","required":true,"description":"IPv4 or IPv6 address. Takes precedence over ?ip.","schema":{"type":"string"},"example":"1.1.1.1"},{"name":"ip","in":"query","description":"Optional IPv4 or IPv6 address. Without an explicit IP, the caller is the agent/server making the request.","schema":{"type":"string"}}],"responses":{"200":{"description":"Full JSON lookup.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Lookup"}}}},"400":{"description":"Request failed. Inspect the error field.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"}}}}}},"404":{"description":"Request failed. Inspect the error field.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"}}}}}},"405":{"description":"Only GET and HEAD are supported.","content":{"text/plain":{"schema":{"type":"string"}}}},"503":{"description":"Request failed. Inspect the error field.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"}}}}}}},"operationId":"lookupjson"},"head":{"summary":"json for an explicit IP (headers only)","operationId":"lookupjsonHead","parameters":[{"name":"ip","in":"path","required":true,"description":"IPv4 or IPv6 address. Takes precedence over ?ip.","schema":{"type":"string"},"example":"1.1.1.1"},{"name":"ip","in":"query","description":"Optional IPv4 or IPv6 address. Without an explicit IP, the caller is the agent/server making the request.","schema":{"type":"string"}}],"responses":{"200":{"description":"Full JSON lookup."},"400":{"description":"Request failed. Inspect the error field."},"404":{"description":"Request failed. Inspect the error field."},"405":{"description":"Only GET and HEAD are supported."},"503":{"description":"Request failed. Inspect the error field."}}}},"/{ip}/ip":{"get":{"summary":"ip for an explicit IP","parameters":[{"name":"ip","in":"path","required":true,"description":"IPv4 or IPv6 address. Takes precedence over ?ip.","schema":{"type":"string"},"example":"1.1.1.1"},{"name":"ip","in":"query","description":"Optional IPv4 or IPv6 address. Without an explicit IP, the caller is the agent/server making the request.","schema":{"type":"string"}}],"responses":{"200":{"description":"Plain text by default; Accept: application/json returns the full lookup. Summary routes return HTML for Accept: text/html (takes precedence over JSON).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Lookup"}},"text/plain":{"schema":{"type":"string"}}}},"400":{"description":"Request failed. Inspect the error field.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"}}}}}},"404":{"description":"Request failed. Inspect the error field.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"}}}}}},"405":{"description":"Only GET and HEAD are supported.","content":{"text/plain":{"schema":{"type":"string"}}}},"503":{"description":"Request failed. Inspect the error field.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"}}}}}}},"operationId":"lookupip"},"head":{"summary":"ip for an explicit IP (headers only)","operationId":"lookupipHead","parameters":[{"name":"ip","in":"path","required":true,"description":"IPv4 or IPv6 address. Takes precedence over ?ip.","schema":{"type":"string"},"example":"1.1.1.1"},{"name":"ip","in":"query","description":"Optional IPv4 or IPv6 address. Without an explicit IP, the caller is the agent/server making the request.","schema":{"type":"string"}}],"responses":{"200":{"description":"Plain text by default; Accept: application/json returns the full lookup. Summary routes return HTML for Accept: text/html (takes precedence over JSON)."},"400":{"description":"Request failed. Inspect the error field."},"404":{"description":"Request failed. Inspect the error field."},"405":{"description":"Only GET and HEAD are supported."},"503":{"description":"Request failed. Inspect the error field."}}}},"/{ip}/country":{"get":{"summary":"country for an explicit IP","parameters":[{"name":"ip","in":"path","required":true,"description":"IPv4 or IPv6 address. Takes precedence over ?ip.","schema":{"type":"string"},"example":"1.1.1.1"},{"name":"ip","in":"query","description":"Optional IPv4 or IPv6 address. Without an explicit IP, the caller is the agent/server making the request.","schema":{"type":"string"}}],"responses":{"200":{"description":"Plain text by default; Accept: application/json returns the full lookup. Summary routes return HTML for Accept: text/html (takes precedence over JSON).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Lookup"}},"text/plain":{"schema":{"type":"string"}}}},"400":{"description":"Request failed. Inspect the error field.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"}}}}}},"404":{"description":"Request failed. Inspect the error field.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"}}}}}},"405":{"description":"Only GET and HEAD are supported.","content":{"text/plain":{"schema":{"type":"string"}}}},"503":{"description":"Request failed. Inspect the error field.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"}}}}}}},"operationId":"lookupcountry"},"head":{"summary":"country for an explicit IP (headers only)","operationId":"lookupcountryHead","parameters":[{"name":"ip","in":"path","required":true,"description":"IPv4 or IPv6 address. Takes precedence over ?ip.","schema":{"type":"string"},"example":"1.1.1.1"},{"name":"ip","in":"query","description":"Optional IPv4 or IPv6 address. Without an explicit IP, the caller is the agent/server making the request.","schema":{"type":"string"}}],"responses":{"200":{"description":"Plain text by default; Accept: application/json returns the full lookup. Summary routes return HTML for Accept: text/html (takes precedence over JSON)."},"400":{"description":"Request failed. Inspect the error field."},"404":{"description":"Request failed. Inspect the error field."},"405":{"description":"Only GET and HEAD are supported."},"503":{"description":"Request failed. Inspect the error field."}}}},"/{ip}/network":{"get":{"summary":"network for an explicit IP","parameters":[{"name":"ip","in":"path","required":true,"description":"IPv4 or IPv6 address. Takes precedence over ?ip.","schema":{"type":"string"},"example":"1.1.1.1"},{"name":"ip","in":"query","description":"Optional IPv4 or IPv6 address. Without an explicit IP, the caller is the agent/server making the request.","schema":{"type":"string"}}],"responses":{"200":{"description":"Plain text by default; Accept: application/json returns the full lookup. Summary routes return HTML for Accept: text/html (takes precedence over JSON).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Lookup"}},"text/plain":{"schema":{"type":"string"}}}},"400":{"description":"Request failed. Inspect the error field.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"}}}}}},"404":{"description":"Request failed. Inspect the error field.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"}}}}}},"405":{"description":"Only GET and HEAD are supported.","content":{"text/plain":{"schema":{"type":"string"}}}},"503":{"description":"Request failed. Inspect the error field.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"}}}}}}},"operationId":"lookupnetwork"},"head":{"summary":"network for an explicit IP (headers only)","operationId":"lookupnetworkHead","parameters":[{"name":"ip","in":"path","required":true,"description":"IPv4 or IPv6 address. Takes precedence over ?ip.","schema":{"type":"string"},"example":"1.1.1.1"},{"name":"ip","in":"query","description":"Optional IPv4 or IPv6 address. Without an explicit IP, the caller is the agent/server making the request.","schema":{"type":"string"}}],"responses":{"200":{"description":"Plain text by default; Accept: application/json returns the full lookup. Summary routes return HTML for Accept: text/html (takes precedence over JSON)."},"400":{"description":"Request failed. Inspect the error field."},"404":{"description":"Request failed. Inspect the error field."},"405":{"description":"Only GET and HEAD are supported."},"503":{"description":"Request failed. Inspect the error field."}}}},"/{ip}/asn":{"get":{"summary":"asn for an explicit IP","parameters":[{"name":"ip","in":"path","required":true,"description":"IPv4 or IPv6 address. Takes precedence over ?ip.","schema":{"type":"string"},"example":"1.1.1.1"},{"name":"ip","in":"query","description":"Optional IPv4 or IPv6 address. Without an explicit IP, the caller is the agent/server making the request.","schema":{"type":"string"}}],"responses":{"200":{"description":"Plain text by default; Accept: application/json returns the full lookup. Summary routes return HTML for Accept: text/html (takes precedence over JSON).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Lookup"}},"text/plain":{"schema":{"type":"string"}}}},"400":{"description":"Request failed. Inspect the error field.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"}}}}}},"404":{"description":"Request failed. Inspect the error field.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"}}}}}},"405":{"description":"Only GET and HEAD are supported.","content":{"text/plain":{"schema":{"type":"string"}}}},"503":{"description":"Request failed. Inspect the error field.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"}}}}}}},"operationId":"lookupasn"},"head":{"summary":"asn for an explicit IP (headers only)","operationId":"lookupasnHead","parameters":[{"name":"ip","in":"path","required":true,"description":"IPv4 or IPv6 address. Takes precedence over ?ip.","schema":{"type":"string"},"example":"1.1.1.1"},{"name":"ip","in":"query","description":"Optional IPv4 or IPv6 address. Without an explicit IP, the caller is the agent/server making the request.","schema":{"type":"string"}}],"responses":{"200":{"description":"Plain text by default; Accept: application/json returns the full lookup. Summary routes return HTML for Accept: text/html (takes precedence over JSON)."},"400":{"description":"Request failed. Inspect the error field."},"404":{"description":"Request failed. Inspect the error field."},"405":{"description":"Only GET and HEAD are supported."},"503":{"description":"Request failed. Inspect the error field."}}}},"/health":{"get":{"operationId":"health","summary":"Service readiness","responses":{"200":{"description":"Service is running.","content":{"application/json":{"schema":{"type":"object","required":["status"],"properties":{"status":{"const":"ok"}}}}}}}},"head":{"operationId":"healthHead","summary":"Service readiness (headers only)","responses":{"200":{"description":"Service is running."}}}}},"components":{"schemas":{"Lookup":{"type":"object","required":["ip","network","network_source","continent","country","country_code","region","city","timezone","latitude","longitude","accuracy_radius","asn","asn_organization","private_address","ipv6","address_type","database","meta"],"properties":{"ip":{"type":"string","examples":["1.1.1.1","2606:4700:4700::1111"]},"network":{"type":["string","null"]},"network_source":{"enum":["asn","city",null]},"continent":{"type":["string","null"]},"country":{"type":["string","null"]},"country_code":{"type":["string","null"]},"region":{"type":["string","null"]},"city":{"type":["string","null"]},"timezone":{"type":["string","null"]},"latitude":{"type":["number","null"]},"longitude":{"type":["number","null"]},"accuracy_radius":{"type":["number","null"],"description":"Approximate accuracy radius in kilometres."},"asn":{"type":["integer","null"]},"asn_organization":{"type":["string","null"]},"private_address":{"type":"boolean"},"ipv6":{"type":"boolean"},"address_type":{"type":"string"},"database":{"type":"object","required":["city","asn"],"properties":{"city":{"type":"string"},"asn":{"type":["string","null"]}}},"meta":{"type":"object","required":["cached","lookup_ms"],"properties":{"cached":{"type":"boolean"},"lookup_ms":{"type":"number"}}}}}}}}