{"openapi":"3.1.0","info":{"title":"Sync Jeux — API de lecture","description":"API publique, en lecture seule et versionnée. Au sein de la v1 : ajouts uniquement, jamais de rupture.","version":"1.0.0"},"paths":{"/api/v1/members":{"get":{"summary":"Membres du groupe","operationId":"get_members_api_v1_members_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/MemberOut"},"type":"array","title":"Response Get Members Api V1 Members Get"}}}}}}},"/api/v1/members/{public_id}/avatar":{"get":{"summary":"Photo de profil d'un membre","operationId":"get_member_avatar_api_v1_members__public_id__avatar_get","parameters":[{"name":"public_id","in":"path","required":true,"schema":{"type":"string","title":"Public Id"}}],"responses":{"200":{"description":"Successful Response"},"404":{"description":"membre inconnu ou sans photo"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/availability":{"get":{"summary":"Statuts calculés par membre et par créneau","operationId":"get_availability_api_v1_availability_get","parameters":[{"name":"from","in":"query","required":true,"schema":{"type":"string","description":"Date locale incluse, AAAA-MM-JJ","title":"From"},"description":"Date locale incluse, AAAA-MM-JJ"},{"name":"to","in":"query","required":true,"schema":{"type":"string","description":"Date locale exclue, AAAA-MM-JJ","title":"To"},"description":"Date locale exclue, AAAA-MM-JJ"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AvailabilityOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/status/now":{"get":{"summary":"Photo du groupe maintenant","operationId":"get_status_now_api_v1_status_now_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NowOut"}}}}}}},"/api/v1/voice":{"get":{"summary":"Membres dans le salon vocal maintenant","description":"Written by the bot on every voice-channel transition; the API only reads.","operationId":"get_voice_api_v1_voice_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VoiceOut"}}}}}}}},"components":{"schemas":{"AvailabilityOut":{"properties":{"from_date":{"type":"string","title":"From Date"},"to_date":{"type":"string","title":"To Date"},"timezone":{"type":"string","title":"Timezone"},"slots":{"items":{"$ref":"#/components/schemas/SlotOut"},"type":"array","title":"Slots"},"members":{"items":{"$ref":"#/components/schemas/MemberAvailability"},"type":"array","title":"Members"}},"type":"object","required":["from_date","to_date","timezone","slots","members"],"title":"AvailabilityOut"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"MemberAvailability":{"properties":{"id":{"type":"string","title":"Id"},"display_name":{"type":"string","title":"Display Name"},"avatar_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar Url","description":"URL relative de la photo de profil, ou null si aucune (afficher les initiales)"},"statuses":{"items":{"anyOf":[{"type":"integer"},{"type":"null"}]},"type":"array","title":"Statuses","description":"One entry per slot, in the same order. null means unknown (not declared) and is distinct from 0 (declared unavailable)."}},"type":"object","required":["id","display_name","statuses"],"title":"MemberAvailability"},"MemberOut":{"properties":{"id":{"type":"string","title":"Id"},"display_name":{"type":"string","title":"Display Name"},"avatar_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar Url","description":"URL relative de la photo de profil, ou null si aucune (afficher les initiales)"}},"type":"object","required":["id","display_name"],"title":"MemberOut"},"NowMember":{"properties":{"id":{"type":"string","title":"Id"},"display_name":{"type":"string","title":"Display Name"},"avatar_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar Url","description":"URL relative de la photo de profil, ou null si aucune (afficher les initiales)"},"status":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Status"}},"type":"object","required":["id","display_name","status"],"title":"NowMember"},"NowOut":{"properties":{"now":{"type":"string","format":"date-time","title":"Now"},"timezone":{"type":"string","title":"Timezone"},"members":{"items":{"$ref":"#/components/schemas/NowMember"},"type":"array","title":"Members"}},"type":"object","required":["now","timezone","members"],"title":"NowOut"},"SlotOut":{"properties":{"local":{"type":"string","title":"Local","description":"Local wall-clock label, e.g. 2026-09-22T20:00"},"start_utc":{"type":"string","format":"date-time","title":"Start Utc"},"end_utc":{"type":"string","format":"date-time","title":"End Utc"}},"type":"object","required":["local","start_utc","end_utc"],"title":"SlotOut"},"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"},"VoiceMember":{"properties":{"id":{"type":"string","title":"Id"},"display_name":{"type":"string","title":"Display Name"},"avatar_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar Url","description":"URL relative de la photo de profil, ou null si aucune (afficher les initiales)"},"since":{"type":"string","format":"date-time","title":"Since","description":"Entrée dans le salon vocal (UTC)"}},"type":"object","required":["id","display_name","since"],"title":"VoiceMember"},"VoiceOut":{"properties":{"now":{"type":"string","format":"date-time","title":"Now"},"members":{"items":{"$ref":"#/components/schemas/VoiceMember"},"type":"array","title":"Members","description":"Membres dans le salon vocal, premier arrivé en tête"}},"type":"object","required":["now","members"],"title":"VoiceOut"}}}}