{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "$id": "https://raw.githubusercontent.com/api-evangelist/tinyproxy/main/json-schema/tinyproxy-config-schema.json",
  "title": "Tinyproxy Configuration",
  "description": "Schema for Tinyproxy HTTP proxy daemon configuration parameters",
  "type": "object",
  "properties": {
    "port": {
      "type": "integer",
      "minimum": 1,
      "maximum": 65535,
      "description": "TCP port Tinyproxy listens on (default: 8888)"
    },
    "user": {
      "type": "string",
      "description": "System user to run the proxy daemon as"
    },
    "group": {
      "type": "string",
      "description": "System group for the proxy daemon process"
    },
    "logFile": {
      "type": "string",
      "description": "Path to the log file"
    },
    "logLevel": {
      "type": "string",
      "enum": ["Critical", "Error", "Warning", "Notice", "Connect", "Info"],
      "description": "Logging verbosity level"
    },
    "pidFile": {
      "type": "string",
      "description": "Path to the PID file"
    },
    "maxClients": {
      "type": "integer",
      "minimum": 1,
      "description": "Maximum number of simultaneous connections"
    },
    "minSpareServers": {
      "type": "integer",
      "description": "Minimum number of spare server processes"
    },
    "maxSpareServers": {
      "type": "integer",
      "description": "Maximum number of spare server processes"
    },
    "startServers": {
      "type": "integer",
      "description": "Initial number of server processes to start"
    },
    "maxRequestsPerChild": {
      "type": "integer",
      "description": "Number of connections per child process before recycling"
    },
    "allow": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Allowed client IP addresses or CIDR ranges"
    },
    "deny": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Denied client IP addresses or CIDR ranges"
    },
    "disableViaHeader": {
      "type": "boolean",
      "description": "Whether to disable the Via header"
    },
    "xTinyproxyHeader": {
      "type": "boolean",
      "description": "Whether to send X-Tinyproxy header with client IP"
    },
    "upstream": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "enum": ["http", "socks4", "socks5"]
          },
          "host": {
            "type": "string"
          },
          "port": {
            "type": "integer"
          },
          "domain": {
            "type": "string"
          }
        }
      },
      "description": "Upstream proxy configuration for chaining"
    },
    "noUpstream": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Domains to bypass upstream proxy"
    },
    "filter": {
      "type": "string",
      "description": "Path to filter file for URL/domain filtering"
    },
    "filterURLs": {
      "type": "boolean",
      "description": "Whether to filter by full URLs rather than just domains"
    },
    "filterCaseSensitive": {
      "type": "boolean",
      "description": "Whether filters are case-sensitive"
    },
    "filterDefaultDeny": {
      "type": "boolean",
      "description": "Default deny policy when filter file is active"
    },
    "connectPort": {
      "type": "array",
      "items": {
        "type": "integer"
      },
      "description": "Allowed ports for CONNECT tunneling (e.g., 443, 563)"
    },
    "reverseOnly": {
      "type": "boolean",
      "description": "Whether to operate in reverse proxy mode only"
    },
    "reverseMagic": {
      "type": "boolean",
      "description": "Whether to add cookie magic for reverse proxying"
    },
    "reverseBaseURL": {
      "type": "string",
      "description": "Base URL for reverse proxy mode"
    },
    "statHost": {
      "type": "string",
      "description": "Hostname that returns statistics page"
    },
    "statFile": {
      "type": "string",
      "description": "Path to statistics page template file"
    },
    "timeout": {
      "type": "integer",
      "description": "Connection timeout in seconds"
    },
    "bindSameAddress": {
      "type": "boolean",
      "description": "Whether to bind outbound connections to same address"
    }
  }
}
