{"openapi":"3.1.0","info":{"title":"Centre Stage Permis — API publique","version":"1.0.0","description":"Disponibilités en temps réel des stages de récupération de points de permis (France, centres agréés préfecture). Publique, sans authentification. Un serveur MCP équivalent existe : POST /api/mcp (voir /.well-known/mcp/server-card.json).","contact":{"url":"https://centrestagepermis.fr/contact"}},"servers":[{"url":"https://centrestagepermis.fr"}],"paths":{"/api/stages":{"get":{"operationId":"searchStages","summary":"Rechercher les sessions de stage disponibles","description":"Sessions à venir des centres agréés, avec prix effectif et places restantes. Par défaut, seules les sessions réservables sont renvoyées.","parameters":[{"name":"city","in":"query","required":false,"schema":{"type":"string"},"description":"Ville (correspondance partielle), ex. \"lyon\""},{"name":"dept","in":"query","required":false,"schema":{"type":"string"},"description":"Code département, ex. \"75\", \"13\""},{"name":"region","in":"query","required":false,"schema":{"type":"string"},"description":"Région (correspondance partielle)"},{"name":"from","in":"query","required":false,"schema":{"type":"string","format":"date"},"description":"Date min (YYYY-MM-DD), défaut : aujourd’hui"},{"name":"to","in":"query","required":false,"schema":{"type":"string","format":"date"},"description":"Date max (YYYY-MM-DD)"},{"name":"maxPrice","in":"query","required":false,"schema":{"type":"number"},"description":"Prix max en euros"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":20,"maximum":100}},{"name":"includeUnavailable","in":"query","required":false,"schema":{"type":"boolean","default":false},"description":"Inclure les sessions complètes"}],"responses":{"200":{"description":"Liste de sessions","content":{"application/json":{"schema":{"type":"object","properties":{"object":{"type":"string","const":"list"},"count":{"type":"integer"},"description":{"type":"string"},"platform":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"},"data":{"type":"array","items":{"$ref":"#/components/schemas/StageSession"}}}}}}},"429":{"description":"Rate limit — réessayer plus tard"}}}},"/api/health":{"get":{"operationId":"health","summary":"Disponibilité du service","responses":{"200":{"description":"Service et base de données opérationnels"},"503":{"description":"Base de données indisponible"}}}}},"components":{"schemas":{"StageSession":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"day1":{"type":"string","format":"date","description":"Premier jour du stage (2 jours consécutifs)"},"day2":{"type":"string","format":"date"},"startTime":{"type":"string","example":"08:00"},"endTime":{"type":"string","example":"17:00"},"priceEuros":{"type":"number","description":"Prix effectif en euros"},"spotsAvailable":{"type":"integer"},"bookingUrl":{"type":"string","format":"uri","description":"Page où l’utilisateur humain finalise la réservation"},"centre":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"slug":{"type":"string"},"address":{"type":"string"},"city":{"type":"string"},"postalCode":{"type":"string"},"deptCode":{"type":"string"},"deptName":{"type":"string"},"region":{"type":"string"},"lat":{"type":"number"},"lng":{"type":"number"},"agrementNumber":{"type":"string","description":"Numéro d’agrément préfectoral"},"url":{"type":"string","format":"uri"}}}}}}}}