{"openapi":"3.0.0","info":{"title":"Sporttihubi API","version":"1.0.0"},"tags":[{"name":"clubs","description":"Club endpoints."},{"name":"events","description":"Event endpoints."},{"name":"sport-places","description":"Sport place endpoints."}],"servers":[{"url":"https://api.sporttihubi.fi"}],"components":{"schemas":{"HealthResponse":{"type":"object","properties":{"ok":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"status":{"type":"string","enum":["ok"]}},"required":["status"]},"meta":{"$ref":"#/components/schemas/ApiMeta"}},"required":["ok","data","meta"]},"ApiMeta":{"type":"object","properties":{"requestId":{"type":"string"},"timestamp":{"type":"string","format":"date-time"},"page":{"type":"integer"},"pageSize":{"type":"integer"},"total":{"type":"integer"},"hasNext":{"type":"boolean"}},"required":["requestId","timestamp"]},"ErrorResponse":{"type":"object","properties":{"ok":{"type":"boolean","enum":[false]},"error":{"type":"object","properties":{"code":{"$ref":"#/components/schemas/ErrorCode"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":{"nullable":true}}},"required":["code","message"]},"meta":{"$ref":"#/components/schemas/ApiMeta"}},"required":["ok","error","meta"]},"ErrorCode":{"type":"string","enum":["BAD_REQUEST","VALIDATION_ERROR","UNAUTHORIZED","FORBIDDEN","NOT_FOUND","DB_ERROR","SERVER_MISCONFIG","INTERNAL_ERROR"]},"AuthUserResponse":{"type":"object","properties":{"ok":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/AuthUser"},"meta":{"$ref":"#/components/schemas/ApiMeta"}},"required":["ok","data","meta"]},"AuthUser":{"type":"object","properties":{"id":{"type":"string"},"email":{"type":"string","format":"email"},"name":{"type":"string","nullable":true},"image":{"type":"string","nullable":true},"role":{"type":"string"},"isActive":{"type":"boolean"},"stripeCustomerId":{"type":"string","nullable":true}},"required":["id","email","name","image","role","isActive","stripeCustomerId"]},"AuthSuccessResponse":{"type":"object","properties":{"ok":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"user":{"$ref":"#/components/schemas/AuthUser"},"tokens":{"$ref":"#/components/schemas/AuthTokens"}},"required":["user","tokens"]},"meta":{"$ref":"#/components/schemas/ApiMeta"}},"required":["ok","data","meta"]},"AuthTokens":{"type":"object","properties":{"accessToken":{"type":"string"},"accessTokenExpiresAt":{"type":"integer"},"refreshToken":{"type":"string"},"refreshTokenExpiresAt":{"type":"integer"}},"required":["accessToken","accessTokenExpiresAt","refreshToken","refreshTokenExpiresAt"]},"AuthCallbackForm":{"type":"object","properties":{"code":{"type":"string"},"state":{"type":"string"}},"required":["code","state"]},"RefreshTokenRequest":{"type":"object","properties":{"refreshToken":{"type":"string","minLength":1}}},"LogoutResponse":{"type":"object","properties":{"ok":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"revoked":{"type":"boolean"}},"required":["revoked"]},"meta":{"$ref":"#/components/schemas/ApiMeta"}},"required":["ok","data","meta"]},"LogoutRequest":{"type":"object","properties":{"refreshToken":{"type":"string","minLength":1}}},"ClubResponse":{"type":"object","properties":{"ok":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/Club"},"meta":{"$ref":"#/components/schemas/ApiMeta"}},"required":["ok","data","meta"]},"Club":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"status":{"type":"string","enum":["Draft","PendingReview","Published"]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"userId":{"type":"string"},"description":{"type":"string"},"website":{"type":"string"},"mobileNumber":{"type":"string"},"email":{"type":"string"},"bannerKey":{"type":"string"},"price":{"type":"number"},"currencyCode":{"type":"string"},"skillLevel":{"type":"string","enum":["Beginner","Intermediate","Advanced"]},"minAge":{"type":"integer"},"maxAge":{"type":"integer"},"groupSize":{"type":"integer"},"location":{"$ref":"#/components/schemas/ClubLocation"}},"required":["id","name","status","createdAt","updatedAt","userId"]},"ClubLocation":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"country":{"type":"string"},"region":{"anyOf":[{"type":"string","enum":["Ahvenanmaa","Etelä-Karjala","Etelä-Pohjanmaa","Etelä-Savo","Kainuu","Kanta-Häme","Keski-Pohjanmaa","Keski-Suomi","Kymenlaakso","Lappi","Pirkanmaa","Pohjanmaa","Pohjois-Karjala","Pohjois-Pohjanmaa","Pohjois-Savo","Päijät-Häme","Satakunta","Uusimaa","Varsinais-Suomi"]},{"type":"string","enum":[""]}]},"city":{"type":"string"},"zipcode":{"type":"string"},"address":{"type":"string"},"place":{"type":"string"},"lat":{"type":"number"},"lng":{"type":"number"}},"required":["id","country","region","city","zipcode","address","place","lat","lng"]},"CreateClubSchema":{"type":"object","properties":{"name":{"type":"string","minLength":3},"status":{"type":"string","enum":["Draft","PendingReview","Published"],"default":"PendingReview"},"description":{"type":"string"},"website":{"type":"string","format":"uri"},"mobileNumber":{"type":"string"},"email":{"type":"string","format":"email"},"price":{"type":"number","minimum":0},"skillLevel":{"type":"string","enum":["Beginner","Intermediate","Advanced"]},"minAge":{"type":"integer","minimum":0},"maxAge":{"type":"integer","minimum":0},"groupSize":{"type":"integer","minimum":0},"location":{"$ref":"#/components/schemas/CreateClubLocationSchema"}},"required":["name"]},"CreateClubLocationSchema":{"type":"object","properties":{"region":{"type":"string","enum":["Ahvenanmaa","Etelä-Karjala","Etelä-Pohjanmaa","Etelä-Savo","Kainuu","Kanta-Häme","Keski-Pohjanmaa","Keski-Suomi","Kymenlaakso","Lappi","Pirkanmaa","Pohjanmaa","Pohjois-Karjala","Pohjois-Pohjanmaa","Pohjois-Savo","Päijät-Häme","Satakunta","Uusimaa","Varsinais-Suomi"]},"city":{"type":"string"},"zipcode":{"type":"string"},"address":{"type":"string"},"place":{"type":"string"},"lat":{"type":"number"},"lng":{"type":"number"}},"required":["lat","lng"]},"ClubBannerResponseSchema":{"type":"object","properties":{"ok":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"bannerKey":{"type":"string"},"url":{"type":"string","format":"uri"}},"required":["bannerKey","url"]},"meta":{"$ref":"#/components/schemas/ApiMeta"}},"required":["ok","data","meta"]},"ClubBannerUploadSchema":{"type":"object","properties":{"file":{"type":"string","format":"binary"}},"required":["file"]},"UpdateClubSchema":{"type":"object","properties":{"name":{"type":"string","minLength":3},"status":{"type":"string","enum":["Draft","PendingReview","Published"]},"description":{"type":"string","nullable":true},"website":{"type":"string","nullable":true,"format":"uri"},"mobileNumber":{"type":"string","nullable":true},"email":{"type":"string","nullable":true,"format":"email"},"price":{"type":"number","nullable":true,"minimum":0},"skillLevel":{"type":"string","nullable":true,"enum":["Beginner","Intermediate","Advanced",null]},"minAge":{"type":"integer","nullable":true,"minimum":0},"maxAge":{"type":"integer","nullable":true,"minimum":0},"groupSize":{"type":"integer","nullable":true,"minimum":0},"location":{"$ref":"#/components/schemas/UpdateClubLocationSchema"}}},"UpdateClubLocationSchema":{"type":"object","nullable":true,"properties":{"region":{"type":"string","nullable":true,"enum":["Ahvenanmaa","Etelä-Karjala","Etelä-Pohjanmaa","Etelä-Savo","Kainuu","Kanta-Häme","Keski-Pohjanmaa","Keski-Suomi","Kymenlaakso","Lappi","Pirkanmaa","Pohjanmaa","Pohjois-Karjala","Pohjois-Pohjanmaa","Pohjois-Savo","Päijät-Häme","Satakunta","Uusimaa","Varsinais-Suomi",null]},"city":{"type":"string","nullable":true},"zipcode":{"type":"string","nullable":true},"address":{"type":"string","nullable":true},"place":{"type":"string","nullable":true},"lat":{"type":"number"},"lng":{"type":"number"}}},"ClubKeywordsResponseSchema":{"type":"object","properties":{"ok":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/ClubKeywordSchema"}},"meta":{"$ref":"#/components/schemas/ApiMeta"}},"required":["ok","data","meta"]},"ClubKeywordSchema":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"clubId":{"type":"string","format":"uuid"},"keyword":{"type":"string"}},"required":["id","clubId","keyword"]},"CreateClubKeywordsSchema":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string"}}},"required":["keywords"]},"DeleteClubResponseSchema":{"type":"object","properties":{"ok":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"id":{"type":"string","format":"uuid"}},"required":["id"]},"meta":{"$ref":"#/components/schemas/ApiMeta"}},"required":["ok","data","meta"]},"ClubsResponse":{"type":"object","properties":{"ok":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/Club"}},"meta":{"$ref":"#/components/schemas/ApiMeta"}},"required":["ok","data","meta"]},"HobbyEventsResponse":{"type":"object","properties":{"ok":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/HobbyEvent"}},"meta":{"$ref":"#/components/schemas/ApiMeta"}},"required":["ok","data","meta"]},"HobbyEvent":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"seriesId":{"type":"string","format":"uuid","description":"Sarjan id"},"occurrenceId":{"type":"string"},"occurrenceDate":{"type":"string","format":"date"},"occurrenceStart":{"type":"string","format":"date-time"},"isOccurrence":{"type":"boolean"},"occurrenceException":{"$ref":"#/components/schemas/HobbyEventOccurrenceExceptionSchema"},"title":{"type":"string"},"startsAt":{"type":"string","format":"date-time"},"endsAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"userId":{"type":"string"},"timezone":{"type":"string","enum":["Europe/Helsinki"]},"status":{"type":"string","enum":["Draft","Scheduled","Cancelled"]},"locationSource":{"type":"string","enum":["Own","Club","SportPlace"]},"description":{"type":"string"},"recurrenceRule":{"type":"string"},"recurrenceEndsAt":{"type":"string","format":"date"},"price":{"type":"number"},"phone":{"type":"string"},"email":{"type":"string"},"clubId":{"type":"string"},"sportPlaceId":{"type":"string"},"location":{"$ref":"#/components/schemas/HobbyEventLocation"}},"required":["id","title","startsAt","endsAt","createdAt","updatedAt","userId","timezone","status","locationSource"]},"HobbyEventOccurrenceExceptionSchema":{"type":"object","properties":{"eventId":{"type":"string","format":"uuid"},"occurrenceDate":{"type":"string","format":"date"},"isDeleted":{"type":"boolean"},"title":{"type":"string"},"description":{"type":"string"},"startsAt":{"type":"string","format":"date-time"},"endsAt":{"type":"string","format":"date-time"},"timezone":{"type":"string","enum":["Europe/Helsinki"]},"status":{"type":"string","enum":["Draft","Scheduled","Cancelled"]},"price":{"type":"number"},"phone":{"type":"string"},"email":{"type":"string","format":"email"},"locationSource":{"type":"string","enum":["Own","Club","SportPlace"]},"location":{"$ref":"#/components/schemas/HobbyEventLocationOverrideSchema"}},"required":["eventId","occurrenceDate","isDeleted"]},"HobbyEventLocationOverrideSchema":{"type":"object","properties":{"country":{"type":"string","nullable":true},"region":{"type":"string","nullable":true,"enum":["Ahvenanmaa","Etelä-Karjala","Etelä-Pohjanmaa","Etelä-Savo","Kainuu","Kanta-Häme","Keski-Pohjanmaa","Keski-Suomi","Kymenlaakso","Lappi","Pirkanmaa","Pohjanmaa","Pohjois-Karjala","Pohjois-Pohjanmaa","Pohjois-Savo","Päijät-Häme","Satakunta","Uusimaa","Varsinais-Suomi",null]},"city":{"type":"string","nullable":true},"zipcode":{"type":"string","nullable":true},"address":{"type":"string","nullable":true},"place":{"type":"string","nullable":true},"lat":{"type":"number","nullable":true},"lng":{"type":"number","nullable":true}}},"HobbyEventLocation":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"country":{"type":"string"},"region":{"type":"string","nullable":true,"enum":["Ahvenanmaa","Etelä-Karjala","Etelä-Pohjanmaa","Etelä-Savo","Kainuu","Kanta-Häme","Keski-Pohjanmaa","Keski-Suomi","Kymenlaakso","Lappi","Pirkanmaa","Pohjanmaa","Pohjois-Karjala","Pohjois-Pohjanmaa","Pohjois-Savo","Päijät-Häme","Satakunta","Uusimaa","Varsinais-Suomi",null]},"city":{"type":"string"},"zipcode":{"type":"string"},"address":{"type":"string"},"place":{"type":"string"},"lat":{"type":"number"},"lng":{"type":"number"}},"required":["id","country","region","city","zipcode","address","place","lat","lng"]},"SportPlaceResponse":{"type":"object","properties":{"ok":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/SportPlace"},"meta":{"$ref":"#/components/schemas/ApiMeta"}},"required":["ok","data","meta"]},"SportPlace":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"status":{"type":"string","enum":["Draft","PendingReview","Published"]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"userId":{"type":"string"},"description":{"type":"string"},"website":{"type":"string"},"mobileNumber":{"type":"string"},"email":{"type":"string"},"bannerKey":{"type":"string"},"location":{"$ref":"#/components/schemas/SportPlaceLocation"}},"required":["id","name","status","createdAt","updatedAt","userId"]},"SportPlaceLocation":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"country":{"type":"string"},"region":{"anyOf":[{"type":"string","enum":["Ahvenanmaa","Etelä-Karjala","Etelä-Pohjanmaa","Etelä-Savo","Kainuu","Kanta-Häme","Keski-Pohjanmaa","Keski-Suomi","Kymenlaakso","Lappi","Pirkanmaa","Pohjanmaa","Pohjois-Karjala","Pohjois-Pohjanmaa","Pohjois-Savo","Päijät-Häme","Satakunta","Uusimaa","Varsinais-Suomi"]},{"type":"string","enum":[""]}]},"city":{"type":"string"},"zipcode":{"type":"string"},"address":{"type":"string"},"place":{"type":"string"},"lat":{"type":"number"},"lng":{"type":"number"}},"required":["id","country","region","city","zipcode","address","place","lat","lng"]},"CreateSportPlaceSchema":{"type":"object","properties":{"name":{"type":"string","minLength":3},"status":{"type":"string","enum":["Draft","PendingReview","Published"],"default":"PendingReview"},"description":{"type":"string"},"website":{"type":"string","format":"uri"},"mobileNumber":{"type":"string"},"email":{"type":"string","format":"email"},"location":{"$ref":"#/components/schemas/CreateSportPlaceLocationSchema"}},"required":["name"]},"CreateSportPlaceLocationSchema":{"type":"object","properties":{"region":{"type":"string","enum":["Ahvenanmaa","Etelä-Karjala","Etelä-Pohjanmaa","Etelä-Savo","Kainuu","Kanta-Häme","Keski-Pohjanmaa","Keski-Suomi","Kymenlaakso","Lappi","Pirkanmaa","Pohjanmaa","Pohjois-Karjala","Pohjois-Pohjanmaa","Pohjois-Savo","Päijät-Häme","Satakunta","Uusimaa","Varsinais-Suomi"]},"city":{"type":"string"},"zipcode":{"type":"string"},"address":{"type":"string"},"place":{"type":"string"},"lat":{"type":"number"},"lng":{"type":"number"}},"required":["lat","lng"]},"SportPlaceBannerResponseSchema":{"type":"object","properties":{"ok":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"bannerKey":{"type":"string"},"url":{"type":"string","format":"uri"}},"required":["bannerKey","url"]},"meta":{"$ref":"#/components/schemas/ApiMeta"}},"required":["ok","data","meta"]},"SportPlaceBannerUploadSchema":{"type":"object","properties":{"file":{"type":"string","format":"binary"}},"required":["file"]},"UpdateSportPlaceSchema":{"type":"object","properties":{"name":{"type":"string","minLength":3},"status":{"type":"string","enum":["Draft","PendingReview","Published"]},"description":{"type":"string","nullable":true},"website":{"type":"string","nullable":true,"format":"uri"},"mobileNumber":{"type":"string","nullable":true},"email":{"type":"string","nullable":true,"format":"email"},"location":{"$ref":"#/components/schemas/UpdateSportPlaceLocationSchema"}}},"UpdateSportPlaceLocationSchema":{"type":"object","nullable":true,"properties":{"region":{"type":"string","nullable":true,"enum":["Ahvenanmaa","Etelä-Karjala","Etelä-Pohjanmaa","Etelä-Savo","Kainuu","Kanta-Häme","Keski-Pohjanmaa","Keski-Suomi","Kymenlaakso","Lappi","Pirkanmaa","Pohjanmaa","Pohjois-Karjala","Pohjois-Pohjanmaa","Pohjois-Savo","Päijät-Häme","Satakunta","Uusimaa","Varsinais-Suomi",null]},"city":{"type":"string","nullable":true},"zipcode":{"type":"string","nullable":true},"address":{"type":"string","nullable":true},"place":{"type":"string","nullable":true},"lat":{"type":"number"},"lng":{"type":"number"}}},"SportPlaceKeywordsResponseSchema":{"type":"object","properties":{"ok":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/SportPlaceKeywordSchema"}},"meta":{"$ref":"#/components/schemas/ApiMeta"}},"required":["ok","data","meta"]},"SportPlaceKeywordSchema":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"sportPlaceId":{"type":"string","format":"uuid"},"keyword":{"type":"string"}},"required":["id","sportPlaceId","keyword"]},"CreateSportPlaceKeywordsSchema":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string"}}},"required":["keywords"]},"DeleteSportPlaceResponseSchema":{"type":"object","properties":{"ok":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"id":{"type":"string","format":"uuid"}},"required":["id"]},"meta":{"$ref":"#/components/schemas/ApiMeta"}},"required":["ok","data","meta"]},"SportPlacesResponse":{"type":"object","properties":{"ok":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/SportPlace"}},"meta":{"$ref":"#/components/schemas/ApiMeta"}},"required":["ok","data","meta"]},"HobbyEventResponse":{"type":"object","properties":{"ok":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/HobbyEvent"},"meta":{"$ref":"#/components/schemas/ApiMeta"}},"required":["ok","data","meta"]},"CreateHobbyEventSchema":{"type":"object","properties":{"title":{"type":"string","minLength":3},"startsAt":{"type":"string","format":"date-time"},"endsAt":{"type":"string","format":"date-time"},"status":{"type":"string","enum":["Draft","Scheduled","Cancelled"],"default":"Scheduled"},"locationSource":{"type":"string","enum":["Own","Club","SportPlace"],"default":"Own"},"timezone":{"type":"string","enum":["Europe/Helsinki"],"default":"Europe/Helsinki"},"description":{"type":"string"},"recurrenceRule":{"type":"string"},"recurrenceEndsAt":{"type":"string","format":"date"},"phone":{"type":"string"},"email":{"type":"string","format":"email"},"price":{"type":"number","minimum":0},"location":{"$ref":"#/components/schemas/CreateHobbyEventLocationSchema"},"clubId":{"type":"string"},"sportPlaceId":{"type":"string"}},"required":["title","startsAt","endsAt"]},"CreateHobbyEventLocationSchema":{"type":"object","properties":{"region":{"type":"string","enum":["Ahvenanmaa","Etelä-Karjala","Etelä-Pohjanmaa","Etelä-Savo","Kainuu","Kanta-Häme","Keski-Pohjanmaa","Keski-Suomi","Kymenlaakso","Lappi","Pirkanmaa","Pohjanmaa","Pohjois-Karjala","Pohjois-Pohjanmaa","Pohjois-Savo","Päijät-Häme","Satakunta","Uusimaa","Varsinais-Suomi"]},"city":{"type":"string"},"zipcode":{"type":"string"},"address":{"type":"string"},"place":{"type":"string"},"lat":{"type":"number"},"lng":{"type":"number"}},"required":["lat","lng"]},"UpdateHobbyEventSchema":{"type":"object","properties":{"title":{"type":"string","minLength":3},"startsAt":{"type":"string","format":"date-time"},"endsAt":{"type":"string","format":"date-time"},"locationSource":{"type":"string","enum":["Own","Club","SportPlace"]},"status":{"type":"string","enum":["Draft","Scheduled","Cancelled"]},"timezone":{"type":"string","enum":["Europe/Helsinki"]},"description":{"type":"string","nullable":true},"recurrenceRule":{"type":"string","nullable":true},"recurrenceEndsAt":{"type":"string","nullable":true,"format":"date"},"phone":{"type":"string","nullable":true},"email":{"type":"string","nullable":true,"format":"email"},"price":{"type":"number","nullable":true,"minimum":0},"location":{"$ref":"#/components/schemas/UpdateHobbyEventLocationSchema"},"clubId":{"type":"string","nullable":true},"sportPlaceId":{"type":"string","nullable":true}}},"UpdateHobbyEventLocationSchema":{"type":"object","nullable":true,"properties":{"region":{"type":"string","nullable":true,"enum":["Ahvenanmaa","Etelä-Karjala","Etelä-Pohjanmaa","Etelä-Savo","Kainuu","Kanta-Häme","Keski-Pohjanmaa","Keski-Suomi","Kymenlaakso","Lappi","Pirkanmaa","Pohjanmaa","Pohjois-Karjala","Pohjois-Pohjanmaa","Pohjois-Savo","Päijät-Häme","Satakunta","Uusimaa","Varsinais-Suomi",null]},"city":{"type":"string","nullable":true},"zipcode":{"type":"string","nullable":true},"address":{"type":"string","nullable":true},"place":{"type":"string","nullable":true},"lat":{"type":"number"},"lng":{"type":"number"}}},"UpdateHobbyEventOccurrenceSchema":{"type":"object","properties":{"title":{"type":"string","nullable":true,"minLength":3},"description":{"type":"string","nullable":true},"startsAt":{"type":"string","nullable":true,"format":"date-time"},"endsAt":{"type":"string","nullable":true,"format":"date-time"},"timezone":{"type":"string","nullable":true,"enum":["Europe/Helsinki",null]},"status":{"type":"string","nullable":true,"enum":["Draft","Scheduled","Cancelled",null]},"price":{"type":"number","nullable":true,"minimum":0},"phone":{"type":"string","nullable":true},"email":{"type":"string","nullable":true,"format":"email"},"locationSource":{"type":"string","nullable":true,"enum":["Own","Club","SportPlace",null]},"location":{"$ref":"#/components/schemas/UpdateHobbyEventLocationSchema"}}},"DeleteHobbyEventOccurrenceResponseSchema":{"type":"object","properties":{"ok":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"occurrenceDate":{"type":"string","format":"date"}},"required":["id","occurrenceDate"]},"meta":{"$ref":"#/components/schemas/ApiMeta"}},"required":["ok","data","meta"]},"DeleteHobbyEventResponseSchema":{"type":"object","properties":{"ok":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"id":{"type":"string","format":"uuid"}},"required":["id"]},"meta":{"$ref":"#/components/schemas/ApiMeta"}},"required":["ok","data","meta"]},"OpenAiKeywordsResponseSchema":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string"}}},"required":["keywords"]},"OpenAiErrorResponseSchema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]},"OpenAiKeywordsRequestSchema":{"type":"object","properties":{"name":{"type":"string"},"description":{"type":"string"}}}},"parameters":{}},"paths":{"/health":{"get":{"responses":{"200":{"description":"Service is healthy.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthResponse"}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/clubs":{"post":{"tags":["clubs"],"security":[{"bearerAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateClubSchema"}}}},"responses":{"201":{"description":"Create a club.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubResponse"}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"get":{"tags":["clubs"],"parameters":[{"schema":{"type":"string"},"required":false,"name":"search","in":"query"},{"schema":{"type":"number","nullable":true},"required":false,"name":"minPrice","in":"query"},{"schema":{"type":"number","nullable":true},"required":false,"name":"maxPrice","in":"query"},{"schema":{"type":"integer","nullable":true},"required":false,"name":"minGroupSize","in":"query"},{"schema":{"type":"integer","nullable":true},"required":false,"name":"maxGroupSize","in":"query"},{"schema":{"type":"integer","nullable":true},"required":false,"name":"age","in":"query"},{"schema":{"type":"string","enum":["Ahvenanmaa","Etelä-Karjala","Etelä-Pohjanmaa","Etelä-Savo","Kainuu","Kanta-Häme","Keski-Pohjanmaa","Keski-Suomi","Kymenlaakso","Lappi","Pirkanmaa","Pohjanmaa","Pohjois-Karjala","Pohjois-Pohjanmaa","Pohjois-Savo","Päijät-Häme","Satakunta","Uusimaa","Varsinais-Suomi"]},"required":false,"name":"region","in":"query"},{"schema":{"type":"string","enum":["Beginner","Intermediate","Advanced"]},"required":false,"name":"skillLevel","in":"query"},{"schema":{"type":"integer","nullable":true},"required":false,"name":"page","in":"query"},{"schema":{"type":"integer","nullable":true},"required":false,"name":"pageSize","in":"query"}],"responses":{"200":{"description":"List published clubs.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubsResponse"}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not Found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/clubs/{id}/banner":{"post":{"tags":["clubs"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","format":"uuid"},"required":true,"name":"id","in":"path"}],"requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ClubBannerUploadSchema"}}}},"responses":{"201":{"description":"Upload club banner.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubBannerResponseSchema"}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not Found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/clubs/{id}":{"patch":{"tags":["clubs"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","format":"uuid"},"required":true,"name":"id","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateClubSchema"}}}},"responses":{"200":{"description":"Update a club.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubResponse"}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not Found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"delete":{"tags":["clubs"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","format":"uuid"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Delete a club.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteClubResponseSchema"}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not Found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"get":{"tags":["clubs"],"parameters":[{"schema":{"type":"string","format":"uuid"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Club details.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubResponse"}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not Found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/clubs/{id}/keywords":{"post":{"tags":["clubs"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","format":"uuid"},"required":true,"name":"id","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateClubKeywordsSchema"}}}},"responses":{"200":{"description":"Add keywords to a club.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubKeywordsResponseSchema"}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not Found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"get":{"tags":["clubs"],"parameters":[{"schema":{"type":"string","format":"uuid"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Get keywords for a club.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubKeywordsResponseSchema"}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not Found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/me/clubs":{"get":{"tags":["clubs"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","enum":["Draft","PendingReview","Published"]},"required":false,"name":"status","in":"query"},{"schema":{"type":"integer","nullable":true},"required":false,"name":"page","in":"query"},{"schema":{"type":"integer","nullable":true},"required":false,"name":"pageSize","in":"query"}],"responses":{"200":{"description":"List clubs owned by the authenticated user.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubsResponse"}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/clubs/{id}/events":{"get":{"tags":["clubs","events"],"parameters":[{"schema":{"type":"string","format":"uuid"},"required":true,"name":"id","in":"path"},{"schema":{"type":"string","enum":["Draft","Scheduled","Cancelled"]},"required":false,"name":"status","in":"query"},{"schema":{"type":"string","format":"date-time"},"required":false,"name":"startsAt","in":"query"},{"schema":{"type":"string","format":"date-time"},"required":false,"name":"endsAt","in":"query"},{"schema":{"type":"number","nullable":true},"required":false,"name":"minPrice","in":"query"},{"schema":{"type":"number","nullable":true},"required":false,"name":"maxPrice","in":"query"},{"schema":{"type":"integer","nullable":true},"required":false,"name":"page","in":"query"},{"schema":{"type":"integer","nullable":true},"required":false,"name":"pageSize","in":"query"}],"responses":{"200":{"description":"List events for a club.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HobbyEventsResponse"}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not Found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/sport-places":{"post":{"tags":["sport-places"],"security":[{"bearerAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSportPlaceSchema"}}}},"responses":{"201":{"description":"Create a sport place.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SportPlaceResponse"}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"get":{"tags":["sport-places"],"parameters":[{"schema":{"type":"string"},"required":false,"name":"search","in":"query"},{"schema":{"type":"string","enum":["Ahvenanmaa","Etelä-Karjala","Etelä-Pohjanmaa","Etelä-Savo","Kainuu","Kanta-Häme","Keski-Pohjanmaa","Keski-Suomi","Kymenlaakso","Lappi","Pirkanmaa","Pohjanmaa","Pohjois-Karjala","Pohjois-Pohjanmaa","Pohjois-Savo","Päijät-Häme","Satakunta","Uusimaa","Varsinais-Suomi"]},"required":false,"name":"region","in":"query"},{"schema":{"type":"integer","nullable":true},"required":false,"name":"page","in":"query"},{"schema":{"type":"integer","nullable":true},"required":false,"name":"pageSize","in":"query"}],"responses":{"200":{"description":"List published sport places.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SportPlacesResponse"}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not Found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/sport-places/{id}/banner":{"post":{"tags":["sport-places"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","format":"uuid"},"required":true,"name":"id","in":"path"}],"requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/SportPlaceBannerUploadSchema"}}}},"responses":{"201":{"description":"Upload sport place banner.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SportPlaceBannerResponseSchema"}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not Found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/sport-places/{id}":{"patch":{"tags":["sport-places"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","format":"uuid"},"required":true,"name":"id","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateSportPlaceSchema"}}}},"responses":{"200":{"description":"Update a sport place.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SportPlaceResponse"}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not Found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"delete":{"tags":["sport-places"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","format":"uuid"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Delete a sport place.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteSportPlaceResponseSchema"}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not Found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"get":{"tags":["sport-places"],"parameters":[{"schema":{"type":"string","format":"uuid"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Sport place details.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SportPlaceResponse"}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not Found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/sport-places/{id}/keywords":{"post":{"tags":["sport-places"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","format":"uuid"},"required":true,"name":"id","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSportPlaceKeywordsSchema"}}}},"responses":{"200":{"description":"Add keywords to a sport place.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SportPlaceKeywordsResponseSchema"}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not Found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"get":{"tags":["sport-places"],"parameters":[{"schema":{"type":"string","format":"uuid"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Get keywords for a sport place.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SportPlaceKeywordsResponseSchema"}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not Found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/me/sport-places":{"get":{"tags":["sport-places"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","enum":["Draft","PendingReview","Published"]},"required":false,"name":"status","in":"query"},{"schema":{"type":"integer","nullable":true},"required":false,"name":"page","in":"query"},{"schema":{"type":"integer","nullable":true},"required":false,"name":"pageSize","in":"query"}],"responses":{"200":{"description":"List sport places owned by the authenticated user.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SportPlacesResponse"}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/sport-places/{id}/events":{"get":{"tags":["sport-places","events"],"parameters":[{"schema":{"type":"string","format":"uuid"},"required":true,"name":"id","in":"path"},{"schema":{"type":"string","enum":["Draft","Scheduled","Cancelled"]},"required":false,"name":"status","in":"query"},{"schema":{"type":"string","format":"date-time"},"required":false,"name":"startsAt","in":"query"},{"schema":{"type":"string","format":"date-time"},"required":false,"name":"endsAt","in":"query"},{"schema":{"type":"number","nullable":true},"required":false,"name":"minPrice","in":"query"},{"schema":{"type":"number","nullable":true},"required":false,"name":"maxPrice","in":"query"},{"schema":{"type":"integer","nullable":true},"required":false,"name":"page","in":"query"},{"schema":{"type":"integer","nullable":true},"required":false,"name":"pageSize","in":"query"}],"responses":{"200":{"description":"List events for a sport place.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HobbyEventsResponse"}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not Found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/events":{"get":{"tags":["events"],"parameters":[{"schema":{"type":"string","enum":["Draft","Scheduled","Cancelled"]},"required":false,"name":"status","in":"query"},{"schema":{"type":"string","format":"date-time"},"required":false,"name":"startsAt","in":"query"},{"schema":{"type":"string","format":"date-time"},"required":false,"name":"endsAt","in":"query"},{"schema":{"type":"number","nullable":true},"required":false,"name":"minPrice","in":"query"},{"schema":{"type":"number","nullable":true},"required":false,"name":"maxPrice","in":"query"},{"schema":{"type":"string","enum":["Ahvenanmaa","Etelä-Karjala","Etelä-Pohjanmaa","Etelä-Savo","Kainuu","Kanta-Häme","Keski-Pohjanmaa","Keski-Suomi","Kymenlaakso","Lappi","Pirkanmaa","Pohjanmaa","Pohjois-Karjala","Pohjois-Pohjanmaa","Pohjois-Savo","Päijät-Häme","Satakunta","Uusimaa","Varsinais-Suomi"]},"required":false,"name":"region","in":"query"},{"schema":{"type":"integer","nullable":true},"required":false,"name":"page","in":"query"},{"schema":{"type":"integer","nullable":true},"required":false,"name":"pageSize","in":"query"}],"responses":{"200":{"description":"List public events.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HobbyEventsResponse"}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"post":{"tags":["events"],"security":[{"bearerAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateHobbyEventSchema"}}}},"responses":{"201":{"description":"Create an event.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HobbyEventResponse"}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not Found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/me/events":{"get":{"tags":["events"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","enum":["Draft","Scheduled","Cancelled"]},"required":false,"name":"status","in":"query"},{"schema":{"type":"integer","nullable":true},"required":false,"name":"page","in":"query"},{"schema":{"type":"integer","nullable":true},"required":false,"name":"pageSize","in":"query"}],"responses":{"200":{"description":"List events owned by the authenticated user.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HobbyEventsResponse"}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/events/{id}":{"get":{"tags":["events"],"parameters":[{"schema":{"type":"string","format":"uuid"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Event details.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HobbyEventResponse"}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not Found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"patch":{"tags":["events"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","format":"uuid"},"required":true,"name":"id","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateHobbyEventSchema"}}}},"responses":{"200":{"description":"Update an event.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HobbyEventResponse"}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not Found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"delete":{"tags":["events"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","format":"uuid"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Delete an event.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteHobbyEventResponseSchema"}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not Found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/events/{id}/occurrence/{occurrenceDate}":{"get":{"tags":["events"],"parameters":[{"schema":{"type":"string","format":"uuid"},"required":true,"name":"id","in":"path"},{"schema":{"type":"string","format":"date"},"required":true,"name":"occurrenceDate","in":"path"}],"responses":{"200":{"description":"Occurrence details.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HobbyEventResponse"}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not Found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/events/{id}/{occurrenceDate}":{"patch":{"tags":["events"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","format":"uuid"},"required":true,"name":"id","in":"path"},{"schema":{"type":"string","format":"date"},"required":true,"name":"occurrenceDate","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateHobbyEventOccurrenceSchema"}}}},"responses":{"200":{"description":"Update a single occurrence.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HobbyEventResponse"}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not Found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"delete":{"tags":["events"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","format":"uuid"},"required":true,"name":"id","in":"path"},{"schema":{"type":"string","format":"date"},"required":true,"name":"occurrenceDate","in":"path"}],"responses":{"200":{"description":"Delete a single occurrence.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteHobbyEventOccurrenceResponseSchema"}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not Found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}}}}