{
  "openapi": "3.1.0",
  "info": {
    "title": "VeloRix Tournaments Public API",
    "version": "1.0.0",
    "summary": "Read-only JSON API for VeloRix Tournaments, an India-focused Free Fire and BGMI mobile esports tournament platform.",
    "description": "Public, unauthenticated, read-only endpoints exposing VeloRix Tournaments content: published pages (tournaments, announcements, policies), the current Android APK release and live site status.\n\n## Errors\nEvery non-2xx response is `application/problem+json` (RFC 9457) using the `Error` schema: a `type` URI, a machine-readable `title`/`error.code`, the HTTP `status`, a human-readable `error.message` and an actionable `error.hint`. Error codes are enumerated in `Error.error.code`, so agents can branch on them without parsing prose.\n\n## Rate limits\nEvery response carries RFC 9331 style rate-limit headers: `RateLimit-Policy`, `RateLimit`, plus the legacy `X-RateLimit-Limit` / `X-RateLimit-Remaining` / `X-RateLimit-Reset` mirrors. The default policy is 120 requests per 60 second window per client IP. When exhausted the API returns `429` with `Retry-After` (seconds) and the `rate_limited` error code. Agents should self-throttle from `RateLimit` rather than retrying blindly.\n\n## Versioning and deprecation\nThe API is versioned in the URL path (`/api/v1`). Breaking changes ship as a new path segment (`/api/v2`); the previous version stays available for at least 180 days. A version scheduled for removal returns `Deprecation` (RFC 9745) and `Sunset` (RFC 8594) headers on every response, plus a `Link; rel=\"deprecation\"` pointing at the policy at https://velorix-esports.tech/md/versioning.md. Every response also carries `X-API-Version`. Full policy: https://velorix-esports.tech/md/versioning.md",
    "termsOfService": "https://velorix-esports.tech/terms",
    "contact": {
      "name": "VeloRix Tournaments",
      "email": "service.veloxyra@gmail.com",
      "url": "https://velorix-esports.tech/developers"
    },
    "license": {
      "name": "Proprietary — content reusable with attribution",
      "url": "https://velorix-esports.tech/ai.txt"
    }
  },
  "externalDocs": {
    "description": "VeloRix developer and agent resources (MCP server, OpenAPI, rate limits, versioning policy)",
    "url": "https://velorix-esports.tech/developers"
  },
  "servers": [
    {
      "url": "https://velorix-esports.tech/api/v1",
      "description": "Production (v1)"
    }
  ],
  "x-rate-limit": {
    "policy": "120 requests per 60 second window per client IP",
    "headers": [
      "RateLimit-Policy",
      "RateLimit",
      "Retry-After",
      "X-RateLimit-Limit",
      "X-RateLimit-Remaining",
      "X-RateLimit-Reset"
    ],
    "documentation": "https://velorix-esports.tech/md/versioning.md#rate-limits"
  },
  "x-versioning": {
    "scheme": "url-path",
    "current": "v1",
    "deprecationHeaders": [
      "Deprecation",
      "Sunset",
      "Link"
    ],
    "minimumSupportWindowDays": 180,
    "policy": "https://velorix-esports.tech/md/versioning.md"
  },
  "tags": [
    {
      "name": "pages",
      "description": "Published VeloRix pages: tournaments, announcements, policies."
    },
    {
      "name": "releases",
      "description": "VeloRix Android application releases."
    },
    {
      "name": "platform",
      "description": "Platform metadata and live status."
    }
  ],
  "paths": {
    "/": {
      "get": {
        "operationId": "getApiIndex",
        "tags": [
          "platform"
        ],
        "summary": "API index",
        "description": "Returns the API name, version, links to the OpenAPI document and MCP handshake, the rate-limit policy and the list of available operations.",
        "parameters": [
          {
            "name": "pretty",
            "in": "query",
            "required": false,
            "description": "Pretty-print the JSON response body with two-space indentation.",
            "schema": {
              "type": "boolean",
              "default": true
            },
            "example": true
          }
        ],
        "responses": {
          "200": {
            "description": "API index document.",
            "headers": {
              "RateLimit-Policy": {
                "description": "Advertised quota policy, RFC 9331 style. Example: \"default\";q=120;w=60",
                "schema": {
                  "type": "string"
                },
                "example": "\"default\";q=120;w=60"
              },
              "RateLimit": {
                "description": "Current quota state for this client. Example: \"default\";r=118;t=57",
                "schema": {
                  "type": "string"
                },
                "example": "\"default\";r=118;t=57"
              },
              "X-RateLimit-Limit": {
                "description": "Legacy mirror: requests allowed per window.",
                "schema": {
                  "type": "integer"
                },
                "example": 120
              },
              "X-RateLimit-Remaining": {
                "description": "Legacy mirror: requests left in the current window.",
                "schema": {
                  "type": "integer"
                },
                "example": 118
              },
              "X-RateLimit-Reset": {
                "description": "Legacy mirror: seconds until the current window resets.",
                "schema": {
                  "type": "integer"
                },
                "example": 57
              },
              "X-API-Version": {
                "description": "API version serving the response.",
                "schema": {
                  "type": "string"
                },
                "example": "v1"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiIndex"
                }
              }
            }
          },
          "400": {
            "description": "A query parameter failed validation.",
            "headers": {
              "RateLimit-Policy": {
                "description": "Advertised quota policy, RFC 9331 style. Example: \"default\";q=120;w=60",
                "schema": {
                  "type": "string"
                },
                "example": "\"default\";q=120;w=60"
              },
              "RateLimit": {
                "description": "Current quota state for this client. Example: \"default\";r=118;t=57",
                "schema": {
                  "type": "string"
                },
                "example": "\"default\";r=118;t=57"
              },
              "X-RateLimit-Limit": {
                "description": "Legacy mirror: requests allowed per window.",
                "schema": {
                  "type": "integer"
                },
                "example": 120
              },
              "X-RateLimit-Remaining": {
                "description": "Legacy mirror: requests left in the current window.",
                "schema": {
                  "type": "integer"
                },
                "example": 118
              },
              "X-RateLimit-Reset": {
                "description": "Legacy mirror: seconds until the current window resets.",
                "schema": {
                  "type": "integer"
                },
                "example": 57
              },
              "X-API-Version": {
                "description": "API version serving the response.",
                "schema": {
                  "type": "string"
                },
                "example": "v1"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "405": {
            "description": "The API is read-only; only GET, HEAD and OPTIONS are accepted.",
            "headers": {
              "RateLimit-Policy": {
                "description": "Advertised quota policy, RFC 9331 style. Example: \"default\";q=120;w=60",
                "schema": {
                  "type": "string"
                },
                "example": "\"default\";q=120;w=60"
              },
              "RateLimit": {
                "description": "Current quota state for this client. Example: \"default\";r=118;t=57",
                "schema": {
                  "type": "string"
                },
                "example": "\"default\";r=118;t=57"
              },
              "X-RateLimit-Limit": {
                "description": "Legacy mirror: requests allowed per window.",
                "schema": {
                  "type": "integer"
                },
                "example": 120
              },
              "X-RateLimit-Remaining": {
                "description": "Legacy mirror: requests left in the current window.",
                "schema": {
                  "type": "integer"
                },
                "example": 118
              },
              "X-RateLimit-Reset": {
                "description": "Legacy mirror: seconds until the current window resets.",
                "schema": {
                  "type": "integer"
                },
                "example": 57
              },
              "X-API-Version": {
                "description": "API version serving the response.",
                "schema": {
                  "type": "string"
                },
                "example": "v1"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "The client exceeded the published quota. Honour Retry-After before retrying.",
            "headers": {
              "RateLimit-Policy": {
                "description": "Advertised quota policy, RFC 9331 style. Example: \"default\";q=120;w=60",
                "schema": {
                  "type": "string"
                },
                "example": "\"default\";q=120;w=60"
              },
              "RateLimit": {
                "description": "Current quota state for this client. Example: \"default\";r=118;t=57",
                "schema": {
                  "type": "string"
                },
                "example": "\"default\";r=118;t=57"
              },
              "X-RateLimit-Limit": {
                "description": "Legacy mirror: requests allowed per window.",
                "schema": {
                  "type": "integer"
                },
                "example": 120
              },
              "X-RateLimit-Remaining": {
                "description": "Legacy mirror: requests left in the current window.",
                "schema": {
                  "type": "integer"
                },
                "example": 118
              },
              "X-RateLimit-Reset": {
                "description": "Legacy mirror: seconds until the current window resets.",
                "schema": {
                  "type": "integer"
                },
                "example": 57
              },
              "X-API-Version": {
                "description": "API version serving the response.",
                "schema": {
                  "type": "string"
                },
                "example": "v1"
              },
              "Retry-After": {
                "description": "Seconds to wait before retrying (sent on 429 and 503).",
                "schema": {
                  "type": "integer"
                },
                "example": 30
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error.",
            "headers": {
              "RateLimit-Policy": {
                "description": "Advertised quota policy, RFC 9331 style. Example: \"default\";q=120;w=60",
                "schema": {
                  "type": "string"
                },
                "example": "\"default\";q=120;w=60"
              },
              "RateLimit": {
                "description": "Current quota state for this client. Example: \"default\";r=118;t=57",
                "schema": {
                  "type": "string"
                },
                "example": "\"default\";r=118;t=57"
              },
              "X-RateLimit-Limit": {
                "description": "Legacy mirror: requests allowed per window.",
                "schema": {
                  "type": "integer"
                },
                "example": 120
              },
              "X-RateLimit-Remaining": {
                "description": "Legacy mirror: requests left in the current window.",
                "schema": {
                  "type": "integer"
                },
                "example": 118
              },
              "X-RateLimit-Reset": {
                "description": "Legacy mirror: seconds until the current window resets.",
                "schema": {
                  "type": "integer"
                },
                "example": 57
              },
              "X-API-Version": {
                "description": "API version serving the response.",
                "schema": {
                  "type": "string"
                },
                "example": "v1"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The content database rejected the query.",
            "headers": {
              "RateLimit-Policy": {
                "description": "Advertised quota policy, RFC 9331 style. Example: \"default\";q=120;w=60",
                "schema": {
                  "type": "string"
                },
                "example": "\"default\";q=120;w=60"
              },
              "RateLimit": {
                "description": "Current quota state for this client. Example: \"default\";r=118;t=57",
                "schema": {
                  "type": "string"
                },
                "example": "\"default\";r=118;t=57"
              },
              "X-RateLimit-Limit": {
                "description": "Legacy mirror: requests allowed per window.",
                "schema": {
                  "type": "integer"
                },
                "example": 120
              },
              "X-RateLimit-Remaining": {
                "description": "Legacy mirror: requests left in the current window.",
                "schema": {
                  "type": "integer"
                },
                "example": 118
              },
              "X-RateLimit-Reset": {
                "description": "Legacy mirror: seconds until the current window resets.",
                "schema": {
                  "type": "integer"
                },
                "example": 57
              },
              "X-API-Version": {
                "description": "API version serving the response.",
                "schema": {
                  "type": "string"
                },
                "example": "v1"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "The backend is temporarily unavailable.",
            "headers": {
              "RateLimit-Policy": {
                "description": "Advertised quota policy, RFC 9331 style. Example: \"default\";q=120;w=60",
                "schema": {
                  "type": "string"
                },
                "example": "\"default\";q=120;w=60"
              },
              "RateLimit": {
                "description": "Current quota state for this client. Example: \"default\";r=118;t=57",
                "schema": {
                  "type": "string"
                },
                "example": "\"default\";r=118;t=57"
              },
              "X-RateLimit-Limit": {
                "description": "Legacy mirror: requests allowed per window.",
                "schema": {
                  "type": "integer"
                },
                "example": 120
              },
              "X-RateLimit-Remaining": {
                "description": "Legacy mirror: requests left in the current window.",
                "schema": {
                  "type": "integer"
                },
                "example": 118
              },
              "X-RateLimit-Reset": {
                "description": "Legacy mirror: seconds until the current window resets.",
                "schema": {
                  "type": "integer"
                },
                "example": 57
              },
              "X-API-Version": {
                "description": "API version serving the response.",
                "schema": {
                  "type": "string"
                },
                "example": "v1"
              },
              "Retry-After": {
                "description": "Seconds to wait before retrying (sent on 429 and 503).",
                "schema": {
                  "type": "integer"
                },
                "example": 30
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "default": {
            "description": "Any other failure. Always the same typed problem document.",
            "headers": {
              "RateLimit-Policy": {
                "description": "Advertised quota policy, RFC 9331 style. Example: \"default\";q=120;w=60",
                "schema": {
                  "type": "string"
                },
                "example": "\"default\";q=120;w=60"
              },
              "RateLimit": {
                "description": "Current quota state for this client. Example: \"default\";r=118;t=57",
                "schema": {
                  "type": "string"
                },
                "example": "\"default\";r=118;t=57"
              },
              "X-RateLimit-Limit": {
                "description": "Legacy mirror: requests allowed per window.",
                "schema": {
                  "type": "integer"
                },
                "example": 120
              },
              "X-RateLimit-Remaining": {
                "description": "Legacy mirror: requests left in the current window.",
                "schema": {
                  "type": "integer"
                },
                "example": 118
              },
              "X-RateLimit-Reset": {
                "description": "Legacy mirror: seconds until the current window resets.",
                "schema": {
                  "type": "integer"
                },
                "example": 57
              },
              "X-API-Version": {
                "description": "API version serving the response.",
                "schema": {
                  "type": "string"
                },
                "example": "v1"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/pages": {
      "get": {
        "operationId": "listPages",
        "tags": [
          "pages"
        ],
        "summary": "List published pages",
        "description": "Lists published VeloRix custom pages (tournament pages, announcements, policy pages) with slug, title, subtitle and last update time, newest first. Supports simple paging and a case-insensitive title search.",
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Maximum number of pages to return (default 50).",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 50
            },
            "example": 20
          },
          {
            "name": "offset",
            "in": "query",
            "required": false,
            "description": "Number of pages to skip before collecting results (default 0).",
            "schema": {
              "type": "integer",
              "minimum": 0,
              "default": 0
            },
            "example": 0
          },
          {
            "name": "q",
            "in": "query",
            "required": false,
            "description": "Case-insensitive substring filter applied to the page title.",
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 80
            },
            "example": "diwali"
          },
          {
            "name": "pretty",
            "in": "query",
            "required": false,
            "description": "Pretty-print the JSON response body with two-space indentation.",
            "schema": {
              "type": "boolean",
              "default": true
            },
            "example": true
          }
        ],
        "responses": {
          "200": {
            "description": "A list of published pages.",
            "headers": {
              "RateLimit-Policy": {
                "description": "Advertised quota policy, RFC 9331 style. Example: \"default\";q=120;w=60",
                "schema": {
                  "type": "string"
                },
                "example": "\"default\";q=120;w=60"
              },
              "RateLimit": {
                "description": "Current quota state for this client. Example: \"default\";r=118;t=57",
                "schema": {
                  "type": "string"
                },
                "example": "\"default\";r=118;t=57"
              },
              "X-RateLimit-Limit": {
                "description": "Legacy mirror: requests allowed per window.",
                "schema": {
                  "type": "integer"
                },
                "example": 120
              },
              "X-RateLimit-Remaining": {
                "description": "Legacy mirror: requests left in the current window.",
                "schema": {
                  "type": "integer"
                },
                "example": 118
              },
              "X-RateLimit-Reset": {
                "description": "Legacy mirror: seconds until the current window resets.",
                "schema": {
                  "type": "integer"
                },
                "example": 57
              },
              "X-API-Version": {
                "description": "API version serving the response.",
                "schema": {
                  "type": "string"
                },
                "example": "v1"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PageList"
                }
              }
            }
          },
          "400": {
            "description": "A query parameter failed validation.",
            "headers": {
              "RateLimit-Policy": {
                "description": "Advertised quota policy, RFC 9331 style. Example: \"default\";q=120;w=60",
                "schema": {
                  "type": "string"
                },
                "example": "\"default\";q=120;w=60"
              },
              "RateLimit": {
                "description": "Current quota state for this client. Example: \"default\";r=118;t=57",
                "schema": {
                  "type": "string"
                },
                "example": "\"default\";r=118;t=57"
              },
              "X-RateLimit-Limit": {
                "description": "Legacy mirror: requests allowed per window.",
                "schema": {
                  "type": "integer"
                },
                "example": 120
              },
              "X-RateLimit-Remaining": {
                "description": "Legacy mirror: requests left in the current window.",
                "schema": {
                  "type": "integer"
                },
                "example": 118
              },
              "X-RateLimit-Reset": {
                "description": "Legacy mirror: seconds until the current window resets.",
                "schema": {
                  "type": "integer"
                },
                "example": 57
              },
              "X-API-Version": {
                "description": "API version serving the response.",
                "schema": {
                  "type": "string"
                },
                "example": "v1"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "405": {
            "description": "The API is read-only; only GET, HEAD and OPTIONS are accepted.",
            "headers": {
              "RateLimit-Policy": {
                "description": "Advertised quota policy, RFC 9331 style. Example: \"default\";q=120;w=60",
                "schema": {
                  "type": "string"
                },
                "example": "\"default\";q=120;w=60"
              },
              "RateLimit": {
                "description": "Current quota state for this client. Example: \"default\";r=118;t=57",
                "schema": {
                  "type": "string"
                },
                "example": "\"default\";r=118;t=57"
              },
              "X-RateLimit-Limit": {
                "description": "Legacy mirror: requests allowed per window.",
                "schema": {
                  "type": "integer"
                },
                "example": 120
              },
              "X-RateLimit-Remaining": {
                "description": "Legacy mirror: requests left in the current window.",
                "schema": {
                  "type": "integer"
                },
                "example": 118
              },
              "X-RateLimit-Reset": {
                "description": "Legacy mirror: seconds until the current window resets.",
                "schema": {
                  "type": "integer"
                },
                "example": 57
              },
              "X-API-Version": {
                "description": "API version serving the response.",
                "schema": {
                  "type": "string"
                },
                "example": "v1"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "The client exceeded the published quota. Honour Retry-After before retrying.",
            "headers": {
              "RateLimit-Policy": {
                "description": "Advertised quota policy, RFC 9331 style. Example: \"default\";q=120;w=60",
                "schema": {
                  "type": "string"
                },
                "example": "\"default\";q=120;w=60"
              },
              "RateLimit": {
                "description": "Current quota state for this client. Example: \"default\";r=118;t=57",
                "schema": {
                  "type": "string"
                },
                "example": "\"default\";r=118;t=57"
              },
              "X-RateLimit-Limit": {
                "description": "Legacy mirror: requests allowed per window.",
                "schema": {
                  "type": "integer"
                },
                "example": 120
              },
              "X-RateLimit-Remaining": {
                "description": "Legacy mirror: requests left in the current window.",
                "schema": {
                  "type": "integer"
                },
                "example": 118
              },
              "X-RateLimit-Reset": {
                "description": "Legacy mirror: seconds until the current window resets.",
                "schema": {
                  "type": "integer"
                },
                "example": 57
              },
              "X-API-Version": {
                "description": "API version serving the response.",
                "schema": {
                  "type": "string"
                },
                "example": "v1"
              },
              "Retry-After": {
                "description": "Seconds to wait before retrying (sent on 429 and 503).",
                "schema": {
                  "type": "integer"
                },
                "example": 30
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error.",
            "headers": {
              "RateLimit-Policy": {
                "description": "Advertised quota policy, RFC 9331 style. Example: \"default\";q=120;w=60",
                "schema": {
                  "type": "string"
                },
                "example": "\"default\";q=120;w=60"
              },
              "RateLimit": {
                "description": "Current quota state for this client. Example: \"default\";r=118;t=57",
                "schema": {
                  "type": "string"
                },
                "example": "\"default\";r=118;t=57"
              },
              "X-RateLimit-Limit": {
                "description": "Legacy mirror: requests allowed per window.",
                "schema": {
                  "type": "integer"
                },
                "example": 120
              },
              "X-RateLimit-Remaining": {
                "description": "Legacy mirror: requests left in the current window.",
                "schema": {
                  "type": "integer"
                },
                "example": 118
              },
              "X-RateLimit-Reset": {
                "description": "Legacy mirror: seconds until the current window resets.",
                "schema": {
                  "type": "integer"
                },
                "example": 57
              },
              "X-API-Version": {
                "description": "API version serving the response.",
                "schema": {
                  "type": "string"
                },
                "example": "v1"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The content database rejected the query.",
            "headers": {
              "RateLimit-Policy": {
                "description": "Advertised quota policy, RFC 9331 style. Example: \"default\";q=120;w=60",
                "schema": {
                  "type": "string"
                },
                "example": "\"default\";q=120;w=60"
              },
              "RateLimit": {
                "description": "Current quota state for this client. Example: \"default\";r=118;t=57",
                "schema": {
                  "type": "string"
                },
                "example": "\"default\";r=118;t=57"
              },
              "X-RateLimit-Limit": {
                "description": "Legacy mirror: requests allowed per window.",
                "schema": {
                  "type": "integer"
                },
                "example": 120
              },
              "X-RateLimit-Remaining": {
                "description": "Legacy mirror: requests left in the current window.",
                "schema": {
                  "type": "integer"
                },
                "example": 118
              },
              "X-RateLimit-Reset": {
                "description": "Legacy mirror: seconds until the current window resets.",
                "schema": {
                  "type": "integer"
                },
                "example": 57
              },
              "X-API-Version": {
                "description": "API version serving the response.",
                "schema": {
                  "type": "string"
                },
                "example": "v1"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "The backend is temporarily unavailable.",
            "headers": {
              "RateLimit-Policy": {
                "description": "Advertised quota policy, RFC 9331 style. Example: \"default\";q=120;w=60",
                "schema": {
                  "type": "string"
                },
                "example": "\"default\";q=120;w=60"
              },
              "RateLimit": {
                "description": "Current quota state for this client. Example: \"default\";r=118;t=57",
                "schema": {
                  "type": "string"
                },
                "example": "\"default\";r=118;t=57"
              },
              "X-RateLimit-Limit": {
                "description": "Legacy mirror: requests allowed per window.",
                "schema": {
                  "type": "integer"
                },
                "example": 120
              },
              "X-RateLimit-Remaining": {
                "description": "Legacy mirror: requests left in the current window.",
                "schema": {
                  "type": "integer"
                },
                "example": 118
              },
              "X-RateLimit-Reset": {
                "description": "Legacy mirror: seconds until the current window resets.",
                "schema": {
                  "type": "integer"
                },
                "example": 57
              },
              "X-API-Version": {
                "description": "API version serving the response.",
                "schema": {
                  "type": "string"
                },
                "example": "v1"
              },
              "Retry-After": {
                "description": "Seconds to wait before retrying (sent on 429 and 503).",
                "schema": {
                  "type": "integer"
                },
                "example": 30
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "default": {
            "description": "Any other failure. Always the same typed problem document.",
            "headers": {
              "RateLimit-Policy": {
                "description": "Advertised quota policy, RFC 9331 style. Example: \"default\";q=120;w=60",
                "schema": {
                  "type": "string"
                },
                "example": "\"default\";q=120;w=60"
              },
              "RateLimit": {
                "description": "Current quota state for this client. Example: \"default\";r=118;t=57",
                "schema": {
                  "type": "string"
                },
                "example": "\"default\";r=118;t=57"
              },
              "X-RateLimit-Limit": {
                "description": "Legacy mirror: requests allowed per window.",
                "schema": {
                  "type": "integer"
                },
                "example": 120
              },
              "X-RateLimit-Remaining": {
                "description": "Legacy mirror: requests left in the current window.",
                "schema": {
                  "type": "integer"
                },
                "example": 118
              },
              "X-RateLimit-Reset": {
                "description": "Legacy mirror: seconds until the current window resets.",
                "schema": {
                  "type": "integer"
                },
                "example": 57
              },
              "X-API-Version": {
                "description": "API version serving the response.",
                "schema": {
                  "type": "string"
                },
                "example": "v1"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/pages/{slug}": {
      "get": {
        "operationId": "getPage",
        "tags": [
          "pages"
        ],
        "summary": "Get one published page",
        "description": "Fetches the full markdown content of a single published VeloRix page by its slug. Slugs are lowercase and hyphenated, for example 'diwali-cup'.",
        "parameters": [
          {
            "name": "slug",
            "in": "path",
            "required": true,
            "description": "Lowercase, hyphenated page slug as returned by listPages.",
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 120,
              "pattern": "^[a-z0-9-]+$"
            },
            "example": "diwali-cup"
          },
          {
            "name": "pretty",
            "in": "query",
            "required": false,
            "description": "Pretty-print the JSON response body with two-space indentation.",
            "schema": {
              "type": "boolean",
              "default": true
            },
            "example": true
          }
        ],
        "responses": {
          "200": {
            "description": "The requested page.",
            "headers": {
              "RateLimit-Policy": {
                "description": "Advertised quota policy, RFC 9331 style. Example: \"default\";q=120;w=60",
                "schema": {
                  "type": "string"
                },
                "example": "\"default\";q=120;w=60"
              },
              "RateLimit": {
                "description": "Current quota state for this client. Example: \"default\";r=118;t=57",
                "schema": {
                  "type": "string"
                },
                "example": "\"default\";r=118;t=57"
              },
              "X-RateLimit-Limit": {
                "description": "Legacy mirror: requests allowed per window.",
                "schema": {
                  "type": "integer"
                },
                "example": 120
              },
              "X-RateLimit-Remaining": {
                "description": "Legacy mirror: requests left in the current window.",
                "schema": {
                  "type": "integer"
                },
                "example": 118
              },
              "X-RateLimit-Reset": {
                "description": "Legacy mirror: seconds until the current window resets.",
                "schema": {
                  "type": "integer"
                },
                "example": 57
              },
              "X-API-Version": {
                "description": "API version serving the response.",
                "schema": {
                  "type": "string"
                },
                "example": "v1"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Page"
                }
              }
            }
          },
          "400": {
            "description": "A query parameter failed validation.",
            "headers": {
              "RateLimit-Policy": {
                "description": "Advertised quota policy, RFC 9331 style. Example: \"default\";q=120;w=60",
                "schema": {
                  "type": "string"
                },
                "example": "\"default\";q=120;w=60"
              },
              "RateLimit": {
                "description": "Current quota state for this client. Example: \"default\";r=118;t=57",
                "schema": {
                  "type": "string"
                },
                "example": "\"default\";r=118;t=57"
              },
              "X-RateLimit-Limit": {
                "description": "Legacy mirror: requests allowed per window.",
                "schema": {
                  "type": "integer"
                },
                "example": 120
              },
              "X-RateLimit-Remaining": {
                "description": "Legacy mirror: requests left in the current window.",
                "schema": {
                  "type": "integer"
                },
                "example": 118
              },
              "X-RateLimit-Reset": {
                "description": "Legacy mirror: seconds until the current window resets.",
                "schema": {
                  "type": "integer"
                },
                "example": 57
              },
              "X-API-Version": {
                "description": "API version serving the response.",
                "schema": {
                  "type": "string"
                },
                "example": "v1"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist.",
            "headers": {
              "RateLimit-Policy": {
                "description": "Advertised quota policy, RFC 9331 style. Example: \"default\";q=120;w=60",
                "schema": {
                  "type": "string"
                },
                "example": "\"default\";q=120;w=60"
              },
              "RateLimit": {
                "description": "Current quota state for this client. Example: \"default\";r=118;t=57",
                "schema": {
                  "type": "string"
                },
                "example": "\"default\";r=118;t=57"
              },
              "X-RateLimit-Limit": {
                "description": "Legacy mirror: requests allowed per window.",
                "schema": {
                  "type": "integer"
                },
                "example": 120
              },
              "X-RateLimit-Remaining": {
                "description": "Legacy mirror: requests left in the current window.",
                "schema": {
                  "type": "integer"
                },
                "example": 118
              },
              "X-RateLimit-Reset": {
                "description": "Legacy mirror: seconds until the current window resets.",
                "schema": {
                  "type": "integer"
                },
                "example": 57
              },
              "X-API-Version": {
                "description": "API version serving the response.",
                "schema": {
                  "type": "string"
                },
                "example": "v1"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "405": {
            "description": "The API is read-only; only GET, HEAD and OPTIONS are accepted.",
            "headers": {
              "RateLimit-Policy": {
                "description": "Advertised quota policy, RFC 9331 style. Example: \"default\";q=120;w=60",
                "schema": {
                  "type": "string"
                },
                "example": "\"default\";q=120;w=60"
              },
              "RateLimit": {
                "description": "Current quota state for this client. Example: \"default\";r=118;t=57",
                "schema": {
                  "type": "string"
                },
                "example": "\"default\";r=118;t=57"
              },
              "X-RateLimit-Limit": {
                "description": "Legacy mirror: requests allowed per window.",
                "schema": {
                  "type": "integer"
                },
                "example": 120
              },
              "X-RateLimit-Remaining": {
                "description": "Legacy mirror: requests left in the current window.",
                "schema": {
                  "type": "integer"
                },
                "example": 118
              },
              "X-RateLimit-Reset": {
                "description": "Legacy mirror: seconds until the current window resets.",
                "schema": {
                  "type": "integer"
                },
                "example": 57
              },
              "X-API-Version": {
                "description": "API version serving the response.",
                "schema": {
                  "type": "string"
                },
                "example": "v1"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "The client exceeded the published quota. Honour Retry-After before retrying.",
            "headers": {
              "RateLimit-Policy": {
                "description": "Advertised quota policy, RFC 9331 style. Example: \"default\";q=120;w=60",
                "schema": {
                  "type": "string"
                },
                "example": "\"default\";q=120;w=60"
              },
              "RateLimit": {
                "description": "Current quota state for this client. Example: \"default\";r=118;t=57",
                "schema": {
                  "type": "string"
                },
                "example": "\"default\";r=118;t=57"
              },
              "X-RateLimit-Limit": {
                "description": "Legacy mirror: requests allowed per window.",
                "schema": {
                  "type": "integer"
                },
                "example": 120
              },
              "X-RateLimit-Remaining": {
                "description": "Legacy mirror: requests left in the current window.",
                "schema": {
                  "type": "integer"
                },
                "example": 118
              },
              "X-RateLimit-Reset": {
                "description": "Legacy mirror: seconds until the current window resets.",
                "schema": {
                  "type": "integer"
                },
                "example": 57
              },
              "X-API-Version": {
                "description": "API version serving the response.",
                "schema": {
                  "type": "string"
                },
                "example": "v1"
              },
              "Retry-After": {
                "description": "Seconds to wait before retrying (sent on 429 and 503).",
                "schema": {
                  "type": "integer"
                },
                "example": 30
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error.",
            "headers": {
              "RateLimit-Policy": {
                "description": "Advertised quota policy, RFC 9331 style. Example: \"default\";q=120;w=60",
                "schema": {
                  "type": "string"
                },
                "example": "\"default\";q=120;w=60"
              },
              "RateLimit": {
                "description": "Current quota state for this client. Example: \"default\";r=118;t=57",
                "schema": {
                  "type": "string"
                },
                "example": "\"default\";r=118;t=57"
              },
              "X-RateLimit-Limit": {
                "description": "Legacy mirror: requests allowed per window.",
                "schema": {
                  "type": "integer"
                },
                "example": 120
              },
              "X-RateLimit-Remaining": {
                "description": "Legacy mirror: requests left in the current window.",
                "schema": {
                  "type": "integer"
                },
                "example": 118
              },
              "X-RateLimit-Reset": {
                "description": "Legacy mirror: seconds until the current window resets.",
                "schema": {
                  "type": "integer"
                },
                "example": 57
              },
              "X-API-Version": {
                "description": "API version serving the response.",
                "schema": {
                  "type": "string"
                },
                "example": "v1"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The content database rejected the query.",
            "headers": {
              "RateLimit-Policy": {
                "description": "Advertised quota policy, RFC 9331 style. Example: \"default\";q=120;w=60",
                "schema": {
                  "type": "string"
                },
                "example": "\"default\";q=120;w=60"
              },
              "RateLimit": {
                "description": "Current quota state for this client. Example: \"default\";r=118;t=57",
                "schema": {
                  "type": "string"
                },
                "example": "\"default\";r=118;t=57"
              },
              "X-RateLimit-Limit": {
                "description": "Legacy mirror: requests allowed per window.",
                "schema": {
                  "type": "integer"
                },
                "example": 120
              },
              "X-RateLimit-Remaining": {
                "description": "Legacy mirror: requests left in the current window.",
                "schema": {
                  "type": "integer"
                },
                "example": 118
              },
              "X-RateLimit-Reset": {
                "description": "Legacy mirror: seconds until the current window resets.",
                "schema": {
                  "type": "integer"
                },
                "example": 57
              },
              "X-API-Version": {
                "description": "API version serving the response.",
                "schema": {
                  "type": "string"
                },
                "example": "v1"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "The backend is temporarily unavailable.",
            "headers": {
              "RateLimit-Policy": {
                "description": "Advertised quota policy, RFC 9331 style. Example: \"default\";q=120;w=60",
                "schema": {
                  "type": "string"
                },
                "example": "\"default\";q=120;w=60"
              },
              "RateLimit": {
                "description": "Current quota state for this client. Example: \"default\";r=118;t=57",
                "schema": {
                  "type": "string"
                },
                "example": "\"default\";r=118;t=57"
              },
              "X-RateLimit-Limit": {
                "description": "Legacy mirror: requests allowed per window.",
                "schema": {
                  "type": "integer"
                },
                "example": 120
              },
              "X-RateLimit-Remaining": {
                "description": "Legacy mirror: requests left in the current window.",
                "schema": {
                  "type": "integer"
                },
                "example": 118
              },
              "X-RateLimit-Reset": {
                "description": "Legacy mirror: seconds until the current window resets.",
                "schema": {
                  "type": "integer"
                },
                "example": 57
              },
              "X-API-Version": {
                "description": "API version serving the response.",
                "schema": {
                  "type": "string"
                },
                "example": "v1"
              },
              "Retry-After": {
                "description": "Seconds to wait before retrying (sent on 429 and 503).",
                "schema": {
                  "type": "integer"
                },
                "example": 30
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "default": {
            "description": "Any other failure. Always the same typed problem document.",
            "headers": {
              "RateLimit-Policy": {
                "description": "Advertised quota policy, RFC 9331 style. Example: \"default\";q=120;w=60",
                "schema": {
                  "type": "string"
                },
                "example": "\"default\";q=120;w=60"
              },
              "RateLimit": {
                "description": "Current quota state for this client. Example: \"default\";r=118;t=57",
                "schema": {
                  "type": "string"
                },
                "example": "\"default\";r=118;t=57"
              },
              "X-RateLimit-Limit": {
                "description": "Legacy mirror: requests allowed per window.",
                "schema": {
                  "type": "integer"
                },
                "example": 120
              },
              "X-RateLimit-Remaining": {
                "description": "Legacy mirror: requests left in the current window.",
                "schema": {
                  "type": "integer"
                },
                "example": 118
              },
              "X-RateLimit-Reset": {
                "description": "Legacy mirror: seconds until the current window resets.",
                "schema": {
                  "type": "integer"
                },
                "example": 57
              },
              "X-API-Version": {
                "description": "API version serving the response.",
                "schema": {
                  "type": "string"
                },
                "example": "v1"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/apk/active": {
      "get": {
        "operationId": "getActiveApk",
        "tags": [
          "releases"
        ],
        "summary": "Get the active Android release",
        "description": "Returns the currently active VeloRix Android APK: version string, storage path, file size in bytes, changelog and release timestamp.",
        "parameters": [
          {
            "name": "pretty",
            "in": "query",
            "required": false,
            "description": "Pretty-print the JSON response body with two-space indentation.",
            "schema": {
              "type": "boolean",
              "default": true
            },
            "example": true
          }
        ],
        "responses": {
          "200": {
            "description": "The active Android release.",
            "headers": {
              "RateLimit-Policy": {
                "description": "Advertised quota policy, RFC 9331 style. Example: \"default\";q=120;w=60",
                "schema": {
                  "type": "string"
                },
                "example": "\"default\";q=120;w=60"
              },
              "RateLimit": {
                "description": "Current quota state for this client. Example: \"default\";r=118;t=57",
                "schema": {
                  "type": "string"
                },
                "example": "\"default\";r=118;t=57"
              },
              "X-RateLimit-Limit": {
                "description": "Legacy mirror: requests allowed per window.",
                "schema": {
                  "type": "integer"
                },
                "example": 120
              },
              "X-RateLimit-Remaining": {
                "description": "Legacy mirror: requests left in the current window.",
                "schema": {
                  "type": "integer"
                },
                "example": 118
              },
              "X-RateLimit-Reset": {
                "description": "Legacy mirror: seconds until the current window resets.",
                "schema": {
                  "type": "integer"
                },
                "example": 57
              },
              "X-API-Version": {
                "description": "API version serving the response.",
                "schema": {
                  "type": "string"
                },
                "example": "v1"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApkRelease"
                }
              }
            }
          },
          "400": {
            "description": "A query parameter failed validation.",
            "headers": {
              "RateLimit-Policy": {
                "description": "Advertised quota policy, RFC 9331 style. Example: \"default\";q=120;w=60",
                "schema": {
                  "type": "string"
                },
                "example": "\"default\";q=120;w=60"
              },
              "RateLimit": {
                "description": "Current quota state for this client. Example: \"default\";r=118;t=57",
                "schema": {
                  "type": "string"
                },
                "example": "\"default\";r=118;t=57"
              },
              "X-RateLimit-Limit": {
                "description": "Legacy mirror: requests allowed per window.",
                "schema": {
                  "type": "integer"
                },
                "example": 120
              },
              "X-RateLimit-Remaining": {
                "description": "Legacy mirror: requests left in the current window.",
                "schema": {
                  "type": "integer"
                },
                "example": 118
              },
              "X-RateLimit-Reset": {
                "description": "Legacy mirror: seconds until the current window resets.",
                "schema": {
                  "type": "integer"
                },
                "example": 57
              },
              "X-API-Version": {
                "description": "API version serving the response.",
                "schema": {
                  "type": "string"
                },
                "example": "v1"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist.",
            "headers": {
              "RateLimit-Policy": {
                "description": "Advertised quota policy, RFC 9331 style. Example: \"default\";q=120;w=60",
                "schema": {
                  "type": "string"
                },
                "example": "\"default\";q=120;w=60"
              },
              "RateLimit": {
                "description": "Current quota state for this client. Example: \"default\";r=118;t=57",
                "schema": {
                  "type": "string"
                },
                "example": "\"default\";r=118;t=57"
              },
              "X-RateLimit-Limit": {
                "description": "Legacy mirror: requests allowed per window.",
                "schema": {
                  "type": "integer"
                },
                "example": 120
              },
              "X-RateLimit-Remaining": {
                "description": "Legacy mirror: requests left in the current window.",
                "schema": {
                  "type": "integer"
                },
                "example": 118
              },
              "X-RateLimit-Reset": {
                "description": "Legacy mirror: seconds until the current window resets.",
                "schema": {
                  "type": "integer"
                },
                "example": 57
              },
              "X-API-Version": {
                "description": "API version serving the response.",
                "schema": {
                  "type": "string"
                },
                "example": "v1"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "405": {
            "description": "The API is read-only; only GET, HEAD and OPTIONS are accepted.",
            "headers": {
              "RateLimit-Policy": {
                "description": "Advertised quota policy, RFC 9331 style. Example: \"default\";q=120;w=60",
                "schema": {
                  "type": "string"
                },
                "example": "\"default\";q=120;w=60"
              },
              "RateLimit": {
                "description": "Current quota state for this client. Example: \"default\";r=118;t=57",
                "schema": {
                  "type": "string"
                },
                "example": "\"default\";r=118;t=57"
              },
              "X-RateLimit-Limit": {
                "description": "Legacy mirror: requests allowed per window.",
                "schema": {
                  "type": "integer"
                },
                "example": 120
              },
              "X-RateLimit-Remaining": {
                "description": "Legacy mirror: requests left in the current window.",
                "schema": {
                  "type": "integer"
                },
                "example": 118
              },
              "X-RateLimit-Reset": {
                "description": "Legacy mirror: seconds until the current window resets.",
                "schema": {
                  "type": "integer"
                },
                "example": 57
              },
              "X-API-Version": {
                "description": "API version serving the response.",
                "schema": {
                  "type": "string"
                },
                "example": "v1"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "The client exceeded the published quota. Honour Retry-After before retrying.",
            "headers": {
              "RateLimit-Policy": {
                "description": "Advertised quota policy, RFC 9331 style. Example: \"default\";q=120;w=60",
                "schema": {
                  "type": "string"
                },
                "example": "\"default\";q=120;w=60"
              },
              "RateLimit": {
                "description": "Current quota state for this client. Example: \"default\";r=118;t=57",
                "schema": {
                  "type": "string"
                },
                "example": "\"default\";r=118;t=57"
              },
              "X-RateLimit-Limit": {
                "description": "Legacy mirror: requests allowed per window.",
                "schema": {
                  "type": "integer"
                },
                "example": 120
              },
              "X-RateLimit-Remaining": {
                "description": "Legacy mirror: requests left in the current window.",
                "schema": {
                  "type": "integer"
                },
                "example": 118
              },
              "X-RateLimit-Reset": {
                "description": "Legacy mirror: seconds until the current window resets.",
                "schema": {
                  "type": "integer"
                },
                "example": 57
              },
              "X-API-Version": {
                "description": "API version serving the response.",
                "schema": {
                  "type": "string"
                },
                "example": "v1"
              },
              "Retry-After": {
                "description": "Seconds to wait before retrying (sent on 429 and 503).",
                "schema": {
                  "type": "integer"
                },
                "example": 30
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error.",
            "headers": {
              "RateLimit-Policy": {
                "description": "Advertised quota policy, RFC 9331 style. Example: \"default\";q=120;w=60",
                "schema": {
                  "type": "string"
                },
                "example": "\"default\";q=120;w=60"
              },
              "RateLimit": {
                "description": "Current quota state for this client. Example: \"default\";r=118;t=57",
                "schema": {
                  "type": "string"
                },
                "example": "\"default\";r=118;t=57"
              },
              "X-RateLimit-Limit": {
                "description": "Legacy mirror: requests allowed per window.",
                "schema": {
                  "type": "integer"
                },
                "example": 120
              },
              "X-RateLimit-Remaining": {
                "description": "Legacy mirror: requests left in the current window.",
                "schema": {
                  "type": "integer"
                },
                "example": 118
              },
              "X-RateLimit-Reset": {
                "description": "Legacy mirror: seconds until the current window resets.",
                "schema": {
                  "type": "integer"
                },
                "example": 57
              },
              "X-API-Version": {
                "description": "API version serving the response.",
                "schema": {
                  "type": "string"
                },
                "example": "v1"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The content database rejected the query.",
            "headers": {
              "RateLimit-Policy": {
                "description": "Advertised quota policy, RFC 9331 style. Example: \"default\";q=120;w=60",
                "schema": {
                  "type": "string"
                },
                "example": "\"default\";q=120;w=60"
              },
              "RateLimit": {
                "description": "Current quota state for this client. Example: \"default\";r=118;t=57",
                "schema": {
                  "type": "string"
                },
                "example": "\"default\";r=118;t=57"
              },
              "X-RateLimit-Limit": {
                "description": "Legacy mirror: requests allowed per window.",
                "schema": {
                  "type": "integer"
                },
                "example": 120
              },
              "X-RateLimit-Remaining": {
                "description": "Legacy mirror: requests left in the current window.",
                "schema": {
                  "type": "integer"
                },
                "example": 118
              },
              "X-RateLimit-Reset": {
                "description": "Legacy mirror: seconds until the current window resets.",
                "schema": {
                  "type": "integer"
                },
                "example": 57
              },
              "X-API-Version": {
                "description": "API version serving the response.",
                "schema": {
                  "type": "string"
                },
                "example": "v1"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "The backend is temporarily unavailable.",
            "headers": {
              "RateLimit-Policy": {
                "description": "Advertised quota policy, RFC 9331 style. Example: \"default\";q=120;w=60",
                "schema": {
                  "type": "string"
                },
                "example": "\"default\";q=120;w=60"
              },
              "RateLimit": {
                "description": "Current quota state for this client. Example: \"default\";r=118;t=57",
                "schema": {
                  "type": "string"
                },
                "example": "\"default\";r=118;t=57"
              },
              "X-RateLimit-Limit": {
                "description": "Legacy mirror: requests allowed per window.",
                "schema": {
                  "type": "integer"
                },
                "example": 120
              },
              "X-RateLimit-Remaining": {
                "description": "Legacy mirror: requests left in the current window.",
                "schema": {
                  "type": "integer"
                },
                "example": 118
              },
              "X-RateLimit-Reset": {
                "description": "Legacy mirror: seconds until the current window resets.",
                "schema": {
                  "type": "integer"
                },
                "example": 57
              },
              "X-API-Version": {
                "description": "API version serving the response.",
                "schema": {
                  "type": "string"
                },
                "example": "v1"
              },
              "Retry-After": {
                "description": "Seconds to wait before retrying (sent on 429 and 503).",
                "schema": {
                  "type": "integer"
                },
                "example": 30
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "default": {
            "description": "Any other failure. Always the same typed problem document.",
            "headers": {
              "RateLimit-Policy": {
                "description": "Advertised quota policy, RFC 9331 style. Example: \"default\";q=120;w=60",
                "schema": {
                  "type": "string"
                },
                "example": "\"default\";q=120;w=60"
              },
              "RateLimit": {
                "description": "Current quota state for this client. Example: \"default\";r=118;t=57",
                "schema": {
                  "type": "string"
                },
                "example": "\"default\";r=118;t=57"
              },
              "X-RateLimit-Limit": {
                "description": "Legacy mirror: requests allowed per window.",
                "schema": {
                  "type": "integer"
                },
                "example": 120
              },
              "X-RateLimit-Remaining": {
                "description": "Legacy mirror: requests left in the current window.",
                "schema": {
                  "type": "integer"
                },
                "example": 118
              },
              "X-RateLimit-Reset": {
                "description": "Legacy mirror: seconds until the current window resets.",
                "schema": {
                  "type": "integer"
                },
                "example": 57
              },
              "X-API-Version": {
                "description": "API version serving the response.",
                "schema": {
                  "type": "string"
                },
                "example": "v1"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/status": {
      "get": {
        "operationId": "getSiteStatus",
        "tags": [
          "platform"
        ],
        "summary": "Get live platform status",
        "description": "Reports whether the VeloRix platform is live or in maintenance mode, with the operator's current status message. Call this before telling a player to register for a tournament.",
        "parameters": [
          {
            "name": "pretty",
            "in": "query",
            "required": false,
            "description": "Pretty-print the JSON response body with two-space indentation.",
            "schema": {
              "type": "boolean",
              "default": true
            },
            "example": true
          }
        ],
        "responses": {
          "200": {
            "description": "Current platform status.",
            "headers": {
              "RateLimit-Policy": {
                "description": "Advertised quota policy, RFC 9331 style. Example: \"default\";q=120;w=60",
                "schema": {
                  "type": "string"
                },
                "example": "\"default\";q=120;w=60"
              },
              "RateLimit": {
                "description": "Current quota state for this client. Example: \"default\";r=118;t=57",
                "schema": {
                  "type": "string"
                },
                "example": "\"default\";r=118;t=57"
              },
              "X-RateLimit-Limit": {
                "description": "Legacy mirror: requests allowed per window.",
                "schema": {
                  "type": "integer"
                },
                "example": 120
              },
              "X-RateLimit-Remaining": {
                "description": "Legacy mirror: requests left in the current window.",
                "schema": {
                  "type": "integer"
                },
                "example": 118
              },
              "X-RateLimit-Reset": {
                "description": "Legacy mirror: seconds until the current window resets.",
                "schema": {
                  "type": "integer"
                },
                "example": 57
              },
              "X-API-Version": {
                "description": "API version serving the response.",
                "schema": {
                  "type": "string"
                },
                "example": "v1"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SiteStatus"
                }
              }
            }
          },
          "400": {
            "description": "A query parameter failed validation.",
            "headers": {
              "RateLimit-Policy": {
                "description": "Advertised quota policy, RFC 9331 style. Example: \"default\";q=120;w=60",
                "schema": {
                  "type": "string"
                },
                "example": "\"default\";q=120;w=60"
              },
              "RateLimit": {
                "description": "Current quota state for this client. Example: \"default\";r=118;t=57",
                "schema": {
                  "type": "string"
                },
                "example": "\"default\";r=118;t=57"
              },
              "X-RateLimit-Limit": {
                "description": "Legacy mirror: requests allowed per window.",
                "schema": {
                  "type": "integer"
                },
                "example": 120
              },
              "X-RateLimit-Remaining": {
                "description": "Legacy mirror: requests left in the current window.",
                "schema": {
                  "type": "integer"
                },
                "example": 118
              },
              "X-RateLimit-Reset": {
                "description": "Legacy mirror: seconds until the current window resets.",
                "schema": {
                  "type": "integer"
                },
                "example": 57
              },
              "X-API-Version": {
                "description": "API version serving the response.",
                "schema": {
                  "type": "string"
                },
                "example": "v1"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "405": {
            "description": "The API is read-only; only GET, HEAD and OPTIONS are accepted.",
            "headers": {
              "RateLimit-Policy": {
                "description": "Advertised quota policy, RFC 9331 style. Example: \"default\";q=120;w=60",
                "schema": {
                  "type": "string"
                },
                "example": "\"default\";q=120;w=60"
              },
              "RateLimit": {
                "description": "Current quota state for this client. Example: \"default\";r=118;t=57",
                "schema": {
                  "type": "string"
                },
                "example": "\"default\";r=118;t=57"
              },
              "X-RateLimit-Limit": {
                "description": "Legacy mirror: requests allowed per window.",
                "schema": {
                  "type": "integer"
                },
                "example": 120
              },
              "X-RateLimit-Remaining": {
                "description": "Legacy mirror: requests left in the current window.",
                "schema": {
                  "type": "integer"
                },
                "example": 118
              },
              "X-RateLimit-Reset": {
                "description": "Legacy mirror: seconds until the current window resets.",
                "schema": {
                  "type": "integer"
                },
                "example": 57
              },
              "X-API-Version": {
                "description": "API version serving the response.",
                "schema": {
                  "type": "string"
                },
                "example": "v1"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "The client exceeded the published quota. Honour Retry-After before retrying.",
            "headers": {
              "RateLimit-Policy": {
                "description": "Advertised quota policy, RFC 9331 style. Example: \"default\";q=120;w=60",
                "schema": {
                  "type": "string"
                },
                "example": "\"default\";q=120;w=60"
              },
              "RateLimit": {
                "description": "Current quota state for this client. Example: \"default\";r=118;t=57",
                "schema": {
                  "type": "string"
                },
                "example": "\"default\";r=118;t=57"
              },
              "X-RateLimit-Limit": {
                "description": "Legacy mirror: requests allowed per window.",
                "schema": {
                  "type": "integer"
                },
                "example": 120
              },
              "X-RateLimit-Remaining": {
                "description": "Legacy mirror: requests left in the current window.",
                "schema": {
                  "type": "integer"
                },
                "example": 118
              },
              "X-RateLimit-Reset": {
                "description": "Legacy mirror: seconds until the current window resets.",
                "schema": {
                  "type": "integer"
                },
                "example": 57
              },
              "X-API-Version": {
                "description": "API version serving the response.",
                "schema": {
                  "type": "string"
                },
                "example": "v1"
              },
              "Retry-After": {
                "description": "Seconds to wait before retrying (sent on 429 and 503).",
                "schema": {
                  "type": "integer"
                },
                "example": 30
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error.",
            "headers": {
              "RateLimit-Policy": {
                "description": "Advertised quota policy, RFC 9331 style. Example: \"default\";q=120;w=60",
                "schema": {
                  "type": "string"
                },
                "example": "\"default\";q=120;w=60"
              },
              "RateLimit": {
                "description": "Current quota state for this client. Example: \"default\";r=118;t=57",
                "schema": {
                  "type": "string"
                },
                "example": "\"default\";r=118;t=57"
              },
              "X-RateLimit-Limit": {
                "description": "Legacy mirror: requests allowed per window.",
                "schema": {
                  "type": "integer"
                },
                "example": 120
              },
              "X-RateLimit-Remaining": {
                "description": "Legacy mirror: requests left in the current window.",
                "schema": {
                  "type": "integer"
                },
                "example": 118
              },
              "X-RateLimit-Reset": {
                "description": "Legacy mirror: seconds until the current window resets.",
                "schema": {
                  "type": "integer"
                },
                "example": 57
              },
              "X-API-Version": {
                "description": "API version serving the response.",
                "schema": {
                  "type": "string"
                },
                "example": "v1"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "The content database rejected the query.",
            "headers": {
              "RateLimit-Policy": {
                "description": "Advertised quota policy, RFC 9331 style. Example: \"default\";q=120;w=60",
                "schema": {
                  "type": "string"
                },
                "example": "\"default\";q=120;w=60"
              },
              "RateLimit": {
                "description": "Current quota state for this client. Example: \"default\";r=118;t=57",
                "schema": {
                  "type": "string"
                },
                "example": "\"default\";r=118;t=57"
              },
              "X-RateLimit-Limit": {
                "description": "Legacy mirror: requests allowed per window.",
                "schema": {
                  "type": "integer"
                },
                "example": 120
              },
              "X-RateLimit-Remaining": {
                "description": "Legacy mirror: requests left in the current window.",
                "schema": {
                  "type": "integer"
                },
                "example": 118
              },
              "X-RateLimit-Reset": {
                "description": "Legacy mirror: seconds until the current window resets.",
                "schema": {
                  "type": "integer"
                },
                "example": 57
              },
              "X-API-Version": {
                "description": "API version serving the response.",
                "schema": {
                  "type": "string"
                },
                "example": "v1"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "The backend is temporarily unavailable.",
            "headers": {
              "RateLimit-Policy": {
                "description": "Advertised quota policy, RFC 9331 style. Example: \"default\";q=120;w=60",
                "schema": {
                  "type": "string"
                },
                "example": "\"default\";q=120;w=60"
              },
              "RateLimit": {
                "description": "Current quota state for this client. Example: \"default\";r=118;t=57",
                "schema": {
                  "type": "string"
                },
                "example": "\"default\";r=118;t=57"
              },
              "X-RateLimit-Limit": {
                "description": "Legacy mirror: requests allowed per window.",
                "schema": {
                  "type": "integer"
                },
                "example": 120
              },
              "X-RateLimit-Remaining": {
                "description": "Legacy mirror: requests left in the current window.",
                "schema": {
                  "type": "integer"
                },
                "example": 118
              },
              "X-RateLimit-Reset": {
                "description": "Legacy mirror: seconds until the current window resets.",
                "schema": {
                  "type": "integer"
                },
                "example": 57
              },
              "X-API-Version": {
                "description": "API version serving the response.",
                "schema": {
                  "type": "string"
                },
                "example": "v1"
              },
              "Retry-After": {
                "description": "Seconds to wait before retrying (sent on 429 and 503).",
                "schema": {
                  "type": "integer"
                },
                "example": 30
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "default": {
            "description": "Any other failure. Always the same typed problem document.",
            "headers": {
              "RateLimit-Policy": {
                "description": "Advertised quota policy, RFC 9331 style. Example: \"default\";q=120;w=60",
                "schema": {
                  "type": "string"
                },
                "example": "\"default\";q=120;w=60"
              },
              "RateLimit": {
                "description": "Current quota state for this client. Example: \"default\";r=118;t=57",
                "schema": {
                  "type": "string"
                },
                "example": "\"default\";r=118;t=57"
              },
              "X-RateLimit-Limit": {
                "description": "Legacy mirror: requests allowed per window.",
                "schema": {
                  "type": "integer"
                },
                "example": 120
              },
              "X-RateLimit-Remaining": {
                "description": "Legacy mirror: requests left in the current window.",
                "schema": {
                  "type": "integer"
                },
                "example": 118
              },
              "X-RateLimit-Reset": {
                "description": "Legacy mirror: seconds until the current window resets.",
                "schema": {
                  "type": "integer"
                },
                "example": 57
              },
              "X-API-Version": {
                "description": "API version serving the response.",
                "schema": {
                  "type": "string"
                },
                "example": "v1"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "parameters": {
      "Pretty": {
        "name": "pretty",
        "in": "query",
        "required": false,
        "description": "Pretty-print the JSON response body with two-space indentation.",
        "schema": {
          "type": "boolean",
          "default": true
        },
        "example": true
      }
    },
    "headers": {
      "RateLimitPolicy": {
        "description": "Advertised quota policy, RFC 9331 style. Example: \"default\";q=120;w=60",
        "schema": {
          "type": "string"
        },
        "example": "\"default\";q=120;w=60"
      },
      "RateLimit": {
        "description": "Current quota state for this client. Example: \"default\";r=118;t=57",
        "schema": {
          "type": "string"
        },
        "example": "\"default\";r=118;t=57"
      },
      "RateLimitLimit": {
        "description": "Legacy mirror: requests allowed per window.",
        "schema": {
          "type": "integer"
        },
        "example": 120
      },
      "RateLimitRemaining": {
        "description": "Legacy mirror: requests left in the current window.",
        "schema": {
          "type": "integer"
        },
        "example": 118
      },
      "RateLimitReset": {
        "description": "Legacy mirror: seconds until the current window resets.",
        "schema": {
          "type": "integer"
        },
        "example": 57
      },
      "ApiVersion": {
        "description": "API version serving the response.",
        "schema": {
          "type": "string"
        },
        "example": "v1"
      },
      "RetryAfter": {
        "description": "Seconds to wait before retrying (sent on 429 and 503).",
        "schema": {
          "type": "integer"
        },
        "example": 30
      }
    },
    "responses": {
      "BadRequest": {
        "description": "A query parameter failed validation.",
        "headers": {
          "RateLimit-Policy": {
            "$ref": "#/components/headers/RateLimitPolicy"
          },
          "RateLimit": {
            "$ref": "#/components/headers/RateLimit"
          },
          "X-RateLimit-Limit": {
            "$ref": "#/components/headers/RateLimitLimit"
          },
          "X-RateLimit-Remaining": {
            "$ref": "#/components/headers/RateLimitRemaining"
          },
          "X-RateLimit-Reset": {
            "$ref": "#/components/headers/RateLimitReset"
          },
          "X-API-Version": {
            "$ref": "#/components/headers/ApiVersion"
          }
        },
        "content": {
          "application/problem+json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      },
      "NotFound": {
        "description": "The requested resource does not exist.",
        "headers": {
          "RateLimit-Policy": {
            "$ref": "#/components/headers/RateLimitPolicy"
          },
          "RateLimit": {
            "$ref": "#/components/headers/RateLimit"
          },
          "X-RateLimit-Limit": {
            "$ref": "#/components/headers/RateLimitLimit"
          },
          "X-RateLimit-Remaining": {
            "$ref": "#/components/headers/RateLimitRemaining"
          },
          "X-RateLimit-Reset": {
            "$ref": "#/components/headers/RateLimitReset"
          },
          "X-API-Version": {
            "$ref": "#/components/headers/ApiVersion"
          }
        },
        "content": {
          "application/problem+json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      },
      "MethodNotAllowed": {
        "description": "The API is read-only; only GET, HEAD and OPTIONS are accepted.",
        "headers": {
          "RateLimit-Policy": {
            "$ref": "#/components/headers/RateLimitPolicy"
          },
          "RateLimit": {
            "$ref": "#/components/headers/RateLimit"
          },
          "X-RateLimit-Limit": {
            "$ref": "#/components/headers/RateLimitLimit"
          },
          "X-RateLimit-Remaining": {
            "$ref": "#/components/headers/RateLimitRemaining"
          },
          "X-RateLimit-Reset": {
            "$ref": "#/components/headers/RateLimitReset"
          },
          "X-API-Version": {
            "$ref": "#/components/headers/ApiVersion"
          }
        },
        "content": {
          "application/problem+json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      },
      "RateLimited": {
        "description": "The client exceeded the published quota. Honour Retry-After before retrying.",
        "headers": {
          "RateLimit-Policy": {
            "$ref": "#/components/headers/RateLimitPolicy"
          },
          "RateLimit": {
            "$ref": "#/components/headers/RateLimit"
          },
          "X-RateLimit-Limit": {
            "$ref": "#/components/headers/RateLimitLimit"
          },
          "X-RateLimit-Remaining": {
            "$ref": "#/components/headers/RateLimitRemaining"
          },
          "X-RateLimit-Reset": {
            "$ref": "#/components/headers/RateLimitReset"
          },
          "X-API-Version": {
            "$ref": "#/components/headers/ApiVersion"
          },
          "Retry-After": {
            "$ref": "#/components/headers/RetryAfter"
          }
        },
        "content": {
          "application/problem+json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      },
      "InternalError": {
        "description": "Unexpected server error.",
        "headers": {
          "RateLimit-Policy": {
            "$ref": "#/components/headers/RateLimitPolicy"
          },
          "RateLimit": {
            "$ref": "#/components/headers/RateLimit"
          },
          "X-RateLimit-Limit": {
            "$ref": "#/components/headers/RateLimitLimit"
          },
          "X-RateLimit-Remaining": {
            "$ref": "#/components/headers/RateLimitRemaining"
          },
          "X-RateLimit-Reset": {
            "$ref": "#/components/headers/RateLimitReset"
          },
          "X-API-Version": {
            "$ref": "#/components/headers/ApiVersion"
          }
        },
        "content": {
          "application/problem+json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      },
      "UpstreamError": {
        "description": "The content database rejected the query.",
        "headers": {
          "RateLimit-Policy": {
            "$ref": "#/components/headers/RateLimitPolicy"
          },
          "RateLimit": {
            "$ref": "#/components/headers/RateLimit"
          },
          "X-RateLimit-Limit": {
            "$ref": "#/components/headers/RateLimitLimit"
          },
          "X-RateLimit-Remaining": {
            "$ref": "#/components/headers/RateLimitRemaining"
          },
          "X-RateLimit-Reset": {
            "$ref": "#/components/headers/RateLimitReset"
          },
          "X-API-Version": {
            "$ref": "#/components/headers/ApiVersion"
          }
        },
        "content": {
          "application/problem+json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      },
      "Unavailable": {
        "description": "The backend is temporarily unavailable.",
        "headers": {
          "RateLimit-Policy": {
            "$ref": "#/components/headers/RateLimitPolicy"
          },
          "RateLimit": {
            "$ref": "#/components/headers/RateLimit"
          },
          "X-RateLimit-Limit": {
            "$ref": "#/components/headers/RateLimitLimit"
          },
          "X-RateLimit-Remaining": {
            "$ref": "#/components/headers/RateLimitRemaining"
          },
          "X-RateLimit-Reset": {
            "$ref": "#/components/headers/RateLimitReset"
          },
          "X-API-Version": {
            "$ref": "#/components/headers/ApiVersion"
          },
          "Retry-After": {
            "$ref": "#/components/headers/RetryAfter"
          }
        },
        "content": {
          "application/problem+json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      },
      "ProblemDefault": {
        "description": "Any other failure. Always the same typed problem document.",
        "headers": {
          "RateLimit-Policy": {
            "$ref": "#/components/headers/RateLimitPolicy"
          },
          "RateLimit": {
            "$ref": "#/components/headers/RateLimit"
          },
          "X-RateLimit-Limit": {
            "$ref": "#/components/headers/RateLimitLimit"
          },
          "X-RateLimit-Remaining": {
            "$ref": "#/components/headers/RateLimitRemaining"
          },
          "X-RateLimit-Reset": {
            "$ref": "#/components/headers/RateLimitReset"
          },
          "X-API-Version": {
            "$ref": "#/components/headers/ApiVersion"
          }
        },
        "content": {
          "application/problem+json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      }
    },
    "schemas": {
      "ApiIndex": {
        "type": "object",
        "description": "Self-describing index of the VeloRix public API.",
        "required": [
          "name",
          "version",
          "openapi",
          "endpoints"
        ],
        "properties": {
          "name": {
            "type": "string"
          },
          "version": {
            "type": "string"
          },
          "openapi": {
            "type": "string",
            "format": "uri"
          },
          "documentation": {
            "type": "string",
            "format": "uri"
          },
          "mcp": {
            "type": "string",
            "format": "uri"
          },
          "rate_limit": {
            "type": "object",
            "description": "Published quota for this API.",
            "properties": {
              "limit": {
                "type": "integer"
              },
              "window_seconds": {
                "type": "integer"
              },
              "headers": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              "documentation": {
                "type": "string",
                "format": "uri"
              }
            }
          },
          "versioning": {
            "type": "object",
            "description": "Versioning and deprecation policy summary.",
            "properties": {
              "current": {
                "type": "string"
              },
              "scheme": {
                "type": "string"
              },
              "deprecation_signals": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              "minimum_support_window_days": {
                "type": "integer"
              },
              "policy": {
                "type": "string",
                "format": "uri"
              }
            }
          },
          "endpoints": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "operationId",
                "method",
                "path"
              ],
              "properties": {
                "operationId": {
                  "type": "string"
                },
                "method": {
                  "type": "string"
                },
                "path": {
                  "type": "string"
                }
              }
            }
          }
        }
      },
      "PageSummary": {
        "type": "object",
        "description": "Summary of a published VeloRix page.",
        "required": [
          "slug",
          "title"
        ],
        "properties": {
          "slug": {
            "type": "string",
            "description": "Lowercase hyphenated identifier used in URLs."
          },
          "title": {
            "type": "string",
            "description": "Page title."
          },
          "subtitle": {
            "type": [
              "string",
              "null"
            ],
            "description": "Optional one-line subtitle."
          },
          "updated_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time",
            "description": "Last edit timestamp (UTC)."
          }
        }
      },
      "PageList": {
        "type": "object",
        "description": "List of published pages with the paging window that produced it.",
        "required": [
          "items",
          "count"
        ],
        "properties": {
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PageSummary"
            }
          },
          "count": {
            "type": "integer",
            "minimum": 0
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 100
          },
          "offset": {
            "type": "integer",
            "minimum": 0
          },
          "query": {
            "type": [
              "string",
              "null"
            ]
          }
        }
      },
      "Page": {
        "allOf": [
          {
            "$ref": "#/components/schemas/PageSummary"
          },
          {
            "type": "object",
            "required": [
              "content"
            ],
            "properties": {
              "content": {
                "type": "string",
                "description": "Full page body in Markdown."
              }
            }
          }
        ]
      },
      "ApkRelease": {
        "type": "object",
        "description": "An active VeloRix Android release.",
        "required": [
          "version"
        ],
        "properties": {
          "version": {
            "type": "string",
            "description": "Semantic version string, e.g. '1.4.2'."
          },
          "file_path": {
            "type": [
              "string",
              "null"
            ],
            "description": "Storage path of the APK object."
          },
          "file_size": {
            "type": [
              "integer",
              "null"
            ],
            "description": "APK size in bytes."
          },
          "changelog": {
            "type": [
              "string",
              "null"
            ],
            "description": "Release notes in Markdown."
          },
          "released_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          }
        }
      },
      "SiteStatus": {
        "type": "object",
        "description": "Live platform status.",
        "required": [
          "status",
          "maintenance",
          "message"
        ],
        "properties": {
          "status": {
            "type": "string",
            "enum": [
              "live",
              "maintenance"
            ]
          },
          "maintenance": {
            "type": "boolean"
          },
          "message": {
            "type": "string"
          },
          "checked_at": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "Error": {
        "type": "object",
        "description": "Structured RFC 9457 problem document. Every non-2xx response uses this shape.",
        "required": [
          "status",
          "error",
          "title"
        ],
        "properties": {
          "type": {
            "type": "string",
            "format": "uri",
            "description": "Link to documentation for this error code."
          },
          "title": {
            "type": "string",
            "description": "Short machine-readable error title (same as error.code)."
          },
          "status": {
            "type": "integer",
            "description": "HTTP status code."
          },
          "detail": {
            "type": "string",
            "description": "Human-readable explanation (mirrors error.message)."
          },
          "instance": {
            "type": "string",
            "description": "Path of the request that failed."
          },
          "error": {
            "type": "object",
            "description": "Machine-readable error payload.",
            "required": [
              "code",
              "message"
            ],
            "properties": {
              "code": {
                "type": "string",
                "description": "Stable error code.",
                "enum": [
                  "bad_request",
                  "page_not_found",
                  "no_active_release",
                  "endpoint_not_found",
                  "method_not_allowed",
                  "rate_limited",
                  "upstream_error",
                  "backend_unavailable",
                  "internal_error"
                ]
              },
              "message": {
                "type": "string",
                "description": "Human-readable explanation."
              },
              "hint": {
                "type": "string",
                "description": "How to resolve or recover from the error."
              },
              "retry_after": {
                "type": [
                  "integer",
                  "null"
                ],
                "description": "Seconds to wait before retrying, when applicable."
              }
            }
          }
        }
      }
    }
  }
}
