{
  "openapi": "3.1.0",
  "info": {
    "title": "API des disponibilités",
    "version": "1.1.0",
    "description": "Permet de CONSULTER les disponibilités (lecture seule). La réservation n'est pas disponible via l'API pour les assistants IA : elle se fait uniquement par un humain sur le site web (protégée par Cloudflare Turnstile). Un assistant IA doit donc présenter les dates disponibles à l'utilisateur, puis l'inviter à réserver lui-même sur https://www.mon-poney-magique.ch/. Ne jamais prétendre qu'une réservation a été effectuée par l'assistant."
  },
  "servers": [
    { "url": "https://api.mon-poney-magique.ch" }
  ],
  "paths": {
    "/availabilities": {
      "get": {
        "operationId": "listAvailabilities",
        "summary": "Lister les disponibilités",
        "description": "Renvoie toutes les disponibilités. Un créneau est réservable si status != \"booked\". Pour un cours (type \"lesson\"), il faut en plus has_booking == false. Une balade (type \"walk\") accepte tout créneau non complet. Plages horaires : \"am\" = 9h–11h, \"pm\" = 14h–18h, les deux = 9h–18h. Minutes autorisées : 00, 15, 30, 45. Une demande en attente de confirmation bloque déjà le créneau : un créneau absent ou complet peut donc se libérer si la demande n'est pas confirmée.",
        "responses": {
          "200": {
            "description": "Liste des disponibilités",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": { "$ref": "#/components/schemas/Availability" }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "Availability": {
        "type": "object",
        "properties": {
          "id": { "type": "integer", "description": "Identifiant du créneau" },
          "date": { "type": "string", "format": "date", "description": "YYYY-MM-DD" },
          "status": { "type": "string", "description": "\"booked\" = complet, non réservable" },
          "has_booking": {
            "type": "boolean",
            "description": "Si true, le créneau accepte uniquement les balades (walk), pas les cours (lesson)"
          },
          "type": {
            "description": "Période(s) disponible(s) : am (9h–11h), pm (14h–18h) ou les deux. Peut être un tableau ou une chaîne JSON.",
            "oneOf": [
              { "type": "array", "items": { "type": "string", "enum": ["am", "pm"] } },
              { "type": "string" }
            ]
          }
        }
      }
    }
  }
}