{"openapi":"3.1.0","info":{"title":"Glissandoo Public API","version":"1.0.0","description":"Read-only API for Glissandoo members and administrators.","license":{"name":"Proprietary","identifier":"LicenseRef-Proprietary"}},"servers":[{"url":".","description":"Current v1 endpoint"}],"security":[{"ApiKeyAuth":[]},{"OAuth2":["public-api:read"]},{"BearerAuth":[]}],"paths":{"/health":{"get":{"operationId":"health","summary":"Check API availability","security":[],"parameters":[],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Health"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/openapi.json":{"get":{"operationId":"getOpenApiDocument","summary":"Get the OpenAPI description","security":[],"parameters":[],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/me/groups":{"get":{"operationId":"listMyGroups","summary":"List groups for the authenticated member","description":"Returns every group the authenticated member belongs to. No group permission required.","tags":["Me"],"parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":200}},{"name":"role","in":"query","required":false,"schema":{"type":"string","enum":["admin","member","guest"]}},{"name":"sort","in":"query","required":false,"schema":{"type":"string","enum":["displayName","joinedAt","role"],"default":"displayName"}},{"name":"direction","in":"query","required":false,"schema":{"type":"string","enum":["asc","desc"],"default":"asc"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":20}},{"name":"cursor","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":1024}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","required":["data","pagination"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Group"}},"pagination":{"$ref":"#/components/schemas/Pagination"}}}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid credential","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Insufficient permissions","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/me/events":{"get":{"operationId":"listMyEvents","summary":"List events for the authenticated member","description":"Returns the events the authenticated member takes part in. No group permission required.","tags":["Me","Events"],"parameters":[{"name":"startDate","in":"query","required":true,"description":"Range start","schema":{"type":"string","format":"date-time"}},{"name":"endDate","in":"query","required":true,"description":"Range end","schema":{"type":"string","format":"date-time"}},{"name":"type","in":"query","required":false,"schema":{"type":"string","enum":["practice","performance","other"]}},{"name":"q","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":200}},{"name":"status","in":"query","required":false,"schema":{"type":"string","enum":["confirmed","declined","pending"]}},{"name":"rollcall","in":"query","required":false,"schema":{"type":"string","enum":["confirmed","declined","pending"]}},{"name":"selected","in":"query","required":false,"schema":{"type":"boolean"}},{"name":"sort","in":"query","required":false,"schema":{"type":"string","enum":["datetime","displayName","type"],"default":"datetime"}},{"name":"direction","in":"query","required":false,"schema":{"type":"string","enum":["asc","desc"],"default":"desc"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":20}},{"name":"cursor","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":1024}},{"name":"groupId","in":"query","required":false,"description":"Glissandoo resource identifier","schema":{"type":"string","minLength":1,"maxLength":128}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","required":["data","pagination"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/MyMemberEvent"}},"pagination":{"$ref":"#/components/schemas/Pagination"}}}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid credential","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Insufficient permissions","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/groups/{groupId}":{"get":{"operationId":"getGroup","summary":"Get a group","description":"Requires group membership. Member custom field definitions are only included with Owner or Members permission.","tags":["Groups"],"parameters":[{"name":"groupId","in":"path","required":true,"description":"Glissandoo resource identifier","schema":{"type":"string","minLength":1,"maxLength":128}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/GroupDetail"}}}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid credential","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Insufficient permissions","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource not found or not accessible","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/groups/{groupId}/events":{"get":{"operationId":"listGroupEvents","summary":"List group events","description":"Requires Owner or Events permission in the group.","tags":["Groups","Events"],"parameters":[{"name":"groupId","in":"path","required":true,"description":"Glissandoo resource identifier","schema":{"type":"string","minLength":1,"maxLength":128}},{"name":"startDate","in":"query","required":true,"description":"Range start","schema":{"type":"string","format":"date-time"}},{"name":"endDate","in":"query","required":true,"description":"Range end","schema":{"type":"string","format":"date-time"}},{"name":"type","in":"query","required":false,"schema":{"type":"string","enum":["practice","performance","other"]}},{"name":"q","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":200}},{"name":"status","in":"query","required":false,"schema":{"type":"string","enum":["confirmed","declined","pending"]}},{"name":"rollcall","in":"query","required":false,"schema":{"type":"string","enum":["confirmed","declined","pending"]}},{"name":"selected","in":"query","required":false,"schema":{"type":"boolean"}},{"name":"sort","in":"query","required":false,"schema":{"type":"string","enum":["datetime","displayName","type"],"default":"datetime"}},{"name":"direction","in":"query","required":false,"schema":{"type":"string","enum":["asc","desc"],"default":"desc"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":20}},{"name":"cursor","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":1024}},{"name":"memberId","in":"query","required":false,"description":"Glissandoo resource identifier","schema":{"type":"string","minLength":1,"maxLength":128}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","required":["data","pagination"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/GroupEvent"}},"pagination":{"$ref":"#/components/schemas/Pagination"}}}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid credential","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Insufficient permissions","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource not found or not accessible","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/groups/{groupId}/members/{memberId}/events/metrics":{"get":{"operationId":"getGroupMemberEventMetrics","summary":"Get attendance metrics for a group member","description":"Requires Owner, Members or Events permission in the group.","tags":["Groups","Members","Events","Metrics"],"parameters":[{"name":"groupId","in":"path","required":true,"description":"Glissandoo resource identifier","schema":{"type":"string","minLength":1,"maxLength":128}},{"name":"memberId","in":"path","required":true,"description":"Glissandoo resource identifier","schema":{"type":"string","minLength":1,"maxLength":128}},{"name":"startDate","in":"query","required":true,"description":"Range start","schema":{"type":"string","format":"date-time"}},{"name":"endDate","in":"query","required":true,"description":"Range end","schema":{"type":"string","format":"date-time"}},{"name":"type","in":"query","required":false,"schema":{"type":"string","enum":["practice","performance","other"]}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/MemberEventMetrics"}}}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid credential","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Insufficient permissions","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource not found or not accessible","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/groups/{groupId}/members/{memberId}/events/{eventId}":{"get":{"operationId":"getGroupMemberEvent","summary":"Get a member participation in an event","description":"Requires Owner, Members or Events permission in the group.","tags":["Groups","Members","Events"],"parameters":[{"name":"groupId","in":"path","required":true,"description":"Glissandoo resource identifier","schema":{"type":"string","minLength":1,"maxLength":128}},{"name":"memberId","in":"path","required":true,"description":"Glissandoo resource identifier","schema":{"type":"string","minLength":1,"maxLength":128}},{"name":"eventId","in":"path","required":true,"description":"Glissandoo resource identifier","schema":{"type":"string","minLength":1,"maxLength":128}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/MemberEventDetail"}}}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid credential","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Insufficient permissions","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource not found or not accessible","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/groups/{groupId}/members":{"get":{"operationId":"listGroupMembers","summary":"List group members","description":"Requires Owner or Members permission in the group.","tags":["Groups","Members"],"parameters":[{"name":"groupId","in":"path","required":true,"description":"Glissandoo resource identifier","schema":{"type":"string","minLength":1,"maxLength":128}},{"name":"q","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":200}},{"name":"username","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":200}},{"name":"email","in":"query","required":false,"schema":{"type":"string","format":"email","maxLength":320}},{"name":"role","in":"query","required":false,"schema":{"type":"string","enum":["admin","member","guest"]}},{"name":"mainInstrumentId","in":"query","required":false,"description":"Glissandoo resource identifier","schema":{"type":"string","minLength":1,"maxLength":128}},{"name":"customFields","in":"query","required":false,"schema":{"type":"string","minLength":2,"maxLength":4096}},{"name":"sort","in":"query","required":false,"schema":{"type":"string","enum":["displayName","joinedAt","role","mainInstrumentId","name","lastname","email"],"default":"displayName"}},{"name":"direction","in":"query","required":false,"schema":{"type":"string","enum":["asc","desc"],"default":"asc"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":20}},{"name":"cursor","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":1024}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","required":["data","pagination"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/MemberListItem"}},"pagination":{"$ref":"#/components/schemas/Pagination"}}}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid credential","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Insufficient permissions","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource not found or not accessible","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/groups/{groupId}/members/{memberId}":{"get":{"operationId":"getGroupMember","summary":"Get a group member","description":"Requires Owner or Members permission in the group.","tags":["Groups","Members"],"parameters":[{"name":"groupId","in":"path","required":true,"description":"Glissandoo resource identifier","schema":{"type":"string","minLength":1,"maxLength":128}},{"name":"memberId","in":"path","required":true,"description":"Glissandoo resource identifier","schema":{"type":"string","minLength":1,"maxLength":128}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/Member"}}}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid credential","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Insufficient permissions","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource not found or not accessible","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/groups/{groupId}/members/{memberId}/events":{"get":{"operationId":"listGroupMemberEvents","summary":"List events for a group member","description":"Requires Owner, Members or Events permission in the group.","tags":["Groups","Members","Events"],"parameters":[{"name":"groupId","in":"path","required":true,"description":"Glissandoo resource identifier","schema":{"type":"string","minLength":1,"maxLength":128}},{"name":"memberId","in":"path","required":true,"description":"Glissandoo resource identifier","schema":{"type":"string","minLength":1,"maxLength":128}},{"name":"startDate","in":"query","required":true,"description":"Range start","schema":{"type":"string","format":"date-time"}},{"name":"endDate","in":"query","required":true,"description":"Range end","schema":{"type":"string","format":"date-time"}},{"name":"type","in":"query","required":false,"schema":{"type":"string","enum":["practice","performance","other"]}},{"name":"q","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":200}},{"name":"status","in":"query","required":false,"schema":{"type":"string","enum":["confirmed","declined","pending"]}},{"name":"rollcall","in":"query","required":false,"schema":{"type":"string","enum":["confirmed","declined","pending"]}},{"name":"selected","in":"query","required":false,"schema":{"type":"boolean"}},{"name":"sort","in":"query","required":false,"schema":{"type":"string","enum":["datetime","displayName","type"],"default":"datetime"}},{"name":"direction","in":"query","required":false,"schema":{"type":"string","enum":["asc","desc"],"default":"desc"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":20}},{"name":"cursor","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":1024}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","required":["data","pagination"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/MemberEventListItem"}},"pagination":{"$ref":"#/components/schemas/Pagination"}}}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid credential","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Insufficient permissions","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource not found or not accessible","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/groups/{groupId}/repertoire":{"get":{"operationId":"listGroupRepertoire","summary":"List group repertoire metadata","description":"Requires Owner or Repertoire permission in the group.","tags":["Groups","Repertoire"],"parameters":[{"name":"groupId","in":"path","required":true,"description":"Glissandoo resource identifier","schema":{"type":"string","minLength":1,"maxLength":128}},{"name":"q","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":200}},{"name":"tag","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":200}},{"name":"eventId","in":"query","required":false,"description":"Glissandoo resource identifier","schema":{"type":"string","minLength":1,"maxLength":128}},{"name":"visibility","in":"query","required":false,"schema":{"type":"string","enum":["always","byEvent"]}},{"name":"sort","in":"query","required":false,"schema":{"type":"string","enum":["createdAt","title","composer","lastEventDatetime"],"default":"createdAt"}},{"name":"direction","in":"query","required":false,"schema":{"type":"string","enum":["asc","desc"],"default":"desc"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":20}},{"name":"cursor","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":1024}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","required":["data","pagination"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/RepertoireListItem"}},"pagination":{"$ref":"#/components/schemas/Pagination"}}}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid credential","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Insufficient permissions","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource not found or not accessible","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/groups/{groupId}/repertoire/{repertoireId}":{"get":{"operationId":"getRepertoireItem","summary":"Get repertoire item metadata","description":"Requires Owner or Repertoire permission in the group.","tags":["Groups","Repertoire"],"parameters":[{"name":"groupId","in":"path","required":true,"description":"Glissandoo resource identifier","schema":{"type":"string","minLength":1,"maxLength":128}},{"name":"repertoireId","in":"path","required":true,"description":"Glissandoo resource identifier","schema":{"type":"string","minLength":1,"maxLength":128}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/Repertoire"}}}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid credential","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Insufficient permissions","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource not found or not accessible","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/groups/{groupId}/events/metrics":{"get":{"operationId":"getGroupEventMetrics","summary":"Get group-wide event attendance metrics","description":"Requires Owner or Events permission in the group.","tags":["Groups","Events","Metrics"],"parameters":[{"name":"groupId","in":"path","required":true,"description":"Glissandoo resource identifier","schema":{"type":"string","minLength":1,"maxLength":128}},{"name":"startDate","in":"query","required":true,"description":"Range start","schema":{"type":"string","format":"date-time"}},{"name":"endDate","in":"query","required":true,"description":"Range end","schema":{"type":"string","format":"date-time"}},{"name":"type","in":"query","required":false,"schema":{"type":"string","enum":["practice","performance","other"]}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":20}},{"name":"cursor","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":1024}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","required":["data","pagination"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/GroupEventMetricsItem"}},"pagination":{"$ref":"#/components/schemas/Pagination"}}}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid credential","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Insufficient permissions","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource not found or not accessible","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/groups/{groupId}/events/{eventId}":{"get":{"operationId":"getGroupEvent","summary":"Get a group event","description":"Requires Owner or Events permission in the group. Returns the event with its participant roster (including per-participant attendance) and the event question definitions.","tags":["Groups","Events"],"parameters":[{"name":"groupId","in":"path","required":true,"description":"Glissandoo resource identifier","schema":{"type":"string","minLength":1,"maxLength":128}},{"name":"eventId","in":"path","required":true,"description":"Glissandoo resource identifier","schema":{"type":"string","minLength":1,"maxLength":128}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/GroupEventDetail"}}}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid credential","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Insufficient permissions","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource not found or not accessible","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}},"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"x-api-key","description":"User API key. Public API v1 accepts requests from every browser origin."},"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"OAuth 2.1 access token or Glissandoo API key","description":"OAuth 2.1 access token, or a user API key for backwards-compatible technical integrations."},"OAuth2":{"type":"oauth2","description":"Delegated read-only access for browser and MCP clients.","flows":{"authorizationCode":{"authorizationUrl":"https://auth.glissandoo.com/oauth/authorize","tokenUrl":"https://auth.glissandoo.com/oauth/token","scopes":{"public-api:read":"Read data visible to the authenticated user"}}}}},"schemas":{"Health":{"type":"object","required":["status","version"],"properties":{"status":{"type":"string","enum":["ok"],"description":"Service status."},"version":{"type":"string","enum":["v1"],"description":"API version."}}},"Pagination":{"type":"object","required":["hasMore","nextCursor"],"properties":{"hasMore":{"type":"boolean","description":"true when more pages are available."},"nextCursor":{"type":["string","null"],"description":"Cursor to request the next page. null on the last page."}}},"Membership":{"type":"object","required":["id","role","permissions","instrumentIds"],"properties":{"id":{"type":"string","description":"User identifier of the member."},"role":{"type":"string","enum":["admin","member","guest"],"description":"Membership role in the group."},"permissions":{"type":"array","items":{"type":"string"},"description":"Admin permissions the member holds in the group."},"mainInstrumentId":{"type":["string","null"],"description":"Identifier of the member main instrument. null when not set."},"instrumentIds":{"type":"array","items":{"type":"string"},"description":"Identifiers of the member instruments."},"joinedAt":{"type":["string","null"],"format":"date-time","description":"When the member joined the group, ISO 8601. null when unknown."}}},"Group":{"type":"object","required":["id","displayName","username"],"properties":{"id":{"type":"string","description":"Unique group identifier."},"displayName":{"type":"string","description":"Group display name."},"username":{"type":"string","description":"Group public username."},"photoURL":{"type":["string","null"],"description":"Group photo URL. null when not set."},"musicStyle":{"type":["string","null"],"description":"Group music style. null when not set."},"locality":{"type":["string","null"],"description":"Group locality or city. null when not set."},"country":{"type":["string","null"],"description":"Group country. null when not set."},"membership":{"$ref":"#/components/schemas/Membership","description":"Your membership in the group."}}},"GroupMemberField":{"type":"object","description":"Definition of a member custom field configured for the group.","required":["id","label","type","required","allowEditByMember","private","options","order"],"properties":{"id":{"type":"string","description":"Custom field identifier."},"label":{"type":"string","description":"Field label shown to members."},"type":{"type":"string","enum":["text","number","date","select","email","phone","link","paragraph"],"description":"Field input type."},"required":{"type":"boolean","description":"true when members must fill this field."},"allowEditByMember":{"type":"boolean","description":"true when the member can edit their own value."},"private":{"type":"boolean","description":"true when the field is private."},"placeholder":{"type":["string","null"],"description":"Placeholder text. null when not set."},"options":{"type":"array","description":"Selectable options, for select-type fields.","items":{"type":"object","required":["id","value"],"properties":{"id":{"type":"string","description":"Option identifier."},"value":{"type":"string","description":"Option text."}}}},"order":{"type":"integer","description":"Display order."}}},"GroupDetail":{"type":"object","description":"A group, including member custom field definitions for member managers.","required":[],"properties":{"memberFields":{"type":"array","description":"Member custom field definitions. Only present with Owner or Members permission; otherwise omitted.","items":{"$ref":"#/components/schemas/GroupMemberField"}}},"allOf":[{"$ref":"#/components/schemas/Group"}]},"Event":{"type":"object","required":["id","type","datetime","datetimeEnd","timezone","createdAt","online","group","repertoire"],"properties":{"id":{"type":"string","description":"Unique event identifier."},"title":{"type":["string","null"],"description":"Event title. null when it has no title."},"description":{"type":["string","null"],"description":"Event description text. null when it has no description."},"type":{"type":"string","enum":["practice","performance","other"],"description":"Event category (rehearsal, concert, etc.)."},"datetime":{"type":"string","format":"date-time","description":"Event start, ISO 8601."},"datetimeEnd":{"type":"string","format":"date-time","description":"Event end, ISO 8601."},"timezone":{"type":"string","description":"IANA timezone the event is scheduled in."},"createdAt":{"type":"string","format":"date-time","description":"When the event was created, ISO 8601."},"locality":{"type":["string","null"],"description":"Human-readable place or city. null when not set."},"location":{"type":["object","null"],"description":"Venue coordinates. null when the event has no coordinates.","required":["latitude","longitude"],"properties":{"latitude":{"type":["number","null"],"description":"Latitude in decimal degrees."},"longitude":{"type":["number","null"],"description":"Longitude in decimal degrees."}}},"online":{"type":"boolean","description":"true when the event takes place online."},"group":{"type":"object","description":"The group that promotes the event.","required":["id","displayName"],"properties":{"id":{"type":"string","description":"Group identifier."},"displayName":{"type":"string","description":"Group display name."}}},"repertoire":{"type":"array","description":"Repertoire pieces linked to the event, ordered as in the event.","items":{"type":"object","required":["id","title"],"properties":{"id":{"type":"string","description":"Repertoire item identifier."},"title":{"type":"string","description":"Repertoire item title."}}}}}},"GroupEventPlayer":{"type":"object","description":"Event participant with their forecast, roll-call attendance, selection, remarks and question answers.","required":["id","displayName","forecast","attended","selected","remarks","answers"],"properties":{"id":{"type":"string","description":"User identifier of the participant."},"displayName":{"type":"string","description":"Participant display name."},"username":{"type":["string","null"],"description":"Participant public username. null when not set."},"mainInstrumentId":{"type":["string","null"],"description":"Identifier of the participant main instrument. null when not set."},"forecast":{"type":["string","null"],"enum":["confirmed","declined",null],"description":"Forecast response of the participant; null when not answered."},"attended":{"type":["boolean","null"],"description":"Actual roll-call attendance: true confirmed, false declined, null when roll call was not taken."},"selected":{"type":["boolean","null"],"description":"Whether the participant was selected to attend."},"remarks":{"type":["string","null"],"description":"Private roll-call remark for this participant. null when none."},"answers":{"type":"array","description":"Questions the participant answered, with their titles and selected options.","items":{"type":"object","required":["id","title","note","answers"],"properties":{"id":{"type":"string","description":"Identifier of the event question."},"title":{"type":"string","description":"Question title."},"note":{"type":["string","null"],"description":"Free-text note the participant attached to this question. null when none."},"answers":{"type":"array","description":"Options the participant selected for this question.","items":{"type":"object","required":["id","title"],"properties":{"id":{"type":"string","description":"Answer option identifier."},"title":{"type":"string","description":"Answer option text."}}}}}}}}},"EventQuestion":{"type":"object","description":"A question configured for the event, with its answer options.","required":["id","title","status","multiselect","allowNotes","answers"],"properties":{"id":{"type":"string","description":"Question identifier."},"title":{"type":"string","description":"Question text."},"status":{"type":"string","enum":["confirmed","declined"],"description":"Response status the question is asked for."},"multiselect":{"type":"boolean","description":"true when more than one answer option can be selected."},"allowNotes":{"type":"boolean","description":"true when the member can attach a free-text note."},"answers":{"type":"array","description":"Available answer options.","items":{"type":"object","required":["id","text"],"properties":{"id":{"type":"string","description":"Answer option identifier."},"text":{"type":"string","description":"Answer option text."}}}}}},"GroupEventDetail":{"type":"object","description":"A group event including its participant roster and question definitions.","required":["id","type","datetime","datetimeEnd","timezone","responseDeadlineAt","online","selectionMode","createdAt","createdBy","repertoire","players","questions"],"properties":{"id":{"type":"string","description":"Unique event identifier."},"title":{"type":["string","null"],"description":"Event title. null when it has no title."},"description":{"type":["string","null"],"description":"Event description text. null when it has no description."},"type":{"type":"string","enum":["practice","performance","other"],"description":"Event category (rehearsal, concert, etc.)."},"datetime":{"type":"string","format":"date-time","description":"Event start, ISO 8601."},"datetimeEnd":{"type":"string","format":"date-time","description":"Event end, ISO 8601."},"timezone":{"type":"string","description":"IANA timezone the event is scheduled in."},"responseDeadlineAt":{"type":"string","format":"date-time","description":"Deadline for members to respond to the event, ISO 8601."},"locality":{"type":["string","null"],"description":"Human-readable place or city. null when not set."},"location":{"type":["object","null"],"description":"Venue coordinates. null when the event has no coordinates.","required":["latitude","longitude"],"properties":{"latitude":{"type":["number","null"],"description":"Latitude in decimal degrees."},"longitude":{"type":["number","null"],"description":"Longitude in decimal degrees."}}},"online":{"type":"boolean","description":"true when the event takes place online."},"selectionMode":{"type":["string","null"],"enum":["open","closed",null],"description":"Participant selection mode: open (members opt in) or closed (managers select). null when not applicable."},"createdAt":{"type":"string","format":"date-time","description":"When the event was created, ISO 8601."},"createdBy":{"type":["string","null"],"description":"User identifier of the event creator. null when not set."},"repertoire":{"type":"array","description":"Repertoire pieces linked to the event, ordered as in the event.","items":{"type":"object","required":["id","title"],"properties":{"id":{"type":"string","description":"Repertoire item identifier."},"title":{"type":"string","description":"Repertoire item title."}}}},"players":{"type":"array","description":"Participant roster with forecast, roll-call attendance, selection, remarks and answers.","items":{"$ref":"#/components/schemas/GroupEventPlayer"}},"questions":{"type":"array","description":"Question definitions configured for the event.","items":{"$ref":"#/components/schemas/EventQuestion"}}}},"GroupEventListPlayer":{"type":"object","description":"Event participant with their forecast, roll-call attendance and selection.","required":["id","displayName","forecast","attended","selected"],"properties":{"id":{"type":"string","description":"User identifier of the participant."},"displayName":{"type":"string","description":"Participant display name."},"username":{"type":["string","null"],"description":"Participant public username. null when not set."},"mainInstrumentId":{"type":["string","null"],"description":"Identifier of the participant main instrument. null when not set."},"forecast":{"type":["string","null"],"enum":["confirmed","declined",null],"description":"Forecast response of the participant; null when not answered."},"attended":{"type":["boolean","null"],"description":"Actual roll-call attendance: true confirmed, false declined, null when roll call was not taken."},"selected":{"type":["boolean","null"],"description":"Whether the participant was selected to attend."}}},"GroupEventBase":{"type":"object","description":"Core group event fields, shared by the event list and detail.","required":["id","type","datetime","datetimeEnd","timezone","online","repertoire"],"properties":{"id":{"type":"string","description":"Unique event identifier."},"title":{"type":["string","null"],"description":"Event title. null when it has no title."},"description":{"type":["string","null"],"description":"Event description text. null when it has no description."},"type":{"type":"string","enum":["practice","performance","other"],"description":"Event category (rehearsal, concert, etc.)."},"datetime":{"type":"string","format":"date-time","description":"Event start, ISO 8601."},"datetimeEnd":{"type":"string","format":"date-time","description":"Event end, ISO 8601."},"timezone":{"type":"string","description":"IANA timezone the event is scheduled in."},"locality":{"type":["string","null"],"description":"Human-readable place or city. null when not set."},"location":{"type":["object","null"],"description":"Venue coordinates. null when the event has no coordinates.","required":["latitude","longitude"],"properties":{"latitude":{"type":["number","null"],"description":"Latitude in decimal degrees."},"longitude":{"type":["number","null"],"description":"Longitude in decimal degrees."}}},"online":{"type":"boolean","description":"true when the event takes place online."},"repertoire":{"type":"array","description":"Repertoire pieces linked to the event, ordered as in the event.","items":{"type":"object","required":["id","title"],"properties":{"id":{"type":"string","description":"Repertoire item identifier."},"title":{"type":"string","description":"Repertoire item title."}}}}}},"GroupEvent":{"type":"object","description":"A group event with its participant roster.","required":["players"],"properties":{"players":{"type":"array","description":"Participant roster with forecast, roll-call attendance and selection.","items":{"$ref":"#/components/schemas/GroupEventListPlayer"}}},"allOf":[{"$ref":"#/components/schemas/GroupEventBase"}]},"MemberEventParticipation":{"type":"object","description":"The member relation with the event. forecast is the response the member gave in advance; attended is the actual roll-call attendance. Personal response details are returned to that member.","required":["memberId","invited","forecast","attended","selected","isGuest"],"properties":{"memberId":{"type":"string","description":"User identifier of the member this participation belongs to."},"invited":{"type":"boolean","enum":[true],"description":"Always true; the member is invited to the event."},"forecast":{"type":["string","null"],"enum":["confirmed","declined",null],"description":"Forecast response given by the member (confirmed/declined). null when not answered."},"attended":{"type":["boolean","null"],"description":"Actual roll-call attendance: true confirmed, false declined, null when roll call was not taken."},"selected":{"type":["boolean","null"],"description":"Whether the member was selected to attend. null when selection does not apply."},"note":{"type":["string","null"],"description":"Private note left by the member. null when none."},"isGuest":{"type":"boolean","description":"true when the member participates as a guest."},"questions":{"type":"array","description":"Questions the member answered, with their titles and selected options.","items":{"type":"object","required":["id","title","note","answers"],"properties":{"id":{"type":"string","description":"Identifier of the event question."},"title":{"type":"string","description":"Question title."},"note":{"type":["string","null"],"description":"Free-text note the member attached to this question. null when none."},"answers":{"type":"array","description":"Options the member selected for this question.","items":{"type":"object","required":["id","title"],"properties":{"id":{"type":"string","description":"Answer option identifier."},"title":{"type":"string","description":"Answer option text."}}}}}}}}},"MemberEventListItem":{"type":"object","description":"Basic event info with the member participation merged into the same object.","required":["id","type","datetime","datetimeEnd","timezone","forecast","attended","selected","isGuest"],"properties":{"id":{"type":"string","description":"Unique event identifier."},"title":{"type":["string","null"],"description":"Event title. null when it has no title."},"type":{"type":"string","enum":["practice","performance","other"],"description":"Event category (rehearsal, concert, etc.)."},"datetime":{"type":"string","format":"date-time","description":"Event start, ISO 8601."},"datetimeEnd":{"type":"string","format":"date-time","description":"Event end, ISO 8601."},"timezone":{"type":"string","description":"IANA timezone the event is scheduled in."},"locality":{"type":["string","null"],"description":"Human-readable place or city. null when not set."},"location":{"type":["object","null"],"description":"Venue coordinates. null when the event has no coordinates.","required":["latitude","longitude"],"properties":{"latitude":{"type":["number","null"],"description":"Latitude in decimal degrees."},"longitude":{"type":["number","null"],"description":"Longitude in decimal degrees."}}},"forecast":{"type":["string","null"],"enum":["confirmed","declined",null],"description":"Forecast response given by the member (confirmed/declined). null when not answered."},"attended":{"type":["boolean","null"],"description":"Actual roll-call attendance: true confirmed, false declined, null when roll call was not taken."},"selected":{"type":["boolean","null"],"description":"Whether the member was selected to attend. null when selection does not apply."},"isGuest":{"type":"boolean","description":"true when the member participates as a guest."}}},"MemberEventDetail":{"type":"object","description":"Basic event info plus the member participation, merged into one object.","required":["id","type","datetime","datetimeEnd","timezone","online","repertoire","forecast","attended","selected","isGuest","attendedAt","attendedVia","remarks","note","questions"],"properties":{"id":{"type":"string","description":"Unique event identifier."},"title":{"type":["string","null"],"description":"Event title. null when it has no title."},"description":{"type":["string","null"],"description":"Event description text. null when it has no description."},"type":{"type":"string","enum":["practice","performance","other"],"description":"Event category (rehearsal, concert, etc.)."},"datetime":{"type":"string","format":"date-time","description":"Event start, ISO 8601."},"datetimeEnd":{"type":"string","format":"date-time","description":"Event end, ISO 8601."},"timezone":{"type":"string","description":"IANA timezone the event is scheduled in."},"locality":{"type":["string","null"],"description":"Human-readable place or city. null when not set."},"location":{"type":["object","null"],"description":"Venue coordinates. null when the event has no coordinates.","required":["latitude","longitude"],"properties":{"latitude":{"type":["number","null"],"description":"Latitude in decimal degrees."},"longitude":{"type":["number","null"],"description":"Longitude in decimal degrees."}}},"online":{"type":"boolean","description":"true when the event takes place online."},"repertoire":{"type":"array","description":"Repertoire pieces linked to the event, ordered as in the event.","items":{"type":"object","required":["id","title"],"properties":{"id":{"type":"string","description":"Repertoire item identifier."},"title":{"type":"string","description":"Repertoire item title."}}}},"forecast":{"type":["string","null"],"enum":["confirmed","declined",null],"description":"Forecast response given by the member (confirmed/declined). null when not answered."},"attended":{"type":["boolean","null"],"description":"Actual roll-call attendance: true confirmed, false declined, null when roll call was not taken."},"selected":{"type":["boolean","null"],"description":"Whether the member was selected to attend. null when selection does not apply."},"isGuest":{"type":"boolean","description":"true when the member participates as a guest."},"attendedAt":{"type":["string","null"],"format":"date-time","description":"When roll call was taken for this member, ISO 8601. null when not taken."},"attendedVia":{"type":["string","null"],"enum":["QR","GeoLoc","Admin",null],"description":"How roll call was taken (QR, GeoLoc, Admin). null when not taken."},"remarks":{"type":["string","null"],"description":"Private roll-call remark for this member. null when none."},"note":{"type":["string","null"],"description":"Administrative note about the member participation. null when none."},"questions":{"type":"array","description":"Questions the member answered, with their titles and selected options.","items":{"type":"object","required":["id","title","note","answers"],"properties":{"id":{"type":"string","description":"Identifier of the event question."},"title":{"type":"string","description":"Question title."},"note":{"type":["string","null"],"description":"Free-text note the member attached to this question. null when none."},"answers":{"type":"array","description":"Options the member selected for this question.","items":{"type":"object","required":["id","title"],"properties":{"id":{"type":"string","description":"Answer option identifier."},"title":{"type":"string","description":"Answer option text."}}}}}}}}},"EventPlayerSummary":{"type":"object","description":"Lightweight participant identity, without attendance data.","required":["id","displayName"],"properties":{"id":{"type":"string","description":"User identifier of the participant."},"displayName":{"type":"string","description":"Participant display name."},"username":{"type":["string","null"],"description":"Participant public username. null when not set."},"mainInstrumentId":{"type":["string","null"],"description":"Identifier of the participant main instrument. null when not set."}}},"EventWithRoster":{"type":"object","description":"Event including a lightweight roster of participants (identity only, no attendance).","required":["players"],"properties":{"players":{"type":"array","items":{"$ref":"#/components/schemas/EventPlayerSummary"},"description":"Participants of the event (identity only)."}},"allOf":[{"$ref":"#/components/schemas/Event"}]},"MyMemberEvent":{"type":"object","required":["event","participation"],"properties":{"event":{"$ref":"#/components/schemas/EventWithRoster"},"participation":{"$ref":"#/components/schemas/MemberEventParticipation"}}},"AttendanceStatusBreakdown":{"type":"object","required":["confirmed","declined","pending","confirmedPercentage","declinedPercentage","pendingPercentage"],"properties":{"confirmed":{"type":"integer","minimum":0,"description":"Number of confirmed entries."},"declined":{"type":"integer","minimum":0,"description":"Number of declined entries."},"pending":{"type":"integer","minimum":0,"description":"Number of pending entries (no response)."},"confirmedPercentage":{"type":["integer","null"],"minimum":0,"maximum":100,"description":"Confirmed share as a percentage. null when there is no data."},"declinedPercentage":{"type":["integer","null"],"minimum":0,"maximum":100,"description":"Declined share as a percentage. null when there is no data."},"pendingPercentage":{"type":["integer","null"],"minimum":0,"maximum":100,"description":"Pending share as a percentage. null when there is no data."}}},"AttendanceMetricsBucket":{"type":"object","required":["total","forecast","attendance"],"properties":{"total":{"type":"integer","minimum":0,"description":"Total entries counted in this bucket."},"forecast":{"$ref":"#/components/schemas/AttendanceStatusBreakdown","description":"Breakdown by forecast response."},"attendance":{"$ref":"#/components/schemas/AttendanceStatusBreakdown","description":"Breakdown by actual roll-call attendance."}}},"MemberEventMetrics":{"type":"object","description":"Attendance metrics using the same denominator and rounding as the dashboard member attendance view.","required":["groupId","memberId","range","type","overall","byType"],"properties":{"groupId":{"type":"string","description":"Group identifier."},"memberId":{"type":"string","description":"Member identifier."},"range":{"type":"object","description":"Date range the metrics cover.","required":["startDate","endDate"],"properties":{"startDate":{"type":"string","format":"date-time","description":"Range start, ISO 8601."},"endDate":{"type":"string","format":"date-time","description":"Range end, ISO 8601."}}},"type":{"type":["string","null"],"enum":["practice","performance","other",null],"description":"Event type the metrics are filtered by, or null for all types."},"overall":{"$ref":"#/components/schemas/AttendanceMetricsBucket","description":"Metrics across all event types."},"byType":{"type":"object","description":"Metrics split by event type.","required":["practice","performance","other"],"properties":{"practice":{"$ref":"#/components/schemas/AttendanceMetricsBucket"},"performance":{"$ref":"#/components/schemas/AttendanceMetricsBucket"},"other":{"$ref":"#/components/schemas/AttendanceMetricsBucket"}}}}},"GroupEventMetricsItem":{"type":"object","description":"A group event with its attendance metrics.","required":["id","type","datetime","datetimeEnd","timezone","metrics"],"properties":{"id":{"type":"string","description":"Unique event identifier."},"title":{"type":["string","null"],"description":"Event title. null when it has no title."},"type":{"type":"string","enum":["practice","performance","other"],"description":"Event category (rehearsal, concert, etc.)."},"datetime":{"type":"string","format":"date-time","description":"Event start, ISO 8601."},"datetimeEnd":{"type":"string","format":"date-time","description":"Event end, ISO 8601."},"timezone":{"type":"string","description":"IANA timezone the event is scheduled in."},"locality":{"type":["string","null"],"description":"Human-readable place or city. null when not set."},"location":{"type":["object","null"],"description":"Venue coordinates. null when the event has no coordinates.","required":["latitude","longitude"],"properties":{"latitude":{"type":["number","null"],"description":"Latitude in decimal degrees."},"longitude":{"type":["number","null"],"description":"Longitude in decimal degrees."}}},"metrics":{"$ref":"#/components/schemas/AttendanceMetricsBucket","description":"Attendance metrics for this event (total participants, forecast and roll-call breakdown)."}}},"MemberListItem":{"type":"object","description":"Group member directory entry.","required":["id","displayName","registered","instrumentIds","role","joinedAt"],"properties":{"id":{"type":"string","description":"User identifier of the member."},"username":{"type":["string","null"],"description":"Public username. null when not set."},"displayName":{"type":"string","description":"Display name."},"photoURL":{"type":["string","null"],"description":"Photo URL. null when not set."},"registered":{"type":"boolean","description":"false when this is a placeholder member without a registered account."},"mainInstrumentId":{"type":["string","null"],"description":"Identifier of the main instrument. null when not set."},"instrumentIds":{"type":"array","items":{"type":"string"},"description":"Identifiers of the member instruments."},"role":{"type":"string","description":"Membership role in the group."},"joinedAt":{"type":["string","null"],"format":"date-time","description":"When the member joined, ISO 8601. null when unknown."}}},"Member":{"type":"object","description":"Full group member profile, including personal and administrative fields.","required":["id","displayName","registered","instrumentIds","role","joinedAt","permissions","additionalInfo","fields"],"properties":{"id":{"type":"string","description":"User identifier of the member."},"username":{"type":["string","null"],"description":"Public username. null when not set."},"displayName":{"type":"string","description":"Display name."},"photoURL":{"type":["string","null"],"description":"Photo URL. null when not set."},"registered":{"type":"boolean","description":"false when this is a placeholder member without a registered account."},"mainInstrumentId":{"type":["string","null"],"description":"Identifier of the main instrument. null when not set."},"instrumentIds":{"type":"array","items":{"type":"string"},"description":"Identifiers of the member instruments."},"role":{"type":"string","description":"Membership role in the group."},"joinedAt":{"type":["string","null"],"format":"date-time","description":"When the member joined, ISO 8601. null when unknown."},"name":{"type":["string","null"],"description":"First name. null when not set."},"lastname":{"type":["string","null"],"description":"Last name. null when not set."},"email":{"type":["string","null"],"format":"email","description":"Email. null when not set."},"locality":{"type":["string","null"],"description":"Locality or city. null when not set."},"birthDate":{"type":["string","null"],"format":"date-time","description":"Birth date, ISO 8601. null when not set."},"permissions":{"type":"array","items":{"type":"string"},"description":"Admin permissions in the group."},"additionalInfo":{"type":"array","items":{},"description":"Administrative additional info."},"fields":{"type":"array","description":"Values the member filled in for the group custom fields.","items":{"type":"object","required":["id","name","value"],"properties":{"id":{"type":"string","description":"Custom field identifier."},"name":{"type":"string","description":"Field title from the group definition."},"value":{"type":["string","number","boolean","array","null"],"items":{"type":"string"},"description":"Value the member set. For select fields, an array of the selected option labels. null when empty."}}}}}},"RepertoireListItem":{"type":"object","description":"Repertoire piece summary.","required":["id","title","tags"],"properties":{"id":{"type":"string","description":"Repertoire item identifier."},"title":{"type":"string","description":"Piece title."},"composer":{"type":["string","null"],"description":"Composer. null when not set."},"tags":{"type":"array","items":{"type":"string"},"description":"Tags attached to the piece."}}},"Repertoire":{"type":"object","description":"Repertoire piece detail.","required":["id","title","tags","createdAt","createdBy","visibility","eventIds"],"properties":{"id":{"type":"string","description":"Repertoire item identifier."},"title":{"type":"string","description":"Piece title."},"composer":{"type":["string","null"],"description":"Composer. null when not set."},"tags":{"type":"array","items":{"type":"string"},"description":"Tags attached to the piece."},"createdAt":{"type":"string","format":"date-time","description":"When the item was created, ISO 8601."},"createdBy":{"type":"string","description":"User identifier of the item creator."},"visibility":{"type":"string","enum":["always","byEvent"],"description":"Visibility setting: always (visible to members) or byEvent (visible only through its events)."},"eventIds":{"type":"array","items":{"type":"string"},"description":"Identifiers of events using this piece."}}},"Error":{"type":"object","description":"Standard error envelope returned for any non-2xx response.","required":["error","requestId"],"properties":{"error":{"type":"object","description":"Error details.","required":["code","message"],"properties":{"code":{"type":"string","description":"Machine-readable error code."},"message":{"type":"string","description":"Human-readable error message."},"details":{"description":"Optional additional error context."}}},"requestId":{"type":"string","description":"Request identifier, useful for support and tracing."}}}}}}