{"openapi":"3.0.0","paths":{"/api/v1/users/me":{"get":{"operationId":"UsersController_getMe","summary":"Get current user profile","parameters":[],"responses":{"200":{"description":""}},"tags":["Users"],"security":[{"bearer":[]}]},"patch":{"operationId":"UsersController_updateMe","summary":"Update current user profile preferences","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserMeUpdateDto"}}}},"responses":{"200":{"description":""}},"tags":["Users"],"security":[{"bearer":[]}]},"delete":{"operationId":"UsersController_deleteMe","summary":"Delete current user account (GDPR self-delete)","parameters":[],"responses":{"200":{"description":""}},"tags":["Users"],"security":[{"bearer":[]}]}},"/api/v1/users/me/vehicles":{"get":{"operationId":"UsersController_getMyVehicles","summary":"List current user vehicles","parameters":[],"responses":{"200":{"description":""}},"tags":["Users"],"security":[{"bearer":[]}]},"post":{"operationId":"UsersController_createMyVehicle","summary":"Create current user vehicle","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateVehicleDto"}}}},"responses":{"201":{"description":""}},"tags":["Users"],"security":[{"bearer":[]}]}},"/api/v1/users/me/vehicles/{id}":{"patch":{"operationId":"UsersController_updateMyVehicle","summary":"Update current user vehicle","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateVehicleDto"}}}},"responses":{"200":{"description":""}},"tags":["Users"],"security":[{"bearer":[]}]},"delete":{"operationId":"UsersController_deleteMyVehicle","summary":"Delete current user vehicle","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Users"],"security":[{"bearer":[]}]}},"/api/v1/users/confirm-email":{"get":{"operationId":"UsersController_confirmEmailByQuery","summary":"Confirm email address using token from email link","parameters":[{"name":"token","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConfirmEmailResponseDto"}}}}},"tags":["Users"]}},"/api/v1/users":{"get":{"operationId":"UsersController_listUsers","summary":"List users (filter by query userType)","parameters":[{"name":"userType","required":false,"in":"query","description":"Filter by user category: client/partner/internal.","schema":{"enum":["client","partner","internal"],"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Users"],"security":[{"bearer":[]}]}},"/api/v1/users/{id}":{"get":{"operationId":"UsersController_getUser","summary":"Get user by id","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"userType","required":false,"in":"query","description":"Filter by user category: client/partner/internal.","schema":{"enum":["client","partner","internal"],"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Users"],"security":[{"bearer":[]}]}},"/api/v1/users/{id}/vehicles":{"get":{"operationId":"UsersController_getUserVehicles","summary":"Get vehicles for user by id","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"userType","required":false,"in":"query","description":"Filter by user category: client/partner/internal.","schema":{"enum":["client","partner","internal"],"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Users"],"security":[{"bearer":[]}]}},"/api/v1/users/{userType}":{"post":{"operationId":"UsersController_createUser","summary":"Create user by path userType","parameters":[{"name":"userType","required":true,"in":"path","schema":{"enum":["client","partner"],"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserCreateDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserProvisioningResponseDto"}}}}},"tags":["Users"],"security":[{"bearer":[]}]}},"/api/v1/users/{userType}/invite":{"post":{"operationId":"UsersController_inviteUser","summary":"Invite user by path userType","parameters":[{"name":"userType","required":true,"in":"path","schema":{"enum":["client","partner"],"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserCreateDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserProvisioningResponseDto"}}}}},"tags":["Users"],"security":[{"bearer":[]}]}},"/api/v1/users/{userType}/{id}":{"patch":{"operationId":"UsersController_updateUser","summary":"Update user by id and path userType","parameters":[{"name":"userType","required":true,"in":"path","schema":{"enum":["client","partner"],"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserUpdateDto"}}}},"responses":{"200":{"description":""}},"tags":["Users"],"security":[{"bearer":[]}]},"delete":{"operationId":"UsersController_deleteUser","summary":"Delete user by id and path userType","parameters":[{"name":"userType","required":true,"in":"path","schema":{"enum":["client","partner"],"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Users"],"security":[{"bearer":[]}]}},"/api/v1/users/client/me":{"get":{"operationId":"ClientUsersController_getMe","summary":"Get current client profile","parameters":[],"responses":{"200":{"description":""}},"tags":["Users"],"security":[{"bearer":[]}]},"patch":{"operationId":"ClientUsersController_updateMe","summary":"Update current client profile preferences","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserMeUpdateDto"}}}},"responses":{"200":{"description":""}},"tags":["Users"],"security":[{"bearer":[]}]}},"/api/v1/users/client/me/export":{"get":{"operationId":"ClientUsersController_exportMyData","summary":"NF-04: export full personal data package (JSON)","parameters":[],"responses":{"200":{"description":""}},"tags":["Users"],"security":[{"bearer":[]}]}},"/api/v1/users/client/me/consents":{"get":{"operationId":"ClientUsersController_getMyConsents","summary":"NF-04: list my consent history + current status","parameters":[],"responses":{"200":{"description":""}},"tags":["Users"],"security":[{"bearer":[]}]}},"/api/v1/users/client/me/consents/{consentType}":{"post":{"operationId":"ClientUsersController_updateMyConsent","summary":"NF-04: grant/revoke consent for current user","parameters":[{"name":"consentType","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpsertUserConsentDto"}}}},"responses":{"201":{"description":""}},"tags":["Users"],"security":[{"bearer":[]}]}},"/api/v1/users/client/me/dsar/requests":{"post":{"operationId":"ClientUsersController_createMyDsarRequest","summary":"GDPR/MD: submit data-subject request (DSAR)","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateDsarRequestDto"}}}},"responses":{"201":{"description":""}},"tags":["Users"],"security":[{"bearer":[]}]},"get":{"operationId":"ClientUsersController_listMyDsarRequests","summary":"GDPR/MD: list my DSAR requests","parameters":[{"name":"page","required":true,"in":"query","schema":{"type":"string"}},{"name":"limit","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Users"],"security":[{"bearer":[]}]}},"/api/v1/users/internal":{"get":{"operationId":"InternalUsersController_listUsers","summary":"List users (internal admin)","parameters":[],"responses":{"200":{"description":""}},"tags":["Users"],"security":[{"bearer":[]}]},"post":{"operationId":"InternalUsersController_createUser","summary":"Create user (internal admin)","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserCreateDto"}}}},"responses":{"201":{"description":""}},"tags":["Users"],"security":[{"bearer":[]}]}},"/api/v1/users/internal/{id}":{"get":{"operationId":"InternalUsersController_getUser","summary":"Get user by id (internal admin)","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Users"],"security":[{"bearer":[]}]},"patch":{"operationId":"InternalUsersController_updateUser","summary":"Update user by id (internal admin)","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserUpdateDto"}}}},"responses":{"200":{"description":""}},"tags":["Users"],"security":[{"bearer":[]}]},"delete":{"operationId":"InternalUsersController_deleteUser","summary":"Delete user by id (internal admin)","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Users"],"security":[{"bearer":[]}]}},"/api/v1/users/internal/{id}/export":{"get":{"operationId":"InternalUsersController_exportUserData","summary":"NF-04: internal full user data export (audit/compliance)","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Users"],"security":[{"bearer":[]}]}},"/api/v1/users/internal/{id}/sensitive-access-logs":{"get":{"operationId":"InternalUsersController_listSensitiveAccessLogs","summary":"NF-04: list sensitive data access logs for user","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Users"],"security":[{"bearer":[]}]}},"/api/v1/users/internal/{id}/dsar-requests":{"get":{"operationId":"InternalUsersController_listDsarRequestsForUser","summary":"GDPR/MD: list DSAR requests for target user","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"page","required":true,"in":"query","schema":{"type":"string"}},{"name":"limit","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Users"],"security":[{"bearer":[]}]}},"/api/v1/users/internal/dsar-requests/{id}":{"patch":{"operationId":"InternalUsersController_updateDsarRequest","summary":"GDPR/MD: update/execute DSAR request","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateDsarRequestDto"}}}},"responses":{"200":{"description":""}},"tags":["Users"],"security":[{"bearer":[]}]}},"/api/v1/users/internal/retention/run":{"post":{"operationId":"InternalUsersController_runRetentionPolicy","summary":"GDPR/MD: run retention policy enforcement (dry-run/default)","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunRetentionPolicyDto"}}}},"responses":{"201":{"description":""}},"tags":["Users"],"security":[{"bearer":[]}]}},"/api/v1/users/internal/retention/runs":{"get":{"operationId":"InternalUsersController_listRetentionRuns","summary":"GDPR/MD: list retention policy execution history","parameters":[{"name":"limit","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Users"],"security":[{"bearer":[]}]}},"/api/v1/users/internal/privacy/breaches":{"post":{"operationId":"InternalUsersController_createPrivacyBreach","summary":"GDPR/MD: create privacy/data-breach incident","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePrivacyBreachDto"}}}},"responses":{"201":{"description":""}},"tags":["Users"],"security":[{"bearer":[]}]},"get":{"operationId":"InternalUsersController_listPrivacyBreaches","summary":"GDPR/MD: list privacy/data-breach incidents","parameters":[{"name":"page","required":true,"in":"query","schema":{"type":"string"}},{"name":"limit","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Users"],"security":[{"bearer":[]}]}},"/api/v1/users/internal/privacy/breaches/{id}":{"get":{"operationId":"InternalUsersController_getPrivacyBreach","summary":"GDPR/MD: get privacy/data-breach incident details","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Users"],"security":[{"bearer":[]}]},"patch":{"operationId":"InternalUsersController_updatePrivacyBreach","summary":"GDPR/MD: update privacy/data-breach incident + notifications","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdatePrivacyBreachDto"}}}},"responses":{"200":{"description":""}},"tags":["Users"],"security":[{"bearer":[]}]}},"/api/v1/users/partner/me":{"get":{"operationId":"PartnerUsersController_getMe","summary":"Get current partner profile","parameters":[],"responses":{"200":{"description":""}},"tags":["Users"],"security":[{"bearer":[]}]},"patch":{"operationId":"PartnerUsersController_updateMe","summary":"Update current partner profile preferences","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserMeUpdateDto"}}}},"responses":{"200":{"description":""}},"tags":["Users"],"security":[{"bearer":[]}]}},"/api/v1/partners":{"post":{"operationId":"PartnersController_createPartner","summary":"Create partner (admin)","parameters":[],"responses":{"201":{"description":""}},"tags":["Partners"],"security":[{"bearer":[]}]},"get":{"operationId":"PartnersController_listPartners","summary":"List active partners (optionally by geolocation radius)","parameters":[{"name":"lat","required":true,"in":"query","schema":{"type":"string"}},{"name":"lng","required":true,"in":"query","schema":{"type":"string"}},{"name":"r","required":true,"in":"query","schema":{"type":"string"}},{"name":"radius","required":true,"in":"query","schema":{"type":"string"}},{"name":"radiusKm","required":true,"in":"query","schema":{"type":"string"}},{"name":"limit","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Partners"],"security":[{"bearer":[]}]}},"/api/v1/vehicles":{"get":{"operationId":"VehiclesController_listVehicles","summary":"List vehicles (client/partner: mine, internal: requires userId query)","parameters":[{"name":"userId","required":false,"in":"query","description":"Internal only: list vehicles for this userId.","schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"description":""}},"tags":["Vehicles"],"security":[{"bearer":[]}]},"post":{"operationId":"VehiclesController_createVehicle","summary":"Create vehicle (client/partner: mine, internal: provide userId in request body)","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateVehicleDto"}}}},"responses":{"201":{"description":""}},"tags":["Vehicles"],"security":[{"bearer":[]}]}},"/api/v1/vehicles/{id}":{"get":{"operationId":"VehiclesController_getVehicle","summary":"Get vehicle by id","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Vehicles"],"security":[{"bearer":[]}]},"patch":{"operationId":"VehiclesController_updateVehicle","summary":"Update vehicle by id","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateVehicleDto"}}}},"responses":{"200":{"description":""}},"tags":["Vehicles"],"security":[{"bearer":[]}]},"delete":{"operationId":"VehiclesController_deleteVehicle","summary":"Delete vehicle by id","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Vehicles"],"security":[{"bearer":[]}]}},"/api/v1/vehicles/{id}/primary":{"patch":{"operationId":"VehiclesController_setPrimaryVehicle","summary":"Set vehicle as primary","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Vehicles"],"security":[{"bearer":[]}]}},"/api/v1/partners/search":{"get":{"operationId":"PartnersController_searchPartners","summary":"Search partners by text query (name/address/sector)","parameters":[{"name":"q","required":true,"in":"query","schema":{"type":"string"}},{"name":"sector","required":true,"in":"query","schema":{"type":"string"}},{"name":"limit","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Partners"],"security":[{"bearer":[]}]}},"/api/v1/partners/nearby":{"get":{"operationId":"PartnersController_nearbyPartners","summary":"Nearby partners sorted by distance (PRD alias)","parameters":[{"name":"lat","required":true,"in":"query","schema":{"type":"string"}},{"name":"lng","required":true,"in":"query","schema":{"type":"string"}},{"name":"r","required":true,"in":"query","schema":{"type":"string"}},{"name":"limit","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Partners"],"security":[{"bearer":[]}]}},"/api/v1/partners/{id}/reviews":{"get":{"operationId":"PartnersController_getPartnerReviews","summary":"Partner reviews (paginated)","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"page","required":true,"in":"query","schema":{"type":"string"}},{"name":"limit","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Partners"],"security":[{"bearer":[]}]}},"/api/v1/partners/{id}/slots":{"get":{"operationId":"PartnersController_getPartnerSlots","summary":"Partner booking slots for date","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"date","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Partners"],"security":[{"bearer":[]}]}},"/api/v1/partners/{id}":{"get":{"operationId":"PartnersController_getPartner","summary":"Get partner details","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Partners"],"security":[{"bearer":[]}]},"patch":{"operationId":"PartnersController_updatePartner","summary":"Update partner (admin)","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Partners"],"security":[{"bearer":[]}]},"delete":{"operationId":"PartnersController_deletePartner","summary":"Delete partner (admin)","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Partners"],"security":[{"bearer":[]}]}},"/api/v1/partners/sync-outbox":{"post":{"operationId":"PartnersController_syncOutbox","summary":"Re-emit partner.created outbox events for all active partners (admin)","parameters":[],"responses":{"201":{"description":""}},"tags":["Partners"],"security":[{"bearer":[]}]}},"/api/v1/partners/dashboard/summary":{"get":{"operationId":"PartnerAdminController_getDashboardSummary","summary":"Partner console dashboard summary (bookings + checkins)","parameters":[{"name":"partnerId","required":true,"in":"query","schema":{"type":"string"}},{"name":"startDate","required":true,"in":"query","schema":{"type":"string"}},{"name":"endDate","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Partners"],"security":[{"bearer":[]}]}},"/api/v1/partners/dashboard/checkins":{"get":{"operationId":"PartnerAdminController_getDashboardCheckins","summary":"Partner console dashboard checkins details","parameters":[{"name":"partnerId","required":true,"in":"query","schema":{"type":"string"}},{"name":"startDate","required":true,"in":"query","schema":{"type":"string"}},{"name":"endDate","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Partners"],"security":[{"bearer":[]}]}},"/api/v1/client/wash-partners":{"get":{"operationId":"ClientWashPartnersController_listPartners","summary":"List active wash partners (optionally by geolocation radius)","parameters":[{"name":"lat","required":true,"in":"query","schema":{"type":"string"}},{"name":"lng","required":true,"in":"query","schema":{"type":"string"}},{"name":"radiusKm","required":true,"in":"query","schema":{"type":"string"}},{"name":"limit","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Partners"]}},"/api/v1/client/wash-partners/{id}":{"get":{"operationId":"ClientWashPartnersController_getPartner","summary":"Get wash partner details","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Partners"]}},"/api/v1/partners/ops/clients":{"post":{"operationId":"PartnerConsoleOperationsController_createClient","summary":"Create client user assisted by partner","parameters":[],"responses":{"201":{"description":""}},"tags":["Partners"],"security":[{"bearer":[]}]}},"/api/v1/partners/ops/clients/{userId}/vehicles":{"post":{"operationId":"PartnerConsoleOperationsController_addVehicle","summary":"Register vehicle for a client","parameters":[{"name":"userId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["Partners"],"security":[{"bearer":[]}]}},"/api/v1/partners/ops/clients/{userId}/subscriptions":{"post":{"operationId":"PartnerConsoleOperationsController_assignSubscription","summary":"Assign subscription to a client","parameters":[{"name":"userId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateClientSubscriptionDto"}}}},"responses":{"201":{"description":""}},"tags":["Partners"],"security":[{"bearer":[]}]}},"/api/v1/partners/ops/clients/{userId}/bookings":{"post":{"operationId":"PartnerConsoleOperationsController_createBooking","summary":"Create booking for a client","parameters":[{"name":"userId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBookingDto"}}}},"responses":{"201":{"description":""}},"tags":["Partners"],"security":[{"bearer":[]}]},"get":{"operationId":"PartnerConsoleOperationsController_listClientBookings","summary":"List bookings for a client","parameters":[{"name":"userId","required":true,"in":"path","schema":{"type":"string"}},{"name":"page","required":true,"in":"query","schema":{"type":"number"}},{"name":"limit","required":true,"in":"query","schema":{"type":"number"}}],"responses":{"200":{"description":""}},"tags":["Partners"],"security":[{"bearer":[]}]}},"/api/v1/partners/ops/clients/{userId}/bookings/{bookingId}/reschedule":{"patch":{"operationId":"PartnerConsoleOperationsController_rescheduleBooking","summary":"Reschedule client booking","parameters":[{"name":"userId","required":true,"in":"path","schema":{"type":"string"}},{"name":"bookingId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RescheduleBookingDto"}}}},"responses":{"200":{"description":""}},"tags":["Partners"],"security":[{"bearer":[]}]}},"/api/v1/partners/ops/clients/{userId}/bookings/{bookingId}/cancel":{"patch":{"operationId":"PartnerConsoleOperationsController_cancelBooking","summary":"Cancel client booking","parameters":[{"name":"userId","required":true,"in":"path","schema":{"type":"string"}},{"name":"bookingId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Partners"],"security":[{"bearer":[]}]}},"/api/v1/partners/ops/payment-providers":{"get":{"operationId":"PartnerConsoleOperationsController_listPaymentProviders","summary":"List partner payment providers mapping","parameters":[{"name":"partnerId","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Partners"],"security":[{"bearer":[]}]},"patch":{"operationId":"PartnerConsoleOperationsController_setPaymentProviders","summary":"Set partner payment providers mapping","parameters":[],"responses":{"200":{"description":""}},"tags":["Partners"],"security":[{"bearer":[]}]}},"/api/v1/partners/ops/audits":{"get":{"operationId":"PartnerConsoleOperationsController_listAudits","summary":"List partner-console audit records","parameters":[{"name":"partnerId","required":true,"in":"query","schema":{"type":"string"}},{"name":"page","required":true,"in":"query","schema":{"type":"number"}},{"name":"limit","required":true,"in":"query","schema":{"type":"number"}}],"responses":{"200":{"description":""}},"tags":["Partners"],"security":[{"bearer":[]}]}},"/api/v1/partners/promotions":{"get":{"operationId":"PartnerConsolePromotionsController_listPromotions","summary":"List partner promotions","parameters":[{"name":"partnerId","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Partners"],"security":[{"bearer":[]}]},"post":{"operationId":"PartnerConsolePromotionsController_createPromotion","summary":"Create partner promotion","parameters":[],"responses":{"201":{"description":""}},"tags":["Partners"],"security":[{"bearer":[]}]}},"/api/v1/partners/promotions/{id}":{"patch":{"operationId":"PartnerConsolePromotionsController_updatePromotion","summary":"Update partner promotion","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Partners"],"security":[{"bearer":[]}]},"delete":{"operationId":"PartnerConsolePromotionsController_deletePromotion","summary":"Delete partner promotion","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Partners"],"security":[{"bearer":[]}]}},"/api/v1/partners/promotions/{id}/activate":{"patch":{"operationId":"PartnerConsolePromotionsController_activatePromotion","summary":"Activate partner promotion","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Partners"],"security":[{"bearer":[]}]}},"/api/v1/partners/promotions/{id}/deactivate":{"patch":{"operationId":"PartnerConsolePromotionsController_deactivatePromotion","summary":"Deactivate partner promotion","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Partners"],"security":[{"bearer":[]}]}},"/api/v1/users/{id}/checkins":{"get":{"operationId":"UsersPartnerRelationsController_getUserCheckins","summary":"Get checkins for user by id","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"page","required":false,"in":"query","schema":{"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"type":"number"}}],"responses":{"200":{"description":""}},"tags":["Users"],"security":[{"bearer":[]}]}},"/api/v1/users/{id}/promotions":{"get":{"operationId":"UsersPartnerRelationsController_getUserPromotions","summary":"Get currently active promotions applicable to user (partner-specific if user has partnerId, otherwise global)","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Users"],"security":[{"bearer":[]}]}},"/api/v1/checkins":{"post":{"operationId":"CheckinsController_createCheckin","summary":"Create checkin","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCheckinDto"},"examples":{"create":{"summary":"Validate QR and create checkin","value":{"subscriptionQrCode":"WP-SUB-6d26d56f-9d03-4de6-8d86-8d236e6f1036","partnerId":"ad4ddad0-3c8d-4a9c-862c-9f64e0f1c1aa","method":"qr_scan"}}}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"example":{"checkinId":"2d8f5f5d-32cc-4e37-a75d-4a87b574f5af","status":"validated","userName":"Ion Popescu","planTier":"premium","partner":"WashPoint Botanica","bookingId":null,"message":"Welcome! premium wash validated."}}}}},"400":{"description":"Bad Request (validation or domain rule error)","schema":{"example":{"statusCode":400,"error":"Bad Request","message":["email must be an email"],"timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"401":{"description":"Unauthorized","schema":{"example":{"statusCode":401,"error":"Unauthorized","message":"Invalid credentials","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"403":{"description":"Forbidden","schema":{"example":{"statusCode":403,"error":"Forbidden","message":"Forbidden resource","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"404":{"description":"Not Found","schema":{"example":{"statusCode":404,"error":"Not Found","message":"Resource not found","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"500":{"description":"Internal Server Error","schema":{"example":{"statusCode":500,"error":"Internal Server Error","message":"Internal server error","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}}},"tags":["Checkins"],"security":[{"bearer":[]}]}},"/api/v1/checkins/{id}/complete":{"post":{"operationId":"CheckinsController_completeCheckin","summary":"Complete checkin","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""},"400":{"description":"Bad Request (validation or domain rule error)","schema":{"example":{"statusCode":400,"error":"Bad Request","message":["email must be an email"],"timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"401":{"description":"Unauthorized","schema":{"example":{"statusCode":401,"error":"Unauthorized","message":"Invalid credentials","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"403":{"description":"Forbidden","schema":{"example":{"statusCode":403,"error":"Forbidden","message":"Forbidden resource","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"404":{"description":"Not Found","schema":{"example":{"statusCode":404,"error":"Not Found","message":"Resource not found","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"500":{"description":"Internal Server Error","schema":{"example":{"statusCode":500,"error":"Internal Server Error","message":"Internal server error","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}}},"tags":["Checkins"],"security":[{"bearer":[]}]}},"/api/v1/checkins/validate":{"post":{"operationId":"CheckinsController_validateCheckin","summary":"PRD alias: validate QR and create checkin (partner flow)","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCheckinDto"},"examples":{"validate":{"summary":"Partner-side QR validation","value":{"subscriptionQrCode":"WP-SUB-6d26d56f-9d03-4de6-8d86-8d236e6f1036","partnerId":"ad4ddad0-3c8d-4a9c-862c-9f64e0f1c1aa","method":"manual"}}}}}},"responses":{"201":{"description":""},"400":{"description":"Bad Request (validation or domain rule error)","schema":{"example":{"statusCode":400,"error":"Bad Request","message":["email must be an email"],"timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"401":{"description":"Unauthorized","schema":{"example":{"statusCode":401,"error":"Unauthorized","message":"Invalid credentials","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"403":{"description":"Forbidden","schema":{"example":{"statusCode":403,"error":"Forbidden","message":"Forbidden resource","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"404":{"description":"Not Found","schema":{"example":{"statusCode":404,"error":"Not Found","message":"Resource not found","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"500":{"description":"Internal Server Error","schema":{"example":{"statusCode":500,"error":"Internal Server Error","message":"Internal server error","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}}},"tags":["Checkins"],"security":[{"bearer":[]}]}},"/api/v1/checkins/me":{"get":{"operationId":"CheckinsController_getMyCheckinsAlias","summary":"PRD alias: my checkin history","parameters":[{"name":"page","required":true,"in":"query","schema":{"type":"string"}},{"name":"limit","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""},"400":{"description":"Bad Request (validation or domain rule error)","schema":{"example":{"statusCode":400,"error":"Bad Request","message":["email must be an email"],"timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"401":{"description":"Unauthorized","schema":{"example":{"statusCode":401,"error":"Unauthorized","message":"Invalid credentials","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"403":{"description":"Forbidden","schema":{"example":{"statusCode":403,"error":"Forbidden","message":"Forbidden resource","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"404":{"description":"Not Found","schema":{"example":{"statusCode":404,"error":"Not Found","message":"Resource not found","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"500":{"description":"Internal Server Error","schema":{"example":{"statusCode":500,"error":"Internal Server Error","message":"Internal server error","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}}},"tags":["Checkins"],"security":[{"bearer":[]}]}},"/api/v1/checkins/me/usage":{"get":{"operationId":"CheckinsController_getMyUsage","summary":"PRD alias: my fair-use usage stats (remaining/cooldown)","parameters":[],"responses":{"200":{"description":""},"400":{"description":"Bad Request (validation or domain rule error)","schema":{"example":{"statusCode":400,"error":"Bad Request","message":["email must be an email"],"timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"401":{"description":"Unauthorized","schema":{"example":{"statusCode":401,"error":"Unauthorized","message":"Invalid credentials","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"403":{"description":"Forbidden","schema":{"example":{"statusCode":403,"error":"Forbidden","message":"Forbidden resource","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"404":{"description":"Not Found","schema":{"example":{"statusCode":404,"error":"Not Found","message":"Resource not found","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"500":{"description":"Internal Server Error","schema":{"example":{"statusCode":500,"error":"Internal Server Error","message":"Internal server error","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}}},"tags":["Checkins"],"security":[{"bearer":[]}]}},"/api/v1/checkins/me/savings":{"get":{"operationId":"CheckinsController_getMySavings","summary":"My subscription savings vs paying per wash","parameters":[{"name":"months","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"example":{"totalWashes":8,"estimatedSingleWashCost":150,"totalWithoutSubscription":1200,"subscriptionCost":299,"totalSaved":901,"savingsPercent":75,"currency":"MDL","period":{"from":"2026-04-01T00:00:00.000Z","to":"2026-04-05T12:00:00.000Z","months":1}}}}}},"400":{"description":"Bad Request (validation or domain rule error)","schema":{"example":{"statusCode":400,"error":"Bad Request","message":["email must be an email"],"timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"401":{"description":"Unauthorized","schema":{"example":{"statusCode":401,"error":"Unauthorized","message":"Invalid credentials","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"403":{"description":"Forbidden","schema":{"example":{"statusCode":403,"error":"Forbidden","message":"Forbidden resource","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"404":{"description":"Not Found","schema":{"example":{"statusCode":404,"error":"Not Found","message":"Resource not found","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"500":{"description":"Internal Server Error","schema":{"example":{"statusCode":500,"error":"Internal Server Error","message":"Internal server error","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}}},"tags":["Checkins"],"security":[{"bearer":[]}]}},"/api/v1/checkins/me/stats":{"get":{"operationId":"CheckinsController_getMyStats","summary":"SHOULD: personal wash statistics (monthly, favorite, streak)","parameters":[{"name":"months","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""},"400":{"description":"Bad Request (validation or domain rule error)","schema":{"example":{"statusCode":400,"error":"Bad Request","message":["email must be an email"],"timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"401":{"description":"Unauthorized","schema":{"example":{"statusCode":401,"error":"Unauthorized","message":"Invalid credentials","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"403":{"description":"Forbidden","schema":{"example":{"statusCode":403,"error":"Forbidden","message":"Forbidden resource","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"404":{"description":"Not Found","schema":{"example":{"statusCode":404,"error":"Not Found","message":"Resource not found","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"500":{"description":"Internal Server Error","schema":{"example":{"statusCode":500,"error":"Internal Server Error","message":"Internal server error","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}}},"tags":["Checkins"],"security":[{"bearer":[]}]}},"/api/v1/checkins/history":{"get":{"operationId":"CheckinsController_getMyCheckins","summary":"My checkin history","parameters":[{"name":"page","required":true,"in":"query","schema":{"type":"string"}},{"name":"limit","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""},"400":{"description":"Bad Request (validation or domain rule error)","schema":{"example":{"statusCode":400,"error":"Bad Request","message":["email must be an email"],"timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"401":{"description":"Unauthorized","schema":{"example":{"statusCode":401,"error":"Unauthorized","message":"Invalid credentials","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"403":{"description":"Forbidden","schema":{"example":{"statusCode":403,"error":"Forbidden","message":"Forbidden resource","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"404":{"description":"Not Found","schema":{"example":{"statusCode":404,"error":"Not Found","message":"Resource not found","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"500":{"description":"Internal Server Error","schema":{"example":{"statusCode":500,"error":"Internal Server Error","message":"Internal server error","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}}},"tags":["Checkins"],"security":[{"bearer":[]}]}},"/api/v1/checkins/partner/{partnerId}":{"get":{"operationId":"CheckinsController_getPartnerCheckins","summary":"Internal: get partner checkins in date interval","parameters":[{"name":"partnerId","required":true,"in":"path","schema":{"type":"string"}},{"name":"startDate","required":true,"in":"query","schema":{"type":"string"}},{"name":"endDate","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""},"400":{"description":"Bad Request (validation or domain rule error)","schema":{"example":{"statusCode":400,"error":"Bad Request","message":["email must be an email"],"timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"401":{"description":"Unauthorized","schema":{"example":{"statusCode":401,"error":"Unauthorized","message":"Invalid credentials","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"403":{"description":"Forbidden","schema":{"example":{"statusCode":403,"error":"Forbidden","message":"Forbidden resource","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"404":{"description":"Not Found","schema":{"example":{"statusCode":404,"error":"Not Found","message":"Resource not found","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"500":{"description":"Internal Server Error","schema":{"example":{"statusCode":500,"error":"Internal Server Error","message":"Internal server error","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}}},"tags":["Checkins"],"security":[{"bearer":[]}]}},"/api/v1/checkins/user/{userId}":{"get":{"operationId":"CheckinsController_getUserCheckins","summary":"Internal: get user checkins","parameters":[{"name":"userId","required":true,"in":"path","schema":{"type":"string"}},{"name":"page","required":true,"in":"query","schema":{"type":"string"}},{"name":"limit","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""},"400":{"description":"Bad Request (validation or domain rule error)","schema":{"example":{"statusCode":400,"error":"Bad Request","message":["email must be an email"],"timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"401":{"description":"Unauthorized","schema":{"example":{"statusCode":401,"error":"Unauthorized","message":"Invalid credentials","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"403":{"description":"Forbidden","schema":{"example":{"statusCode":403,"error":"Forbidden","message":"Forbidden resource","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"404":{"description":"Not Found","schema":{"example":{"statusCode":404,"error":"Not Found","message":"Resource not found","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"500":{"description":"Internal Server Error","schema":{"example":{"statusCode":500,"error":"Internal Server Error","message":"Internal server error","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}}},"tags":["Checkins"],"security":[{"bearer":[]}]}},"/api/v1/subscriptions/me":{"get":{"operationId":"SubscriptionsController_getMySubscriptions","summary":"Get my subscriptions (active + history)","parameters":[],"responses":{"200":{"description":""},"400":{"description":"Bad Request (validation or domain rule error)","schema":{"example":{"statusCode":400,"error":"Bad Request","message":["email must be an email"],"timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"401":{"description":"Unauthorized","schema":{"example":{"statusCode":401,"error":"Unauthorized","message":"Invalid credentials","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"403":{"description":"Forbidden","schema":{"example":{"statusCode":403,"error":"Forbidden","message":"Forbidden resource","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"404":{"description":"Not Found","schema":{"example":{"statusCode":404,"error":"Not Found","message":"Resource not found","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"500":{"description":"Internal Server Error","schema":{"example":{"statusCode":500,"error":"Internal Server Error","message":"Internal server error","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}}},"tags":["Subscriptions"],"security":[{"bearer":[]}]},"patch":{"operationId":"SubscriptionsController_updateCurrentSubscription","summary":"PRD alias: update current subscription (upgrade/downgrade/auto-renew)","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateClientSubscriptionDto"},"examples":{"update":{"summary":"Upgrade billing cycle and keep auto renew","value":{"billingCycle":"yearly","autoRenew":true}}}}}},"responses":{"200":{"description":""},"400":{"description":"Bad Request (validation or domain rule error)","schema":{"example":{"statusCode":400,"error":"Bad Request","message":["email must be an email"],"timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"401":{"description":"Unauthorized","schema":{"example":{"statusCode":401,"error":"Unauthorized","message":"Invalid credentials","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"403":{"description":"Forbidden","schema":{"example":{"statusCode":403,"error":"Forbidden","message":"Forbidden resource","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"404":{"description":"Not Found","schema":{"example":{"statusCode":404,"error":"Not Found","message":"Resource not found","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"500":{"description":"Internal Server Error","schema":{"example":{"statusCode":500,"error":"Internal Server Error","message":"Internal server error","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}}},"tags":["Subscriptions"],"security":[{"bearer":[]}]}},"/api/v1/subscriptions":{"post":{"operationId":"SubscriptionsController_createMySubscription","summary":"Create my subscription draft (pending payment)","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateClientSubscriptionDto"},"examples":{"create":{"summary":"Create subscription with card checkout","value":{"planId":"3fa85f64-5717-4562-b3fc-2c963f66afa6","billingCycle":"monthly","vehicleIds":["11111111-2222-3333-4444-555555555555"],"paymentMethod":"card","checkoutDescription":"Premium monthly plan"}}}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"example":{"id":"99ab8c8e-4f1a-4c59-ae8d-1e3d3b227001","status":"pending_payment","billingCycle":"monthly","totalPrice":199,"priceCurrency":"MDL","payment":{"initiated":true,"method":"card","paymentId":"aabbccdd-eeff-1122-3344-556677889900","checkoutUrl":"https://api.mpay.md/checkout?order=aabbccdd-eeff-1122-3344-556677889900"}}}}}},"400":{"description":"Bad Request (validation or domain rule error)","schema":{"example":{"statusCode":400,"error":"Bad Request","message":["email must be an email"],"timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"401":{"description":"Unauthorized","schema":{"example":{"statusCode":401,"error":"Unauthorized","message":"Invalid credentials","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"403":{"description":"Forbidden","schema":{"example":{"statusCode":403,"error":"Forbidden","message":"Forbidden resource","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"404":{"description":"Not Found","schema":{"example":{"statusCode":404,"error":"Not Found","message":"Resource not found","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"500":{"description":"Internal Server Error","schema":{"example":{"statusCode":500,"error":"Internal Server Error","message":"Internal server error","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}}},"tags":["Subscriptions"],"security":[{"bearer":[]}]}},"/api/v1/subscriptions/me/cancel":{"post":{"operationId":"SubscriptionsController_cancelCurrentSubscription","summary":"PRD alias: cancel current subscription at period end with reason","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CancelSubscriptionDto"},"examples":{"cancel":{"summary":"Cancellation with retention reason","value":{"reasonCode":"too_expensive","reasonDetails":"Need to reduce monthly costs"}}}}}},"responses":{"201":{"description":""},"400":{"description":"Bad Request (validation or domain rule error)","schema":{"example":{"statusCode":400,"error":"Bad Request","message":["email must be an email"],"timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"401":{"description":"Unauthorized","schema":{"example":{"statusCode":401,"error":"Unauthorized","message":"Invalid credentials","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"403":{"description":"Forbidden","schema":{"example":{"statusCode":403,"error":"Forbidden","message":"Forbidden resource","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"404":{"description":"Not Found","schema":{"example":{"statusCode":404,"error":"Not Found","message":"Resource not found","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"500":{"description":"Internal Server Error","schema":{"example":{"statusCode":500,"error":"Internal Server Error","message":"Internal server error","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}}},"tags":["Subscriptions"],"security":[{"bearer":[]}]}},"/api/v1/subscriptions/me/pause":{"post":{"operationId":"SubscriptionsController_pauseCurrentSubscription","summary":"PRD alias: pause current subscription (max 1 month)","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PauseSubscriptionDto"},"examples":{"pauseByDays":{"summary":"Pause by number of days","value":{"days":14}},"pauseUntilDate":{"summary":"Pause until fixed date","value":{"until":"2026-04-01T00:00:00.000Z"}}}}}},"responses":{"201":{"description":""},"400":{"description":"Bad Request (validation or domain rule error)","schema":{"example":{"statusCode":400,"error":"Bad Request","message":["email must be an email"],"timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"401":{"description":"Unauthorized","schema":{"example":{"statusCode":401,"error":"Unauthorized","message":"Invalid credentials","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"403":{"description":"Forbidden","schema":{"example":{"statusCode":403,"error":"Forbidden","message":"Forbidden resource","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"404":{"description":"Not Found","schema":{"example":{"statusCode":404,"error":"Not Found","message":"Resource not found","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"500":{"description":"Internal Server Error","schema":{"example":{"statusCode":500,"error":"Internal Server Error","message":"Internal server error","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}}},"tags":["Subscriptions"],"security":[{"bearer":[]}]}},"/api/v1/subscriptions/{id}":{"patch":{"operationId":"SubscriptionsController_updateMySubscription","summary":"Update my subscription plan/vehicles/billing cycle","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateClientSubscriptionDto"}}}},"responses":{"200":{"description":""},"400":{"description":"Bad Request (validation or domain rule error)","schema":{"example":{"statusCode":400,"error":"Bad Request","message":["email must be an email"],"timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"401":{"description":"Unauthorized","schema":{"example":{"statusCode":401,"error":"Unauthorized","message":"Invalid credentials","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"403":{"description":"Forbidden","schema":{"example":{"statusCode":403,"error":"Forbidden","message":"Forbidden resource","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"404":{"description":"Not Found","schema":{"example":{"statusCode":404,"error":"Not Found","message":"Resource not found","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"500":{"description":"Internal Server Error","schema":{"example":{"statusCode":500,"error":"Internal Server Error","message":"Internal server error","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}}},"tags":["Subscriptions"],"security":[{"bearer":[]}]}},"/api/v1/subscriptions/{id}/cancel":{"post":{"operationId":"SubscriptionsController_cancelAtPeriodEnd","summary":"Cancel at period end (access remains until endDate)","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CancelSubscriptionDto"}}}},"responses":{"201":{"description":""},"400":{"description":"Bad Request (validation or domain rule error)","schema":{"example":{"statusCode":400,"error":"Bad Request","message":["email must be an email"],"timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"401":{"description":"Unauthorized","schema":{"example":{"statusCode":401,"error":"Unauthorized","message":"Invalid credentials","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"403":{"description":"Forbidden","schema":{"example":{"statusCode":403,"error":"Forbidden","message":"Forbidden resource","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"404":{"description":"Not Found","schema":{"example":{"statusCode":404,"error":"Not Found","message":"Resource not found","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"500":{"description":"Internal Server Error","schema":{"example":{"statusCode":500,"error":"Internal Server Error","message":"Internal server error","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}}},"tags":["Subscriptions"],"security":[{"bearer":[]}]}},"/api/v1/subscriptions/{id}/resume":{"post":{"operationId":"SubscriptionsController_resumeAutoRenew","summary":"Resume auto-renew (undo period-end cancellation request)","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""},"400":{"description":"Bad Request (validation or domain rule error)","schema":{"example":{"statusCode":400,"error":"Bad Request","message":["email must be an email"],"timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"401":{"description":"Unauthorized","schema":{"example":{"statusCode":401,"error":"Unauthorized","message":"Invalid credentials","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"403":{"description":"Forbidden","schema":{"example":{"statusCode":403,"error":"Forbidden","message":"Forbidden resource","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"404":{"description":"Not Found","schema":{"example":{"statusCode":404,"error":"Not Found","message":"Resource not found","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"500":{"description":"Internal Server Error","schema":{"example":{"statusCode":500,"error":"Internal Server Error","message":"Internal server error","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}}},"tags":["Subscriptions"],"security":[{"bearer":[]}]}},"/api/v1/client/payments/mpay/init":{"post":{"operationId":"PaymentsController_initiateMpayPayment","summary":"Initiate mPay payment (live API request)","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InitPaymentDto"}}}},"responses":{"201":{"description":""},"400":{"description":"Bad Request (validation or domain rule error)","schema":{"example":{"statusCode":400,"error":"Bad Request","message":["email must be an email"],"timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"401":{"description":"Unauthorized","schema":{"example":{"statusCode":401,"error":"Unauthorized","message":"Invalid credentials","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"403":{"description":"Forbidden","schema":{"example":{"statusCode":403,"error":"Forbidden","message":"Forbidden resource","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"404":{"description":"Not Found","schema":{"example":{"statusCode":404,"error":"Not Found","message":"Resource not found","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"500":{"description":"Internal Server Error","schema":{"example":{"statusCode":500,"error":"Internal Server Error","message":"Internal server error","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}}},"tags":["Payments"],"security":[{"bearer":[]}]}},"/api/v1/client/payments/mia/init":{"post":{"operationId":"PaymentsController_initiateMiaPayment","summary":"Initiate MIA payment (live API request)","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InitPaymentDto"}}}},"responses":{"201":{"description":""},"400":{"description":"Bad Request (validation or domain rule error)","schema":{"example":{"statusCode":400,"error":"Bad Request","message":["email must be an email"],"timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"401":{"description":"Unauthorized","schema":{"example":{"statusCode":401,"error":"Unauthorized","message":"Invalid credentials","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"403":{"description":"Forbidden","schema":{"example":{"statusCode":403,"error":"Forbidden","message":"Forbidden resource","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"404":{"description":"Not Found","schema":{"example":{"statusCode":404,"error":"Not Found","message":"Resource not found","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"500":{"description":"Internal Server Error","schema":{"example":{"statusCode":500,"error":"Internal Server Error","message":"Internal server error","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}}},"tags":["Payments"],"security":[{"bearer":[]}]}},"/api/v1/client/payments/paynet/init":{"post":{"operationId":"PaymentsController_initiatePaynetPayment","summary":"Initiate Paynet payment (live API request)","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InitPaymentDto"}}}},"responses":{"201":{"description":""},"400":{"description":"Bad Request (validation or domain rule error)","schema":{"example":{"statusCode":400,"error":"Bad Request","message":["email must be an email"],"timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"401":{"description":"Unauthorized","schema":{"example":{"statusCode":401,"error":"Unauthorized","message":"Invalid credentials","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"403":{"description":"Forbidden","schema":{"example":{"statusCode":403,"error":"Forbidden","message":"Forbidden resource","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"404":{"description":"Not Found","schema":{"example":{"statusCode":404,"error":"Not Found","message":"Resource not found","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"500":{"description":"Internal Server Error","schema":{"example":{"statusCode":500,"error":"Internal Server Error","message":"Internal server error","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}}},"tags":["Payments"],"security":[{"bearer":[]}]}},"/api/v1/client/payments/mpay/callback":{"post":{"operationId":"PaymentsController_handleMpayCallback","summary":"Handle mPay callback/webhook","parameters":[],"responses":{"201":{"description":""},"400":{"description":"Bad Request (validation or domain rule error)","schema":{"example":{"statusCode":400,"error":"Bad Request","message":["email must be an email"],"timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"401":{"description":"Unauthorized","schema":{"example":{"statusCode":401,"error":"Unauthorized","message":"Invalid credentials","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"403":{"description":"Forbidden","schema":{"example":{"statusCode":403,"error":"Forbidden","message":"Forbidden resource","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"404":{"description":"Not Found","schema":{"example":{"statusCode":404,"error":"Not Found","message":"Resource not found","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"500":{"description":"Internal Server Error","schema":{"example":{"statusCode":500,"error":"Internal Server Error","message":"Internal server error","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}}},"tags":["Payments"]}},"/api/v1/client/payments/mia/callback":{"post":{"operationId":"PaymentsController_handleMiaCallback","summary":"Handle MIA callback/webhook","parameters":[],"responses":{"201":{"description":""},"400":{"description":"Bad Request (validation or domain rule error)","schema":{"example":{"statusCode":400,"error":"Bad Request","message":["email must be an email"],"timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"401":{"description":"Unauthorized","schema":{"example":{"statusCode":401,"error":"Unauthorized","message":"Invalid credentials","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"403":{"description":"Forbidden","schema":{"example":{"statusCode":403,"error":"Forbidden","message":"Forbidden resource","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"404":{"description":"Not Found","schema":{"example":{"statusCode":404,"error":"Not Found","message":"Resource not found","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"500":{"description":"Internal Server Error","schema":{"example":{"statusCode":500,"error":"Internal Server Error","message":"Internal server error","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}}},"tags":["Payments"]}},"/api/v1/client/payments/paynet/callback":{"post":{"operationId":"PaymentsController_handlePaynetCallback","summary":"Handle Paynet callback/webhook","parameters":[],"responses":{"201":{"description":""},"400":{"description":"Bad Request (validation or domain rule error)","schema":{"example":{"statusCode":400,"error":"Bad Request","message":["email must be an email"],"timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"401":{"description":"Unauthorized","schema":{"example":{"statusCode":401,"error":"Unauthorized","message":"Invalid credentials","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"403":{"description":"Forbidden","schema":{"example":{"statusCode":403,"error":"Forbidden","message":"Forbidden resource","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"404":{"description":"Not Found","schema":{"example":{"statusCode":404,"error":"Not Found","message":"Resource not found","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"500":{"description":"Internal Server Error","schema":{"example":{"statusCode":500,"error":"Internal Server Error","message":"Internal server error","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}}},"tags":["Payments"]}},"/api/v1/client/payments/initiate":{"post":{"operationId":"PaymentsController_initiatePayment","summary":"PRD alias: initiate payment by checkout method","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InitCheckoutDto"},"examples":{"card":{"summary":"Card checkout","value":{"subscriptionId":"3fa85f64-5717-4562-b3fc-2c963f66afa6","method":"card","description":"WashPass Premium monthly"}},"mia":{"summary":"MIA checkout","value":{"subscriptionId":"3fa85f64-5717-4562-b3fc-2c963f66afa6","method":"mia","phoneNumber":"+37360123456"}}}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"example":{"paymentId":"c1db7d8f-d36d-49bb-85d1-355f70c2c30f","checkoutUrl":"https://api.mpay.md/checkout?order=c1db7d8f-d36d-49bb-85d1-355f70c2c30f","paymentData":{"merchant_id":"merchant-123","order_id":"c1db7d8f-d36d-49bb-85d1-355f70c2c30f","amount":199,"currency":"MDL"},"signature":"<sha256-signature>"}}}}},"400":{"description":"Bad Request (validation or domain rule error)","schema":{"example":{"statusCode":400,"error":"Bad Request","message":["email must be an email"],"timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"401":{"description":"Unauthorized","schema":{"example":{"statusCode":401,"error":"Unauthorized","message":"Invalid credentials","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"403":{"description":"Forbidden","schema":{"example":{"statusCode":403,"error":"Forbidden","message":"Forbidden resource","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"404":{"description":"Not Found","schema":{"example":{"statusCode":404,"error":"Not Found","message":"Resource not found","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"500":{"description":"Internal Server Error","schema":{"example":{"statusCode":500,"error":"Internal Server Error","message":"Internal server error","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}}},"tags":["Payments"],"security":[{"bearer":[]}]}},"/api/v1/client/payments/{provider}/init":{"post":{"operationId":"PaymentsController_initiateByProvider","summary":"Initiate payment by provider (mpay|mia|paynet)","parameters":[{"name":"provider","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InitPaymentDto"},"examples":{"providerInit":{"summary":"Provider specific init request","value":{"subscriptionId":"3fa85f64-5717-4562-b3fc-2c963f66afa6","amount":199,"currency":"MDL","description":"Monthly renewal"}}}}}},"responses":{"201":{"description":""},"400":{"description":"Bad Request (validation or domain rule error)","schema":{"example":{"statusCode":400,"error":"Bad Request","message":["email must be an email"],"timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"401":{"description":"Unauthorized","schema":{"example":{"statusCode":401,"error":"Unauthorized","message":"Invalid credentials","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"403":{"description":"Forbidden","schema":{"example":{"statusCode":403,"error":"Forbidden","message":"Forbidden resource","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"404":{"description":"Not Found","schema":{"example":{"statusCode":404,"error":"Not Found","message":"Resource not found","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"500":{"description":"Internal Server Error","schema":{"example":{"statusCode":500,"error":"Internal Server Error","message":"Internal server error","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}}},"tags":["Payments"],"security":[{"bearer":[]}]}},"/api/v1/client/payments/mock/checkout/{paymentId}":{"get":{"operationId":"PaymentsController_getMockCheckoutPage","summary":"Mock payment provider checkout page (development only)","parameters":[{"name":"paymentId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""},"400":{"description":"Bad Request (validation or domain rule error)","schema":{"example":{"statusCode":400,"error":"Bad Request","message":["email must be an email"],"timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"401":{"description":"Unauthorized","schema":{"example":{"statusCode":401,"error":"Unauthorized","message":"Invalid credentials","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"403":{"description":"Forbidden","schema":{"example":{"statusCode":403,"error":"Forbidden","message":"Forbidden resource","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"404":{"description":"Not Found","schema":{"example":{"statusCode":404,"error":"Not Found","message":"Resource not found","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"500":{"description":"Internal Server Error","schema":{"example":{"statusCode":500,"error":"Internal Server Error","message":"Internal server error","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}}},"tags":["Payments"]}},"/api/v1/client/payments/mock/confirm/{paymentId}":{"post":{"operationId":"PaymentsController_confirmMockPayment","summary":"Confirm mock payment (development only)","parameters":[{"name":"paymentId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""},"400":{"description":"Bad Request (validation or domain rule error)","schema":{"example":{"statusCode":400,"error":"Bad Request","message":["email must be an email"],"timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"401":{"description":"Unauthorized","schema":{"example":{"statusCode":401,"error":"Unauthorized","message":"Invalid credentials","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"403":{"description":"Forbidden","schema":{"example":{"statusCode":403,"error":"Forbidden","message":"Forbidden resource","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"404":{"description":"Not Found","schema":{"example":{"statusCode":404,"error":"Not Found","message":"Resource not found","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"500":{"description":"Internal Server Error","schema":{"example":{"statusCode":500,"error":"Internal Server Error","message":"Internal server error","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}}},"tags":["Payments"]}},"/api/v1/client/payments/{provider}/callback":{"post":{"operationId":"PaymentsController_handleByProviderCallback","summary":"Handle provider callback (mpay|mia|paynet|mock)","parameters":[{"name":"provider","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""},"400":{"description":"Bad Request (validation or domain rule error)","schema":{"example":{"statusCode":400,"error":"Bad Request","message":["email must be an email"],"timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"401":{"description":"Unauthorized","schema":{"example":{"statusCode":401,"error":"Unauthorized","message":"Invalid credentials","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"403":{"description":"Forbidden","schema":{"example":{"statusCode":403,"error":"Forbidden","message":"Forbidden resource","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"404":{"description":"Not Found","schema":{"example":{"statusCode":404,"error":"Not Found","message":"Resource not found","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"500":{"description":"Internal Server Error","schema":{"example":{"statusCode":500,"error":"Internal Server Error","message":"Internal server error","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}}},"tags":["Payments"]}},"/api/v1/client/payments/me":{"get":{"operationId":"PaymentsController_getMyPayments","summary":"Get my payment history (paginated)","parameters":[{"name":"page","required":true,"in":"query","schema":{"type":"string"}},{"name":"limit","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""},"400":{"description":"Bad Request (validation or domain rule error)","schema":{"example":{"statusCode":400,"error":"Bad Request","message":["email must be an email"],"timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"401":{"description":"Unauthorized","schema":{"example":{"statusCode":401,"error":"Unauthorized","message":"Invalid credentials","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"403":{"description":"Forbidden","schema":{"example":{"statusCode":403,"error":"Forbidden","message":"Forbidden resource","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"404":{"description":"Not Found","schema":{"example":{"statusCode":404,"error":"Not Found","message":"Resource not found","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"500":{"description":"Internal Server Error","schema":{"example":{"statusCode":500,"error":"Internal Server Error","message":"Internal server error","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}}},"tags":["Payments"],"security":[{"bearer":[]}]}},"/api/v1/client/payments/me/export":{"get":{"operationId":"PaymentsController_exportMyPayments","summary":"SHOULD/COULD: export my payment history (CSV/PDF)","parameters":[{"name":"format","required":true,"in":"query","schema":{"type":"string"}},{"name":"from","required":true,"in":"query","schema":{"type":"string"}},{"name":"to","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""},"400":{"description":"Bad Request (validation or domain rule error)","schema":{"example":{"statusCode":400,"error":"Bad Request","message":["email must be an email"],"timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"401":{"description":"Unauthorized","schema":{"example":{"statusCode":401,"error":"Unauthorized","message":"Invalid credentials","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"403":{"description":"Forbidden","schema":{"example":{"statusCode":403,"error":"Forbidden","message":"Forbidden resource","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"404":{"description":"Not Found","schema":{"example":{"statusCode":404,"error":"Not Found","message":"Resource not found","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"500":{"description":"Internal Server Error","schema":{"example":{"statusCode":500,"error":"Internal Server Error","message":"Internal server error","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}}},"tags":["Payments"],"security":[{"bearer":[]}]}},"/api/v1/client/payments/{id}/receipt":{"get":{"operationId":"PaymentsController_getPaymentReceipt","summary":"PRD alias: download payment receipt (PDF)","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""},"400":{"description":"Bad Request (validation or domain rule error)","schema":{"example":{"statusCode":400,"error":"Bad Request","message":["email must be an email"],"timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"401":{"description":"Unauthorized","schema":{"example":{"statusCode":401,"error":"Unauthorized","message":"Invalid credentials","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"403":{"description":"Forbidden","schema":{"example":{"statusCode":403,"error":"Forbidden","message":"Forbidden resource","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"404":{"description":"Not Found","schema":{"example":{"statusCode":404,"error":"Not Found","message":"Resource not found","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"500":{"description":"Internal Server Error","schema":{"example":{"statusCode":500,"error":"Internal Server Error","message":"Internal server error","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}}},"tags":["Payments"],"security":[{"bearer":[]}]}},"/api/v1/client/payments/{id}/receipt/email":{"post":{"operationId":"PaymentsController_sendPaymentReceiptByEmail","summary":"SHOULD: send payment receipt by email","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""},"400":{"description":"Bad Request (validation or domain rule error)","schema":{"example":{"statusCode":400,"error":"Bad Request","message":["email must be an email"],"timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"401":{"description":"Unauthorized","schema":{"example":{"statusCode":401,"error":"Unauthorized","message":"Invalid credentials","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"403":{"description":"Forbidden","schema":{"example":{"statusCode":403,"error":"Forbidden","message":"Forbidden resource","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"404":{"description":"Not Found","schema":{"example":{"statusCode":404,"error":"Not Found","message":"Resource not found","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"500":{"description":"Internal Server Error","schema":{"example":{"statusCode":500,"error":"Internal Server Error","message":"Internal server error","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}}},"tags":["Payments"],"security":[{"bearer":[]}]}},"/api/v1/client/payments/{id}":{"get":{"operationId":"PaymentsController_getPaymentById","summary":"PRD alias: get my payment details","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""},"400":{"description":"Bad Request (validation or domain rule error)","schema":{"example":{"statusCode":400,"error":"Bad Request","message":["email must be an email"],"timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"401":{"description":"Unauthorized","schema":{"example":{"statusCode":401,"error":"Unauthorized","message":"Invalid credentials","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"403":{"description":"Forbidden","schema":{"example":{"statusCode":403,"error":"Forbidden","message":"Forbidden resource","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"404":{"description":"Not Found","schema":{"example":{"statusCode":404,"error":"Not Found","message":"Resource not found","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"500":{"description":"Internal Server Error","schema":{"example":{"statusCode":500,"error":"Internal Server Error","message":"Internal server error","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}}},"tags":["Payments"],"security":[{"bearer":[]}]}},"/api/v1/client/payments/checkout":{"post":{"operationId":"PaymentsController_initiateCheckout","summary":"Initiate checkout by payment method (mpay/mia/paynet/card/wallet)","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InitCheckoutDto"}}}},"responses":{"201":{"description":""},"400":{"description":"Bad Request (validation or domain rule error)","schema":{"example":{"statusCode":400,"error":"Bad Request","message":["email must be an email"],"timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"401":{"description":"Unauthorized","schema":{"example":{"statusCode":401,"error":"Unauthorized","message":"Invalid credentials","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"403":{"description":"Forbidden","schema":{"example":{"statusCode":403,"error":"Forbidden","message":"Forbidden resource","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"404":{"description":"Not Found","schema":{"example":{"statusCode":404,"error":"Not Found","message":"Resource not found","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}},"500":{"description":"Internal Server Error","schema":{"example":{"statusCode":500,"error":"Internal Server Error","message":"Internal server error","timestamp":"2026-03-09T10:30:00.000Z","path":"/api/v1/resource"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponseDto"}}}}},"tags":["Payments"],"security":[{"bearer":[]}]}},"/api/v1/plans":{"get":{"operationId":"PlansController_listPlans","summary":"List active plans","parameters":[{"name":"includeInactive","required":true,"in":"query","schema":{"type":"string"}},{"name":"city","required":true,"in":"query","schema":{"type":"string"}},{"name":"vehicleType","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Plans"]}},"/api/v1/internal/plans":{"get":{"operationId":"PlansInternalController_listPlans","summary":"List plans (internal)","parameters":[],"responses":{"200":{"description":""}},"tags":["Internal"],"security":[{"bearer":[]}]},"post":{"operationId":"PlansInternalController_createPlan","summary":"Create plan (internal)","parameters":[],"responses":{"201":{"description":""}},"tags":["Internal"],"security":[{"bearer":[]}]}},"/api/v1/internal/plans/{id}":{"patch":{"operationId":"PlansInternalController_updatePlan","summary":"Update plan (internal)","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Internal"],"security":[{"bearer":[]}]},"delete":{"operationId":"PlansInternalController_deletePlan","summary":"Delete plan (internal)","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Internal"],"security":[{"bearer":[]}]}},"/api/v1/internal/plans/{id}/activate":{"patch":{"operationId":"PlansInternalController_activatePlan","summary":"Activate plan (internal)","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Internal"],"security":[{"bearer":[]}]}},"/api/v1/internal/plans/{id}/deactivate":{"patch":{"operationId":"PlansInternalController_deactivatePlan","summary":"Deactivate plan (internal)","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Internal"],"security":[{"bearer":[]}]}},"/api/v1/admin/plans":{"get":{"operationId":"PlansAdminController_listPlans","summary":"List plans","parameters":[],"responses":{"200":{"description":""}},"tags":["Admin"],"security":[{"bearer":[]}]},"post":{"operationId":"PlansAdminController_createPlan","summary":"Create plan","parameters":[],"responses":{"201":{"description":""}},"tags":["Admin"],"security":[{"bearer":[]}]}},"/api/v1/admin/plans/{id}":{"patch":{"operationId":"PlansAdminController_updatePlan","summary":"Update plan","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Admin"],"security":[{"bearer":[]}]},"delete":{"operationId":"PlansAdminController_deletePlan","summary":"Delete plan","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Admin"],"security":[{"bearer":[]}]}},"/api/v1/admin/plans/{id}/activate":{"patch":{"operationId":"PlansAdminController_activatePlan","summary":"Activate plan","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Admin"],"security":[{"bearer":[]}]}},"/api/v1/admin/plans/{id}/deactivate":{"patch":{"operationId":"PlansAdminController_deactivatePlan","summary":"Deactivate plan","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Admin"],"security":[{"bearer":[]}]}},"/api/v1/ratings":{"post":{"operationId":"RatingsController_create","summary":"Submit rating for a completed wash check-in","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateRatingDto"}}}},"responses":{"201":{"description":""}},"tags":["Ratings"],"security":[{"bearer":[]}]}},"/api/v1/ratings/partner/{partnerId}":{"get":{"operationId":"RatingsController_getPartnerRatings","summary":"Get ratings for a wash partner","parameters":[{"name":"partnerId","required":true,"in":"path","schema":{"type":"string"}},{"name":"page","required":false,"in":"query","schema":{"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"type":"number"}}],"responses":{"200":{"description":""}},"tags":["Ratings"]}},"/health":{"get":{"operationId":"HealthController_getHealth","summary":"Service health checks (API/DB/Redis)","parameters":[],"responses":{"200":{"description":""}},"tags":["Health"]}}},"info":{"title":"WashPass Partner","description":"Partner service API","version":"0.1.0+038d699","contact":{}},"tags":[],"servers":[{"url":"http://localhost:3000","description":"Gateway (localhost)"},{"url":"http://127.0.0.1:3000","description":"Gateway (127.0.0.1)"}],"components":{"securitySchemes":{"bearer":{"scheme":"bearer","bearerFormat":"JWT","type":"http"}},"schemas":{"UserMeUpdateDto":{"type":"object","properties":{"name":{"type":"string","example":"Ion Popescu"},"email":{"type":"string","example":"ion@example.com"},"phone":{"type":"object","example":"+37360123456"},"city":{"type":"string","enum":["chisinau","balti","bucuresti","cluj","kiev","odesa"]},"country":{"type":"string","example":"moldova"},"language":{"type":"string","example":"ro"},"currency":{"type":"string","example":"MDL"},"firebaseToken":{"type":"object"}}},"CreateVehicleDto":{"type":"object","properties":{"userId":{"type":"string","description":"Internal only: target user id for vehicle creation. Ignored for client/partner.","format":"uuid"},"plateNumber":{"type":"string","example":"ABC 123","maxLength":20},"make":{"type":"string","maxLength":50},"model":{"type":"string","maxLength":50},"type":{"type":"string","enum":["motorcycle","sedan","hatchback","suv","bus","van","truck"]},"color":{"type":"string"},"isPrimary":{"type":"boolean","default":false}},"required":["plateNumber"]},"UpdateVehicleDto":{"type":"object","properties":{"plateNumber":{"type":"string","example":"ABC 123","maxLength":20},"make":{"type":"string","maxLength":50},"model":{"type":"string","maxLength":50},"type":{"type":"string","enum":["motorcycle","sedan","hatchback","suv","bus","van","truck"]},"color":{"type":"string"},"isPrimary":{"type":"boolean"}}},"SharedSubscriptionUserRefDto":{"type":"object","properties":{"userId":{"type":"string","format":"uuid","example":"3fa85f64-5717-4562-b3fc-2c963f66afa6"}},"required":["userId"]},"UserEmailConfirmationDto":{"type":"object","properties":{"required":{"type":"boolean","example":true},"emailSent":{"type":"boolean","example":false},"status":{"type":"string","example":"pending","enum":["pending","confirmed","not_required"]},"expiresAt":{"type":"string","example":"2026-02-22T12:00:00.000Z"},"confirmedAt":{"type":"string","example":"2026-02-22T12:05:10.000Z"}},"required":["required","emailSent","status"]},"ConfirmEmailResponseDto":{"type":"object","properties":{"userId":{"type":"string","format":"uuid"},"name":{"type":"string","example":"Ion Popescu"},"email":{"type":"string","example":"ion@example.com"},"phone":{"type":"object","example":"+37360123456"},"country":{"type":"string","example":"moldova"},"city":{"type":"string","example":"chisinau"},"language":{"type":"string","example":"ro"},"currency":{"type":"string","example":"MDL"},"partnerId":{"type":"string","format":"uuid","nullable":true,"example":"3fa85f64-5717-4562-b3fc-2c963f66afa6"},"active":{"type":"boolean","example":false},"vehicles":{"example":[],"type":"array","items":{"type":"object"}},"subscription":{"type":"object","nullable":true,"example":null},"sharedSubscriptionWith":{"example":[{"userId":"3fa85f64-5717-4562-b3fc-2c963f66afa6"}],"type":"array","items":{"$ref":"#/components/schemas/SharedSubscriptionUserRefDto"}},"confirmation":{"$ref":"#/components/schemas/UserEmailConfirmationDto"},"message":{"type":"string","example":"Email confirmed successfully"}},"required":["userId","name","email","country","city","language","active","confirmation","message"]},"UserCreateDto":{"type":"object","properties":{"name":{"type":"string","example":"Ion Popescu"},"email":{"type":"string","example":"ion@example.com"},"password":{"type":"string","example":"Secret123!"},"phone":{"type":"string","example":"+37360123456"},"city":{"type":"string","enum":["chisinau","balti","bucuresti","cluj","kiev","odesa"],"example":"chisinau"},"country":{"type":"string","example":"moldova"},"language":{"type":"string","example":"ro"},"currency":{"type":"string","example":"MDL","description":"Optional. Used for client users; partner/internal use country default."},"partnerId":{"type":"string","format":"uuid"}},"required":["name","email","password"]},"UserProvisioningResponseDto":{"type":"object","properties":{"userId":{"type":"string","format":"uuid"},"name":{"type":"string","example":"Ion Popescu"},"email":{"type":"string","example":"ion@example.com"},"phone":{"type":"object","example":"+37360123456"},"country":{"type":"string","example":"moldova"},"city":{"type":"string","example":"chisinau"},"language":{"type":"string","example":"ro"},"currency":{"type":"string","example":"MDL"},"partnerId":{"type":"string","format":"uuid","nullable":true,"example":"3fa85f64-5717-4562-b3fc-2c963f66afa6"},"active":{"type":"boolean","example":false},"vehicles":{"example":[],"type":"array","items":{"type":"object"}},"subscription":{"type":"object","nullable":true,"example":null},"sharedSubscriptionWith":{"example":[{"userId":"3fa85f64-5717-4562-b3fc-2c963f66afa6"}],"type":"array","items":{"$ref":"#/components/schemas/SharedSubscriptionUserRefDto"}},"confirmation":{"$ref":"#/components/schemas/UserEmailConfirmationDto"}},"required":["userId","name","email","country","city","language","active","confirmation"]},"UserUpdateDto":{"type":"object","properties":{"name":{"type":"string","example":"Ion Popescu"},"email":{"type":"string","example":"ion@example.com"},"password":{"type":"string","example":"Secret123!"},"phone":{"type":"object","example":"+37360123456"},"city":{"type":"string","enum":["chisinau","balti","bucuresti","cluj","kiev","odesa"]},"country":{"type":"string","example":"moldova"},"language":{"type":"string","example":"ro"},"currency":{"type":"string","example":"MDL","description":"Optional. For partner/internal userType routes, currency updates are ignored."},"partnerId":{"type":"string","format":"uuid"},"isActive":{"type":"boolean"},"firebaseToken":{"type":"object"}}},"UpsertUserConsentDto":{"type":"object","properties":{"granted":{"type":"boolean","example":true,"description":"Set consent status to granted/revoked (true = granted, false = revoked)."},"source":{"type":"string","example":"client_app","description":"Origin of consent update (client_app/internal_console/support)."},"policyVersion":{"type":"string","example":"privacy-policy-2026-03-01","description":"Policy document version accepted/revoked by the user."},"metadata":{"type":"object","example":{"locale":"ro","device":"ios"},"description":"Optional metadata for compliance/audit context."}},"required":["granted"]},"CreateDsarRequestDto":{"type":"object","properties":{"requestType":{"type":"string","enum":["access_export","portability_export","erasure","rectification","restriction","objection"]},"reason":{"type":"string","maxLength":2000},"metadata":{"type":"object","description":"Optional context for compliance workflow."}},"required":["requestType"]},"UpdateDsarRequestDto":{"type":"object","properties":{"status":{"type":"string","enum":["submitted","in_review","approved","rejected","processing","fulfilled","cancelled"]},"assignedToUserId":{"type":"string"},"resolutionSummary":{"type":"string","maxLength":4000},"executeNow":{"type":"boolean","description":"Execute requested action now (export/anonymize/delete)."},"metadata":{"type":"object"}}},"RunRetentionPolicyDto":{"type":"object","properties":{"policyCode":{"type":"string","enum":["inactive_client_anonymization","unconfirmed_client_delete"],"default":"inactive_client_anonymization"},"dryRun":{"type":"boolean","default":true},"olderThanDays":{"type":"number","default":365},"limit":{"type":"number","default":200}}},"CreatePrivacyBreachDto":{"type":"object","properties":{"title":{"type":"string"},"description":{"type":"string"},"severity":{"type":"string","enum":["low","medium","high","critical"]},"detectedAt":{"type":"string"},"occurredAt":{"type":"string"},"ownerUserId":{"type":"string"},"affectedSubjectsCount":{"type":"number"},"affectedRecordsCount":{"type":"number"},"likelyHighRisk":{"type":"boolean"},"metadata":{"type":"object"}},"required":["title","description"]},"UpdatePrivacyBreachDto":{"type":"object","properties":{"severity":{"type":"string","enum":["low","medium","high","critical"]},"status":{"type":"string","enum":["open","triage","contained","notified_authority","notified_subjects","resolved","closed"]},"ownerUserId":{"type":"string"},"affectedSubjectsCount":{"type":"number"},"affectedRecordsCount":{"type":"number"},"likelyHighRisk":{"type":"boolean"},"authorityNotifiedAt":{"type":"string"},"subjectsNotifiedAt":{"type":"string"},"resolutionSummary":{"type":"string","maxLength":6000},"metadata":{"type":"object"}}},"ApiErrorResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","example":400},"error":{"type":"string","example":"Bad Request"},"message":{"oneOf":[{"type":"string","example":"Validation failed"},{"type":"array","items":{"type":"string"}}],"example":["email must be an email"]},"timestamp":{"type":"string","example":"2026-03-09T10:30:00.000Z"},"path":{"type":"string","example":"/api/v1/auth/login"}},"required":["statusCode","error","message","timestamp","path"]},"RegisterDto":{"type":"object","properties":{}},"LoginDto":{"type":"object","properties":{"email":{"type":"string","example":"ion@example.com","description":"Account email. Provide this or phoneNumber."},"phoneNumber":{"type":"string","example":"+37360123456","description":"Account phone number. Provide this or email."}}},"AuthTokenPairResponseDto":{"type":"object","properties":{"accessToken":{"type":"string","example":"yourAccessTokenHere"},"refreshToken":{"type":"string","example":"yourRefreshTokenHere"}},"required":["accessToken","refreshToken"]},"RefreshAccessTokenDto":{"type":"object","properties":{"refreshToken":{"type":"string","description":"Refresh token JWT used to rotate access/refresh token pair."}},"required":["refreshToken"]},"ForgotPasswordDto":{"type":"object","properties":{"email":{"type":"string","example":"ion@example.com"}},"required":["email"]},"ResetPasswordDto":{"type":"object","properties":{"token":{"type":"string","description":"Password reset token received by email."},"password":{"type":"string","description":"New account password. Must contain at least one uppercase letter, one lowercase letter, and one digit.","minLength":8}},"required":["token","password"]},"OauthProviderLoginDto":{"type":"object","properties":{"method":{"type":"string","enum":["oauth"],"description":"Optional marker for oauth flow.","default":"oauth"},"providerUserId":{"type":"string","example":"provider-user-subject","description":"Optional when idToken contains subject (sub) claim."},"oauthEmail":{"type":"string","example":"ion@example.com","description":"Optional when idToken contains email claim."},"name":{"type":"string","example":"Ion Popescu","description":"Optional when idToken contains name claims."},"phone":{"type":"string","example":"+37360123456"},"country":{"type":"string","example":"moldova"},"city":{"type":"string","example":"chisinau"},"language":{"type":"string","example":"ro"},"currency":{"type":"string","example":"MDL"},"idToken":{"type":"string"}}},"AuthLoginCredentialsDto":{"type":"object","properties":{"email":{"type":"string","example":"yourEmail@example.com"},"password":{"type":"string","example":"yourPassword123!"}},"required":["email","password"]},"RefreshTokenDto":{"type":"object","properties":{"userId":{"type":"string","format":"uuid"},"refreshToken":{"type":"string"}},"required":["userId","refreshToken"]},"AuthLoginOauthDto":{"type":"object","properties":{"method":{"type":"string","enum":["oauth"],"description":"Optional marker for oauth flow.","default":"oauth"},"provider":{"type":"string","enum":["google","apple","facebook"]},"providerUserId":{"type":"string","example":"provider-user-subject","description":"Optional when idToken contains subject (sub) claim."},"oauthEmail":{"type":"string","example":"ion@example.com","description":"Optional when idToken contains email claim."},"name":{"type":"string","example":"Ion Popescu","description":"Optional when idToken contains name claims."},"phone":{"type":"string","example":"+37360123456"},"country":{"type":"string","example":"moldova"},"city":{"type":"string","example":"chisinau"},"language":{"type":"string","example":"ro"},"currency":{"type":"string","example":"MDL"},"idToken":{"type":"string"}},"required":["provider"]},"SsoLogoutDto":{"type":"object","properties":{"userId":{"type":"string","format":"uuid"}},"required":["userId"]},"CreatePartnerOrganizationDto":{"type":"object","properties":{"organizationName":{"type":"string","example":"WashPoint Botanica"},"address":{"type":"string","example":"Str. Stefan cel Mare 42, Chisinau"},"city":{"type":"string","example":"chisinau"},"lat":{"type":"number","example":47.0245},"lng":{"type":"number","example":28.8322},"phone":{"type":"string","example":"+37322123456"},"contactEmail":{"type":"string","example":"partner@washpoint.md"},"bankIban":{"type":"string","example":"MD24AG000225100013104168"},"capacityPerHour":{"type":"number","example":4,"minimum":1,"maximum":1000,"description":"Maximum vehicles that can be processed simultaneously at this location per booking slot."},"hours":{"type":"object","description":"Working hours per weekday. Bookings availability depends on this schedule (e.g. monday, tuesday, ...).","additionalProperties":{"type":"object","properties":{"open":{"type":"string","example":"08:00"},"close":{"type":"string","example":"20:00"}},"required":["open","close"]},"example":{"monday":{"open":"08:00","close":"20:00"},"tuesday":{"open":"08:00","close":"20:00"},"wednesday":{"open":"08:00","close":"20:00"},"thursday":{"open":"08:00","close":"20:00"},"friday":{"open":"08:00","close":"20:00"},"saturday":{"open":"09:00","close":"18:00"}}},"services":{"example":["exterior","interior"],"type":"array","items":{"type":"string"}},"photos":{"example":["https://cdn.washpass.md/partners/washpoint-1.jpg"],"type":"array","items":{"type":"string"}},"ownerName":{"type":"string","example":"Ion Popescu"},"ownerEmail":{"type":"string","example":"ion.partner@example.com"},"ownerPhone":{"type":"string","example":"+37360123456"},"ownerPassword":{"type":"string","example":"Secret123!"},"ownerCountry":{"type":"string","example":"moldova"},"ownerLanguage":{"type":"string","example":"ro"},"ownerCurrency":{"type":"string","example":"MDL"}},"required":["organizationName","address","city","lat","lng","ownerName","ownerEmail","ownerPassword","ownerCountry","ownerLanguage","ownerCurrency"]},"PartnerOrganizationSummaryDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string","example":"WashPoint Botanica"},"address":{"type":"string","example":"Str. Stefan cel Mare 42, Chisinau"},"city":{"type":"string","example":"chisinau"},"lat":{"type":"number","example":47.0245},"lng":{"type":"number","example":28.8322},"phone":{"type":"string","example":"+37322123456"},"contactEmail":{"type":"string","example":"partner@washpoint.md"},"bankIban":{"type":"string","example":"MD24AG000225100013104168"},"capacityPerHour":{"type":"number","example":4},"hours":{"type":"object","additionalProperties":{"type":"object","properties":{"open":{"type":"string","example":"08:00"},"close":{"type":"string","example":"20:00"}}}},"services":{"example":["exterior","interior"],"type":"array","items":{"type":"string"}},"photos":{"example":["https://cdn.washpass.md/partners/washpoint-1.jpg"],"type":"array","items":{"type":"string"}}},"required":["id","name","address","city","lat","lng"]},"PartnerOrganizationDto":{"type":"object","properties":{"partnerId":{"type":"string","format":"uuid","description":"Partner organization identifier (UUID/GUID).","example":"3fa85f64-5717-4562-b3fc-2c963f66afa6"},"partner":{"$ref":"#/components/schemas/PartnerOrganizationSummaryDto"},"owner":{"description":"Provisioning response for the partner owner user.","allOf":[{"$ref":"#/components/schemas/UserProvisioningResponseDto"}]}},"required":["partnerId","partner","owner"]},"CreateClientSubscriptionDto":{"type":"object","properties":{}},"BookingRecurrenceDto":{"type":"object","properties":{"frequency":{"type":"string","enum":["daily","weekly"],"description":"Recurring booking frequency. Defaults to weekly when recurrence is provided.","example":"weekly"},"count":{"type":"number","description":"How many occurrences to create, including the first booking.","minimum":1,"maximum":52,"example":4}}},"CreateBookingDto":{"type":"object","properties":{"partnerId":{"type":"string","format":"uuid","description":"Wash partner location UUID where the appointment is requested."},"userId":{"type":"string","format":"uuid","description":"Target user id for partner/internal-assisted booking creation. Ignored for client self-booking."},"vehicleId":{"type":"string","format":"uuid","description":"Vehicle id attached to booking (recommended for scheduling context)."},"boxNumber":{"type":"number","minimum":1,"maximum":1000,"example":2,"description":"Optional preferred wash box number. If omitted, bookings service auto-assigns the first available box."},"scheduledAt":{"type":"string","format":"date-time","example":"2026-03-15T10:00:00.000Z","description":"Requested appointment date-time. The service normalizes to the configured partner slot boundary (20-120 minutes)."},"notes":{"type":"string","example":"Exterior wash only please"},"recurrence":{"description":"Optional recurring booking configuration (daily/weekly).","allOf":[{"$ref":"#/components/schemas/BookingRecurrenceDto"}]}},"required":["partnerId","scheduledAt"]},"RescheduleBookingDto":{"type":"object","properties":{"scheduledAt":{"type":"string","format":"date-time","example":"2026-03-15T14:00:00.000Z","description":"New desired appointment date-time. The service normalizes to the configured partner slot boundary (20-120 minutes)."},"boxNumber":{"type":"number","minimum":1,"maximum":1000,"example":2,"description":"Optional preferred wash box number for the rescheduled slot. If omitted, system keeps current box when available or auto-assigns another free one."}},"required":["scheduledAt"]},"CreateCheckinDto":{"type":"object","properties":{}},"UpdateClientSubscriptionDto":{"type":"object","properties":{}},"CancelSubscriptionDto":{"type":"object","properties":{}},"PauseSubscriptionDto":{"type":"object","properties":{}},"InitPaymentDto":{"type":"object","properties":{}},"InitCheckoutDto":{"type":"object","properties":{}},"CreateRatingDto":{"type":"object","properties":{}}}}}