{
  "openapi": "3.0.3",
  "info": {
    "title": "Coaster World DATA API",
    "version": "1.0.0",
    "description": "API locale versionnée. Les valeurs inconnues restent null. L’accès privé exige une clé créée par un administrateur (Authorization Bearer ou X-API-Key). Locale via locale ou Accept-Language. Les sources ne sont jamais appelées pendant une requête API."
  },
  "servers": [
    {
      "url": "/api/v1"
    }
  ],
  "security": [
    {
      "bearerAuth": []
    },
    {
      "apiKey": []
    }
  ],
  "paths": {
    "/attractions": {
      "get": {
        "operationId": "api_v1_attractions_index",
        "summary": "Catalogue des attractions",
        "parameters": [
          {
            "name": "locale",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "fr",
                "en",
                "de",
                "es",
                "it"
              ]
            }
          },
          {
            "name": "q",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "maxLength": 180
            }
          },
          {
            "name": "status",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "maxLength": 40
            }
          },
          {
            "name": "per_page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "description": "Valeur plafonnée par la configuration (100 par défaut)."
            }
          },
          {
            "name": "page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "park_id",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "kind",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "maxLength": 40
            }
          },
          {
            "name": "include_coasters",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "enum": [
                0,
                1
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Réponse JSON locale. Les listes utilisent data, avec pagination selon la route.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "429": {
            "description": "Limite de débit atteinte."
          },
          "401": {
            "description": "Clé absente, invalide ou révoquée lorsque l’accès privé est activé."
          },
          "422": {
            "description": "Paramètres invalides."
          }
        }
      }
    },
    "/attractions/{attraction}": {
      "get": {
        "operationId": "api_v1_attractions_show",
        "summary": "Fiche attraction",
        "parameters": [
          {
            "name": "attraction",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "locale",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "fr",
                "en",
                "de",
                "es",
                "it"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Réponse JSON locale. Les listes utilisent data, avec pagination selon la route.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "429": {
            "description": "Limite de débit atteinte."
          },
          "401": {
            "description": "Clé absente, invalide ou révoquée lorsque l’accès privé est activé."
          },
          "404": {
            "description": "Fiche introuvable ou type non pris en charge."
          }
        }
      }
    },
    "/attractions/{attraction}/live": {
      "get": {
        "operationId": "api_v1_attractions_live",
        "summary": "État Live de l’attraction",
        "parameters": [
          {
            "name": "attraction",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "locale",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "fr",
                "en",
                "de",
                "es",
                "it"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Réponse JSON locale. Les listes utilisent data, avec pagination selon la route.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "429": {
            "description": "Limite de débit atteinte."
          },
          "401": {
            "description": "Clé absente, invalide ou révoquée lorsque l’accès privé est activé."
          },
          "404": {
            "description": "Fiche introuvable ou type non pris en charge."
          }
        }
      }
    },
    "/attractions/{attraction}/live/history": {
      "get": {
        "operationId": "api_v1_attractions_live_history",
        "summary": "Historique paginé des mesures Live",
        "parameters": [
          {
            "name": "attraction",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "locale",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "fr",
                "en",
                "de",
                "es",
                "it"
              ]
            }
          },
          {
            "name": "from",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "to",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "per_page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 50
            }
          },
          {
            "name": "page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Réponse JSON locale. Les listes utilisent data, avec pagination selon la route.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "429": {
            "description": "Limite de débit atteinte."
          },
          "401": {
            "description": "Clé absente, invalide ou révoquée lorsque l’accès privé est activé."
          },
          "404": {
            "description": "Fiche introuvable ou type non pris en charge."
          },
          "422": {
            "description": "Paramètres invalides."
          }
        }
      }
    },
    "/coasters": {
      "get": {
        "operationId": "api_v1_coasters_index",
        "summary": "Catalogue des coasters",
        "parameters": [
          {
            "name": "locale",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "fr",
                "en",
                "de",
                "es",
                "it"
              ]
            }
          },
          {
            "name": "q",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "maxLength": 180
            }
          },
          {
            "name": "status",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "maxLength": 40
            }
          },
          {
            "name": "per_page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "description": "Valeur plafonnée par la configuration (100 par défaut)."
            }
          },
          {
            "name": "page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "park_id",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "coaster_type",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "maxLength": 80
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Réponse JSON locale. Les listes utilisent data, avec pagination selon la route.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "429": {
            "description": "Limite de débit atteinte."
          },
          "401": {
            "description": "Clé absente, invalide ou révoquée lorsque l’accès privé est activé."
          },
          "422": {
            "description": "Paramètres invalides."
          }
        }
      }
    },
    "/coasters/{coaster}": {
      "get": {
        "operationId": "api_v1_coasters_show",
        "summary": "Fiche coaster",
        "parameters": [
          {
            "name": "coaster",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "locale",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "fr",
                "en",
                "de",
                "es",
                "it"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Réponse JSON locale. Les listes utilisent data, avec pagination selon la route.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "429": {
            "description": "Limite de débit atteinte."
          },
          "401": {
            "description": "Clé absente, invalide ou révoquée lorsque l’accès privé est activé."
          },
          "404": {
            "description": "Fiche introuvable ou type non pris en charge."
          }
        }
      }
    },
    "/entities/{type}/{id}/media": {
      "get": {
        "operationId": "api_v1_media",
        "summary": "Médias autorisés à la publication",
        "parameters": [
          {
            "name": "type",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "enum": [
                "park",
                "attraction",
                "coaster",
                "poi"
              ]
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "locale",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "fr",
                "en",
                "de",
                "es",
                "it"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Réponse JSON locale. Les listes utilisent data, avec pagination selon la route.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "429": {
            "description": "Limite de débit atteinte."
          },
          "401": {
            "description": "Clé absente, invalide ou révoquée lorsque l’accès privé est activé."
          },
          "404": {
            "description": "Fiche introuvable ou type non pris en charge."
          }
        }
      }
    },
    "/entities/{type}/{id}/organizations": {
      "get": {
        "operationId": "api_v1_organizations",
        "summary": "Organisations et rôles datés",
        "parameters": [
          {
            "name": "type",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "enum": [
                "park",
                "attraction",
                "coaster"
              ]
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "locale",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "fr",
                "en",
                "de",
                "es",
                "it"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Réponse JSON locale. Les listes utilisent data, avec pagination selon la route.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "429": {
            "description": "Limite de débit atteinte."
          },
          "401": {
            "description": "Clé absente, invalide ou révoquée lorsque l’accès privé est activé."
          },
          "404": {
            "description": "Fiche introuvable ou type non pris en charge."
          }
        }
      }
    },
    "/health": {
      "get": {
        "operationId": "api_v1_health",
        "summary": "Disponibilité de la base et version de l’application",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Réponse JSON locale. Les listes utilisent data, avec pagination selon la route.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "429": {
            "description": "Limite de débit atteinte."
          },
          "503": {
            "description": "Base indisponible."
          }
        },
        "security": []
      }
    },
    "/live/attractions": {
      "get": {
        "operationId": "api_v1_live_attractions",
        "summary": "États Live locaux paginés",
        "parameters": [
          {
            "name": "locale",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "fr",
                "en",
                "de",
                "es",
                "it"
              ]
            }
          },
          {
            "name": "park_id",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "status",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "maxLength": 40
            }
          },
          {
            "name": "freshness",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "fresh",
                "stale",
                "expired",
                "unavailable"
              ]
            }
          },
          {
            "name": "per_page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "description": "Valeur plafonnée par la configuration (100 par défaut)."
            }
          },
          {
            "name": "page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Réponse JSON locale. Les listes utilisent data, avec pagination selon la route.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "429": {
            "description": "Limite de débit atteinte."
          },
          "401": {
            "description": "Clé absente, invalide ou révoquée lorsque l’accès privé est activé."
          },
          "422": {
            "description": "Paramètres invalides."
          }
        }
      }
    },
    "/parks": {
      "get": {
        "operationId": "api_v1_parks_index",
        "summary": "Catalogue des parcs",
        "parameters": [
          {
            "name": "locale",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "fr",
                "en",
                "de",
                "es",
                "it"
              ]
            }
          },
          {
            "name": "q",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "maxLength": 180
            }
          },
          {
            "name": "status",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "maxLength": 40
            }
          },
          {
            "name": "per_page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "description": "Valeur plafonnée par la configuration (100 par défaut)."
            }
          },
          {
            "name": "page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "country_code",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "minLength": 2,
              "maxLength": 2
            }
          },
          {
            "name": "kind",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "maxLength": 40
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Réponse JSON locale. Les listes utilisent data, avec pagination selon la route.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "429": {
            "description": "Limite de débit atteinte."
          },
          "401": {
            "description": "Clé absente, invalide ou révoquée lorsque l’accès privé est activé."
          },
          "422": {
            "description": "Paramètres invalides."
          }
        }
      }
    },
    "/parks/{park}": {
      "get": {
        "operationId": "api_v1_parks_show",
        "summary": "Fiche parc et champs canoniques",
        "parameters": [
          {
            "name": "park",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "locale",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "fr",
                "en",
                "de",
                "es",
                "it"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Réponse JSON locale. Les listes utilisent data, avec pagination selon la route.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "429": {
            "description": "Limite de débit atteinte."
          },
          "401": {
            "description": "Clé absente, invalide ou révoquée lorsque l’accès privé est activé."
          },
          "404": {
            "description": "Fiche introuvable ou type non pris en charge."
          }
        }
      }
    },
    "/parks/{park}/attractions": {
      "get": {
        "operationId": "api_v1_parks_attractions",
        "summary": "Attractions du parc",
        "parameters": [
          {
            "name": "park",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "locale",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "fr",
                "en",
                "de",
                "es",
                "it"
              ]
            }
          },
          {
            "name": "q",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "maxLength": 180
            }
          },
          {
            "name": "status",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "maxLength": 40
            }
          },
          {
            "name": "per_page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "description": "Valeur plafonnée par la configuration (100 par défaut)."
            }
          },
          {
            "name": "page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "park_id",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "kind",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "maxLength": 40
            }
          },
          {
            "name": "include_coasters",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "enum": [
                0,
                1
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Réponse JSON locale. Les listes utilisent data, avec pagination selon la route.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "429": {
            "description": "Limite de débit atteinte."
          },
          "401": {
            "description": "Clé absente, invalide ou révoquée lorsque l’accès privé est activé."
          },
          "404": {
            "description": "Fiche introuvable ou type non pris en charge."
          },
          "422": {
            "description": "Paramètres invalides."
          }
        }
      }
    },
    "/parks/{park}/coasters": {
      "get": {
        "operationId": "api_v1_parks_coasters",
        "summary": "Coasters du parc",
        "parameters": [
          {
            "name": "park",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "locale",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "fr",
                "en",
                "de",
                "es",
                "it"
              ]
            }
          },
          {
            "name": "q",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "maxLength": 180
            }
          },
          {
            "name": "status",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "maxLength": 40
            }
          },
          {
            "name": "per_page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "description": "Valeur plafonnée par la configuration (100 par défaut)."
            }
          },
          {
            "name": "page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "park_id",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "coaster_type",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "maxLength": 80
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Réponse JSON locale. Les listes utilisent data, avec pagination selon la route.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "429": {
            "description": "Limite de débit atteinte."
          },
          "401": {
            "description": "Clé absente, invalide ou révoquée lorsque l’accès privé est activé."
          },
          "404": {
            "description": "Fiche introuvable ou type non pris en charge."
          },
          "422": {
            "description": "Paramètres invalides."
          }
        }
      }
    },
    "/parks/{park}/live": {
      "get": {
        "operationId": "api_v1_parks_live",
        "summary": "États Live des attractions du parc",
        "parameters": [
          {
            "name": "park",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "locale",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "fr",
                "en",
                "de",
                "es",
                "it"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Réponse JSON locale. Les listes utilisent data, avec pagination selon la route.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "429": {
            "description": "Limite de débit atteinte."
          },
          "401": {
            "description": "Clé absente, invalide ou révoquée lorsque l’accès privé est activé."
          },
          "404": {
            "description": "Fiche introuvable ou type non pris en charge."
          }
        }
      }
    },
    "/parks/{park}/pois": {
      "get": {
        "operationId": "api_v1_parks_pois",
        "summary": "POI du parc",
        "parameters": [
          {
            "name": "park",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "locale",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "fr",
                "en",
                "de",
                "es",
                "it"
              ]
            }
          },
          {
            "name": "q",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "maxLength": 180
            }
          },
          {
            "name": "status",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "maxLength": 40
            }
          },
          {
            "name": "per_page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "description": "Valeur plafonnée par la configuration (100 par défaut)."
            }
          },
          {
            "name": "page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "park_id",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "type",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "maxLength": 60
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Réponse JSON locale. Les listes utilisent data, avec pagination selon la route.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "429": {
            "description": "Limite de débit atteinte."
          },
          "401": {
            "description": "Clé absente, invalide ou révoquée lorsque l’accès privé est activé."
          },
          "404": {
            "description": "Fiche introuvable ou type non pris en charge."
          },
          "422": {
            "description": "Paramètres invalides."
          }
        }
      }
    },
    "/parks/{park}/schedule": {
      "get": {
        "operationId": "api_v1_parks_schedule",
        "summary": "Horaires, fuseau et état du parc",
        "parameters": [
          {
            "name": "park",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "locale",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "fr",
                "en",
                "de",
                "es",
                "it"
              ]
            }
          },
          {
            "name": "from",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date"
            }
          },
          {
            "name": "days",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 90,
              "default": 30
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Réponse JSON locale. Les listes utilisent data, avec pagination selon la route.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "429": {
            "description": "Limite de débit atteinte."
          },
          "401": {
            "description": "Clé absente, invalide ou révoquée lorsque l’accès privé est activé."
          },
          "404": {
            "description": "Fiche introuvable ou type non pris en charge."
          },
          "422": {
            "description": "Paramètres invalides."
          }
        }
      }
    },
    "/pois": {
      "get": {
        "operationId": "api_v1_pois_index",
        "summary": "Catalogue des POI",
        "parameters": [
          {
            "name": "locale",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "fr",
                "en",
                "de",
                "es",
                "it"
              ]
            }
          },
          {
            "name": "q",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "maxLength": 180
            }
          },
          {
            "name": "status",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "maxLength": 40
            }
          },
          {
            "name": "per_page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "description": "Valeur plafonnée par la configuration (100 par défaut)."
            }
          },
          {
            "name": "page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "park_id",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "type",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "maxLength": 60
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Réponse JSON locale. Les listes utilisent data, avec pagination selon la route.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "429": {
            "description": "Limite de débit atteinte."
          },
          "401": {
            "description": "Clé absente, invalide ou révoquée lorsque l’accès privé est activé."
          },
          "422": {
            "description": "Paramètres invalides."
          }
        }
      }
    },
    "/pois/{poi}": {
      "get": {
        "operationId": "api_v1_pois_show",
        "summary": "Fiche POI",
        "parameters": [
          {
            "name": "poi",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "locale",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "fr",
                "en",
                "de",
                "es",
                "it"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Réponse JSON locale. Les listes utilisent data, avec pagination selon la route.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "429": {
            "description": "Limite de débit atteinte."
          },
          "401": {
            "description": "Clé absente, invalide ou révoquée lorsque l’accès privé est activé."
          },
          "404": {
            "description": "Fiche introuvable ou type non pris en charge."
          }
        }
      }
    },
    "/search": {
      "get": {
        "operationId": "api_v1_search",
        "summary": "Recherche transversale dans les fiches et alias",
        "parameters": [
          {
            "name": "locale",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "fr",
                "en",
                "de",
                "es",
                "it"
              ]
            }
          },
          {
            "name": "q",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 2,
              "maxLength": 180
            }
          },
          {
            "name": "type",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "park",
                "attraction",
                "coaster",
                "poi"
              ]
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 25,
              "default": 10
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Réponse JSON locale. Les listes utilisent data, avec pagination selon la route.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "429": {
            "description": "Limite de débit atteinte."
          },
          "401": {
            "description": "Clé absente, invalide ou révoquée lorsque l’accès privé est activé."
          },
          "422": {
            "description": "Paramètres invalides."
          }
        }
      }
    }
  },
  "components": {
    "securitySchemes": {
      "bearerAuth": {
        "type": "http",
        "scheme": "bearer"
      },
      "apiKey": {
        "type": "apiKey",
        "in": "header",
        "name": "X-API-Key"
      }
    }
  }
}
