{"openapi":"3.1.0","info":{"title":"Sync Jeux — API d'écriture","description":"Lire et déclarer SES PROPRES dispos, avec un token demandé au bot en message privé. Une écriture remplace la soirée entière, sauf mode contraire ; les heures déjà passées de la soirée en cours ne bougent plus. Mode d'emploi complet : /info.","version":"1.0.0"},"paths":{"/v1/":{"get":{"summary":"Qui je suis","operationId":"me_v1__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MeOut"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/availability":{"get":{"summary":"Mes déclarations, soirée par soirée — pas les statuts calculés","operationId":"my_availability_v1_availability_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MyAvailabilityOut"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/day/{date}":{"put":{"summary":"Déclarer une soirée (AAAA-MM-JJ, aujourd'hui → +366 jours)","operationId":"put_day_v1_day__date__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"date","in":"path","required":true,"schema":{"type":"string","title":"Date"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RangesIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DayOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/repeat":{"post":{"summary":"Remplir les mêmes plages sur plusieurs soirées, entre deux dates","operationId":"post_repeat_v1_repeat_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RepeatIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RepeatOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}}},"components":{"schemas":{"DayOut":{"properties":{"date":{"type":"string","title":"Date","description":"Soirée réellement écrite : la veille pour des plages avant 03:00"},"ranges":{"items":{"$ref":"#/components/schemas/RangeOut"},"type":"array","title":"Ranges"}},"type":"object","required":["date","ranges"],"title":"DayOut"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"MeOut":{"properties":{"id":{"type":"string","title":"Id","description":"Identifiant opaque, le même que dans l'API de lecture"},"display_name":{"type":"string","title":"Display Name"}},"type":"object","required":["id","display_name"],"title":"MeOut"},"MyAvailabilityOut":{"properties":{"days":{"additionalProperties":{"items":{"$ref":"#/components/schemas/RangeOut"},"type":"array"},"type":"object","title":"Days","description":"Par date AAAA-MM-JJ. Une date ABSENTE n'est pas déclarée : elle vaut « inconnu ». Une date présente est déterminée — ce qu'elle ne couvre pas vaut 0."},"from_date":{"type":"string","title":"From Date","description":"Bornes incluses : première soirée couverte"},"to_date":{"type":"string","title":"To Date","description":"Bornes incluses : dernière soirée couverte"}},"type":"object","required":["days","from_date","to_date"],"title":"MyAvailabilityOut"},"RangeIn":{"properties":{"start":{"type":"string","title":"Start","description":"HH:MM heure locale, aligné sur :00 ou :30, de 00:00 à 27:00. Les réponses de l'API utilisent la forme 24:00-27:00 pour les heures après minuit : elles se resoumettent telles quelles."},"end":{"type":"string","title":"End","description":"HH:MM, de 00:00 à 27:00 ; end <= start = passage de minuit (« 20:00 » → « 02:00 »). Voir start pour la forme 24:00-27:00."},"status":{"anyOf":[{"type":"integer","maximum":100.0,"minimum":0.0},{"type":"null"}],"title":"Status","description":"0 non dispo · 33 possible · 66 probable · 100 confirmé, ou toute valeur 0-100. null = « inconnu » DÉCLARÉ : tu dis que tu ne sais pas encore, ce qui n'est pas 0."}},"type":"object","required":["start","end"],"title":"RangeIn"},"RangeOut":{"properties":{"start":{"type":"string","title":"Start"},"end":{"type":"string","title":"End"},"status":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Status","description":"0 non dispo · 33 possible · 66 probable · 100 confirmé, ou toute valeur 0-100. null = « inconnu » DÉCLARÉ : tu dis que tu ne sais pas encore, ce qui n'est pas 0."}},"type":"object","required":["start","end","status"],"title":"RangeOut"},"RangesIn":{"properties":{"ranges":{"items":{"$ref":"#/components/schemas/RangeIn"},"type":"array","maxItems":64,"title":"Ranges","description":"TOUTES les plages de la soirée. [] efface : la soirée redevient « inconnu »."},"mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mode","description":"Comment la déclaration rencontre ce que la soirée porte déjà : « replace » (défaut) écrase la soirée entière, « merge » masque seulement les heures données, « skip » laisse intactes les soirées déjà déclarées."}},"type":"object","required":["ranges"],"title":"RangesIn"},"RepeatIn":{"properties":{"ranges":{"items":{"$ref":"#/components/schemas/RangeIn"},"type":"array","maxItems":64,"title":"Ranges","description":"TOUTES les plages de la soirée. [] efface : la soirée redevient « inconnu »."},"mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mode","description":"Comment la déclaration rencontre ce que la soirée porte déjà : « replace » (défaut) écrase la soirée entière, « merge » masque seulement les heures données, « skip » laisse intactes les soirées déjà déclarées."},"weekdays":{"items":{"type":"integer"},"type":"array","maxItems":7,"minItems":1,"title":"Weekdays","description":"0 = lundi … 6 = dimanche"},"from_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"From Date","description":"Première date AAAA-MM-JJ ; absent = la soirée en cours"},"until":{"type":"string","title":"Until","description":"Dernière date AAAA-MM-JJ, incluse. Au plus 366 jours."}},"type":"object","required":["ranges","weekdays","until"],"title":"RepeatIn"},"RepeatOut":{"properties":{"dates":{"items":{"type":"string"},"type":"array","title":"Dates","description":"Soirées écrites, dans l'ordre"},"skipped":{"items":{"type":"string"},"type":"array","title":"Skipped","description":"Soirées laissées intactes (mode « skip »)"},"ranges":{"items":{"$ref":"#/components/schemas/RangeOut"},"type":"array","title":"Ranges"}},"type":"object","required":["dates","skipped","ranges"],"title":"RepeatOut"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}},"securitySchemes":{"HTTPBearer":{"type":"http","scheme":"bearer"}}},"servers":[{"url":"/api/me"}]}