{
    "openapi": "3.1.0",
    "info": {
        "title": "Learn ATC Public API",
        "version": "v1",
        "description": "Read-mostly public JSON API for products, content, and aviation reference data.\n\nAuthentication uses Sanctum bearer tokens. Exchange your account credentials at `POST /api/v1/auth/login` for a token, then send it as `Authorization: Bearer {token}` on subsequent requests.\n\nEvery successful response uses the same envelope:\n```\n{ \"data\": ..., \"meta\": { \"url\", \"locale\", \"languages\", \"current_page\"?, \"total\"?, \"total_pages\"?, ... } }\n```\n\n## Also available over WebSocket\n\nEvery operation marked **WS** below is also reachable as a WebSocket event with the same payload contract. Connect to the WS endpoint, then send the event name listed under each operation's description (e.g. `api-v1-me.show`). Authenticated WS calls accept the same bearer in the message data as `authtoken`.\n",
        "contact": {
            "name": "Learn ATC",
            "url": "https://www.learn-atc.com"
        },
        "license": {
            "name": "Proprietary"
        }
    },
    "servers": [
        {
            "url": "https://www.learn-atc.com",
            "description": "Current host"
        },
        {
            "url": "https://www.learn-atc.com",
            "description": "Production"
        }
    ],
    "tags": [
        {
            "name": "Authentication"
        },
        {
            "name": "API tokens"
        },
        {
            "name": "Me"
        },
        {
            "name": "User statistics"
        },
        {
            "name": "Products"
        },
        {
            "name": "Features"
        },
        {
            "name": "Blogs"
        },
        {
            "name": "Wiki"
        },
        {
            "name": "Questions"
        },
        {
            "name": "Syllabus"
        },
        {
            "name": "Flight schools"
        },
        {
            "name": "Flight instructors"
        },
        {
            "name": "Aerodromes"
        },
        {
            "name": "Frequencies"
        },
        {
            "name": "Simulator"
        },
        {
            "name": "Pricing"
        }
    ],
    "paths": {
        "/api/v1/aerodromes": {
            "get": {
                "operationId": "aerodromeIndex",
                "summary": "List aerodrome [WS]",
                "tags": [
                    "Aerodromes"
                ],
                "parameters": [
                    {
                        "name": "page",
                        "in": "query",
                        "required": false,
                        "description": "Page index for paginated lists.",
                        "schema": {
                            "type": "integer",
                            "minimum": 1,
                            "default": 1
                        }
                    },
                    {
                        "name": "per_page",
                        "in": "query",
                        "required": false,
                        "description": "Items per page (capped per endpoint, see endpoint description).",
                        "schema": {
                            "type": "integer",
                            "minimum": 1,
                            "maximum": 500
                        }
                    },
                    {
                        "in": "query",
                        "required": false,
                        "name": "country",
                        "description": "Filter by country (partial match against the country name).",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "in": "query",
                        "required": false,
                        "name": "type",
                        "description": "Aerodrome type slug (e.g. `international-airport`, `medium-airport`).",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "in": "query",
                        "required": false,
                        "name": "traffic_type",
                        "description": "IFR / VFR filter.",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "ifr",
                                "vfr",
                                "both"
                            ]
                        }
                    },
                    {
                        "name": "search",
                        "in": "query",
                        "required": false,
                        "description": "Free-text search across the primary text fields.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "in": "query",
                        "required": false,
                        "name": "icao",
                        "description": "Partial ICAO match.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "in": "query",
                        "required": false,
                        "name": "iata",
                        "description": "Partial IATA match.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "locale",
                        "in": "query",
                        "required": false,
                        "description": "Render translatable fields in this locale (see meta.languages).",
                        "schema": {
                            "type": "string",
                            "example": "en"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Envelope"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Resource not found.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                },
                "description": "**Also reachable over WebSocket** as event `api-v1-aerodrome.index`.",
                "x-websocket": {
                    "event": "api-v1-aerodrome.index",
                    "needAuth": false
                }
            }
        },
        "/api/v1/aerodromes/{icao}": {
            "get": {
                "operationId": "aerodromeShow",
                "summary": "Show aerodrome [WS]",
                "tags": [
                    "Aerodromes"
                ],
                "parameters": [
                    {
                        "name": "icao",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "ICAO airport code (case-insensitive). Example: `LOWW`."
                    },
                    {
                        "name": "locale",
                        "in": "query",
                        "required": false,
                        "description": "Render translatable fields in this locale (see meta.languages).",
                        "schema": {
                            "type": "string",
                            "example": "en"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Envelope"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Resource not found.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                },
                "description": "**Also reachable over WebSocket** as event `api-v1-aerodrome.show`.",
                "x-websocket": {
                    "event": "api-v1-aerodrome.show",
                    "needAuth": false
                }
            }
        },
        "/api/v1/aerodromes/{icao}/frequencies": {
            "get": {
                "operationId": "frequencyForAerodrome",
                "summary": "List frequencies for frequency [WS]",
                "tags": [
                    "Frequencies"
                ],
                "parameters": [
                    {
                        "name": "icao",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "ICAO airport code (case-insensitive). Example: `LOWW`."
                    },
                    {
                        "name": "locale",
                        "in": "query",
                        "required": false,
                        "description": "Render translatable fields in this locale (see meta.languages).",
                        "schema": {
                            "type": "string",
                            "example": "en"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Envelope"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Resource not found.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                },
                "description": "**Also reachable over WebSocket** as event `api-v1-frequency.forAerodrome`.",
                "x-websocket": {
                    "event": "api-v1-frequency.forAerodrome",
                    "needAuth": false
                }
            }
        },
        "/api/v1/auth/login": {
            "post": {
                "operationId": "authLogin",
                "summary": "Log in to auth",
                "tags": [
                    "Authentication"
                ],
                "parameters": [],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Envelope"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Resource not found.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                },
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "email",
                                    "password"
                                ],
                                "properties": {
                                    "email": {
                                        "type": "string",
                                        "format": "email"
                                    },
                                    "password": {
                                        "type": "string",
                                        "format": "password"
                                    }
                                }
                            }
                        }
                    }
                }
            }
        },
        "/api/v1/auth/logout": {
            "post": {
                "operationId": "authLogout",
                "summary": "Log out from auth",
                "tags": [
                    "Authentication"
                ],
                "parameters": [],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Envelope"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Resource not found.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Unauthenticated.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/v1/auth/tokens": {
            "get": {
                "operationId": "tokensIndex",
                "summary": "List tokens",
                "tags": [
                    "API tokens"
                ],
                "parameters": [
                    {
                        "name": "page",
                        "in": "query",
                        "required": false,
                        "description": "Page index for paginated lists.",
                        "schema": {
                            "type": "integer",
                            "minimum": 1,
                            "default": 1
                        }
                    },
                    {
                        "name": "per_page",
                        "in": "query",
                        "required": false,
                        "description": "Items per page (capped per endpoint, see endpoint description).",
                        "schema": {
                            "type": "integer",
                            "minimum": 1,
                            "maximum": 500
                        }
                    },
                    {
                        "name": "locale",
                        "in": "query",
                        "required": false,
                        "description": "Render translatable fields in this locale (see meta.languages).",
                        "schema": {
                            "type": "string",
                            "example": "en"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Envelope"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Resource not found.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Unauthenticated.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            },
            "post": {
                "operationId": "tokensStore",
                "summary": "Create tokens",
                "tags": [
                    "API tokens"
                ],
                "parameters": [],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Envelope"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Resource not found.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Unauthenticated.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "name"
                                ],
                                "properties": {
                                    "name": {
                                        "type": "string",
                                        "minLength": 2,
                                        "maxLength": 60,
                                        "description": "Human-readable label for the token (e.g. `cli`, `automation-bot`). The `login-` prefix is reserved."
                                    }
                                }
                            }
                        }
                    }
                }
            }
        },
        "/api/v1/auth/tokens/{id}": {
            "delete": {
                "operationId": "tokensDestroy",
                "summary": "Revoke tokens",
                "tags": [
                    "API tokens"
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Resource id."
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Envelope"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Resource not found.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Unauthenticated.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/v1/blogs": {
            "get": {
                "operationId": "blogIndex",
                "summary": "List blog [WS]",
                "tags": [
                    "Blogs"
                ],
                "parameters": [
                    {
                        "name": "page",
                        "in": "query",
                        "required": false,
                        "description": "Page index for paginated lists.",
                        "schema": {
                            "type": "integer",
                            "minimum": 1,
                            "default": 1
                        }
                    },
                    {
                        "name": "per_page",
                        "in": "query",
                        "required": false,
                        "description": "Items per page (capped per endpoint, see endpoint description).",
                        "schema": {
                            "type": "integer",
                            "minimum": 1,
                            "maximum": 500
                        }
                    },
                    {
                        "name": "search",
                        "in": "query",
                        "required": false,
                        "description": "Free-text search across the primary text fields.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "in": "query",
                        "required": false,
                        "name": "categories",
                        "description": "Filter by blog-category tag(s). Repeat the param for multiple.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "locale",
                        "in": "query",
                        "required": false,
                        "description": "Render translatable fields in this locale (see meta.languages).",
                        "schema": {
                            "type": "string",
                            "example": "en"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Envelope"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Resource not found.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                },
                "description": "**Also reachable over WebSocket** as event `api-v1-blog.index`.",
                "x-websocket": {
                    "event": "api-v1-blog.index",
                    "needAuth": false
                }
            }
        },
        "/api/v1/blogs/{slug}": {
            "get": {
                "operationId": "blogShow",
                "summary": "Show blog [WS]",
                "tags": [
                    "Blogs"
                ],
                "parameters": [
                    {
                        "name": "slug",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Resource slug or numeric/UUID id."
                    },
                    {
                        "name": "locale",
                        "in": "query",
                        "required": false,
                        "description": "Render translatable fields in this locale (see meta.languages).",
                        "schema": {
                            "type": "string",
                            "example": "en"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Envelope"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Resource not found.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                },
                "description": "**Also reachable over WebSocket** as event `api-v1-blog.show`.",
                "x-websocket": {
                    "event": "api-v1-blog.show",
                    "needAuth": false
                }
            }
        },
        "/api/v1/features": {
            "get": {
                "operationId": "featureIndex",
                "summary": "List feature [WS]",
                "tags": [
                    "Features"
                ],
                "parameters": [
                    {
                        "name": "page",
                        "in": "query",
                        "required": false,
                        "description": "Page index for paginated lists.",
                        "schema": {
                            "type": "integer",
                            "minimum": 1,
                            "default": 1
                        }
                    },
                    {
                        "name": "per_page",
                        "in": "query",
                        "required": false,
                        "description": "Items per page (capped per endpoint, see endpoint description).",
                        "schema": {
                            "type": "integer",
                            "minimum": 1,
                            "maximum": 500
                        }
                    },
                    {
                        "name": "locale",
                        "in": "query",
                        "required": false,
                        "description": "Render translatable fields in this locale (see meta.languages).",
                        "schema": {
                            "type": "string",
                            "example": "en"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Envelope"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Resource not found.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                },
                "description": "**Also reachable over WebSocket** as event `api-v1-feature.index`.",
                "x-websocket": {
                    "event": "api-v1-feature.index",
                    "needAuth": false
                }
            }
        },
        "/api/v1/features/{slug}": {
            "get": {
                "operationId": "featureShow",
                "summary": "Show feature [WS]",
                "tags": [
                    "Features"
                ],
                "parameters": [
                    {
                        "name": "slug",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Resource slug or numeric/UUID id."
                    },
                    {
                        "name": "locale",
                        "in": "query",
                        "required": false,
                        "description": "Render translatable fields in this locale (see meta.languages).",
                        "schema": {
                            "type": "string",
                            "example": "en"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Envelope"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Resource not found.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                },
                "description": "**Also reachable over WebSocket** as event `api-v1-feature.show`.",
                "x-websocket": {
                    "event": "api-v1-feature.show",
                    "needAuth": false
                }
            }
        },
        "/api/v1/flightinstructors": {
            "get": {
                "operationId": "flightinstructorIndex",
                "summary": "List flightinstructor [WS]",
                "tags": [
                    "Flight instructors"
                ],
                "parameters": [
                    {
                        "name": "page",
                        "in": "query",
                        "required": false,
                        "description": "Page index for paginated lists.",
                        "schema": {
                            "type": "integer",
                            "minimum": 1,
                            "default": 1
                        }
                    },
                    {
                        "name": "per_page",
                        "in": "query",
                        "required": false,
                        "description": "Items per page (capped per endpoint, see endpoint description).",
                        "schema": {
                            "type": "integer",
                            "minimum": 1,
                            "maximum": 500
                        }
                    },
                    {
                        "in": "query",
                        "required": false,
                        "name": "country",
                        "description": "ISO 3166-1 alpha-2 country code.",
                        "schema": {
                            "type": "string",
                            "example": "AT"
                        }
                    },
                    {
                        "name": "search",
                        "in": "query",
                        "required": false,
                        "description": "Free-text search across the primary text fields.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "in": "query",
                        "required": false,
                        "name": "city",
                        "description": "Partial match against the instructor city.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "in": "query",
                        "required": false,
                        "name": "certification",
                        "description": "Filter by certification slug (see `/api/v1/features` for available grants).",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "in": "query",
                        "required": false,
                        "name": "service",
                        "description": "Filter by offered service slug.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "in": "query",
                        "required": false,
                        "name": "aerodrome",
                        "description": "ICAO of an aerodrome the instructor operates at.",
                        "schema": {
                            "type": "string",
                            "example": "LOWW"
                        }
                    },
                    {
                        "in": "query",
                        "required": false,
                        "name": "accepting_students",
                        "description": "Only return instructors currently accepting new students.",
                        "schema": {
                            "type": "boolean"
                        }
                    },
                    {
                        "in": "query",
                        "required": false,
                        "name": "near_lat",
                        "description": "Latitude for radius search. Use together with `near_lng` (and optional `radius`).",
                        "schema": {
                            "type": "number",
                            "format": "float"
                        }
                    },
                    {
                        "in": "query",
                        "required": false,
                        "name": "near_lng",
                        "description": "Longitude for radius search.",
                        "schema": {
                            "type": "number",
                            "format": "float"
                        }
                    },
                    {
                        "in": "query",
                        "required": false,
                        "name": "radius",
                        "description": "Radius in kilometers (default 50). Only used when `near_lat`+`near_lng` are present.",
                        "schema": {
                            "type": "number",
                            "format": "float",
                            "default": 50
                        }
                    },
                    {
                        "name": "locale",
                        "in": "query",
                        "required": false,
                        "description": "Render translatable fields in this locale (see meta.languages).",
                        "schema": {
                            "type": "string",
                            "example": "en"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Envelope"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Resource not found.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                },
                "description": "**Also reachable over WebSocket** as event `api-v1-flightinstructor.index`.",
                "x-websocket": {
                    "event": "api-v1-flightinstructor.index",
                    "needAuth": false
                }
            }
        },
        "/api/v1/flightinstructors/{slug}": {
            "get": {
                "operationId": "flightinstructorShow",
                "summary": "Show flightinstructor [WS]",
                "tags": [
                    "Flight instructors"
                ],
                "parameters": [
                    {
                        "name": "slug",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Resource slug or numeric/UUID id."
                    },
                    {
                        "name": "locale",
                        "in": "query",
                        "required": false,
                        "description": "Render translatable fields in this locale (see meta.languages).",
                        "schema": {
                            "type": "string",
                            "example": "en"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Envelope"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Resource not found.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                },
                "description": "**Also reachable over WebSocket** as event `api-v1-flightinstructor.show`.",
                "x-websocket": {
                    "event": "api-v1-flightinstructor.show",
                    "needAuth": false
                }
            }
        },
        "/api/v1/flightschools": {
            "get": {
                "operationId": "flightschoolIndex",
                "summary": "List flightschool [WS]",
                "tags": [
                    "Flight schools"
                ],
                "parameters": [
                    {
                        "name": "page",
                        "in": "query",
                        "required": false,
                        "description": "Page index for paginated lists.",
                        "schema": {
                            "type": "integer",
                            "minimum": 1,
                            "default": 1
                        }
                    },
                    {
                        "name": "per_page",
                        "in": "query",
                        "required": false,
                        "description": "Items per page (capped per endpoint, see endpoint description).",
                        "schema": {
                            "type": "integer",
                            "minimum": 1,
                            "maximum": 500
                        }
                    },
                    {
                        "in": "query",
                        "required": false,
                        "name": "country",
                        "description": "ISO 3166-1 alpha-2 country code. Example: AT.",
                        "schema": {
                            "type": "string",
                            "example": "AT"
                        }
                    },
                    {
                        "name": "search",
                        "in": "query",
                        "required": false,
                        "description": "Free-text search across the primary text fields.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "in": "query",
                        "required": false,
                        "name": "city",
                        "description": "Partial match against the school city.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "in": "query",
                        "required": false,
                        "name": "postal_code",
                        "description": "Partial match against the school postal code.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "locale",
                        "in": "query",
                        "required": false,
                        "description": "Render translatable fields in this locale (see meta.languages).",
                        "schema": {
                            "type": "string",
                            "example": "en"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Envelope"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Resource not found.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                },
                "description": "**Also reachable over WebSocket** as event `api-v1-flightschool.index`.",
                "x-websocket": {
                    "event": "api-v1-flightschool.index",
                    "needAuth": false
                }
            }
        },
        "/api/v1/flightschools/{slug}": {
            "get": {
                "operationId": "flightschoolShow",
                "summary": "Show flightschool [WS]",
                "tags": [
                    "Flight schools"
                ],
                "parameters": [
                    {
                        "name": "slug",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Resource slug or numeric/UUID id."
                    },
                    {
                        "name": "locale",
                        "in": "query",
                        "required": false,
                        "description": "Render translatable fields in this locale (see meta.languages).",
                        "schema": {
                            "type": "string",
                            "example": "en"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Envelope"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Resource not found.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                },
                "description": "**Also reachable over WebSocket** as event `api-v1-flightschool.show`.",
                "x-websocket": {
                    "event": "api-v1-flightschool.show",
                    "needAuth": false
                }
            }
        },
        "/api/v1/frequencies": {
            "get": {
                "operationId": "frequencyIndex",
                "summary": "List frequency [WS]",
                "tags": [
                    "Frequencies"
                ],
                "parameters": [
                    {
                        "name": "page",
                        "in": "query",
                        "required": false,
                        "description": "Page index for paginated lists.",
                        "schema": {
                            "type": "integer",
                            "minimum": 1,
                            "default": 1
                        }
                    },
                    {
                        "name": "per_page",
                        "in": "query",
                        "required": false,
                        "description": "Items per page (capped per endpoint, see endpoint description).",
                        "schema": {
                            "type": "integer",
                            "minimum": 1,
                            "maximum": 500
                        }
                    },
                    {
                        "in": "query",
                        "required": false,
                        "name": "icao",
                        "description": "Filter by aerodrome ICAO.",
                        "schema": {
                            "type": "string",
                            "example": "LOWW"
                        }
                    },
                    {
                        "in": "query",
                        "required": false,
                        "name": "country",
                        "description": "Filter by aerodrome country (partial match).",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "in": "query",
                        "required": false,
                        "name": "type",
                        "description": "ATS frequency type (e.g. `TWR`, `GND`, `APP`).",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "in": "query",
                        "required": false,
                        "name": "primary",
                        "description": "Restrict to primary frequencies only.",
                        "schema": {
                            "type": "boolean"
                        }
                    },
                    {
                        "name": "locale",
                        "in": "query",
                        "required": false,
                        "description": "Render translatable fields in this locale (see meta.languages).",
                        "schema": {
                            "type": "string",
                            "example": "en"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Envelope"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Resource not found.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                },
                "description": "**Also reachable over WebSocket** as event `api-v1-frequency.index`.",
                "x-websocket": {
                    "event": "api-v1-frequency.index",
                    "needAuth": false
                }
            }
        },
        "/api/v1/me": {
            "get": {
                "operationId": "meShow",
                "summary": "Show me [WS]",
                "tags": [
                    "Me"
                ],
                "parameters": [
                    {
                        "name": "page",
                        "in": "query",
                        "required": false,
                        "description": "Page index for paginated lists.",
                        "schema": {
                            "type": "integer",
                            "minimum": 1,
                            "default": 1
                        }
                    },
                    {
                        "name": "per_page",
                        "in": "query",
                        "required": false,
                        "description": "Items per page (capped per endpoint, see endpoint description).",
                        "schema": {
                            "type": "integer",
                            "minimum": 1,
                            "maximum": 500
                        }
                    },
                    {
                        "name": "locale",
                        "in": "query",
                        "required": false,
                        "description": "Render translatable fields in this locale (see meta.languages).",
                        "schema": {
                            "type": "string",
                            "example": "en"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Envelope"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Resource not found.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Unauthenticated.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ],
                "description": "**Also reachable over WebSocket** as event `api-v1-me.show`. Pass the bearer as `authtoken` in the WS message data.",
                "x-websocket": {
                    "event": "api-v1-me.show",
                    "needAuth": true
                }
            }
        },
        "/api/v1/me/stats": {
            "get": {
                "operationId": "userStatsIndex",
                "summary": "List user stats [WS]",
                "tags": [
                    "User statistics"
                ],
                "parameters": [
                    {
                        "name": "page",
                        "in": "query",
                        "required": false,
                        "description": "Page index for paginated lists.",
                        "schema": {
                            "type": "integer",
                            "minimum": 1,
                            "default": 1
                        }
                    },
                    {
                        "name": "per_page",
                        "in": "query",
                        "required": false,
                        "description": "Items per page (capped per endpoint, see endpoint description).",
                        "schema": {
                            "type": "integer",
                            "minimum": 1,
                            "maximum": 500
                        }
                    },
                    {
                        "name": "locale",
                        "in": "query",
                        "required": false,
                        "description": "Render translatable fields in this locale (see meta.languages).",
                        "schema": {
                            "type": "string",
                            "example": "en"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Envelope"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Resource not found.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Unauthenticated.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ],
                "description": "**Also reachable over WebSocket** as event `user.stats`. Pass the bearer as `authtoken` in the WS message data.",
                "x-websocket": {
                    "event": "user.stats",
                    "needAuth": true
                }
            }
        },
        "/api/v1/products": {
            "get": {
                "operationId": "productIndex",
                "summary": "List product [WS]",
                "tags": [
                    "Products"
                ],
                "parameters": [
                    {
                        "name": "page",
                        "in": "query",
                        "required": false,
                        "description": "Page index for paginated lists.",
                        "schema": {
                            "type": "integer",
                            "minimum": 1,
                            "default": 1
                        }
                    },
                    {
                        "name": "per_page",
                        "in": "query",
                        "required": false,
                        "description": "Items per page (capped per endpoint, see endpoint description).",
                        "schema": {
                            "type": "integer",
                            "minimum": 1,
                            "maximum": 500
                        }
                    },
                    {
                        "name": "locale",
                        "in": "query",
                        "required": false,
                        "description": "Render translatable fields in this locale (see meta.languages).",
                        "schema": {
                            "type": "string",
                            "example": "en"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Envelope"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Resource not found.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                },
                "description": "**Also reachable over WebSocket** as event `api-v1-product.index`.",
                "x-websocket": {
                    "event": "api-v1-product.index",
                    "needAuth": false
                }
            }
        },
        "/api/v1/products/{product}": {
            "get": {
                "operationId": "productShow",
                "summary": "Show product [WS]",
                "tags": [
                    "Products"
                ],
                "parameters": [
                    {
                        "name": "product",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Product slug or id."
                    },
                    {
                        "name": "locale",
                        "in": "query",
                        "required": false,
                        "description": "Render translatable fields in this locale (see meta.languages).",
                        "schema": {
                            "type": "string",
                            "example": "en"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Envelope"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Resource not found.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                },
                "description": "**Also reachable over WebSocket** as event `api-v1-product.show`.",
                "x-websocket": {
                    "event": "api-v1-product.show",
                    "needAuth": false
                }
            }
        },
        "/api/v1/products/{product}/prices": {
            "get": {
                "operationId": "productPrices",
                "summary": "List prices for product [WS]",
                "tags": [
                    "Products"
                ],
                "parameters": [
                    {
                        "name": "product",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Product slug or id."
                    },
                    {
                        "name": "locale",
                        "in": "query",
                        "required": false,
                        "description": "Render translatable fields in this locale (see meta.languages).",
                        "schema": {
                            "type": "string",
                            "example": "en"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Envelope"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Resource not found.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                },
                "description": "**Also reachable over WebSocket** as event `api-v1-product.prices`.",
                "x-websocket": {
                    "event": "api-v1-product.prices",
                    "needAuth": false
                }
            }
        },
        "/api/v1/questions": {
            "get": {
                "operationId": "questionIndex",
                "summary": "List question [WS]",
                "tags": [
                    "Questions"
                ],
                "parameters": [
                    {
                        "name": "page",
                        "in": "query",
                        "required": false,
                        "description": "Page index for paginated lists.",
                        "schema": {
                            "type": "integer",
                            "minimum": 1,
                            "default": 1
                        }
                    },
                    {
                        "name": "per_page",
                        "in": "query",
                        "required": false,
                        "description": "Items per page (capped per endpoint, see endpoint description).",
                        "schema": {
                            "type": "integer",
                            "minimum": 1,
                            "maximum": 500
                        }
                    },
                    {
                        "in": "query",
                        "required": false,
                        "name": "license",
                        "description": "License slug (e.g. `bzf-i`, `azf`). Required for the public-demo set when the caller has no full access.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "lang",
                        "in": "query",
                        "required": false,
                        "description": "Language code for the question/answer translation.",
                        "schema": {
                            "type": "string",
                            "example": "en"
                        }
                    },
                    {
                        "name": "locale",
                        "in": "query",
                        "required": false,
                        "description": "Render translatable fields in this locale (see meta.languages).",
                        "schema": {
                            "type": "string",
                            "example": "en"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Envelope"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Resource not found.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                },
                "description": "**Also reachable over WebSocket** as event `api-v1-question.index`.",
                "x-websocket": {
                    "event": "api-v1-question.index",
                    "needAuth": false
                }
            }
        },
        "/api/v1/questions/{id}": {
            "get": {
                "operationId": "questionShow",
                "summary": "Show question [WS]",
                "tags": [
                    "Questions"
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Resource id."
                    },
                    {
                        "name": "lang",
                        "in": "query",
                        "required": false,
                        "description": "Language code for the question/answer translation.",
                        "schema": {
                            "type": "string",
                            "example": "en"
                        }
                    },
                    {
                        "name": "locale",
                        "in": "query",
                        "required": false,
                        "description": "Render translatable fields in this locale (see meta.languages).",
                        "schema": {
                            "type": "string",
                            "example": "en"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Envelope"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Resource not found.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                },
                "description": "**Also reachable over WebSocket** as event `api-v1-question.show`.",
                "x-websocket": {
                    "event": "api-v1-question.show",
                    "needAuth": false
                }
            }
        },
        "/api/v1/simulator/action": {
            "post": {
                "operationId": "simulatorAction",
                "summary": "Record simulator action for simulator",
                "tags": [
                    "Simulator"
                ],
                "parameters": [],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Envelope"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Resource not found.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Unauthenticated.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "action",
                                    "meta"
                                ],
                                "properties": {
                                    "scenario": {
                                        "type": "string",
                                        "maxLength": 36,
                                        "description": "Optional scenario UUID this action belongs to."
                                    },
                                    "action": {
                                        "type": "string",
                                        "enum": [
                                            "takeoff",
                                            "landing",
                                            "taxi",
                                            "hold",
                                            "frequency"
                                        ],
                                        "description": "Pilot action type."
                                    },
                                    "meta": {
                                        "type": "object",
                                        "required": [
                                            "registration",
                                            "frequency"
                                        ],
                                        "properties": {
                                            "session": {
                                                "type": "string",
                                                "maxLength": 36,
                                                "description": "Session UUID. Omit to start a new session."
                                            },
                                            "aircraft": {
                                                "type": "string"
                                            },
                                            "squawk": {
                                                "type": "string"
                                            },
                                            "registration": {
                                                "type": "string",
                                                "description": "Aircraft registration (e.g. `OE-DAC`)."
                                            },
                                            "airport": {
                                                "type": "string"
                                            },
                                            "frequency": {
                                                "type": "string",
                                                "description": "Frequency in MHz (e.g. `118.300`)."
                                            },
                                            "flightrule": {
                                                "type": "string",
                                                "enum": [
                                                    "IFR",
                                                    "VFR"
                                                ]
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        },
        "/api/v1/simulator/reset": {
            "post": {
                "operationId": "simulatorReset",
                "summary": "Reset simulator session for simulator",
                "tags": [
                    "Simulator"
                ],
                "parameters": [],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Envelope"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Resource not found.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Unauthenticated.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/v1/simulator/session": {
            "get": {
                "operationId": "simulatorSession",
                "summary": "Read simulator session for simulator",
                "tags": [
                    "Simulator"
                ],
                "parameters": [
                    {
                        "name": "page",
                        "in": "query",
                        "required": false,
                        "description": "Page index for paginated lists.",
                        "schema": {
                            "type": "integer",
                            "minimum": 1,
                            "default": 1
                        }
                    },
                    {
                        "name": "per_page",
                        "in": "query",
                        "required": false,
                        "description": "Items per page (capped per endpoint, see endpoint description).",
                        "schema": {
                            "type": "integer",
                            "minimum": 1,
                            "maximum": 500
                        }
                    },
                    {
                        "name": "locale",
                        "in": "query",
                        "required": false,
                        "description": "Render translatable fields in this locale (see meta.languages).",
                        "schema": {
                            "type": "string",
                            "example": "en"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Envelope"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Resource not found.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Unauthenticated.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/api/v1/syllabus": {
            "get": {
                "operationId": "syllabusIndex",
                "summary": "List syllabus [WS]",
                "tags": [
                    "Syllabus"
                ],
                "parameters": [
                    {
                        "name": "page",
                        "in": "query",
                        "required": false,
                        "description": "Page index for paginated lists.",
                        "schema": {
                            "type": "integer",
                            "minimum": 1,
                            "default": 1
                        }
                    },
                    {
                        "name": "per_page",
                        "in": "query",
                        "required": false,
                        "description": "Items per page (capped per endpoint, see endpoint description).",
                        "schema": {
                            "type": "integer",
                            "minimum": 1,
                            "maximum": 500
                        }
                    },
                    {
                        "name": "locale",
                        "in": "query",
                        "required": false,
                        "description": "Render translatable fields in this locale (see meta.languages).",
                        "schema": {
                            "type": "string",
                            "example": "en"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Envelope"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Resource not found.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Unauthenticated.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ],
                "description": "**Also reachable over WebSocket** as event `api-v1-syllabus.index`. Pass the bearer as `authtoken` in the WS message data.",
                "x-websocket": {
                    "event": "api-v1-syllabus.index",
                    "needAuth": true
                }
            }
        },
        "/api/v1/syllabus/{id}": {
            "get": {
                "operationId": "syllabusShow",
                "summary": "Show syllabus [WS]",
                "tags": [
                    "Syllabus"
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Resource id."
                    },
                    {
                        "name": "locale",
                        "in": "query",
                        "required": false,
                        "description": "Render translatable fields in this locale (see meta.languages).",
                        "schema": {
                            "type": "string",
                            "example": "en"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Envelope"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Resource not found.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Unauthenticated.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ],
                "description": "**Also reachable over WebSocket** as event `api-v1-syllabus.show`. Pass the bearer as `authtoken` in the WS message data.",
                "x-websocket": {
                    "event": "api-v1-syllabus.show",
                    "needAuth": true
                }
            }
        },
        "/api/v1/wiki": {
            "get": {
                "operationId": "wikiIndex",
                "summary": "List wiki [WS]",
                "tags": [
                    "Wiki"
                ],
                "parameters": [
                    {
                        "name": "page",
                        "in": "query",
                        "required": false,
                        "description": "Page index for paginated lists.",
                        "schema": {
                            "type": "integer",
                            "minimum": 1,
                            "default": 1
                        }
                    },
                    {
                        "name": "per_page",
                        "in": "query",
                        "required": false,
                        "description": "Items per page (capped per endpoint, see endpoint description).",
                        "schema": {
                            "type": "integer",
                            "minimum": 1,
                            "maximum": 500
                        }
                    },
                    {
                        "name": "search",
                        "in": "query",
                        "required": false,
                        "description": "Free-text search across the primary text fields.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "in": "query",
                        "required": false,
                        "name": "categories",
                        "description": "Filter by wiki-category tag(s). Repeat the param for multiple.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "locale",
                        "in": "query",
                        "required": false,
                        "description": "Render translatable fields in this locale (see meta.languages).",
                        "schema": {
                            "type": "string",
                            "example": "en"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Envelope"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Resource not found.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                },
                "description": "**Also reachable over WebSocket** as event `api-v1-wiki.index`.",
                "x-websocket": {
                    "event": "api-v1-wiki.index",
                    "needAuth": false
                }
            }
        },
        "/api/v1/wiki/{slug}": {
            "get": {
                "operationId": "wikiShow",
                "summary": "Show wiki [WS]",
                "tags": [
                    "Wiki"
                ],
                "parameters": [
                    {
                        "name": "slug",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Resource slug or numeric/UUID id."
                    },
                    {
                        "name": "locale",
                        "in": "query",
                        "required": false,
                        "description": "Render translatable fields in this locale (see meta.languages).",
                        "schema": {
                            "type": "string",
                            "example": "en"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Envelope"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Resource not found.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Error"
                                }
                            }
                        }
                    }
                },
                "description": "**Also reachable over WebSocket** as event `api-v1-wiki.show`.",
                "x-websocket": {
                    "event": "api-v1-wiki.show",
                    "needAuth": false
                }
            }
        }
    },
    "components": {
        "securitySchemes": {
            "bearerAuth": {
                "type": "http",
                "scheme": "bearer",
                "description": "Sanctum personal access token issued by `POST /api/v1/auth/login`."
            }
        },
        "schemas": {
            "Envelope": {
                "type": "object",
                "required": [
                    "data",
                    "meta"
                ],
                "properties": {
                    "data": {
                        "description": "Resource(s) returned by the endpoint. Item endpoints return an object; list endpoints return an array.",
                        "oneOf": [
                            {
                                "type": "object"
                            },
                            {
                                "type": "array",
                                "items": {
                                    "type": "object"
                                }
                            }
                        ]
                    },
                    "meta": {
                        "$ref": "#/components/schemas/Meta"
                    }
                }
            },
            "Meta": {
                "type": "object",
                "required": [
                    "url",
                    "locale",
                    "languages"
                ],
                "properties": {
                    "url": {
                        "type": "string",
                        "format": "uri",
                        "description": "Full URL the response was generated from."
                    },
                    "locale": {
                        "type": "string",
                        "description": "Locale used to render translatable fields."
                    },
                    "languages": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        },
                        "description": "Locales available for content on this API."
                    },
                    "current_page": {
                        "type": "integer",
                        "description": "(paginated only) \u2014 current page index."
                    },
                    "per_page": {
                        "type": "integer",
                        "description": "(paginated only) \u2014 items per page."
                    },
                    "from": {
                        "type": "integer",
                        "nullable": true,
                        "description": "(paginated only) \u2014 first item index of the page."
                    },
                    "to": {
                        "type": "integer",
                        "nullable": true,
                        "description": "(paginated only) \u2014 last item index of the page."
                    },
                    "total": {
                        "type": "integer",
                        "description": "(paginated/collection only) \u2014 total item count."
                    },
                    "total_pages": {
                        "type": "integer",
                        "description": "(paginated only) \u2014 total number of pages."
                    },
                    "has_more": {
                        "type": "boolean",
                        "description": "(paginated only) \u2014 whether more pages exist after this one."
                    }
                }
            },
            "Error": {
                "type": "object",
                "required": [
                    "message"
                ],
                "properties": {
                    "message": {
                        "type": "string"
                    },
                    "errors": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "array",
                            "items": {
                                "type": "string"
                            }
                        },
                        "description": "Validation error map (only on 422 responses)."
                    }
                }
            },
            "TokenResponse": {
                "type": "object",
                "required": [
                    "data",
                    "meta"
                ],
                "properties": {
                    "data": {
                        "type": "object",
                        "required": [
                            "token_type",
                            "token"
                        ],
                        "properties": {
                            "token_type": {
                                "type": "string",
                                "example": "Bearer"
                            },
                            "token": {
                                "type": "string"
                            }
                        }
                    },
                    "meta": {
                        "$ref": "#/components/schemas/Meta"
                    }
                }
            }
        }
    }
}