{
  "openapi": "3.1.1",
  "info": {
    "title": "ShowIP public IP and request-inspection API",
    "version": "1.0.0",
    "description": "Curated anonymous utility endpoints; no account, session, or API key is required. Without checkip the result describes the caller network exit observed by ShowIP (including an agent/backend exit, not the browser visitor). Query checkip overrides form checkip; a non-empty network query on /json and /api/ip overrides both. Geolocation is optional and approximate. Requests share a configurable per-client rate limit across public routes; handle 429 and Retry-After without assuming fixed throughput. All application error bodies are plain text followed by a newline, including on JSON endpoints. POST bodies are bounded to 2 MiB. Only a limited list of sensitive field names is redacted; do not send real credentials. Prefer these explicit endpoints: the homepage is excluded because it negotiates HTML/text using Accept and User-Agent. Existing endpoint behavior and CORS policy are unchanged."
  },
  "servers": [
    {
      "url": "https://showip.net"
    }
  ],
  "externalDocs": {
    "description": "Examples, response fields, privacy and usage limits",
    "url": "https://showip.net/developers"
  },
  "security": [],
  "paths": {
    "/ip": {
      "description": "Plain-text IP. Accept does not change this endpoint. network is ignored. Supports GET, HEAD and POST; other methods return 405 with Allow: GET, HEAD, POST.",
      "parameters": [
        {
          "$ref": "#/components/parameters/CheckIP"
        }
      ],
      "get": {
        "operationId": "getIPText",
        "summary": "Read /ip",
        "security": [],
        "responses": {
          "200": {
            "description": "Selected address followed by a newline.",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string",
                  "description": "One IPv4/IPv6 address followed by a newline.",
                  "examples": [
                    "192.0.2.10\n",
                    "2001:db8::10\n"
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/InvalidIPInput"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/IPInternalError"
          },
          "503": {
            "$ref": "#/components/responses/PrivatePrefetch"
          }
        }
      },
      "head": {
        "operationId": "headIPText",
        "summary": "Inspect response metadata for /ip",
        "security": [],
        "responses": {
          "200": {
            "description": "Same text/plain response metadata as GET, without a response body."
          },
          "400": {
            "$ref": "#/components/responses/HeadInvalidIPInput"
          },
          "429": {
            "$ref": "#/components/responses/HeadRateLimited"
          },
          "500": {
            "$ref": "#/components/responses/HeadIPInternalError"
          },
          "503": {
            "$ref": "#/components/responses/HeadPrivatePrefetch"
          }
        }
      },
      "post": {
        "operationId": "postIPText",
        "summary": "Submit a bounded form to /ip",
        "security": [],
        "responses": {
          "200": {
            "description": "Selected address followed by a newline.",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string",
                  "description": "One IPv4/IPv6 address followed by a newline.",
                  "examples": [
                    "192.0.2.10\n",
                    "2001:db8::10\n"
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/InvalidIPInput"
          },
          "413": {
            "$ref": "#/components/responses/BodyTooLarge"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/IPInternalError"
          },
          "503": {
            "$ref": "#/components/responses/PrivatePrefetch"
          }
        },
        "requestBody": {
          "$ref": "#/components/requestBodies/PostInput"
        }
      }
    },
    "/json": {
      "description": "JSON IP/request metadata or CIDR calculation. Accept does not change this endpoint. Supports GET, HEAD and POST; other methods return 405 with Allow: GET, HEAD, POST.",
      "parameters": [
        {
          "$ref": "#/components/parameters/CheckIP"
        },
        {
          "$ref": "#/components/parameters/Network"
        }
      ],
      "get": {
        "operationId": "getIPJSON",
        "summary": "Read /json",
        "security": [],
        "responses": {
          "200": {
            "description": "IP object, or CIDR object when the non-empty network query parameter is supplied.",
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "$ref": "#/components/schemas/IP"
                    },
                    {
                      "$ref": "#/components/schemas/CIDR"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/InvalidInput"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          },
          "503": {
            "$ref": "#/components/responses/PrivatePrefetch"
          }
        }
      },
      "head": {
        "operationId": "headIPJSON",
        "summary": "Inspect response metadata for /json",
        "security": [],
        "responses": {
          "200": {
            "description": "Same application/json response metadata as GET, without a response body."
          },
          "400": {
            "$ref": "#/components/responses/HeadInvalidInput"
          },
          "429": {
            "$ref": "#/components/responses/HeadRateLimited"
          },
          "500": {
            "$ref": "#/components/responses/HeadInternalError"
          },
          "503": {
            "$ref": "#/components/responses/HeadPrivatePrefetch"
          }
        }
      },
      "post": {
        "operationId": "postIPJSON",
        "summary": "Submit a bounded form to /json",
        "security": [],
        "responses": {
          "200": {
            "description": "IP object, or CIDR object when the non-empty network query parameter is supplied.",
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "$ref": "#/components/schemas/IP"
                    },
                    {
                      "$ref": "#/components/schemas/CIDR"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/InvalidInput"
          },
          "413": {
            "$ref": "#/components/responses/BodyTooLarge"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          },
          "503": {
            "$ref": "#/components/responses/PrivatePrefetch"
          }
        },
        "requestBody": {
          "$ref": "#/components/requestBodies/PostInput"
        }
      }
    },
    "/api/ip": {
      "description": "JSON IP/request metadata or CIDR calculation. Accept does not change this endpoint. Supports GET, HEAD and POST; other methods return 405 with Allow: GET, HEAD, POST.",
      "parameters": [
        {
          "$ref": "#/components/parameters/CheckIP"
        },
        {
          "$ref": "#/components/parameters/Network"
        }
      ],
      "get": {
        "operationId": "getAPIIP",
        "summary": "Read /api/ip",
        "security": [],
        "responses": {
          "200": {
            "description": "IP object, or CIDR object when the non-empty network query parameter is supplied.",
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "$ref": "#/components/schemas/IP"
                    },
                    {
                      "$ref": "#/components/schemas/CIDR"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/InvalidInput"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          },
          "503": {
            "$ref": "#/components/responses/PrivatePrefetch"
          }
        }
      },
      "head": {
        "operationId": "headAPIIP",
        "summary": "Inspect response metadata for /api/ip",
        "security": [],
        "responses": {
          "200": {
            "description": "Same application/json response metadata as GET, without a response body."
          },
          "400": {
            "$ref": "#/components/responses/HeadInvalidInput"
          },
          "429": {
            "$ref": "#/components/responses/HeadRateLimited"
          },
          "500": {
            "$ref": "#/components/responses/HeadInternalError"
          },
          "503": {
            "$ref": "#/components/responses/HeadPrivatePrefetch"
          }
        }
      },
      "post": {
        "operationId": "postAPIIP",
        "summary": "Submit a bounded form to /api/ip",
        "security": [],
        "responses": {
          "200": {
            "description": "IP object, or CIDR object when the non-empty network query parameter is supplied.",
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "$ref": "#/components/schemas/IP"
                    },
                    {
                      "$ref": "#/components/schemas/CIDR"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/InvalidInput"
          },
          "413": {
            "$ref": "#/components/responses/BodyTooLarge"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          },
          "503": {
            "$ref": "#/components/responses/PrivatePrefetch"
          }
        },
        "requestBody": {
          "$ref": "#/components/requestBodies/PostInput"
        }
      }
    },
    "/headers": {
      "description": "JSON request inspection. Accept does not change this endpoint. network is an ordinary inspected query value, not a CIDR selector. Supports GET, HEAD and POST; other methods return 405 with Allow: GET, HEAD, POST.",
      "parameters": [
        {
          "$ref": "#/components/parameters/CheckIP"
        }
      ],
      "get": {
        "operationId": "getHeaders",
        "summary": "Read /headers",
        "security": [],
        "responses": {
          "200": {
            "description": "Selected IP and sanitized request collections.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Inspection"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/InvalidIPInput"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/IPInternalError"
          },
          "503": {
            "$ref": "#/components/responses/PrivatePrefetch"
          }
        }
      },
      "head": {
        "operationId": "headHeaders",
        "summary": "Inspect response metadata for /headers",
        "security": [],
        "responses": {
          "200": {
            "description": "Same application/json response metadata as GET, without a response body."
          },
          "400": {
            "$ref": "#/components/responses/HeadInvalidIPInput"
          },
          "429": {
            "$ref": "#/components/responses/HeadRateLimited"
          },
          "500": {
            "$ref": "#/components/responses/HeadIPInternalError"
          },
          "503": {
            "$ref": "#/components/responses/HeadPrivatePrefetch"
          }
        }
      },
      "post": {
        "operationId": "postHeaders",
        "summary": "Submit a bounded form to /headers",
        "security": [],
        "responses": {
          "200": {
            "description": "Selected IP and sanitized request collections.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Inspection"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/InvalidIPInput"
          },
          "413": {
            "$ref": "#/components/responses/BodyTooLarge"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/IPInternalError"
          },
          "503": {
            "$ref": "#/components/responses/PrivatePrefetch"
          }
        },
        "requestBody": {
          "$ref": "#/components/requestBodies/PostInput"
        }
      }
    },
    "/api/headers": {
      "description": "JSON request inspection. Accept does not change this endpoint. network is an ordinary inspected query value, not a CIDR selector. Supports GET, HEAD and POST; other methods return 405 with Allow: GET, HEAD, POST.",
      "parameters": [
        {
          "$ref": "#/components/parameters/CheckIP"
        }
      ],
      "get": {
        "operationId": "getAPIHeaders",
        "summary": "Read /api/headers",
        "security": [],
        "responses": {
          "200": {
            "description": "Selected IP and sanitized request collections.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Inspection"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/InvalidIPInput"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/IPInternalError"
          },
          "503": {
            "$ref": "#/components/responses/PrivatePrefetch"
          }
        }
      },
      "head": {
        "operationId": "headAPIHeaders",
        "summary": "Inspect response metadata for /api/headers",
        "security": [],
        "responses": {
          "200": {
            "description": "Same application/json response metadata as GET, without a response body."
          },
          "400": {
            "$ref": "#/components/responses/HeadInvalidIPInput"
          },
          "429": {
            "$ref": "#/components/responses/HeadRateLimited"
          },
          "500": {
            "$ref": "#/components/responses/HeadIPInternalError"
          },
          "503": {
            "$ref": "#/components/responses/HeadPrivatePrefetch"
          }
        }
      },
      "post": {
        "operationId": "postAPIHeaders",
        "summary": "Submit a bounded form to /api/headers",
        "security": [],
        "responses": {
          "200": {
            "description": "Selected IP and sanitized request collections.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Inspection"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/InvalidIPInput"
          },
          "413": {
            "$ref": "#/components/responses/BodyTooLarge"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/IPInternalError"
          },
          "503": {
            "$ref": "#/components/responses/PrivatePrefetch"
          }
        },
        "requestBody": {
          "$ref": "#/components/requestBodies/PostInput"
        }
      }
    }
  },
  "components": {
    "schemas": {
      "IP": {
        "type": "object",
        "properties": {
          "ip": {
            "type": "string",
            "description": "Selected IPv4 or IPv6 address."
          },
          "version": {
            "type": "string",
            "enum": [
              "IPv4",
              "IPv6"
            ]
          },
          "source": {
            "type": "string",
            "enum": [
              "checkip",
              "x_forwarded_for",
              "x_real_ip",
              "remote_addr",
              "dev_override"
            ]
          },
          "remote_address": {
            "type": "string",
            "description": "Direct connection peer, which may be a proxy."
          },
          "host": {
            "type": "string",
            "description": "Request Host, not a canonical service URL."
          },
          "user_agent": {
            "type": "string",
            "description": "Trimmed User-Agent supplied by the caller."
          },
          "browser_name": {
            "type": "string"
          },
          "browser_version": {
            "type": "string"
          },
          "os": {
            "type": "string"
          },
          "forwarded_for": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Parsed forwarded addresses; presence does not imply trust."
          },
          "forwarded_proto": {
            "type": "string"
          },
          "trusted_proxy_headers": {
            "type": "boolean"
          },
          "geo_status": {
            "type": "string",
            "enum": [
              "found",
              "not_found",
              "unavailable",
              "not_configured"
            ],
            "description": "Missing geo is not an HTTP error."
          },
          "geo": {
            "$ref": "#/components/schemas/Geo"
          }
        },
        "required": [
          "ip",
          "version",
          "source",
          "remote_address",
          "host",
          "user_agent",
          "trusted_proxy_headers"
        ],
        "examples": [
          {
            "ip": "192.0.2.10",
            "version": "IPv4",
            "source": "checkip",
            "remote_address": "198.51.100.20",
            "host": "showip.net",
            "user_agent": "",
            "trusted_proxy_headers": false,
            "geo_status": "not_found"
          }
        ]
      },
      "Geo": {
        "type": "object",
        "properties": {
          "continent_code": {
            "type": "string"
          },
          "continent_name": {
            "type": "string"
          },
          "country_code": {
            "type": "string"
          },
          "country_name": {
            "type": "string"
          },
          "city": {
            "type": "string"
          },
          "postal_code": {
            "type": "string"
          },
          "time_zone": {
            "type": "string"
          },
          "latitude": {
            "type": "number"
          },
          "longitude": {
            "type": "number"
          },
          "asn": {
            "type": "integer",
            "minimum": 0
          },
          "asn_organization": {
            "type": "string"
          }
        },
        "description": "Optional approximate geolocation and network metadata. Every field is optional; availability varies. Not an exact location."
      },
      "CIDR": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "const": "cidr"
          },
          "input": {
            "type": "string"
          },
          "canonical_network": {
            "type": "string"
          },
          "version": {
            "type": "string",
            "enum": [
              "IPv4",
              "IPv6"
            ]
          },
          "prefix_length": {
            "type": "integer",
            "minimum": 0,
            "maximum": 128
          },
          "network_address": {
            "type": "string"
          },
          "first_address": {
            "type": "string"
          },
          "last_address": {
            "type": "string"
          },
          "netmask": {
            "type": "string",
            "description": "IPv4 mask, or Not used for IPv6."
          },
          "broadcast": {
            "type": "string",
            "description": "IPv4 broadcast, or Not used for IPv6."
          },
          "total_addresses": {
            "type": "string",
            "pattern": "^[0-9]+$",
            "description": "Decimal string, including counts beyond JavaScript safe integers."
          },
          "usable_hosts": {
            "type": "string",
            "pattern": "^([0-9]+|N/A)$",
            "description": "Decimal IPv4 count, or N/A for IPv6."
          },
          "normalized_note": {
            "type": "string"
          }
        },
        "required": [
          "type",
          "input",
          "canonical_network",
          "version",
          "prefix_length",
          "network_address",
          "first_address",
          "last_address",
          "netmask",
          "broadcast",
          "total_addresses",
          "usable_hosts"
        ],
        "examples": [
          {
            "type": "cidr",
            "input": "192.0.2.10/24",
            "canonical_network": "192.0.2.0/24",
            "version": "IPv4",
            "prefix_length": 24,
            "network_address": "192.0.2.0",
            "first_address": "192.0.2.0",
            "last_address": "192.0.2.255",
            "netmask": "255.255.255.0",
            "broadcast": "192.0.2.255",
            "total_addresses": "256",
            "usable_hosts": "254",
            "normalized_note": "Normalized 192.0.2.10/24 to the canonical network 192.0.2.0/24."
          }
        ]
      },
      "Inspection": {
        "type": "object",
        "properties": {
          "ip": {
            "$ref": "#/components/schemas/IP"
          },
          "headers": {
            "type": "object",
            "additionalProperties": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "description": "Canonical header names. Non-sensitive values are trimmed and truncated after 240 bytes plus ... ."
          },
          "query": {
            "type": "object",
            "additionalProperties": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "description": "Repeated query values. Each value is truncated after 8192 characters plus ... ."
          },
          "post": {
            "type": "object",
            "additionalProperties": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "description": "POST form fields only; at most 100 values in field-name order, each truncated after 8192 characters plus ... . Other body types produce an empty object."
          }
        },
        "required": [
          "ip",
          "headers",
          "query",
          "post"
        ],
        "description": "Limited name-based redaction only: Authorization, Cookie, Proxy-Authorization, Set-Cookie and X-CSRF-Token (case insensitive). Other names such as password, token and custom API keys are not redacted. Use made-up values only.",
        "examples": [
          {
            "ip": {
              "ip": "192.0.2.10",
              "version": "IPv4",
              "source": "checkip",
              "remote_address": "198.51.100.20",
              "host": "showip.net",
              "user_agent": "",
              "trusted_proxy_headers": false,
              "geo_status": "not_found"
            },
            "headers": {
              "Accept": [
                "application/json"
              ],
              "X-Example": [
                "made-up"
              ]
            },
            "query": {
              "example": [
                "one",
                "two"
              ]
            },
            "post": {}
          }
        ]
      },
      "Form": {
        "type": "object",
        "properties": {
          "checkip": {
            "type": "string",
            "description": "Optional address lookup input. Uses the first retained form value.",
            "examples": [
              "192.0.2.10"
            ]
          }
        },
        "additionalProperties": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          ]
        }
      }
    },
    "responses": {
      "InvalidInput": {
        "description": "Invalid address or CIDR, or malformed POST form. All application errors are plain text followed by a newline, even on JSON endpoints.",
        "content": {
          "text/plain": {
            "schema": {
              "type": "string"
            },
            "examples": {
              "error1": {
                "value": "invalid ip\n"
              },
              "error2": {
                "value": "invalid cidr\n"
              },
              "error3": {
                "value": "could not parse post form\n"
              }
            }
          }
        }
      },
      "BodyTooLarge": {
        "description": "POST body exceeds 2097152 bytes (2 MiB), including ignored body types.",
        "content": {
          "text/plain": {
            "schema": {
              "type": "string"
            },
            "examples": {
              "error1": {
                "value": "post body too large\n"
              }
            }
          }
        }
      },
      "RateLimited": {
        "description": "Shared per-client public-route rate limit exceeded. NAT/VPN users may share a limit. Configuration can change; no fixed throughput is guaranteed.",
        "headers": {
          "Retry-After": {
            "description": "Minimum delay in seconds before a bounded retry with backoff and jitter.",
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        },
        "content": {
          "text/plain": {
            "schema": {
              "type": "string"
            },
            "examples": {
              "error1": {
                "value": "too many requests\n"
              }
            }
          }
        }
      },
      "InternalError": {
        "description": "Application could not resolve the address or calculate the CIDR. An upstream proxy may produce other errors.",
        "content": {
          "text/plain": {
            "schema": {
              "type": "string"
            },
            "examples": {
              "error1": {
                "value": "could not resolve ip\n"
              },
              "error2": {
                "value": "could not calculate cidr\n"
              }
            }
          }
        }
      },
      "PrivatePrefetch": {
        "description": "Requests with Sec-Purpose containing both prefetch and anonymous-client-ip are rejected for request-specific responses.",
        "content": {
          "text/plain": {
            "schema": {
              "type": "string"
            },
            "examples": {
              "error1": {
                "value": "private prefetch is disabled for request-specific responses\n"
              }
            }
          }
        }
      },
      "HeadInvalidInput": {
        "description": "Invalid address or CIDR, or malformed POST form. All application errors are plain text followed by a newline, even on JSON endpoints. HEAD returns no body."
      },
      "HeadRateLimited": {
        "description": "Shared per-client public-route rate limit exceeded. NAT/VPN users may share a limit. Configuration can change; no fixed throughput is guaranteed. HEAD returns no body.",
        "headers": {
          "Retry-After": {
            "description": "Minimum delay in seconds before a bounded retry with backoff and jitter.",
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        }
      },
      "HeadInternalError": {
        "description": "Application could not resolve the address or calculate the CIDR. An upstream proxy may produce other errors. HEAD returns no body."
      },
      "HeadPrivatePrefetch": {
        "description": "Requests with Sec-Purpose containing both prefetch and anonymous-client-ip are rejected for request-specific responses. HEAD returns no body."
      },
      "InvalidIPInput": {
        "description": "Invalid address or malformed POST form. Application errors are plain text followed by a newline, even on JSON endpoints.",
        "content": {
          "text/plain": {
            "schema": {
              "type": "string"
            },
            "examples": {
              "invalidIP": {
                "value": "invalid ip\n"
              },
              "invalidForm": {
                "value": "could not parse post form\n"
              }
            }
          }
        }
      },
      "IPInternalError": {
        "description": "Application could not resolve the address. An upstream proxy may produce other errors.",
        "content": {
          "text/plain": {
            "schema": {
              "type": "string"
            },
            "examples": {
              "resolution": {
                "value": "could not resolve ip\n"
              }
            }
          }
        }
      },
      "HeadInvalidIPInput": {
        "description": "Invalid address or malformed POST form. Application errors are plain text followed by a newline, even on JSON endpoints. HEAD returns no body."
      },
      "HeadIPInternalError": {
        "description": "Application could not resolve the address. An upstream proxy may produce other errors. HEAD returns no body."
      }
    },
    "requestBodies": {
      "PostInput": {
        "description": "Optional POST body, limited to 2 MiB regardless of media type. URL-encoded and multipart form text fields are parsed; files are not returned. checkip is used only when the trimmed query checkip is empty. The parsed form keeps at most 100 values in sorted field-name order, truncating each after 8192 characters plus ... before lookup/inspection. Other media types, including JSON, are read and discarded. Never send real credentials.",
        "required": false,
        "content": {
          "application/x-www-form-urlencoded": {
            "schema": {
              "$ref": "#/components/schemas/Form"
            }
          },
          "multipart/form-data": {
            "schema": {
              "$ref": "#/components/schemas/Form"
            }
          },
          "*/*": {
            "schema": {
              "description": "Unparsed body, read and discarded (not interpreted as lookup input)."
            }
          }
        }
      }
    },
    "parameters": {
      "CheckIP": {
        "name": "checkip",
        "in": "query",
        "required": false,
        "description": "Optional IPv4/IPv6 lookup input (brackets or a port are also accepted). The first value is trimmed; a non-empty query value overrides the POST form field. Empty or omitted input selects the caller network exit as observed by ShowIP, subject to configured proxy trust. A backend or agent request reports that process network exit, not its browser visitor.",
        "schema": {
          "type": "string"
        },
        "example": "2001:db8::10"
      },
      "Network": {
        "name": "network",
        "in": "query",
        "required": false,
        "description": "First query value, trimmed. A non-empty IPv4/IPv6 CIDR selects the CIDR response and overrides checkip, including an invalid checkip. Empty input selects the IP response. A POST form field named network does not select CIDR.",
        "schema": {
          "type": "string"
        },
        "example": "192.0.2.10/24"
      }
    }
  }
}
