{"openapi":"3.1.0","info":{"title":"SuperClean Water API","version":"1.0.0","description":"Branchez votre logiciel de gestion locative (PMS, conciergerie) : chaque réservation planifie un nettoyage de piscine qui se termine avant l'arrivée des voyageurs."},"servers":[{"url":"https://superclean-water.com"}],"security":[{"bearer":[]}],"components":{"securitySchemes":{"bearer":{"type":"http","scheme":"bearer","description":"Clé API de la forme scw_live_..."}},"schemas":{"Mission":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"type":{"type":"string","enum":["avant_arrivee","apres_depart","manuelle"]},"status":{"type":"string","enum":["planifiee","en_cours","terminee","annulee"]},"scheduled_for":{"type":"string","format":"date-time"},"must_be_done_before":{"type":"string","format":"date-time"},"reservation_id":{"type":"string"},"pool_id":{"type":"string","format":"uuid"}}},"Error":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}},"paths":{"/api/v1/pools":{"get":{"summary":"Lister les piscines et leurs liaisons","x-scope":"pools:read","responses":{"200":{"description":"Liste des piscines"}}}},"/api/v1/pool-links":{"post":{"summary":"Relier une piscine à un bien de votre logiciel","x-scope":"pools:read","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["pool_id","source","external_property_id"],"properties":{"pool_id":{"type":"string","format":"uuid"},"source":{"type":"string","example":"mon-pms"},"external_property_id":{"type":"string","example":"B-42"}}}}}},"responses":{"201":{"description":"Liaison enregistrée"},"404":{"description":"Piscine introuvable"}}}},"/api/v1/reservations":{"post":{"summary":"Créer ou mettre à jour une réservation (idempotent) et planifier le nettoyage avant arrivée","x-scope":"reservations:write","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["source","reservation_id","property_id","arrival"],"properties":{"source":{"type":"string","example":"mon-pms"},"reservation_id":{"type":"string","example":"R-2026-0042"},"property_id":{"type":"string","example":"B-42"},"arrival":{"type":"string","format":"date-time","example":"2026-07-18T15:00:00+02:00"},"departure":{"type":"string","format":"date-time"},"guests":{"type":"integer"}}}}}},"responses":{"200":{"description":"Mission mise à jour (réservation déplacée)"},"201":{"description":"Mission créée","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Mission"}}}},"404":{"description":"Bien non relié à une piscine"},"422":{"description":"Requête invalide, ou arrivée trop proche"}}}},"/api/v1/reservations/{source}/{reservation_id}":{"delete":{"summary":"Annuler une réservation et le nettoyage prévu","x-scope":"reservations:write","parameters":[{"name":"source","in":"path","required":true,"schema":{"type":"string"}},{"name":"reservation_id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Nettoyage annulé"},"404":{"description":"Réservation introuvable"}}}},"/api/v1/missions":{"get":{"summary":"Lister les nettoyages planifiés","x-scope":"missions:read","parameters":[{"name":"from","in":"query","schema":{"type":"string","format":"date-time"}},{"name":"to","in":"query","schema":{"type":"string","format":"date-time"}},{"name":"status","in":"query","schema":{"type":"string","enum":["planifiee","en_cours","terminee","annulee"]}}],"responses":{"200":{"description":"Liste des missions (200 maximum)"}}}}}}