{
  "openapi": "3.1.1",
  "info": {
    "title": "VOID API",
    "version": "1",
    "description": "Network tools for a licence's holder. Docs: https://docs.void.enterprises/api"
  },
  "servers": [
    {
      "url": "https://api.void.enterprises"
    }
  ],
  "security": [
    {
      "key": []
    }
  ],
  "tags": [
    {
      "name": "Network",
      "description": "Names, addresses and ports."
    },
    {
      "name": "Web",
      "description": "Pages and links, read by a real browser where it matters."
    },
    {
      "name": "More",
      "description": "Games and words."
    }
  ],
  "paths": {
    "/dns": {
      "get": {
        "tags": [
          "Network"
        ],
        "summary": "A name's records.",
        "operationId": "dns",
        "parameters": [
          {
            "name": "host",
            "in": "query",
            "description": "The name; an IP address for PTR",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "type",
            "in": "query",
            "description": "0 A and AAAA, 1 PTR, 2 NS, 3 CNAME, 4 MX, 5 SRV over TCP, 6 SRV over UDP, 7 TXT",
            "schema": {
              "type": "integer",
              "default": 0,
              "minimum": 0,
              "maximum": 7
            }
          },
          {
            "name": "service",
            "in": "query",
            "description": "SRV's service, which 5 and 6 require",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Done",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "success": {
                      "const": true
                    },
                    "result": {
                      "oneOf": [
                        {
                          "type": "array",
                          "items": {
                            "type": "string"
                          }
                        },
                        {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/dns.MXRecord"
                          }
                        },
                        {
                          "$ref": "#/components/schemas/dns.SRVRecords"
                        }
                      ]
                    }
                  },
                  "required": [
                    "success",
                    "result"
                  ]
                }
              }
            }
          },
          "204": {
            "$ref": "#/components/responses/NoResult"
          },
          "400": {
            "$ref": "#/components/responses/Refused"
          },
          "401": {
            "$ref": "#/components/responses/NoKey"
          },
          "403": {
            "$ref": "#/components/responses/Ended"
          },
          "500": {
            "$ref": "#/components/responses/Fault"
          }
        }
      }
    },
    "/ping": {
      "get": {
        "tags": [
          "Network"
        ],
        "summary": "ICMP echoes to an address, each one's round trip.",
        "operationId": "ping",
        "parameters": [
          {
            "name": "host",
            "in": "query",
            "description": "An IPv4 address",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "count",
            "in": "query",
            "description": "Echoes",
            "schema": {
              "type": "integer",
              "default": 4,
              "minimum": 1,
              "maximum": 10
            }
          },
          {
            "name": "ttl",
            "in": "query",
            "description": "Time to live",
            "schema": {
              "type": "integer",
              "default": 64,
              "minimum": 5,
              "maximum": 255
            }
          },
          {
            "name": "timeout",
            "in": "query",
            "description": "Seconds",
            "schema": {
              "type": "number",
              "default": 2,
              "minimum": 0.8,
              "maximum": 8
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Done",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "success": {
                      "const": true
                    },
                    "result": {
                      "$ref": "#/components/schemas/ping.Response"
                    }
                  },
                  "required": [
                    "success",
                    "result"
                  ]
                }
              }
            }
          },
          "204": {
            "$ref": "#/components/responses/NoResult"
          },
          "400": {
            "$ref": "#/components/responses/Refused"
          },
          "401": {
            "$ref": "#/components/responses/NoKey"
          },
          "403": {
            "$ref": "#/components/responses/Ended"
          },
          "500": {
            "$ref": "#/components/responses/Fault"
          }
        }
      }
    },
    "/port": {
      "get": {
        "tags": [
          "Network"
        ],
        "summary": "Which of an address's TCP ports are open, by port. A port that never answered is left out.",
        "operationId": "port",
        "parameters": [
          {
            "name": "host",
            "in": "query",
            "description": "An IPv4 address",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "ports",
            "in": "query",
            "description": "The ports",
            "required": true,
            "style": "form",
            "explode": false,
            "schema": {
              "type": "array",
              "maxItems": 50,
              "items": {
                "type": "integer",
                "minimum": 1,
                "maximum": 65535
              }
            }
          },
          {
            "name": "timeout",
            "in": "query",
            "description": "Seconds",
            "schema": {
              "type": "number",
              "default": 1.5,
              "minimum": 0.8,
              "maximum": 8
            }
          },
          {
            "name": "stealth",
            "in": "query",
            "description": "true: a SYN scan, no connection completed",
            "schema": {
              "type": "boolean",
              "default": false
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Done",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "success": {
                      "const": true
                    },
                    "result": {
                      "type": "object",
                      "additionalProperties": {
                        "$ref": "#/components/schemas/port.Response"
                      }
                    }
                  },
                  "required": [
                    "success",
                    "result"
                  ]
                }
              }
            }
          },
          "204": {
            "$ref": "#/components/responses/NoResult"
          },
          "400": {
            "$ref": "#/components/responses/Refused"
          },
          "401": {
            "$ref": "#/components/responses/NoKey"
          },
          "403": {
            "$ref": "#/components/responses/Ended"
          },
          "500": {
            "$ref": "#/components/responses/Fault"
          }
        }
      }
    },
    "/whois": {
      "get": {
        "tags": [
          "Network"
        ],
        "summary": "A domain's registration, by RDAP or whois.",
        "operationId": "whois",
        "parameters": [
          {
            "name": "query",
            "in": "query",
            "description": "The domain; a subdomain reads as its registered name",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Done",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "success": {
                      "const": true
                    },
                    "result": {
                      "$ref": "#/components/schemas/whois.Result"
                    }
                  },
                  "required": [
                    "success",
                    "result"
                  ]
                }
              }
            }
          },
          "204": {
            "$ref": "#/components/responses/NoResult"
          },
          "400": {
            "$ref": "#/components/responses/Refused"
          },
          "401": {
            "$ref": "#/components/responses/NoKey"
          },
          "403": {
            "$ref": "#/components/responses/Ended"
          },
          "500": {
            "$ref": "#/components/responses/Fault"
          }
        }
      }
    },
    "/macaddress": {
      "get": {
        "tags": [
          "Network"
        ],
        "summary": "Who made a network card.",
        "operationId": "macaddress",
        "parameters": [
          {
            "name": "mac",
            "in": "query",
            "description": "The MAC address",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Done",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "success": {
                      "const": true
                    },
                    "result": {
                      "$ref": "#/components/schemas/macaddress.Vendor"
                    }
                  },
                  "required": [
                    "success",
                    "result"
                  ]
                }
              }
            }
          },
          "204": {
            "$ref": "#/components/responses/NoResult"
          },
          "400": {
            "$ref": "#/components/responses/Refused"
          },
          "401": {
            "$ref": "#/components/responses/NoKey"
          },
          "403": {
            "$ref": "#/components/responses/Ended"
          },
          "500": {
            "$ref": "#/components/responses/Fault"
          }
        }
      }
    },
    "/screenshot": {
      "get": {
        "tags": [
          "Web"
        ],
        "summary": "A page as a PNG, after its metadata as JSON: two parts of multipart/mixed, not the JSON envelope.",
        "operationId": "screenshot",
        "parameters": [
          {
            "name": "uri",
            "in": "query",
            "description": "The page",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "delay",
            "in": "query",
            "description": "Seconds to wait once it's loaded",
            "schema": {
              "type": "integer",
              "default": 0,
              "minimum": 0,
              "maximum": 10
            }
          },
          {
            "name": "stealth",
            "in": "query",
            "description": "true: Camoufox, for pages that fight automation; slower",
            "schema": {
              "type": "boolean",
              "default": false
            }
          },
          {
            "name": "adblock",
            "in": "query",
            "description": "false: ads and trackers load too",
            "schema": {
              "type": "boolean",
              "default": true
            }
          },
          {
            "name": "console",
            "in": "query",
            "description": "true: the page's console messages too",
            "schema": {
              "type": "boolean",
              "default": false
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Done: multipart/mixed, application/json then image/png",
            "content": {
              "multipart/mixed": {
                "schema": {
                  "type": "array",
                  "prefixItems": [
                    {
                      "$ref": "#/components/schemas/browser.Metadata"
                    },
                    {
                      "type": "string",
                      "contentMediaType": "image/png"
                    }
                  ]
                }
              }
            }
          },
          "204": {
            "$ref": "#/components/responses/NoResult"
          },
          "400": {
            "$ref": "#/components/responses/Refused"
          },
          "401": {
            "$ref": "#/components/responses/NoKey"
          },
          "403": {
            "$ref": "#/components/responses/Ended"
          },
          "500": {
            "$ref": "#/components/responses/Fault"
          }
        }
      }
    },
    "/markdown": {
      "get": {
        "tags": [
          "Web"
        ],
        "summary": "A page's content as markdown, every link made absolute. A PDF's text too.",
        "operationId": "markdown",
        "parameters": [
          {
            "name": "uri",
            "in": "query",
            "description": "The page",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "mode",
            "in": "query",
            "description": "How to read it: fetch runs no script, browser loads it in Chromium, stealth in Camoufox for pages that fight automation; auto tries them in that order, moving on only while one is refused or reads nothing",
            "schema": {
              "type": "string",
              "enum": [
                "auto",
                "fetch",
                "browser",
                "stealth"
              ],
              "default": "auto"
            }
          },
          {
            "name": "full",
            "in": "query",
            "description": "true: the whole page, its navigation, asides, header and footer included",
            "schema": {
              "type": "boolean",
              "default": false
            }
          },
          {
            "name": "force",
            "in": "query",
            "description": "true: convert a page served as markdown too, and ask the site for HTML alone",
            "schema": {
              "type": "boolean",
              "default": false
            }
          },
          {
            "name": "delay",
            "in": "query",
            "description": "Seconds to hold the settled page, for content that comes late; browser modes",
            "schema": {
              "type": "integer",
              "default": 0,
              "minimum": 0,
              "maximum": 10
            }
          },
          {
            "name": "adblock",
            "in": "query",
            "description": "false: ads and trackers load too; browser modes",
            "schema": {
              "type": "boolean",
              "default": true
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Done",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "success": {
                      "const": true
                    },
                    "result": {
                      "$ref": "#/components/schemas/markdown.Page"
                    }
                  },
                  "required": [
                    "success",
                    "result"
                  ]
                }
              }
            }
          },
          "204": {
            "$ref": "#/components/responses/NoResult"
          },
          "400": {
            "$ref": "#/components/responses/Refused"
          },
          "401": {
            "$ref": "#/components/responses/NoKey"
          },
          "403": {
            "$ref": "#/components/responses/Ended"
          },
          "500": {
            "$ref": "#/components/responses/Fault"
          }
        }
      }
    },
    "/unshorten": {
      "get": {
        "tags": [
          "Web"
        ],
        "summary": "Where a link's redirects lead, each hop in order.",
        "operationId": "unshorten",
        "parameters": [
          {
            "name": "uri",
            "in": "query",
            "description": "The link",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "depth",
            "in": "query",
            "description": "Redirects to follow",
            "schema": {
              "type": "integer",
              "default": 10,
              "minimum": 2,
              "maximum": 15
            }
          },
          {
            "name": "timeout",
            "in": "query",
            "description": "Seconds",
            "schema": {
              "type": "integer",
              "default": 15,
              "minimum": 5,
              "maximum": 35
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Done",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "success": {
                      "const": true
                    },
                    "result": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/unshorten.Redirect"
                      }
                    }
                  },
                  "required": [
                    "success",
                    "result"
                  ]
                }
              }
            }
          },
          "204": {
            "$ref": "#/components/responses/NoResult"
          },
          "400": {
            "$ref": "#/components/responses/Refused"
          },
          "401": {
            "$ref": "#/components/responses/NoKey"
          },
          "403": {
            "$ref": "#/components/responses/Ended"
          },
          "500": {
            "$ref": "#/components/responses/Fault"
          }
        }
      }
    },
    "/ocr": {
      "get": {
        "tags": [
          "Web"
        ],
        "summary": "The text in an image.",
        "operationId": "ocr",
        "parameters": [
          {
            "name": "uri",
            "in": "query",
            "description": "The image: JPEG, PNG, GIF or WebP, up to 16 MiB",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Done",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "success": {
                      "const": true
                    },
                    "result": {
                      "$ref": "#/components/schemas/ocr.Text"
                    }
                  },
                  "required": [
                    "success",
                    "result"
                  ]
                }
              }
            }
          },
          "204": {
            "$ref": "#/components/responses/NoResult"
          },
          "400": {
            "$ref": "#/components/responses/Refused"
          },
          "401": {
            "$ref": "#/components/responses/NoKey"
          },
          "403": {
            "$ref": "#/components/responses/Ended"
          },
          "500": {
            "$ref": "#/components/responses/Fault"
          }
        }
      }
    },
    "/minecraft": {
      "get": {
        "tags": [
          "More"
        ],
        "summary": "A Minecraft server's status, from the server itself.",
        "operationId": "minecraft",
        "parameters": [
          {
            "name": "host",
            "in": "query",
            "description": "Its name or address, :port optional",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "bedrock",
            "in": "query",
            "description": "true: Bedrock Edition",
            "schema": {
              "type": "boolean",
              "default": false
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Done",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "success": {
                      "const": true
                    },
                    "result": {
                      "$ref": "#/components/schemas/minecraft.Result"
                    }
                  },
                  "required": [
                    "success",
                    "result"
                  ]
                }
              }
            }
          },
          "204": {
            "$ref": "#/components/responses/NoResult"
          },
          "400": {
            "$ref": "#/components/responses/Refused"
          },
          "401": {
            "$ref": "#/components/responses/NoKey"
          },
          "403": {
            "$ref": "#/components/responses/Ended"
          },
          "500": {
            "$ref": "#/components/responses/Fault"
          }
        }
      }
    },
    "/translate": {
      "get": {
        "tags": [
          "More"
        ],
        "summary": "Text in another language, by DeepL.",
        "operationId": "translate",
        "parameters": [
          {
            "name": "text",
            "in": "query",
            "description": "What to translate",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "source",
            "in": "query",
            "description": "Its language code; guessed if absent",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "target",
            "in": "query",
            "description": "The language wanted",
            "schema": {
              "type": "string",
              "default": "EN"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Done",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "success": {
                      "const": true
                    },
                    "result": {
                      "$ref": "#/components/schemas/translate.Result"
                    }
                  },
                  "required": [
                    "success",
                    "result"
                  ]
                }
              }
            }
          },
          "204": {
            "$ref": "#/components/responses/NoResult"
          },
          "400": {
            "$ref": "#/components/responses/Refused"
          },
          "401": {
            "$ref": "#/components/responses/NoKey"
          },
          "403": {
            "$ref": "#/components/responses/Ended"
          },
          "500": {
            "$ref": "#/components/responses/Fault"
          }
        }
      }
    }
  },
  "components": {
    "securitySchemes": {
      "key": {
        "type": "apiKey",
        "in": "header",
        "name": "Api-Key"
      }
    },
    "responses": {
      "NoResult": {
        "description": "Nothing found: no record, no reply, no text. No body"
      },
      "Refused": {
        "description": "Refused: error says why",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Failure"
            }
          }
        }
      },
      "NoKey": {
        "description": "No key, or not one we know. No body"
      },
      "Ended": {
        "description": "The licence ended: support can renew it",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Failure"
            }
          }
        }
      },
      "Fault": {
        "description": "Our fault, reported to us: error is \"internal error\"",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Failure"
            }
          }
        }
      }
    },
    "schemas": {
      "Failure": {
        "type": "object",
        "properties": {
          "success": {
            "const": false
          },
          "error": {
            "type": "string"
          }
        },
        "required": [
          "success",
          "error"
        ]
      },
      "dns.MXRecord": {
        "type": "object",
        "properties": {
          "host": {
            "type": "string"
          },
          "preference": {
            "type": "integer"
          }
        },
        "required": [
          "host",
          "preference"
        ]
      },
      "dns.SRVRecords": {
        "type": "object",
        "properties": {
          "cname": {
            "type": "string"
          },
          "addresses": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/dns.SRVRecord"
            }
          }
        },
        "required": [
          "cname",
          "addresses"
        ]
      },
      "dns.SRVRecord": {
        "type": "object",
        "properties": {
          "target": {
            "type": "string"
          },
          "port": {
            "type": "integer"
          },
          "priority": {
            "type": "integer"
          },
          "weight": {
            "type": "integer"
          }
        },
        "required": [
          "target",
          "port",
          "priority",
          "weight"
        ]
      },
      "ping.Response": {
        "type": "object",
        "properties": {
          "max": {
            "type": "number",
            "description": "milliseconds"
          },
          "avg": {
            "type": "number",
            "description": "milliseconds"
          },
          "min": {
            "type": "number",
            "description": "milliseconds"
          },
          "loss": {
            "type": "number",
            "description": "the share of echoes unanswered, 0 to 1"
          },
          "sequences": {
            "type": "array",
            "description": "each reply, in order",
            "items": {
              "$ref": "#/components/schemas/ping.Sequence"
            }
          }
        },
        "required": [
          "max",
          "avg",
          "min"
        ]
      },
      "ping.Sequence": {
        "type": "object",
        "properties": {
          "host": {
            "type": "string",
            "description": "the address that replied"
          },
          "latency": {
            "type": "number",
            "description": "milliseconds"
          }
        },
        "required": [
          "host",
          "latency"
        ]
      },
      "port.Response": {
        "type": "object",
        "properties": {
          "open": {
            "type": "boolean"
          },
          "filtered": {
            "type": "boolean",
            "description": "An ICMP unreachable (a firewall's reject, or a router that can't reach the host) answered instead of the host"
          },
          "service": {
            "$ref": "#/components/schemas/portinfo.Description",
            "description": "the port's usual service, if well known"
          },
          "took": {
            "type": "integer",
            "description": "milliseconds to answer"
          }
        },
        "required": [
          "open",
          "service"
        ]
      },
      "portinfo.Description": {
        "type": "object",
        "properties": {
          "Name": {
            "type": "string"
          },
          "Description": {
            "type": "string"
          }
        },
        "required": [
          "Name",
          "Description"
        ]
      },
      "whois.Result": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string"
          },
          "unicode_name": {
            "type": "string"
          },
          "handle": {
            "type": "string"
          },
          "status": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "created": {
            "type": "string",
            "format": "date-time",
            "description": "UTC, to the second: RFC 3339 with no fraction, as updated, expires and transferred"
          },
          "updated": {
            "type": "string",
            "format": "date-time"
          },
          "expires": {
            "type": "string",
            "format": "date-time"
          },
          "transferred": {
            "type": "string",
            "format": "date-time"
          },
          "nameservers": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/whois.Nameserver"
            }
          },
          "dnssec": {
            "$ref": "#/components/schemas/whois.DNSSEC"
          },
          "registrar": {
            "$ref": "#/components/schemas/whois.Registrar"
          },
          "reseller": {
            "$ref": "#/components/schemas/whois.Contact"
          },
          "registrant": {
            "$ref": "#/components/schemas/whois.Contact"
          },
          "administrative": {
            "$ref": "#/components/schemas/whois.Contact"
          },
          "technical": {
            "$ref": "#/components/schemas/whois.Contact"
          },
          "billing": {
            "$ref": "#/components/schemas/whois.Contact"
          },
          "redacted": {
            "type": "array",
            "description": "Each field the registry withheld, by its key here (\"registrant.email\"), sorted",
            "items": {
              "type": "string"
            }
          },
          "whois_server": {
            "type": "string"
          },
          "source": {
            "type": "string"
          }
        },
        "required": [
          "name",
          "source"
        ]
      },
      "whois.Nameserver": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string"
          },
          "addresses": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        },
        "required": [
          "name"
        ]
      },
      "whois.DNSSEC": {
        "type": "object",
        "properties": {
          "signed": {
            "type": "boolean"
          },
          "ds": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/whois.DS"
            }
          },
          "keys": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/whois.Key"
            }
          }
        },
        "required": [
          "signed"
        ]
      },
      "whois.DS": {
        "type": "object",
        "properties": {
          "key_tag": {
            "type": "integer"
          },
          "algorithm": {
            "type": "string"
          },
          "digest_type": {
            "type": "string"
          },
          "digest": {
            "type": "string"
          }
        },
        "required": [
          "key_tag",
          "algorithm",
          "digest_type",
          "digest"
        ]
      },
      "whois.Key": {
        "type": "object",
        "properties": {
          "flags": {
            "type": "integer"
          },
          "algorithm": {
            "type": "string"
          },
          "public_key": {
            "type": "string"
          }
        },
        "required": [
          "flags",
          "algorithm",
          "public_key"
        ]
      },
      "whois.Registrar": {
        "type": "object",
        "properties": {
          "handle": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "organization": {
            "type": "string"
          },
          "address": {
            "$ref": "#/components/schemas/whois.Address"
          },
          "email": {
            "type": "string"
          },
          "phone": {
            "type": "string"
          },
          "phone_extension": {
            "type": "string"
          },
          "fax": {
            "type": "string"
          },
          "fax_extension": {
            "type": "string"
          },
          "url": {
            "type": "string"
          },
          "contact_form": {
            "type": "string"
          },
          "iana_id": {
            "type": "integer"
          },
          "abuse": {
            "$ref": "#/components/schemas/whois.Contact"
          }
        }
      },
      "whois.Address": {
        "type": "object",
        "properties": {
          "street": {
            "type": "string"
          },
          "city": {
            "type": "string"
          },
          "region": {
            "type": "string"
          },
          "postal_code": {
            "type": "string"
          },
          "country": {
            "type": "string"
          }
        }
      },
      "whois.Contact": {
        "type": "object",
        "properties": {
          "handle": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "organization": {
            "type": "string"
          },
          "address": {
            "$ref": "#/components/schemas/whois.Address"
          },
          "email": {
            "type": "string"
          },
          "phone": {
            "type": "string"
          },
          "phone_extension": {
            "type": "string"
          },
          "fax": {
            "type": "string"
          },
          "fax_extension": {
            "type": "string"
          },
          "url": {
            "type": "string"
          },
          "contact_form": {
            "type": "string"
          }
        }
      },
      "macaddress.Vendor": {
        "type": "object",
        "properties": {
          "vendor": {
            "type": "string"
          },
          "private": {
            "type": "boolean",
            "description": "registered privately"
          },
          "block": {
            "type": "integer",
            "description": "IEEE's block, as a character code: l MA-L, m MA-M, s MA-S, c CID, u unknown"
          },
          "updated": {
            "type": "string",
            "description": "when the registration last changed, YYYY/MM/DD"
          }
        },
        "required": [
          "vendor",
          "block"
        ]
      },
      "browser.Metadata": {
        "type": "object",
        "properties": {
          "address": {
            "type": "string",
            "description": "the server the page came from, ip:port"
          },
          "title": {
            "type": "string"
          },
          "requests": {
            "type": "array",
            "description": "every request the page made, redirect hops included",
            "items": {
              "$ref": "#/components/schemas/browser.Resource"
            }
          },
          "certificate": {
            "$ref": "#/components/schemas/browser.Certificate",
            "description": "the page's TLS connection, if it had one"
          },
          "console": {
            "type": "array",
            "description": "when asked for",
            "items": {
              "$ref": "#/components/schemas/browser.Console"
            }
          }
        }
      },
      "browser.Resource": {
        "type": "object",
        "properties": {
          "url": {
            "type": "string"
          },
          "method": {
            "type": "string"
          }
        },
        "required": [
          "url",
          "method"
        ]
      },
      "browser.Certificate": {
        "type": "object",
        "properties": {
          "issuer": {
            "type": "string"
          },
          "protocol": {
            "type": "string"
          },
          "subject": {
            "type": "string"
          },
          "valid_from": {
            "type": "number",
            "description": "Unix seconds"
          },
          "valid_to": {
            "type": "number",
            "description": "Unix seconds"
          }
        },
        "required": [
          "issuer",
          "protocol",
          "subject",
          "valid_from",
          "valid_to"
        ]
      },
      "browser.Console": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "description": "as the browser names it: log, error, …"
          },
          "message": {
            "type": "string"
          }
        },
        "required": [
          "type",
          "message"
        ]
      },
      "markdown.Page": {
        "type": "object",
        "properties": {
          "url": {
            "type": "string",
            "description": "Where the page ended up, past redirects: what its links resolve against"
          },
          "title": {
            "type": "string"
          },
          "markdown": {
            "type": "string"
          },
          "truncated": {
            "type": "boolean",
            "description": "The page was past its size cap: its end was not read"
          }
        },
        "required": [
          "url",
          "markdown"
        ]
      },
      "unshorten.Redirect": {
        "type": "object",
        "properties": {
          "destination": {
            "type": "string"
          },
          "took": {
            "type": "integer",
            "description": "milliseconds since the hop before"
          }
        },
        "required": [
          "destination",
          "took"
        ]
      },
      "ocr.Text": {
        "type": "object",
        "properties": {
          "text": {
            "type": "string",
            "description": "top to bottom, a blank line between blocks"
          }
        },
        "required": [
          "text"
        ]
      },
      "minecraft.Result": {
        "type": "object",
        "properties": {
          "edition": {
            "type": "string",
            "description": "java, bedrock"
          },
          "host": {
            "type": "string",
            "description": "as asked, ASCII"
          },
          "address": {
            "type": "string",
            "description": "the IP pinged"
          },
          "port": {
            "type": "integer"
          },
          "srv": {
            "$ref": "#/components/schemas/minecraft.SRV"
          },
          "latency_ms": {
            "type": "number",
            "description": "Round trip of the ping alone, in milliseconds, to 0.1"
          },
          "version": {
            "$ref": "#/components/schemas/minecraft.Version"
          },
          "players": {
            "$ref": "#/components/schemas/minecraft.Players"
          },
          "motd": {
            "$ref": "#/components/schemas/minecraft.Text"
          },
          "icon": {
            "type": "string",
            "description": "PNG, 64×64 by the protocol, base64 without its data: prefix"
          },
          "blocked": {
            "type": "boolean",
            "description": "on Mojang's EULA block list (Java); absent: the list couldn't be read"
          },
          "blocked_by": {
            "type": "string",
            "description": "the list's entry that matched, as a pattern (*.example.com)"
          },
          "query": {
            "$ref": "#/components/schemas/minecraft.Query"
          },
          "java": {
            "$ref": "#/components/schemas/minecraft.Java"
          },
          "bedrock": {
            "$ref": "#/components/schemas/minecraft.Bedrock"
          }
        },
        "required": [
          "edition",
          "host",
          "address",
          "port",
          "version",
          "players",
          "motd"
        ]
      },
      "minecraft.SRV": {
        "type": "object",
        "properties": {
          "target": {
            "type": "string"
          },
          "port": {
            "type": "integer"
          }
        },
        "required": [
          "target",
          "port"
        ]
      },
      "minecraft.Version": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "formatting stripped"
          },
          "name_raw": {
            "type": "string",
            "description": "with § codes, when it had any"
          },
          "protocol": {
            "type": "integer"
          },
          "release": {
            "type": "string",
            "description": "Java releases speaking Protocol"
          }
        },
        "required": [
          "name",
          "protocol"
        ]
      },
      "minecraft.Players": {
        "type": "object",
        "properties": {
          "online": {
            "type": "integer"
          },
          "max": {
            "type": "integer"
          },
          "list": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/minecraft.Player"
            }
          },
          "info": {
            "$ref": "#/components/schemas/minecraft.Text",
            "description": "The sample's entries that are no player: servers write text there, shown on hovering the player count"
          }
        },
        "required": [
          "online",
          "max"
        ]
      },
      "minecraft.Player": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string"
          },
          "id": {
            "type": "string"
          },
          "account": {
            "type": "string",
            "description": "online: Mojang's (UUID v4); offline: derived from the name, as servers in offline mode do; bedrock: Geyser's Floodgate (an Xbox user ID); anonymous: a player hiding from server lists. Else absent"
          }
        },
        "required": [
          "name",
          "id"
        ]
      },
      "minecraft.Text": {
        "type": "object",
        "properties": {
          "raw": {
            "type": "string",
            "description": "with § codes, hex colours as §x"
          },
          "clean": {
            "type": "array",
            "description": "formatting stripped, a line each",
            "items": {
              "type": "string"
            }
          },
          "ansi": {
            "type": "string",
            "description": "for Discord's ```ansi blocks: eight colours, bold and underline"
          },
          "html": {
            "type": "string",
            "description": "hex colours kept"
          }
        },
        "required": [
          "raw",
          "clean",
          "ansi",
          "html"
        ]
      },
      "minecraft.Query": {
        "type": "object",
        "properties": {
          "software": {
            "type": "string",
            "description": "Paper on 1.21.4"
          },
          "plugins": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/minecraft.Plugin"
            }
          },
          "version": {
            "type": "string"
          },
          "map": {
            "type": "string"
          },
          "game_type": {
            "type": "string"
          },
          "game_id": {
            "type": "string"
          },
          "host_ip": {
            "type": "string",
            "description": "as configured: sometimes a private address"
          },
          "host_port": {
            "type": "string"
          },
          "players": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "extra": {
            "type": "object",
            "description": "other keys (PocketMine's whitelist, server_engine)",
            "additionalProperties": {
              "type": "string"
            }
          }
        }
      },
      "minecraft.Plugin": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string"
          },
          "version": {
            "type": "string"
          }
        },
        "required": [
          "name"
        ]
      },
      "minecraft.Java": {
        "type": "object",
        "properties": {
          "legacy": {
            "type": "boolean",
            "description": "Answered only the pre-1.7 ping: no icon, sample or mods"
          },
          "online_mode": {
            "type": "boolean",
            "description": "From the sample's UUIDs: false on any offline player, true on online ones alone"
          },
          "enforces_secure_chat": {
            "type": "boolean"
          },
          "previews_chat": {
            "type": "boolean",
            "description": "1.19 to 1.19.2"
          },
          "prevents_chat_reports": {
            "type": "boolean",
            "description": "No Chat Reports mod"
          },
          "modded": {
            "type": "boolean",
            "description": "NeoForge's isModded"
          },
          "mods": {
            "$ref": "#/components/schemas/minecraft.Mods"
          },
          "modpack": {
            "$ref": "#/components/schemas/minecraft.Modpack"
          },
          "unknown_keys": {
            "type": "array",
            "description": "Status keys we don't read, sorted: a mod or proxy announcing itself",
            "items": {
              "type": "string"
            }
          }
        }
      },
      "minecraft.Mods": {
        "type": "object",
        "properties": {
          "loader": {
            "type": "string",
            "description": "fml (1.7 to 1.12), forge, neoforge"
          },
          "network_version": {
            "type": "integer"
          },
          "truncated": {
            "type": "boolean",
            "description": "Forge cut the list to fit"
          },
          "list": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/minecraft.Mod"
            }
          },
          "channels": {
            "type": "array",
            "description": "no mod's",
            "items": {
              "$ref": "#/components/schemas/minecraft.Channel"
            }
          }
        },
        "required": [
          "loader",
          "list"
        ]
      },
      "minecraft.Mod": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "version": {
            "type": "string"
          },
          "server_only": {
            "type": "boolean",
            "description": "clients needn't have it"
          },
          "channels": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/minecraft.Channel"
            }
          }
        },
        "required": [
          "id"
        ]
      },
      "minecraft.Channel": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string"
          },
          "version": {
            "type": "string"
          },
          "required": {
            "type": "boolean",
            "description": "on the client"
          }
        },
        "required": [
          "name",
          "version",
          "required"
        ]
      },
      "minecraft.Modpack": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string"
          },
          "version": {
            "type": "string"
          },
          "project_id": {
            "type": "integer"
          },
          "version_id": {
            "type": "integer"
          },
          "release_type": {
            "type": "string"
          }
        },
        "required": [
          "name"
        ]
      },
      "minecraft.Bedrock": {
        "type": "object",
        "properties": {
          "edition": {
            "type": "string",
            "description": "MCPE, MCEE (Education)"
          },
          "server_id": {
            "type": "string",
            "description": "as the pong's text gives it"
          },
          "guid": {
            "type": "string",
            "description": "RakNet's, decimal: past JSON's safe integers"
          },
          "level": {
            "$ref": "#/components/schemas/minecraft.Text",
            "description": "the MOTD's second line, usually the world's name"
          },
          "gamemode": {
            "type": "string"
          },
          "gamemode_id": {
            "type": "integer"
          },
          "port_v4": {
            "type": "integer"
          },
          "port_v6": {
            "type": "integer"
          },
          "extra": {
            "type": "array",
            "description": "fields past those, as sent",
            "items": {
              "type": "string"
            }
          }
        },
        "required": [
          "edition",
          "guid"
        ]
      },
      "translate.Result": {
        "type": "object",
        "properties": {
          "translations": {
            "type": "array",
            "description": "one, today",
            "items": {
              "type": "string"
            }
          },
          "source": {
            "type": "string",
            "description": "the language DeepL read it as"
          }
        },
        "required": [
          "translations"
        ]
      }
    }
  }
}
