changedInput schema / properties / target / anyOf
Previous value: -[
- {
- "description": "A raw IPv4 address.",
- "format": "ipv4",
- "pattern": "^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$",
- "type": "string"
- },
- {
- "description": "A raw IPv6 address.",
- "format": "ipv6",
- "pattern": "^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:))$",
- "type": "string"
- },
- {
- "description": "A dotted hostname, e.g. \"example.com\".",
- "pattern": "^[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(\\.[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+$",
- "type": "string"
- }
-]New value: +[
+ {
+ "description": "Blank means unset.",
+ "pattern": "^\\s*$",
+ "type": "string"
+ },
+ {
+ "description": "A raw IPv4 address.",
+ "format": "ipv4",
+ "pattern": "^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$",
+ "type": "string"
+ },
+ {
+ "description": "A raw IPv6 address.",
+ "format": "ipv6",
+ "pattern": "^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:))$",
+ "type": "string"
+ },
+ {
+ "description": "A dotted hostname, e.g. \"example.com\".",
+ "pattern": "^[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(\\.[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+$",
+ "type": "string"
+ }
+]
changedInput schema / properties / target / description
Previous value: -"A public IPv4/IPv6 address or a hostname (e.g. \"8.8.8.8\" or \"example.com\")."New value: +"One public IP or dotted hostname; mutually exclusive with nonempty targets."
addedInput schema / properties / targets
Added value: +{
+ "description": "Ordered public IPs or dotted hostnames; first 100 positions are served, every remainder is disclosed. Mutually exclusive with nonblank target.",
+ "items": {
+ "anyOf": [
+ {
+ "description": "A raw IPv4 address.",
+ "format": "ipv4",
+ "pattern": "^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$",
+ "type": "string"
+ },
+ {
+ "description": "A raw IPv6 address.",
+ "format": "ipv6",
+ "pattern": "^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:))$",
+ "type": "string"
+ },
+ {
+ "description": "A dotted hostname, e.g. \"example.com\".",
+ "pattern": "^[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(\\.[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+$",
+ "type": "string"
+ }
+ ],
+ "description": "A public IPv4/IPv6 address or a hostname (e.g. \"8.8.8.8\" or \"example.com\")."
+ },
+ "maxItems": 1000,
+ "type": "array"
+}
removedInput schema / required
Removed value: -[
- "target"
-]
changedOutput schema / anyOf
Previous value: -[
- {
- "not": {
- "required": [
- "error"
- ]
- },
- "required": [
- "target",
- "resolvedIp",
- "source"
- ]
- },
- {
- "required": [
- "error"
- ]
- }
-]New value: +[
+ {
+ "not": {
+ "required": [
+ "error"
+ ]
+ }
+ },
+ {
+ "required": [
+ "error"
+ ]
+ }
+]
changedOutput schema / properties / error / properties / data / properties / reason / description
Previous value: -"Machine-readable failure mode. Declared by this tool: `unresolvable_host`: A hostname target failed DNS resolution. `private_target`: The target resolves to a private/reserved IP with no public geolocation. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `rate_limited`: The endpoint request quota or provider cooldown is exhausted. `unresolvable_host`: A hostname target failed DNS resolution. `private_target`: The target resolves to a private/reserved IP with no public geolocation. Other values are possible when a failure originates below the handler."
changedOutput schema / properties / error / properties / data / properties / reason / examples
Previous value: -[
- "unresolvable_host",
- "private_target"
-]New value: +[
+ "rate_limited",
+ "unresolvable_host",
+ "private_target"
+]
addedOutput schema / properties / failedCount
Added value: +{
+ "description": "Number of failed processed targets.",
+ "maximum": 9007199254740991,
+ "minimum": -9007199254740991,
+ "type": "integer"
+}
addedOutput schema / properties / results
Added value: +{
+ "description": "Ordered results or failures for the first 100 input positions.",
+ "items": {
+ "anyOf": [
+ {
+ "additionalProperties": false,
+ "description": "Normalized geolocation metadata for one target.",
+ "properties": {
+ "asn": {
+ "description": "Autonomous System number, e.g. \"AS15169\". Absent on providers that omit it.",
+ "maxLength": 256,
+ "type": "string"
+ },
+ "city": {
+ "description": "City name. Absent when unknown.",
+ "maxLength": 256,
+ "type": "string"
+ },
+ "country": {
+ "description": "Country name. Absent when the provider does not report it.",
+ "maxLength": 256,
+ "type": "string"
+ },
+ "countryCode": {
+ "description": "ISO 3166-1 alpha-2 country code. Absent when unknown.",
+ "maxLength": 256,
+ "type": "string"
+ },
+ "hosting": {
+ "description": "True when the address belongs to a hosting or datacenter network, so the location is a facility rather than a person. Absent when unreported.",
+ "type": "boolean"
+ },
+ "latitude": {
+ "description": "Latitude in decimal degrees. Absent when unknown.",
+ "type": "number"
+ },
+ "longitude": {
+ "description": "Longitude in decimal degrees. Absent when unknown.",
+ "type": "number"
+ },
+ "mobile": {
+ "description": "True when the address belongs to a mobile carrier network, where NAT can place the location far from the device. Absent when unreported.",
+ "type": "boolean"
+ },
+ "org": {
+ "description": "Owning organization or ISP, e.g. \"Google LLC\". Absent when unknown.",
+ "maxLength": 256,
+ "type": "string"
+ },
+ "proxy": {
+ "description": "True when the address is a known proxy, VPN, or Tor exit — the location describes the exit node, not the user. Absent when the provider does not report it.",
+ "type": "boolean"
+ },
+ "region": {
+ "description": "Region or state name. Absent when unknown.",
+ "maxLength": 256,
+ "type": "string"
+ },
+ "resolvedIp": {
+ "description": "The IP that was actually located (a supplied hostname is resolved to this first).",
+ "type": "string"
+ },
+ "source": {
+ "description": "The provider that answered the lookup, e.g. \"ip-api\".",
+ "type": "string"
+ },
+ "target": {
+ "description": "The target as supplied (IP or hostname).",
+ "type": "string"
+ },
+ "timezone": {
+ "description": "IANA timezone, e.g. \"America/Los_Angeles\". Absent when unknown.",
+ "maxLength": 256,
+ "type": "string"
+ }
+ },
+ "required": [
+ "target",
+ "resolvedIp",
+ "source"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "description": "A failed batch target with recovery guidance.",
+ "properties": {
+ "error": {
+ "additionalProperties": false,
+ "description": "Failure for this input position.",
+ "properties": {
+ "message": {
+ "description": "Server-authored failure message.",
+ "type": "string"
+ },
+ "reason": {
+ "description": "Why this target could not be located.",
+ "enum": [
+ "unresolvable_host",
+ "private_target",
+ "rate_limited",
+ "provider_unavailable"
+ ],
+ "type": "string"
+ },
+ "recovery": {
+ "additionalProperties": false,
+ "description": "Recovery guidance for the failed target.",
+ "properties": {
+ "hint": {
+ "description": "How to recover this target lookup.",
+ "type": "string"
+ }
+ },
+ "required": [
+ "hint"
+ ],
+ "type": "object"
+ },
+ "waitTimeSeconds": {
+ "description": "Seconds to wait before retrying a rate-limited target.",
+ "type": "number"
+ }
+ },
+ "required": [
+ "reason",
+ "message",
+ "recovery"
+ ],
+ "type": "object"
+ },
+ "target": {
+ "description": "The failed target as supplied.",
+ "type": "string"
+ }
+ },
+ "required": [
+ "target",
+ "error"
+ ],
+ "type": "object"
+ }
+ ],
+ "description": "Result or failure for one input position."
+ },
+ "type": "array"
+}
addedOutput schema / properties / unprocessedTargets
Added value: +{
+ "description": "Every input position past the first 100; resubmit these targets in another batch.",
+ "items": {
+ "description": "One unprocessed target.",
+ "type": "string"
+ },
+ "type": "array"
+}