{"openapi":"3.0.3","info":{"title":"fitVibe Integration API","version":"1.0.0","description":"Bearer-based API for studio program, trainees and bookings integration."},"servers":[{"url":"https:\/\/fitvibe.gr","description":"Current environment"}],"security":[{"bearerAuth":[]}],"tags":[{"name":"Integration"},{"name":"Studio Program"},{"name":"Studio Trainees"},{"name":"Studio Bookings"},{"name":"EasyBook Bridge"}],"paths":{"\/api\/integration\/routes":{"get":{"tags":["Integration"],"summary":"List token-allowed routes","responses":{"200":{"$ref":"#\/components\/responses\/ApiEnvelope"}}},"post":{"tags":["Integration"],"summary":"List token-allowed routes (POST)","responses":{"200":{"$ref":"#\/components\/responses\/ApiEnvelope"}}}},"\/api\/integration\/get":{"get":{"tags":["Integration"],"summary":"Proxy GET route","parameters":[{"name":"path","in":"query","required":true,"schema":{"type":"string"}}],"responses":{"200":{"$ref":"#\/components\/responses\/ApiEnvelope"}}},"post":{"tags":["Integration"],"summary":"Proxy GET route (POST transport)","requestBody":{"$ref":"#\/components\/requestBodies\/ProxyBody"},"responses":{"200":{"$ref":"#\/components\/responses\/ApiEnvelope"}}}},"\/api\/integration\/set":{"post":{"tags":["Integration"],"summary":"Proxy write route","requestBody":{"$ref":"#\/components\/requestBodies\/ProxyBody"},"responses":{"200":{"$ref":"#\/components\/responses\/ApiEnvelope"}}}},"\/api\/integration\/request":{"post":{"tags":["Integration"],"summary":"Generic proxy route (GET\/POST\/PUT\/PATCH\/DELETE)","requestBody":{"$ref":"#\/components\/requestBodies\/ProxyBody"},"responses":{"200":{"$ref":"#\/components\/responses\/ApiEnvelope"}}}},"\/api\/integration\/studio\/program":{"get":{"tags":["Studio Program"],"summary":"Get studio program","parameters":[{"$ref":"#\/components\/parameters\/studioId"},{"$ref":"#\/components\/parameters\/dateFrom"},{"$ref":"#\/components\/parameters\/dateTo"},{"name":"time_from","in":"query","schema":{"type":"string"}},{"name":"time_to","in":"query","schema":{"type":"string"}},{"name":"open_only","in":"query","schema":{"type":"integer","enum":[0,1]}},{"name":"class_id","in":"query","schema":{"type":"integer"}}],"responses":{"200":{"$ref":"#\/components\/responses\/ApiEnvelope"}}},"post":{"tags":["Studio Program"],"summary":"Get studio program (POST transport)","requestBody":{"$ref":"#\/components\/requestBodies\/StudioScopedBody"},"responses":{"200":{"$ref":"#\/components\/responses\/ApiEnvelope"}}}},"\/api\/integration\/studio\/availability":{"get":{"tags":["Studio Program"],"summary":"Get studio availability","parameters":[{"$ref":"#\/components\/parameters\/studioId"},{"name":"date","in":"query","schema":{"type":"string","format":"date"}},{"name":"time_from","in":"query","schema":{"type":"string"}},{"name":"time_to","in":"query","schema":{"type":"string"}}],"responses":{"200":{"$ref":"#\/components\/responses\/ApiEnvelope"}}},"post":{"tags":["Studio Program"],"summary":"Get studio availability (POST transport)","requestBody":{"$ref":"#\/components\/requestBodies\/StudioScopedBody"},"responses":{"200":{"$ref":"#\/components\/responses\/ApiEnvelope"}}}},"\/api\/integration\/studio\/trainees":{"get":{"tags":["Studio Trainees"],"summary":"Get studio trainees","parameters":[{"$ref":"#\/components\/parameters\/studioId"},{"$ref":"#\/components\/parameters\/page"},{"$ref":"#\/components\/parameters\/perPage"},{"name":"segment","in":"query","schema":{"type":"string"}},{"name":"q","in":"query","schema":{"type":"string"}},{"name":"sort","in":"query","schema":{"type":"string"}}],"responses":{"200":{"$ref":"#\/components\/responses\/ApiEnvelope"}}},"post":{"tags":["Studio Trainees"],"summary":"Get studio trainees (POST transport)","requestBody":{"$ref":"#\/components\/requestBodies\/StudioScopedBody"},"responses":{"200":{"$ref":"#\/components\/responses\/ApiEnvelope"}}}},"\/api\/integration\/studio\/bookings":{"get":{"tags":["Studio Bookings"],"summary":"Get bookings feed","parameters":[{"$ref":"#\/components\/parameters\/studioId"},{"$ref":"#\/components\/parameters\/dateFrom"},{"$ref":"#\/components\/parameters\/dateTo"},{"name":"status","in":"query","schema":{"type":"string"}},{"$ref":"#\/components\/parameters\/page"},{"$ref":"#\/components\/parameters\/perPage"}],"responses":{"200":{"$ref":"#\/components\/responses\/ApiEnvelope"}}},"post":{"tags":["Studio Bookings"],"summary":"Get bookings feed (POST transport)","requestBody":{"$ref":"#\/components\/requestBodies\/StudioScopedBody"},"responses":{"200":{"$ref":"#\/components\/responses\/ApiEnvelope"}}}},"\/api\/integration\/studio\/bookings\/create":{"post":{"tags":["Studio Bookings"],"summary":"Create booking","requestBody":{"$ref":"#\/components\/requestBodies\/BookingCreateBody"},"responses":{"200":{"$ref":"#\/components\/responses\/ApiEnvelope"}}}},"\/api\/integration\/studio\/bookings\/cancel":{"post":{"tags":["Studio Bookings"],"summary":"Cancel booking","requestBody":{"$ref":"#\/components\/requestBodies\/BookingCancelBody"},"responses":{"200":{"$ref":"#\/components\/responses\/ApiEnvelope"}}}},"\/api\/integration\/studio\/bookings\/show":{"get":{"tags":["Studio Bookings"],"summary":"Show booking","parameters":[{"$ref":"#\/components\/parameters\/studioId"},{"name":"booking_token","in":"query","required":true,"schema":{"type":"string"}}],"responses":{"200":{"$ref":"#\/components\/responses\/ApiEnvelope"}}},"post":{"tags":["Studio Bookings"],"summary":"Show booking (POST transport)","requestBody":{"$ref":"#\/components\/requestBodies\/BookingShowBody"},"responses":{"200":{"$ref":"#\/components\/responses\/ApiEnvelope"}}}},"\/api\/integration\/easybook\/businesses":{"get":{"tags":["EasyBook Bridge"],"summary":"EasyBook-compatible businesses list","parameters":[{"name":"activeOnly","in":"query","schema":{"type":"boolean"}},{"name":"studio_id","in":"query","schema":{"type":"integer"}}],"responses":{"200":{"description":"BusinessDto[]","content":{"application\/json":{"schema":{"type":"array","items":{"$ref":"#\/components\/schemas\/EasyBookBusinessDto"}}}}}}}},"\/api\/integration\/easybook\/customers":{"get":{"tags":["EasyBook Bridge"],"summary":"EasyBook-compatible customers list","parameters":[{"name":"studio_id","in":"query","required":true,"schema":{"type":"integer"}},{"name":"page","in":"query","schema":{"type":"integer","minimum":1,"default":1}},{"name":"pageSize","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":25}}],"responses":{"200":{"description":"CustomerDto[]","content":{"application\/json":{"schema":{"type":"array","items":{"$ref":"#\/components\/schemas\/EasyBookCustomerDto"}}}}}}},"post":{"tags":["EasyBook Bridge"],"summary":"Pending phase 2 (write operation)","responses":{"501":{"$ref":"#\/components\/responses\/ApiEnvelope"}}},"put":{"tags":["EasyBook Bridge"],"summary":"Pending phase 2 (write operation)","responses":{"501":{"$ref":"#\/components\/responses\/ApiEnvelope"}}}},"\/api\/integration\/easybook\/services":{"get":{"tags":["EasyBook Bridge"],"summary":"EasyBook-compatible services list","parameters":[{"name":"studio_id","in":"query","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"ServiceDto[]","content":{"application\/json":{"schema":{"type":"array","items":{"$ref":"#\/components\/schemas\/EasyBookServiceDto"}}}}}}}},"\/api\/integration\/easybook\/services-schedules\/date":{"post":{"tags":["EasyBook Bridge"],"summary":"EasyBook-compatible program by date","requestBody":{"$ref":"#\/components\/requestBodies\/EasyBookProgramByDateBody"},"responses":{"200":{"description":"ProgramDto","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/EasyBookProgramDto"}}}}}}},"\/api\/integration\/easybook\/bookings":{"get":{"tags":["EasyBook Bridge"],"summary":"EasyBook-compatible bookings list","parameters":[{"name":"studio_id","in":"query","required":true,"schema":{"type":"integer"}},{"name":"startDate","in":"query","schema":{"type":"string","format":"date"}},{"name":"endDate","in":"query","schema":{"type":"string","format":"date"}}],"responses":{"200":{"description":"BookingDto[]","content":{"application\/json":{"schema":{"type":"array","items":{"$ref":"#\/components\/schemas\/EasyBookBookingDto"}}}}}}},"post":{"tags":["EasyBook Bridge"],"summary":"EasyBook-compatible booking create","requestBody":{"$ref":"#\/components\/requestBodies\/EasyBookCreateBookingBody"},"responses":{"201":{"description":"BookingDto","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/EasyBookBookingDto"}}}}}}},"\/api\/integration\/easybook\/bookings\/{id}":{"get":{"tags":["EasyBook Bridge"],"summary":"EasyBook-compatible booking details","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"studio_id","in":"query","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"BookingDto","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/EasyBookBookingDto"}}}}}}},"\/api\/integration\/easybook\/bookings\/{id}\/cancel":{"patch":{"tags":["EasyBook Bridge"],"summary":"EasyBook-compatible booking cancel (PATCH)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"studio_id","in":"query","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"BookingDto","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/EasyBookBookingDto"}}}}}},"post":{"tags":["EasyBook Bridge"],"summary":"Fallback cancel method for clients that cannot send PATCH","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"studio_id","in":"query","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"BookingDto","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/EasyBookBookingDto"}}}}}}}},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"API Token"}},"parameters":{"studioId":{"name":"studio_id","in":"query","required":true,"schema":{"type":"integer","minimum":1}},"dateFrom":{"name":"date_from","in":"query","schema":{"type":"string","format":"date"}},"dateTo":{"name":"date_to","in":"query","schema":{"type":"string","format":"date"}},"page":{"name":"page","in":"query","schema":{"type":"integer","minimum":1,"default":1}},"perPage":{"name":"per_page","in":"query","schema":{"type":"integer","minimum":1,"maximum":200,"default":50}}},"requestBodies":{"ProxyBody":{"required":true,"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ProxyPayload"}}}},"StudioScopedBody":{"required":true,"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/StudioScopedPayload"}}}},"BookingCreateBody":{"required":true,"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/BookingCreatePayload"}}}},"BookingCancelBody":{"required":true,"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/BookingCancelPayload"}}}},"BookingShowBody":{"required":true,"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/BookingShowPayload"}}}},"EasyBookProgramByDateBody":{"required":true,"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/EasyBookProgramByDatePayload"}}}},"EasyBookCreateBookingBody":{"required":true,"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/EasyBookCreateBookingPayload"}}}}},"responses":{"ApiEnvelope":{"description":"Standard response envelope","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ApiEnvelope"},"example":{"code":200,"ok":true,"message":"ok","error_code":null,"results":[]}}}}},"schemas":{"ApiEnvelope":{"type":"object","required":["code","ok","message"],"properties":{"code":{"type":"integer"},"ok":{"type":"boolean"},"message":{"type":"string"},"error_code":{"type":"string","nullable":true},"results":{"nullable":true,"oneOf":[{"type":"object"},{"type":"array","items":[]}]}}},"ProxyPayload":{"type":"object","required":["path"],"properties":{"path":{"type":"string","example":"\/api\/studio\/dashboard-snapshot"},"method":{"type":"string","enum":["GET","POST","PUT","PATCH","DELETE"]},"dataSend":{"type":"object","additionalProperties":true},"data":{"type":"object","additionalProperties":true}}},"StudioScopedPayload":{"type":"object","required":["studio_id"],"properties":{"studio_id":{"type":"integer"},"date_from":{"type":"string","format":"date"},"date_to":{"type":"string","format":"date"},"page":{"type":"integer"},"per_page":{"type":"integer"}},"additionalProperties":true},"BookingCreatePayload":{"type":"object","required":["studio_id","class_id","class_schedule_id","matched_date","start_time"],"properties":{"studio_id":{"type":"integer"},"user_id":{"type":"integer"},"class_id":{"type":"integer"},"class_schedule_id":{"type":"integer"},"matched_date":{"type":"string","format":"date"},"start_time":{"type":"string","description":"HH:MM or HH:MM:SS"},"office_note":{"type":"string"},"booking_info":{"type":"object","additionalProperties":true}}},"BookingCancelPayload":{"type":"object","required":["studio_id","booking_token"],"properties":{"studio_id":{"type":"integer"},"booking_token":{"type":"string"},"reason":{"type":"string"},"user_id":{"type":"integer"}}},"BookingShowPayload":{"type":"object","required":["studio_id","booking_token"],"properties":{"studio_id":{"type":"integer"},"booking_token":{"type":"string"}}},"EasyBookProgramByDatePayload":{"type":"object","required":["studio_id","date"],"properties":{"studio_id":{"type":"integer"},"date":{"type":"string","format":"date"},"time_from":{"type":"string"},"time_to":{"type":"string"}},"additionalProperties":true},"EasyBookCreateBookingPayload":{"type":"object","required":["studio_id","customerId","serviceScheduleOccurrenceId","scheduleDate"],"properties":{"studio_id":{"type":"integer"},"customerId":{"type":"string"},"serviceScheduleOccurrenceId":{"type":"string"},"scheduleDate":{"type":"string","format":"date"}},"additionalProperties":true},"EasyBookBusinessDto":{"type":"object","properties":{"id":{"type":"string"},"code":{"type":"string"},"name":{"type":"string"},"businessTypeId":{"type":"string","nullable":true},"description":{"type":"string"},"address":{"type":"string"},"city":{"type":"string"},"state":{"type":"string"},"zipCode":{"type":"string"},"country":{"type":"string"},"phoneNumber":{"type":"string"},"email":{"type":"string"},"website":{"type":"string"},"logoUrl":{"type":"string"},"isActive":{"type":"boolean"},"createdAt":{"type":"string"},"updatedAt":{"type":"string"}}},"EasyBookCustomerDto":{"type":"object","properties":{"id":{"type":"string"},"firstName":{"type":"string"},"lastName":{"type":"string"},"email":{"type":"string"},"phoneNumber":{"type":"string"},"isActive":{"type":"boolean"},"fullName":{"type":"string"},"createdAt":{"type":"string"},"updatedAt":{"type":"string"},"businessId":{"type":"string"}}},"EasyBookServiceDto":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"durationInMinutes":{"type":"integer"},"isActive":{"type":"boolean"},"description":{"type":"string"},"price":{"type":"number"}}},"EasyBookProgramDto":{"type":"object","properties":{"date":{"type":"string","format":"date"},"program":{"type":"array","items":{"type":"object","properties":{"startTime":{"type":"string"},"slots":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"dayOfWeek":{"type":"string"},"startTime":{"type":"string"},"endTime":{"type":"string"},"availableSpots":{"type":"integer"},"isAvailable":{"type":"boolean"},"isBookedByCustomer":{"type":"boolean"},"isLocked":{"type":"boolean"}}}}}}}}},"EasyBookBookingDto":{"type":"object","properties":{"id":{"type":"string"},"businessId":{"type":"string"},"customerId":{"type":"string"},"status":{"type":"integer"},"statusName":{"type":"string"},"scheduleDate":{"type":"string","format":"date"},"startTime":{"type":"string"},"endTime":{"type":"string"},"serviceScheduleId":{"type":"string"},"duration":{"type":"string"},"createdAt":{"type":"string"},"updatedAt":{"type":"string"}}}}}}