openapi: 3.1.0
info:
  title: Wunder User API
  description: Wunder Mobility API for User
  version: 1.0.0
  contact:
    name: Wunder Mobility GmbH
    url: 'https://wundermobility.com'
    email: info@wundermobility.com
servers:
  - url: 'https://{environment}.api.gourban.services/v1/{tenant}/front'
    description: Wunder User API
    variables:
      environment:
        default: go
        enum:
          - go
          - go-staging
      tenant:
        default: demo
        description: Tenant identifier of your system. Usually 8 characters.
tags:
  - name: Customers
    description: Customer endpoints
  - name: Branches
    description: Branches endpoints
  - name: Terms and Conditions
    description: Terms and Conditions endpoints
  - name: Rentals
    description: Rentals endpoints
  - name: Bookings
    description: Bookings endpoints
  - name: Stations
    description: Stations endpoints
  - name: Vehicle Categories
    description: Vehicle Categories endpoints
  - name: Vehicles
    description: Vehicles endpoints
  - name: Damages
    description: Damages endpoints
  - name: Subscriptions
    description: Subscriptions endpoints
  - name: Promotions
    description: Promotion endpoints
  - name: Packages
    description: Packages endpoints
  - name: Vouchers
    description: Vouchers endpoints
  - name: Balances
    description: Balances endpoints
  - name: Payment
    description: Payment endpoints
  - name: Invoices
    description: Invoices endpoints
  - name: Pricing
    description: Pricing endpoints
  - name: On-demand pricing
    description: On-demand pricing endpoints
  - name: Radars
    description: Radars endpoints
  - name: OneSignal
    description: OneSignal endpoints
  - name: Verifications
    description: Verifications endpoints
  - name: User Groups
    description: User Groups and User Group Management endpoints
  - name: Files
    description: Files endpoints
  - name: Tutorials
    description: Tutorials endpoints
  - name: Settings
    description: Settings endpoints
  - name: Messages
    description: Messages endpoints
  - name: Events
    description: Events endpoints
  - name: Vehicle Attributes
    description: Vehicle Attributes endpoints
  - name: Driving Log
    description: Driving Log endpoints
  - name: Physical Stations
    description: Physical Stations endpoints
paths:
  /customers:
    get:
      summary: GET /customers
      description: Retrieve the profile of the currently authenticated user.
      operationId: getUser
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GUserResponse'
      tags:
        - Customers
    post:
      summary: POST /customers
      description: Register a new user account. Optionally validates the request using a signature and timestamp.
      operationId: create
      parameters:
        - name: signature
          in: query
          required: false
          schema:
            type: string
          description: Signature hash to validate the request. Check the documentation how to sign the request.
        - name: timestamp
          in: query
          required: false
          schema:
            type: integer
            format: int64
          description: UNIX timestamp in seconds that was used for the signature
        - name: Accept-Language
          in: header
          required: true
          schema:
            type: string
          description: Preferred language for the user account (IETF BCP 47 language tag)
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AddUser'
        required: true
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GUserResponse'
      tags:
        - Customers
    patch:
      summary: PATCH /customers
      description: Update the profile of the currently authenticated user.
      operationId: updateOwnUser
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/GUser'
        required: true
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GUserResponse'
      tags:
        - Customers
  /customers/signed:
    get:
      summary: GET /customers/signed
      description: Retrieve the current user's profile data signed as a JWT for secure third-party verification.
      operationId: getSignedUserInformation
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GUserSignedResponse'
      tags:
        - Customers
  /customers/create-or-sign-in-with-phone-number:
    post:
      summary: POST /customers/create-or-sign-in-with-phone-number
      description: Create a new user account or sign in an existing user using a phone number. A verification code will be sent via SMS.
      operationId: createOrSignInWithPhoneNumber
      parameters:
        - name: signature
          in: query
          required: false
          schema:
            type: string
          description: Signature hash to validate the request. Check the documentation how to sign the request.
        - name: timestamp
          in: query
          required: false
          schema:
            type: integer
            format: int64
          description: UNIX timestamp in seconds that was used for the signature
        - name: Accept-Language
          in: header
          required: true
          schema:
            type: string
          description: Preferred language for the user account (IETF BCP 47 language tag)
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AddUserWithPhoneNumber'
        required: true
      responses:
        '204':
          description: No Content
      tags:
        - Customers
  /customers/create-or-sign-in-with-email-code:
    post:
      summary: POST /customers/create-or-sign-in-with-email-code
      description: Create a new user account or sign in an existing user using an email verification code.
      operationId: createOrSignInWithEmailCode
      parameters:
        - name: signature
          in: query
          required: false
          schema:
            type: string
          description: Signature hash to validate the request. Check the documentation how to sign the request.
        - name: timestamp
          in: query
          required: false
          schema:
            type: integer
            format: int64
          description: UNIX timestamp in seconds that was used for the signature
        - name: Accept-Language
          in: header
          required: true
          schema:
            type: string
          description: Preferred language for the user account (IETF BCP 47 language tag)
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AddUserWithEmailCode'
        required: true
      responses:
        '204':
          description: No Content
      tags:
        - Customers
  /customers/request-deletion:
    post:
      summary: POST /customers/request-deletion
      description: Request deletion of the currently authenticated user's account.
      operationId: requestDeletionOfOwnUser
      responses:
        '204':
          description: No Content
      tags:
        - Customers
  '/customers/reset/{email}':
    post:
      summary: 'POST /customers/reset/{email}'
      description: Send a password reset email to the specified email address.
      operationId: resetPassword
      parameters:
        - name: email
          in: path
          required: true
          schema:
            type: string
          description: Email address to reset password for
        - name: signature
          in: query
          required: false
          schema:
            type: string
          description: Signature hash to validate the request. Check the documentation how to sign the request.
        - name: timestamp
          in: query
          required: false
          schema:
            type: integer
            format: int64
          description: UNIX timestamp in seconds that was used for the signature
        - schema:
            type: string
          in: query
          name: target
          description: Discriminator identifying the target platform/app for the password reset. This is used to forward the user to the correct application for the password reset.
      responses:
        '204':
          description: No Content
      tags:
        - Customers
  /customers/social-sign-up:
    post:
      summary: POST /customers/social-sign-up
      description: Register a new user account using a social login provider (e.g., Google, Apple, Facebook).
      operationId: socialSignUp
      parameters:
        - name: Accept-Language
          in: header
          required: true
          schema:
            type: string
          description: Preferred language for the user account (IETF BCP 47 language tag)
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SocialSignUpRequest'
        required: true
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GUserResponse'
      tags:
        - Customers
  '/customers/verify/check/{code}':
    post:
      summary: 'POST /customers/verify/check/{code}'
      description: Verify the user's phone number by submitting the verification code received via SMS.
      operationId: verifyPhoneCheck
      parameters:
        - name: code
          in: path
          required: true
          schema:
            type: integer
            format: int32
          description: The code identifying the resource
      responses:
        '204':
          description: No Content
      tags:
        - Customers
  /customers/verify/send:
    post:
      summary: POST /customers/verify/send
      description: Send a verification code via SMS to the authenticated user's phone number.
      operationId: verifyPhoneSend
      responses:
        '204':
          description: No Content
      tags:
        - Customers
  /customers/termsandconditions:
    get:
      summary: GET /customers/termsandconditions
      operationId: findTermsAndConditionsAcceptanceByBranchId
      description: Check status of terms and conditions acceptance for the authenticated user on a specific branch.
      parameters:
        - name: branchId
          in: query
          required: true
          schema:
            type: integer
            format: int64
          description: Identifier of the branch to check terms and conditions acceptance for
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TermsAndConditionsAccepted'
      tags:
        - Customers
  '/customers/verify-email/resend/{email}':
    post:
      summary: 'POST /customers/verify-email/resend/{email}'
      operationId: resendVerifyEmail
      responses:
        '204':
          description: |-
            A new email with a verification link has been sent.

            Note that due to security reasons this is also returned if there is no customer with the given email address.
        '409':
          description: Email has already been verified and cannot be verified again.
        '429':
          description: |-
            Resending of email has been requested too many times within a short time period and has thus been rate limited.

            Please retry later.
      tags:
        - Customers
      description: |-
        Resend the email with a link to verify the email address.
        Note that this invalidates all previously sent verification codes and only the latest one is valid.
      parameters:
        - schema:
            type: string
          in: query
          name: signature
          description: Signature hash to validate the request. Check the documentation how to sign the request.
        - schema:
            type: integer
            format: int64
          in: query
          name: timestamp
          description: UNIX timestamp in seconds that was used for the signature
      security: [ ]
    parameters:
      - schema:
          type: string
        name: email
        description: Email address of user requesting a new verification link
        in: path
        required: true
  /promotions:
    get:
      summary: GET /promotions
      operationId: getAllValidNowGeoFence
      parameters:
        - name: branchId
          in: query
          required: true
          schema:
            type: integer
            format: int64
          description: Identifier of the branch to retrieve promotions for
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  anyOf:
                    - $ref: '#/components/schemas/GeofencePromotion'
                    - $ref: '#/components/schemas/GeofenceSurcharge'
              examples:
                Single surcharge result:
                  value:
                    - type: GeoFenceSurcharge
                      branchId: 2
                      value: 1.32
                      code: SL Test 2018 1
                      description: Additional costs arise if you end your rental in the designated area.
                      applicableBranchIds:
                        - 1
                        - 2
                        - 3
                      applicableRentalType: END_RENTAL
                      geoFence:
                        type: MultiPolygon
                        coordinates:
                          - - - - 16.4014
                                - 48.18788
                              - - 16.40457
                                - 48.18584
                              - - 16.40746
                                - 48.18813
                              - - 16.40423
                                - 48.18988
                              - - 16.4014
                                - 48.18788
                      types:
                        - END_RENTAL
      tags:
        - Promotions
      description: |
        Fetch all geofence promotions and surcharges available for the current user.
        The result will contain all geofence promotions and surcharges which could apply to the user on performing a rental.
  /groups:
    get:
      summary: GET /groups
      description: Returns all user groups the authenticated user is a member of.
      operationId: getMemberUserGroups
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/UserGroupMemberView'
      tags:
        - User Groups
  /groups/requests:
    get:
      summary: GET /groups/requests
      description: Retrieve all open join requests and invitations for the authenticated user's groups.
      operationId: getUserGroupRequests
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/GUserGroupRequest'
      tags:
        - User Groups
  '/groups/requests/{requestId}':
    patch:
      summary: 'PATCH /groups/requests/{requestId}'
      description: Accept or decline a join request or invitation for a user group.
      operationId: updateRequest
      parameters:
        - name: requestId
          in: path
          required: true
          schema:
            type: integer
            format: int64
          description: The unique identifier of the request
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/GUserGroupRequest'
        required: true
      responses:
        '201':
          description: Created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GUserGroupRequest'
      tags:
        - User Groups
  '/groups/{code}/leave':
    post:
      summary: 'POST /groups/{code}/leave'
      description: Leave a user group using the group's referral code.
      operationId: leaveUserGroup
      parameters:
        - name: code
          in: path
          required: true
          schema:
            type: string
          description: The code identifying the resource
      responses:
        '204':
          description: No Content
      tags:
        - User Groups
  '/groups/{groupCode}/join':
    post:
      summary: 'POST /groups/{groupCode}/join'
      description: Create a join request for a user group using the group's referral code.
      operationId: joinUserGroup
      parameters:
        - name: groupCode
          in: path
          required: true
          schema:
            type: string
          description: The unique code of the group
        - name: reason
          in: query
          required: false
          schema:
            type: string
          description: Optional reason for requesting to join the group
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GUserGroupRequest'
      tags:
        - User Groups
  /cost-centers:
    get:
      summary: GET /cost-centers
      responses:
        '200':
          description: Successful response
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/CostCenterResponse'
        '403':
          description: User is neither owner nor member of the user group/business account
      tags:
        - Cost Centers
      operationId: listCostCenters
      description: List all cost centers of a user group/business account
      parameters:
        - schema:
            type: integer
            format: int64
          in: query
          name: userGroupId
          required: true
          description: The identifier of the user group/business account
        - schema:
            type: integer
            format: int64
          in: query
          name: id
          description: Search by id of the cost-center (exact match)
        - schema:
            type: string
          in: query
          description: Search by name of the cost-center (like match)
          name: name
        - schema:
            type: string
          in: query
          name: description
          description: Search by description of the cost-center (like match)
        - schema:
            type: string
          in: query
          name: externalReference
          description: Search by external reference (exact match)
        - schema:
            type: string
          in: query
          name: searchText
          description: Free text search across cost center name, description, and external reference
    post:
      summary: POST /cost-centers
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CostCenterRequest'
      responses:
        '201':
          description: Cost center created successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CostCenterResponse'
        '400':
          description: Bad Request
        '403':
          description: Current user is not the owner of the business account and thus cannot create cost centers
        '409':
          description: There already exists a cost center with the same name in the same user group/business account
      tags:
        - Cost Centers
      operationId: createCostCenter
      description: Create a new cost center
    parameters: [ ]
  '/cost-centers/{costCenterId}':
    get:
      summary: 'GET /cost-centers/{costCenterId}'
      responses:
        '200':
          description: Successful response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CostCenterResponse'
        '403':
          description: User is neither owner nor member of the business account of the cost center
        '404':
          description: Cost Center could not be found
      tags:
        - Cost Centers
      operationId: getCostCenter
      description: Retrieve a cost center with the given identifier
    patch:
      summary: 'PATCH /cost-centers/{costCenterId}'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CostCenterPatch'
      responses:
        '200':
          description: Cost center updated successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CostCenterResponse'
        '403':
          description: User is not the owner of the business account of the cost center and thus cannot modify it
        '404':
          description: Cost Center could not be found
      tags:
        - Cost Centers
      operationId: patchCostCenter
      description: Patch a cost center with the given identifier
    delete:
      summary: 'DELETE /cost-centers/{costCenterId}'
      responses:
        '204':
          description: Cost center deleted successfully
        '403':
          description: User is not the owner of the business account of the cost center and thus cannot delete it
        '404':
          description: Cost Center could not be found
      tags:
        - Cost Centers
      operationId: deleteCostCenter
      description: Delete a cost center with the given identifier
    parameters:
      - schema:
          type: integer
          format: int64
        name: costCenterId
        in: path
        required: true
        description: Identifier of the cost center
  /termsandconditions:
    get:
      summary: 'GET /termsandconditions'
      operationId: findTermsAndConditionsQuery
      description: |
        Retrieve the current terms and conditions for either a 
         - branch (query parameter `branchId`)
         - vehicle by id (query parameter `vehicleId`)
         - vehicle by code (query parameter `vehicleCode`)

        It is required to specify one of the query parameters, it is not possible to combine them.
      parameters:
        - name: branchId
          in: query
          required: false
          description: Identifier of the branch
          schema:
            type: integer
            format: int64
        - name: vehicleId
          in: query
          required: false
          description: Identifier of the vehicle
          schema:
            type: integer
            format: int64
        - name: vehicleCode
          in: query
          required: false
          description: Code of the vehicle
          schema:
            type: string
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BranchTermsAndConditions'
      tags:
        - Terms and Conditions
    post:
      summary: POST /termsandconditions
      description: Accept the terms and conditions for a specific branch.
      operationId: acceptTermsAndConditions
      parameters:
        - name: branchId
          in: query
          required: true
          schema:
            type: integer
            format: int64
          description: Identifier of the branch to accept terms and conditions for
        - name: id
          in: query
          required: false
          schema:
            type: integer
            format: int64
          description: Identifier of the specific terms and conditions version to accept
      responses:
        '200':
          description: OK
      tags:
        - Terms and Conditions
  '/termsandconditions/{id}':
    get:
      summary: 'GET /termsandconditions/{id}'
      description: Retrieve a specific terms and conditions document by its ID.
      operationId: findTermsAndConditionsById
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: integer
            format: int64
          description: The unique identifier of the resource
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TermsAndConditions'
      tags:
        - Terms and Conditions
  /vehicles/categories:
    get:
      summary: GET /vehicles/categories
      description: Retrieve all vehicle categories. Optionally filter by branch to get categories from vehicles available on that branch and its child branches.
      operationId: getVehiclesCategoriesOnBranch
      parameters:
        - name: branchId
          in: query
          required: false
          schema:
            type: integer
            format: int64
          description: Filter categories by branch. Returns categories from vehicles on this branch and its child branches
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/VehicleCategory'
      tags:
        - Vehicle Categories
  '/vehicles/categories/{id}':
    get:
      summary: 'GET /vehicles/categories/{id}'
      description: Retrieve a specific vehicle category by its ID.
      operationId: getVehiclesCategoryById
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: integer
            format: int64
          description: The unique identifier of the resource
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/VehicleCategory'
      tags:
        - Vehicle Categories
  /stations:
    get:
      summary: GET /stations
      description: Retrieve all stations for a given branch.
      operationId: getAllStations
      parameters:
        - name: branchId
          in: query
          required: true
          schema:
            type: integer
            format: int64
          description: Identifier of the branch to retrieve stations for
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Station'
      tags:
        - Stations
  /rentals:
    get:
      summary: GET /rentals
      operationId: getRentals
      description: Get rentals for the authenticated user with optional filtering for most attributes.
      parameters:
        - name: page
          in: query
          required: false
          schema:
            type: integer
            default: 0
          description: Page number for pagination (zero-based)
        - name: size
          in: query
          required: false
          schema:
            type: integer
            default: 20
          description: Number of items per page
        - name: sort
          in: query
          required: false
          schema:
            type: string
            default: id,desc
          description: 'Sorting criteria in the format: property,(asc|desc). Default sort is by id,desc'
      responses:
        '200':
          description: OK
          headers:
            X-Total-Count:
              description: Total number of rentals matching the query
              schema:
                type: integer
            X-Total-Pages:
              description: Total number of pages
              schema:
                type: integer
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/RentalList'
        '401':
          description: Unauthorized - User not logged in
        '500':
          description: Internal Server Error
      tags:
        - Rentals
    post:
      summary: POST /rentals
      description: Create a new rental and reserve the specified vehicle.
      operationId: addRental
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AddRental'
        required: true
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Rental'
      tags:
        - Rentals
  '/rentals/{rentalId}':
    get:
      summary: 'GET /rentals/{rentalId}'
      description: Retrieve the details of a specific rental by its ID.
      operationId: getRentalById
      parameters:
        - name: rentalId
          in: path
          required: true
          schema:
            type: integer
            format: int64
          description: The unique identifier of the rental
        - name: userGroupId
          in: query
          required: false
          schema:
            type: integer
            format: int64
          description: User group ID to retrieve the rental as a business account owner
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Rental'
      tags:
        - Rentals
    patch:
      summary: 'PATCH /rentals/{rentalId}'
      description: Update an existing rental (e.g., change additions or other rental properties).
      operationId: updateRental
      parameters:
        - name: rentalId
          in: path
          required: true
          schema:
            type: integer
            format: int64
          description: The unique identifier of the rental
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UpdateRental'
        required: true
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Rental'
      tags:
        - Rentals
    delete:
      summary: 'DELETE /rentals/{rentalId}'
      description: Cancel a reservation by its rental ID.
      operationId: deleteReservationById
      parameters:
        - name: rentalId
          in: path
          required: true
          schema:
            type: integer
            format: int64
          description: The unique identifier of the rental
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Rental'
      tags:
        - Rentals
  '/rentals/{rentalId}/buy-reservation':
    post:
      summary: 'POST /rentals/{rentalId}/buy-reservation'
      description: Purchase additional paid reservation time for an existing rental.
      operationId: buyReservationMinutes
      parameters:
        - name: rentalId
          in: path
          required: true
          schema:
            type: integer
            format: int64
          description: The unique identifier of the rental
        - name: minutes
          in: query
          required: true
          schema:
            type: integer
            format: int64
          description: Number of additional reservation minutes to purchase
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Rental'
      tags:
        - Rentals
  '/rentals/{rentalId}/execute-pre-end-actions':
    post:
      summary: 'POST /rentals/{rentalId}/execute-pre-end-actions'
      description: Trigger execution of pre-end rental actions (e.g., returning vehicle to a station) before ending the rental.
      operationId: executePreEndActions
      parameters:
        - name: rentalId
          in: path
          required: true
          schema:
            type: integer
            format: int64
          description: The unique identifier of the rental
      responses:
        '204':
          description: No Content
      tags:
        - Rentals
  '/rentals/{rentalId}/feedback':
    post:
      summary: 'POST /rentals/{rentalId}/feedback'
      description: Submit user feedback (e.g., rating and comments) for a completed rental.
      operationId: submitFeedback
      parameters:
        - name: rentalId
          in: path
          required: true
          schema:
            type: integer
            format: int64
          description: The unique identifier of the rental
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/RentalFeedback'
        required: true
      responses:
        '201':
          description: Created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Rental'
      tags:
        - Rentals
  '/rentals/{rentalId}/damages':
    get:
      summary: 'GET /rentals/{rentalId}/damages'
      description: >-
        Retrieve damages for the vehicle associated with the given rental; only
        damages in states APPROVED, IGNORED, and UNDER_REPAIR are returned,
        including image file details with download links.
      operationId: getRentalDamages
      parameters:
        - name: rentalId
          in: path
          required: true
          schema:
            type: integer
            format: int64
          description: The unique identifier of the rental
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/DamageWithFilesResponse'
        '404':
          description: Rental not found
      tags:
        - Rentals
        - Damages
  '/rentals/{rentalId}/files':
    post:
      summary: 'POST /rentals/{rentalId}/files'
      operationId: linkFilesToRental
      description: |-
        Link files (e.g., images) to a rental at the start, during, or at the end of the rental.
        Only allowed when the rental is in RESERVATION or ACTIVE state.
      parameters:
        - name: rentalId
          in: path
          required: true
          schema:
            type: integer
            format: int64
          description: The unique identifier of the rental
      requestBody:
        content:
          application/json:
            schema:
              type: array
              items:
                type: integer
                format: int64
              description: List of file IDs to link to the rental.
        required: true
      responses:
        '204':
          description: No Content
        '404':
          description: Rental not found
        '409':
          description: Rental is not in a valid state for condition capture (must be RESERVATION or ACTIVE)
      tags:
        - Rentals
  '/rentals/{rentalId}/operation':
    post:
      summary: 'POST /rentals/{rentalId}/operation'
      description: Execute a rental operation such as starting, ending, locking, or unlocking the vehicle.
      operationId: rentalOperationById
      parameters:
        - name: rentalId
          in: path
          required: true
          schema:
            type: integer
            format: int64
          description: The unique identifier of the rental
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/RentalOperation'
        required: true
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Rental'
      tags:
        - Rentals
  '/rentals/{rentalId}/driving-log':
    get:
      summary: 'GET /rentals/{rentalId}/driving-log'
      operationId: getRentalDrivingLog
      parameters:
        - name: rentalId
          in: path
          required: true
          schema:
            type: integer
            format: int64
          description: The unique identifier of the rental
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RentalDrivingLogUserResponse'
      description: |-
        Retrieve the driving log of a rental.

        Note that this is only available if the rental requires a driving log.
      tags:
        - Driving Log
        - Rentals
  '/rentals/{rentalId}/driving-log/submit':
    post:
      summary: 'POST /rentals/{rentalId}/submit'
      operationId: submitRentalDrivingLog
      parameters:
        - name: rentalId
          in: path
          required: true
          schema:
            type: integer
            format: int64
          description: The unique identifier of the rental
      responses:
        '204':
          description: Submission successful
        '409':
          description: Submitting failed because the driving log is not valid
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RentalDrivingLogValidationResult'
      tags:
        - Driving Log
        - Rentals
      description: |-
        Submit the driving log and finalize it.

        After triggering this action it is currently not possible anymore to edit it.
  '/rentals/{rentalId}/driving-log/validation':
    get:
      summary: 'GET /rentals/{rentalId}/driving-log/validation'
      operationId: getRentalDrivingLogValidation
      parameters:
        - name: rentalId
          in: path
          required: true
          schema:
            type: integer
            format: int64
          description: The unique identifier of the rental
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RentalDrivingLogValidationResult'
      description: Retrieve the validation result of the driving log to check if all entries are valid and if it can be submitted.
      tags:
        - Driving Log
        - Rentals
  '/rentals/{rentalId}/driving-log/entries':
    get:
      summary: 'GET /rentals/{rentalId}/driving-log/entries'
      operationId: getRentalDrivingLogEntries
      parameters:
        - name: rentalId
          in: path
          required: true
          schema:
            type: integer
            format: int64
          description: The unique identifier of the rental
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/DrivingLogEntryUserResponse'
      description: |-
        Retrieve the individual entries of the driving log.

        They will always be sorted by the startKilometers of the entries (ascending).
      tags:
        - Driving Log
        - Rentals
    post:
      summary: 'POST /rentals/{rentalId}/driving-log/entries'
      operationId: createRentalDrivingLogEntries
      parameters:
        - name: rentalId
          in: path
          required: true
          schema:
            type: integer
            format: int64
          description: The unique identifier of the rental
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/RentalDrivingLogEntryUserCreate'
        required: true
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DrivingLogEntryUserResponse'
      description: Add a new entry to the driving log
      tags:
        - Driving Log
        - Rentals
  '/rentals/{rentalId}/driving-log/entries/{drivingLogEntryId}':
    get:
      summary: 'GET /rentals/{rentalId}/driving-log/entries/{drivingLogEntryId}'
      operationId: getRentalDrivingLogEntryById
      parameters:
        - name: rentalId
          in: path
          required: true
          schema:
            type: integer
            format: int64
          description: The unique identifier of the rental
        - name: drivingLogEntryId
          in: path
          required: true
          schema:
            type: integer
            format: int64
          description: The unique identifier of the driving log entry
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DrivingLogEntryUserResponse'
      tags:
        - Driving Log
        - Rentals
      description: Retrieve the data of an individual entry of the driving log
    put:
      summary: 'PUT /rentals/{rentalId}/driving-log/entries/{drivingLogEntryId}'
      operationId: updateRentalDrivingLogEntryById
      parameters:
        - name: rentalId
          in: path
          required: true
          schema:
            type: integer
            format: int64
          description: The unique identifier of the rental
        - name: drivingLogEntryId
          in: path
          required: true
          schema:
            type: integer
            format: int64
          description: The unique identifier of the driving log entry
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/RentalDrivingLogEntryUserUpdate'
        required: true
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DrivingLogEntryUserResponse'
      description: Update an entry of the driving log
      tags:
        - Driving Log
        - Rentals
    delete:
      summary: 'DELETE /rentals/{rentalId}/driving-log/entries/{drivingLogEntryId}'
      operationId: deleteRentalDrivingLogEntryById
      parameters:
        - name: rentalId
          in: path
          required: true
          schema:
            type: integer
            format: int64
          description: The unique identifier of the rental
        - name: drivingLogEntryId
          in: path
          required: true
          schema:
            type: integer
            format: int64
          description: The unique identifier of the driving log entry
      responses:
        '204':
          description: Entry successfully deleted
      description: Delete an entry of the driving log
      tags:
        - Driving Log
        - Rentals
  /files:
    post:
      summary: POST /files
      description: Upload a file as multipart form data. The file can be marked as public or private.
      operationId: uploadMultipart
      parameters:
        - name: public
          in: query
          required: true
          schema:
            type: boolean
          description: Whether the uploaded file should be publicly accessible
        - name: mediaType
          in: query
          required: false
          schema:
            type: string
          description: MIME type of the file being uploaded
        - name: fileName
          in: query
          required: false
          schema:
            type: string
          description: Original file name
        - name: multipart
          in: query
          required: true
          schema:
            type: string
            format: binary
          description: The file content as multipart form data
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/File'
      tags:
        - Files
  '/files/{fileId}':
    get:
      summary: 'GET /files/{fileId}'
      description: >-
        Retrieves file info, streams file content, or returns a download link depending on query params.
        Without params: returns file metadata. With `stream`: streams file content (204).
        With `link`: returns a download URL string.
      operationId: downloadInfo
      parameters:
        - name: fileId
          in: path
          required: true
          schema:
            type: integer
            format: int64
          description: The unique identifier of the file
        - name: stream
          in: query
          required: false
          schema:
            type: boolean
          description: If present, streams the file content directly and returns 204.
        - name: link
          in: query
          required: false
          schema:
            type: boolean
          description: If present, returns a download link URL as a string.
      responses:
        '200':
          description: >-
            Without query params: File metadata object. With `link` param: download URL string.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/File'
        '204':
          description: File content streamed (when `stream` param is present).
      tags:
        - Files
  /packages:
    get:
      summary: GET /packages
      description: Retrieve all available packages for a given branch. Optionally filter by whether the package has a monetary value.
      operationId: getPackagesByBranch
      parameters:
        - name: branchId
          in: query
          required: true
          schema:
            type: integer
            format: int64
          description: Identifier of the branch to retrieve packages for
        - name: hasValue
          in: query
          required: false
          schema:
            type: boolean
          description: When true, only return packages that have a monetary value
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/PackageVoucherable'
      tags:
        - Packages
  /packages/buy:
    post:
      summary: POST /packages/buy
      operationId: buyPackage
      description: |-
        Buy a package. Behavior depends on the `push` query parameter:
        - Without `push`: Direct purchase. Returns 204 on success, or 200 with 3DS payload if additional authentication is required.
        - With `push`: Push-based purchase via payment redirect. Returns 200 with redirect info.
      parameters:
        - name: push
          in: query
          required: false
          schema:
            type: boolean
          description: When present, uses push-based payment flow with BuyPackagePush body and returns redirect info.
      requestBody:
        content:
          application/json:
            schema:
              oneOf:
                - $ref: '#/components/schemas/BuyPackagePush'
                - $ref: '#/components/schemas/BuyPackage'
        required: true
      responses:
        '200':
          description: OK - 3DS payload if additional authentication is required, or redirect info for push payment
          content:
            application/json:
              schema:
                type: object
                additionalProperties: true
        '204':
          description: No Content - package purchased successfully (without push)
      tags:
        - Packages
  '/packages/{packageCode}/pricing':
    get:
      summary: 'GET /packages/{packageCode}/pricing'
      operationId: resolvePackagePricing
      description: Get the price of a package with any applicable promotion or automatic voucher discount applied.
      parameters:
        - name: packageCode
          in: path
          required: true
          schema:
            type: string
          description: The package code
        - name: promotionCode
          in: query
          required: false
          schema:
            type: string
          description: Optional promotion code to apply to the package price
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PackageVoucherable'
      tags:
        - Packages
  /balances:
    get:
      summary: GET /balances
      description: Returns all balance accounts of the authenticated user.
      operationId: findBalances
      parameters:
        - name: branchId
          in: query
          required: false
          schema:
            type: integer
            format: int64
          description: Filter balances available on a specific branch
        - name: vehicleId
          in: query
          required: false
          schema:
            type: integer
            format: int64
          description: Filter balances available for a specific vehicle
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Balance'
      tags:
        - Balances
    post:
      summary: POST /balances
      description: Creates a new balance account.
      operationId: createBalance
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Balance'
        required: true
      responses:
        '201':
          description: Created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Balance'
      tags:
        - Balances
  '/balances/{balanceId}/history':
    get:
      summary: 'GET /balances/{balanceId}/history'
      description: Retrieves balance update history for a specific balance account.
      operationId: findBalanceUpdatesByGUserAndBalance
      parameters:
        - name: balanceId
          in: path
          required: true
          schema:
            type: integer
            format: int64
          description: The unique identifier of the balance account
        - name: includeZeroValueUpdates
          in: query
          required: false
          schema:
            type: boolean
            default: false
          description: When true, includes balance updates with zero value changes in the history
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/BalanceUpdate'
      tags:
        - Balances
  '/balances/{balanceId}/users':
    get:
      summary: 'GET /balances/{balanceId}/users'
      description: Retrieve all users that have access to a specific shared balance account.
      operationId: findBalanceUsers
      parameters:
        - name: balanceId
          in: path
          required: true
          schema:
            type: integer
            format: int64
          description: The unique identifier of the balance account
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/BalanceUserResponse'
      tags:
        - Balances
    post:
      summary: 'POST /balances/{balanceId}/users'
      description: Adds a user to a shared balance account.
      operationId: grantAccessToBalance
      parameters:
        - name: balanceId
          in: path
          required: true
          schema:
            type: integer
            format: int64
          description: The unique identifier of the balance account
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/BalanceUser'
        required: true
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/BalanceUserResponse'
      tags:
        - Balances
  '/balances/{balanceId}/users/{referralCode}':
    delete:
      summary: 'DELETE /balances/{balanceId}/users/{referralCode}'
      description: Removes a user from a shared balance account.
      operationId: revokeAccessToBalance
      parameters:
        - name: balanceId
          in: path
          required: true
          schema:
            type: integer
            format: int64
          description: The unique identifier of the balance account
        - name: referralCode
          in: path
          required: true
          schema:
            type: string
          description: The referral code of the user
      responses:
        '202':
          description: Accepted
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/BalanceUserResponse'
      tags:
        - Balances
  '/balances/{id}':
    delete:
      summary: 'DELETE /balances/{id}'
      description: Delete a balance account owned by the authenticated user.
      operationId: deleteBalance
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: integer
            format: int64
          description: The unique identifier of the resource
      responses:
        '200':
          description: OK
      tags:
        - Balances
  '/balances/{id}/default':
    post:
      summary: 'POST /balances/{id}/default'
      description: Sets a balance account as the default for the authenticated user.
      operationId: selectDefaultBalance
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: integer
            format: int64
          description: The unique identifier of the resource
      responses:
        '200':
          description: OK
      tags:
        - Balances
  /settings:
    get:
      summary: GET /settings
      description: Retrieve application settings by their keys, optionally filtered by branch IDs. Returns settings in the APP and SHARED areas.
      operationId: findByKeyInAndAreaInAndBranchId
      parameters:
        - name: keys
          in: query
          required: true
          schema:
            type: array
            items:
              type: string
          description: List of setting keys to retrieve
        - name: branchIds
          in: query
          required: false
          schema:
            type: array
            items:
              type: integer
              format: int64
          description: Optional list of branch IDs to filter settings by
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/SettingSimple'
      tags:
        - Settings
  /subscriptions:
    get:
      summary: GET /subscriptions
      operationId: findMyValid
      description: |-
        Retrieve subscriptions. Behavior depends on whether branchId is provided:
        - Without branchId: Returns the current user's active subscriptions as UserSubscription objects.
        - With branchId: Returns available subscriptions for the given branch as SubscriptionVoucherable objects (extends ConstraintVoucherable with subscription-specific fields: interval, initialPrice, initialIterations).
      parameters:
        - name: branchId
          in: query
          required: false
          description: When provided, returns available subscriptions for this branch instead of the user's own subscriptions. The response type changes to SubscriptionVoucherable[].
          schema:
            type: integer
            format: int64
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  oneOf:
                    - $ref: '#/components/schemas/UserSubscription'
                    - $ref: '#/components/schemas/SubscriptionVoucherable'
      tags:
        - Subscriptions
  '/subscriptions/buy/{subscriptionCode}':
    post:
      summary: 'POST /subscriptions/buy/{subscriptionCode}'
      description: Purchase a subscription by its code. The subscription will be activated immediately.
      operationId: buy
      parameters:
        - name: subscriptionCode
          in: path
          required: true
          schema:
            type: string
          description: The subscription code
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UserSubscription'
      tags:
        - Subscriptions
  '/subscriptions/cancel/{subscriptionCode}':
    post:
      summary: 'POST /subscriptions/cancel/{subscriptionCode}'
      operationId: cancel
      parameters:
        - name: subscriptionCode
          in: path
          required: true
          schema:
            type: string
          description: The subscription code
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UserSubscription'
      tags:
        - Subscriptions
      description: Deactivate auto-renewal for the given subscription. Alias path /subscriptions/deactivate/{subscriptionCode} also works.
  '/subscriptions/reactivate/{subscriptionCode}':
    post:
      summary: 'POST /subscriptions/reactivate/{subscriptionCode}'
      description: Reactivate auto-renewal for a previously cancelled subscription.
      operationId: reactivate
      parameters:
        - name: subscriptionCode
          in: path
          required: true
          schema:
            type: string
          description: The subscription code
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UserSubscription'
      tags:
        - Subscriptions
  '/subscriptions/renew/{subscriptionCode}':
    post:
      summary: 'POST /subscriptions/renew/{subscriptionCode}'
      description: Manually trigger renewal of an active subscription.
      operationId: renew
      parameters:
        - name: subscriptionCode
          in: path
          required: true
          schema:
            type: string
          description: The subscription code
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UserSubscription'
      tags:
        - Subscriptions
  '/subscriptions/{subscriptionCode}':
    get:
      summary: 'GET /subscriptions/{subscriptionCode}'
      description: Retrieve the details of a specific subscription by its code.
      operationId: findByCode
      parameters:
        - name: subscriptionCode
          in: path
          required: true
          schema:
            type: string
          description: The subscription code
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ConstraintVoucherable'
      tags:
        - Subscriptions
  /user-subscriptions:
    get:
      summary: GET /user-subscriptions
      description: >-
        List subscriptions owned by the authenticated user.
        Results are scoped to the authenticated user.
        Supports filtering, paging, and sorting via query parameters.
        Defaults to sorting by `createdAt` DESC.
      operationId: findAllUserSubscriptions
      parameters:
        - name: state
          in: query
          required: false
          schema:
            type: string
            enum: [RENEWING, EXPIRED, SWITCHING, SWITCHED, CANCELLED]
          description: Filter by subscription state.
        - name: subscription.id
          in: query
          required: false
          schema:
            type: integer
            format: int64
          description: Filter by subscription product id.
        - name: page
          in: query
          required: false
          schema:
            type: integer
            format: int32
            default: 0
          description: Zero-based page index.
        - name: size
          in: query
          required: false
          schema:
            type: integer
            format: int32
            default: 20
          description: Page size.
        - name: sort
          in: query
          required: false
          schema:
            type: string
            default: createdAt,DESC
          description: Sort property and direction, e.g. `validUntil,ASC`.
      responses:
        '200':
          description: OK. Pagination metadata is returned in `X-Total-Count`, `X-Total-Pages`, `X-Page-Number`, and `X-Page-Size` response headers.
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/UserSubscription'
      tags:
        - Subscriptions
  '/user-subscriptions/{id}':
    get:
      summary: 'GET /user-subscriptions/{id}'
      description: Get one of the authenticated user's subscriptions by id.
      operationId: findUserSubscriptionById
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: integer
            format: int64
          description: The user-subscription id
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UserSubscription'
      tags:
        - Subscriptions
    delete:
      summary: 'DELETE /user-subscriptions/{id}'
      description: >-
        Cancel a subscription or revert a pending switch.
        If state == SWITCHING → reverts to RENEWING and clears switchingTarget.
        If state == RENEWING → transitions to CANCELLED. Existing vouchers are kept (user paid; they expire naturally at validUntil).
        Any other state returns 400.
      operationId: cancelUserSubscription
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: integer
            format: int64
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UserSubscription'
      tags:
        - Subscriptions
  '/user-subscriptions/{id}/switch':
    post:
      summary: 'POST /user-subscriptions/{id}/switch'
      description: >-
        Switch a subscription to another tier. With switchImmediately=true, the current subscription is terminated
        immediately (state → SWITCHED) and a new RENEWING subscription is created via the standard buy flow.
        With switchImmediately=false, the current subscription enters SWITCHING state; the scheduler finalizes the
        switch at validUntil (creates the new RENEWING subscription and transitions the current one to SWITCHED).
      operationId: switchUserSubscription
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: integer
            format: int64
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SubscriptionSwitchRequest'
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UserSubscription'
      tags:
        - Subscriptions
  /radars:
    get:
      summary: GET /radars
      description: Retrieve all radars (saved location alerts) for the authenticated user.
      operationId: getAllRadars
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Radar'
      tags:
        - Radars
    post:
      summary: POST /radars
      description: Create a new radar (saved location alert) to receive notifications when vehicles become available in a specified area.
      operationId: createRadar
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Radar'
        required: true
      responses:
        '201':
          description: Created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Radar'
      tags:
        - Radars
  '/radars/{radarId}':
    get:
      summary: 'GET /radars/{radarId}'
      description: Retrieve a specific radar by its ID.
      operationId: getRadarById
      parameters:
        - name: radarId
          in: path
          required: true
          schema:
            type: integer
            format: int64
          description: The unique identifier of the radar
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Radar'
      tags:
        - Radars
    patch:
      summary: 'PATCH /radars/{radarId}'
      description: Update an existing radar's configuration.
      operationId: updateRadar
      parameters:
        - name: radarId
          in: path
          required: true
          schema:
            type: integer
            format: int64
          description: The unique identifier of the radar
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Radar'
        required: true
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Radar'
      tags:
        - Radars
    delete:
      summary: 'DELETE /radars/{radarId}'
      description: Delete a radar by its ID.
      operationId: deleteRadar
      parameters:
        - name: radarId
          in: path
          required: true
          schema:
            type: integer
            format: int64
          description: The unique identifier of the radar
      responses:
        '204':
          description: No Content
      tags:
        - Radars
  /rentals/additions:
    get:
      summary: GET /rentals/additions
      description: Retrieve available rental additions (e.g., insurance, child seat) optionally filtered by vehicle category and branch.
      operationId: findByVehicleCategoryAndBranch
      parameters:
        - name: vehicleCategoryId
          in: query
          required: false
          schema:
            type: integer
            format: int64
          description: Filter additions by vehicle category
        - name: branchId
          in: query
          required: false
          schema:
            type: integer
            format: int64
          description: Filter additions by branch
        - name: bookingStartTime
          in: query
          required: false
          schema:
            type: string
            format: date-time
          description: Start time of the booking period to filter additions by availability
        - name: bookingEndTime
          in: query
          required: false
          schema:
            type: string
            format: date-time
          description: End time of the booking period to filter additions by availability
        - name: userGroupCode
          in: query
          required: false
          schema:
            type: string
          description: Referral code of the user group for group-specific additions
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/RentalAddition'
      tags:
        - Rentals
  /groups-management:
    get:
      summary: GET /groups-management
      description: Returns all user groups managed by the authenticated user.
      operationId: getOwnedUserGroups
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/UserGroupAdminView'
      tags:
        - User Groups
    post:
      summary: POST /groups-management
      description: Create a new user group (business account).
      operationId: createUserGroup
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UserGroupCreateRequest'
        required: true
      responses:
        '201':
          description: Created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UserGroupAdminView'
      tags:
        - User Groups
  '/groups-management/{userGroupId}':
    get:
      summary: 'GET /groups-management/{userGroupId}'
      description: Retrieve the details of a specific user group by its ID. Only accessible by the group owner or admin.
      operationId: getUserGroupById
      parameters:
        - name: userGroupId
          in: path
          required: true
          schema:
            type: integer
            format: int64
          description: The unique identifier of the user group
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UserGroupAdminView'
      tags:
        - User Groups
    delete:
      summary: 'DELETE /groups-management/{userGroupId}'
      description: Delete a user group by its ID. Only accessible by the group owner.
      operationId: deleteUserGroupById
      parameters:
        - name: userGroupId
          in: path
          required: true
          schema:
            type: integer
            format: int64
          description: The unique identifier of the user group
      responses:
        '204':
          description: No Content
      tags:
        - User Groups
    patch:
      summary: 'PATCH /groups-management/{userGroupId}'
      operationId: updateUserGroup
      parameters:
        - name: userGroupId
          in: path
          required: true
          schema:
            type: integer
            format: int64
          description: The unique identifier of the user group
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UserGroupUpdate'
            examples:
              Example 1:
                value:
                  name: IT Department
                  street: Praterstrasse 2
                  postcode: '1020'
                  city: Vienna
                  country: Austria
                  vatNumber: VAT12345
                  billingPeriod: NONE
                  checkRentalRequirements: true
        required: true
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UserGroupAdminView'
        '404':
          description: Not Found - User group does not exist or current user is not the owner of the user group
      tags:
        - User Groups
      description: Update a user group
  '/groups-management/{userGroupId}/add-members':
    post:
      summary: 'POST /groups-management/{userGroupId}/add-members'
      description: Invite users to join a user group by creating join requests on their behalf.
      operationId: addUserToGroup
      parameters:
        - name: userGroupId
          in: path
          required: true
          schema:
            type: integer
            format: int64
          description: The unique identifier of the user group
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AddMembers'
        required: true
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/GUserGroupRequest'
      tags:
        - User Groups
  '/groups-management/{userGroupId}/members':
    get:
      summary: 'GET /groups-management/{userGroupId}/members'
      description: Retrieve the list of all members in a user group.
      operationId: getMemberListByUserGroupId
      parameters:
        - name: userGroupId
          in: path
          required: true
          schema:
            type: integer
            format: int64
          description: The unique identifier of the user group
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/UserGroupMember'
      tags:
        - User Groups
  '/groups-management/{userGroupId}/members/{userId}':
    get:
      summary: 'GET /groups-management/{userGroupId}/members/{userId}'
      description: View the membership details of a specific user within a user group.
      operationId: viewMembershipProperty
      parameters:
        - name: userGroupId
          in: path
          required: true
          schema:
            type: integer
            format: int64
          description: The unique identifier of the user group
        - name: userId
          in: path
          required: true
          schema:
            type: integer
            format: int64
          description: The unique identifier of the user
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UserGroupMember'
        '403':
          description: Forbidden - Current user is not the owner of the user group and cannot view membership details
        '404':
          description: Not Found - User group does not exist or user is not a member of the user group
      tags:
        - User Groups
    patch:
      summary: 'PATCH /groups-management/{userGroupId}/members/{userId}'
      description: Update the membership properties (e.g., role, permissions) of a user within a user group.
      operationId: updateMembershipProperty
      parameters:
        - name: userGroupId
          in: path
          required: true
          schema:
            type: integer
            format: int64
          description: The unique identifier of the user group
        - name: userId
          in: path
          required: true
          schema:
            type: integer
            format: int64
          description: The unique identifier of the user
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UserGroupMemberUpdate'
        required: true
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UserGroupMember'
        '403':
          description: Forbidden - Current user is not the owner of the user group and cannot make changes
        '404':
          description: Not Found - User group does not exist or user is not a member of the user group
      tags:
        - User Groups
    put:
      summary: 'PUT /groups-management/{userGroupId}/members/{userId}'
      description: Fully replace the membership properties of a user within a user group.
      operationId: updateGroupMembershipFull
      parameters:
        - name: userGroupId
          in: path
          required: true
          schema:
            type: integer
            format: int64
          description: The unique identifier of the user group
        - name: userId
          in: path
          required: true
          schema:
            type: integer
            format: int64
          description: The unique identifier of the user
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UserGroupMemberUpdateFull'
        required: true
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UserGroupMember'
        '403':
          description: Forbidden - Current user is not the owner of the user group and cannot make changes
        '404':
          description: Not Found - User group does not exist or user is not a member of the user group
      tags:
        - User Groups
  '/groups-management/{userGroupId}/requests':
    get:
      summary: 'GET /groups-management/{userGroupId}/requests'
      description: Retrieve all open join requests and invitations for a specific user group.
      operationId: getUserGroupRequestsByGroupId
      parameters:
        - name: userGroupId
          in: path
          required: true
          schema:
            type: integer
            format: int64
          description: The unique identifier of the user group
        - name: searchText
          in: query
          required: false
          schema:
            type: string
          description: Search text to filter requests by user name or email
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/GUserGroupRequest'
      tags:
        - User Groups
  '/groups-management/{userGroupId}/requests/{requestId}':
    patch:
      summary: 'PATCH /groups-management/{userGroupId}/requests/{requestId}'
      description: Accept or decline a join request for a specific user group.
      operationId: updateRequestByGroup
      parameters:
        - name: userGroupId
          in: path
          required: true
          schema:
            type: integer
            format: int64
          description: The unique identifier of the user group
        - name: requestId
          in: path
          required: true
          schema:
            type: integer
            format: int64
          description: The unique identifier of the request
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/GUserGroupRequest'
        required: true
      responses:
        '201':
          description: Created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GUserGroupRequest'
      tags:
        - User Groups
  '/groups-management/{userGroupId}/{memberCode}':
    patch:
      summary: 'PATCH /groups-management/{userGroupId}/{memberCode}'
      description: Update a member's properties in a user group using their referral code.
      operationId: updateMemberOfGroup
      parameters:
        - name: userGroupId
          in: path
          required: true
          schema:
            type: integer
            format: int64
          description: The unique identifier of the user group
        - name: memberCode
          in: path
          required: true
          schema:
            type: string
          description: The member code in the group
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UserGroupMember'
        required: true
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UserGroupMember'
      tags:
        - User Groups
  '/groups-management/{userGroupId}/billing-summary':
    get:
      summary: 'GET /groups-management/{userGroupId}/billing-summary'
      description: Retrieve the billing summary for a user group, including total costs and usage statistics.
      operationId: showUserGroupBillingSummary
      parameters:
        - name: userGroupId
          in: path
          required: true
          schema:
            type: integer
            format: int64
          description: The unique identifier of the user group
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BillingSummary'
      tags:
        - User Groups
  /onesignal/session:
    post:
      summary: POST /onesignal/session
      description: Record a new OneSignal push notification session upon app login.
      operationId: newSession
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/OneSignalSubscription'
        required: true
      responses:
        '201':
          description: Created
      tags:
        - OneSignal
  /branches:
    get:
      summary: GET /branches
      description: Retrieve all branches. Optionally filter to only branches that support booking.
      operationId: findAll
      parameters:
        - name: bookingAvailable
          in: query
          required: false
          schema:
            type: boolean
            default: false
          description: When true, only return branches that support booking
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Branch'
      tags:
        - Branches
  /branches/ids:
    get:
      summary: GET /branches/ids
      description: Retrieve the IDs of all available branches.
      operationId: findAllIds
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  type: integer
                  format: int64
      tags:
        - Branches
  /branches/resolve:
    get:
      summary: GET /branches/resolve
      description: Resolve the billable branches of the closest branches sorted by distance from the user's location, with fallback behavior.
      operationId: getBillableBranchesOfClosestBranchesSortedByDistanceOrFallback
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BranchResolverResult'
      tags:
        - Branches
  '/branches/{id}':
    get:
      summary: 'GET /branches/{id}'
      description: Retrieve a specific branch by its ID.
      operationId: findBranchesById
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: integer
            format: int64
          description: The unique identifier of the resource
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Branch'
      tags:
        - Branches
  '/branches/{id}/intersectable':
    get:
      summary: 'GET /branches/{id}/intersectable'
      description: >-
        Returns branches that intersect with the given branch. The response includes
        minimal branch data (id, name) along with the branch address.
      operationId: getIntersectableBranches
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: integer
            format: int64
          description: The unique identifier of the resource
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  properties:
                    id:
                      type: integer
                      format: int64
                    name:
                      type: string
                    contactInfo:
                      type: object
                      properties:
                        address:
                          $ref: '#/components/schemas/AddressInfo'
      tags:
        - Branches
  /invoices:
    get:
      summary: GET /invoices
      description: Retrieve all invoices for the authenticated user. Optionally filter by user group or payment status.
      operationId: findAllInvoices
      parameters:
        - name: invoicedOnly
          in: query
          required: false
          schema:
            type: boolean
          description: 'Return only invoices that have been properly invoiced, i.e., are final and have been sent to the customer.'
        - name: userGroupId
          in: query
          required: false
          schema:
            type: integer
            format: int64
          description: Filter invoices by user group (business account)
        - name: unpaid
          in: query
          required: false
          schema:
            type: boolean
          description: When true, only return unpaid invoices
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Invoice'
      tags:
        - Invoices
  /invoices/retry:
    post:
      summary: POST /invoices/retry
      description: Retry payment for one or more unpaid invoices of the authenticated user. If invoiceIds is omitted, all retryable unpaid invoices are retried.
      operationId: retryInvoicePayment
      parameters:
        - name: invoiceIds
          in: query
          required: false
          schema:
            type: array
            items:
              type: integer
              format: int64
          description: Optional list of invoice IDs to retry. When omitted, all retryable unpaid invoices are retried.
      responses:
        '204':
          description: No Content
        '400':
          description: Retry was not possible for one or more invoices.
      tags:
        - Invoices
  '/invoices/{invoiceId}/download':
    get:
      summary: 'GET /invoices/{invoiceId}/download'
      description: Download an invoice document. Returns a URL to the invoice PDF.
      operationId: downloadInvoice
      parameters:
        - name: invoiceId
          in: path
          required: true
          schema:
            type: integer
            format: int64
          description: The unique identifier of the invoice
        - name: userGroupId
          in: query
          required: false
          schema:
            type: integer
            format: int64
          description: User group ID for downloading business account invoices
      responses:
        '200':
          description: OK
          content:
            '*/*':
              schema:
                type: string
                format: url
      tags:
        - Invoices
  /pricing-bundles/pricing-simulator:
    get:
      summary: GET /pricing-bundles/pricing-simulator
      description: Simulate a price calculation using a specific pricing bundle for the given time range and parameters.
      operationId: simulatePriceByPricingBundle
      parameters:
        - name: pricingBundleId
          in: query
          required: true
          schema:
            type: integer
            format: int64
          description: Identifier of the pricing bundle to simulate
        - name: branchId
          in: query
          required: true
          schema:
            type: integer
            format: int64
          description: Identifier of the branch for the simulation
        - name: startTime
          in: query
          required: true
          schema:
            type: string
            format: date-time
          description: Start time of the simulated rental period
        - name: endTime
          in: query
          required: true
          schema:
            type: string
            format: date-time
          description: End time of the simulated rental period
        - name: additions
          in: query
          required: false
          schema:
            type: array
            items:
              type: string
          description: List of rental addition codes to include in the simulation
        - name: vehicleCategoryId
          in: query
          required: false
          schema:
            type: integer
            format: int64
          description: Vehicle category for the simulation
        - name: pricingBundleVersionId
          in: query
          required: false
          schema:
            type: integer
            format: int64
          description: Specific pricing bundle version to use for the simulation
        - name: entitledAdditions
          in: query
          required: false
          schema:
            type: array
            items:
              type: string
          description: List of entitled addition codes the user has access to
        - name: guserId
          in: query
          required: false
          schema:
            type: integer
            format: int64
          description: User ID for user-specific pricing
        - name: userGroupId
          in: query
          required: false
          schema:
            type: integer
            format: int64
          description: User group ID for group-specific pricing
        - name: distance
          in: query
          required: false
          schema:
            type: number
            format: double
          description: Expected distance in kilometers for distance-based pricing
        - name: bookingId
          in: query
          required: false
          schema:
            type: integer
            format: int64
          description: Booking ID for booking-specific pricing calculations
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PricingBundlePrice'
      tags:
        - Pricing Bundle Pricing Simulator
  /pricing-bundles/pricing-calculator:
    get:
      summary: GET /pricing-bundles/pricing-calculator
      operationId: calculatePriceByPricingBundleOrAssignment
      description: 'Station based price calculation. Either vehicleCategoryId or pricingBundleId must be provided.'
      parameters:
        - name: branchId
          in: query
          required: true
          schema:
            type: integer
            format: int64
          description: Identifier of the branch for the calculation
        - name: vehicleCategoryId
          in: query
          required: false
          schema:
            type: integer
            format: int64
          description: Vehicle category ID. Either this or pricingBundleId must be provided
        - name: pricingBundleId
          in: query
          required: false
          schema:
            type: integer
            format: int64
          description: Pricing bundle ID. Either this or vehicleCategoryId must be provided
        - name: pricingBundleVersionId
          in: query
          required: false
          schema:
            type: integer
            format: int64
          description: Specific pricing bundle version to use for the calculation
        - name: startTime
          in: query
          required: true
          schema:
            type: string
            format: date-time
          description: Start time of the rental period
        - name: endTime
          in: query
          required: true
          schema:
            type: string
            format: date-time
          description: End time of the rental period
        - name: additions
          in: query
          required: false
          schema:
            type: array
            items:
              type: string
          description: List of rental addition codes to include in the calculation
        - name: entitledAdditions
          in: query
          required: false
          schema:
            type: array
            items:
              type: string
          description: List of entitled addition codes the user has access to
        - name: guserId
          in: query
          required: false
          schema:
            type: integer
            format: int64
          description: User ID for user-specific pricing
        - name: userGroupId
          in: query
          required: false
          schema:
            type: integer
            format: int64
          description: User group ID for group-specific pricing
        - name: distance
          in: query
          required: false
          schema:
            type: number
            format: double
          description: Expected distance in kilometers for distance-based pricing
        - name: bookingId
          in: query
          required: false
          schema:
            type: integer
            format: int64
          description: Booking ID for booking-specific pricing calculations
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PriceV3'
      tags:
        - Pricing
  /rentals/requirements:
    get:
      summary: GET /rentals/requirements
      description: Returns rental requirements that must be satisfied to book a vehicle.
      operationId: findAllRentalRequirements
      parameters:
        - name: vehicleCategoryId
          in: query
          required: false
          schema:
            type: integer
            format: int64
          description: Filter requirements by vehicle category
        - name: branchId
          in: query
          required: false
          schema:
            type: integer
            format: int64
          description: Filter requirements by branch
        - name: userGroupId
          in: query
          required: false
          schema:
            type: integer
            format: int64
          description: Filter requirements by user group
        - name: userGroupCode
          in: query
          required: false
          schema:
            type: string
          description: Filter requirements by user group referral code
        - name: bookingStartTime
          in: query
          required: false
          schema:
            type: string
            format: date-time
          description: Start time of the booking period for time-specific requirements
        - name: bookingEndTime
          in: query
          required: false
          schema:
            type: string
            format: date-time
          description: End time of the booking period for time-specific requirements
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/GUserRentalRequirement'
      tags:
        - Rentals
  '/rentals/{rentalId}/check/end':
    post:
      summary: 'POST /rentals/{rentalId}/check/end'
      description: Run rental end checks to verify that all conditions are met before ending the rental (e.g., vehicle is in allowed zone, fuel level is sufficient).
      operationId: checkRentalEndChecks
      parameters:
        - name: rentalId
          in: path
          required: true
          schema:
            type: integer
            format: int64
          description: The unique identifier of the rental
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RentalEndCheckResult'
      tags:
        - Rentals
  '/rentals/{rentalId}/parking-reservation':
    put:
      summary: 'PUT /rentals/{rentalId}/parking-reservation'
      operationId: reserveParkingStation
      description: 'Reserve, switch, or cancel a parking reservation'
      parameters:
        - name: rentalId
          in: path
          required: true
          schema:
            type: integer
            format: int64
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                stationId:
                  type: integer
                  format: int64
                  nullable: true
                  description: 'Station ID to reserve. Null means cancel the current reservation.'
        required: true
      responses:
        '204':
          description: No Content
        '400':
          description: 'Bad Request - invalid state, station full, or no parking area'
        '404':
          description: Rental or station not found
        '409':
          description: Rental is currently being processed by another operation (e.g. end-rental). Retry the request.
      tags:
        - Rentals
  /payment:
    get:
      summary: GET /payment
      description: Retrieve payment sources for the authenticated user.
      operationId: getPaymentSources
      parameters:
        - name: userGroupId
          in: query
          required: false
          schema:
            type: integer
            format: int64
          description: User group ID for business account payment sources
        - name: branchId
          in: query
          required: false
          schema:
            type: integer
            format: int64
          description: Branch ID for branch-specific payment configuration
        - name: state
          in: query
          required: false
          schema:
            type: array
            items:
              type: string
              enum:
                - ACTIVE
                - PENDING
                - FAILED
                - ACTION_NEEDED
                - CANCELLED
            default: ACTIVE
          description: Filter payment sources by state. Defaults to ACTIVE.
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/PaymentSource'
      tags:
        - Payment
    put:
      summary: PUT /payment
      description: Change the default payment source for the authenticated user.
      operationId: changeDefaultPaymentSource
      parameters:
        - name: userGroupId
          in: query
          required: false
          schema:
            type: integer
            format: int64
          description: User group ID for business account payment management
        - name: branchId
          in: query
          required: false
          schema:
            type: integer
            format: int64
          description: Branch ID for branch-specific payment configuration
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ChangeSource'
        required: true
      responses:
        '204':
          description: No Content
      tags:
        - Payment
    delete:
      summary: DELETE /payment
      description: Delete a payment source from the authenticated user's account.
      operationId: deletePaymentSource
      parameters:
        - name: userGroupId
          in: query
          required: false
          schema:
            type: integer
            format: int64
          description: User group ID for business account payment management
        - name: branchId
          in: query
          required: false
          schema:
            type: integer
            format: int64
          description: Branch ID for branch-specific payment configuration
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ChangeSource'
        required: true
      responses:
        '204':
          description: No Content
      tags:
        - Payment
  /payment/applepay:
    post:
      summary: POST /payment/applepay
      description: Add Apple Pay as a payment source.
      operationId: addApplePay
      parameters:
        - name: userGroupId
          in: query
          required: false
          schema:
            type: integer
            format: int64
          description: User group ID for business account payment management
        - name: branchId
          in: query
          required: false
          schema:
            type: integer
            format: int64
          description: Branch ID for branch-specific payment configuration
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AddTokenBasedPaymentMethod'
        required: true
      responses:
        '204':
          description: No Content
      tags:
        - Payment
  /payment/cc:
    get:
      summary: GET /payment/cc
      description: Retrieve the configuration required to set up credit card payment (e.g., client token for payment provider SDK).
      operationId: preAddCC
      parameters:
        - name: userGroupId
          in: query
          required: false
          schema:
            type: integer
            format: int64
          description: User group ID for business account payment management
        - name: branchId
          in: query
          required: false
          schema:
            type: integer
            format: int64
          description: Branch ID for branch-specific payment configuration
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: object
                additionalProperties: true
      tags:
        - Payment
    post:
      summary: POST /payment/cc
      description: Add a credit card as a payment source. May return a 3DS authentication challenge if additional verification is required.
      operationId: addCC
      parameters:
        - name: userGroupId
          in: query
          required: false
          schema:
            type: integer
            format: int64
          description: User group ID for business account payment management
        - name: branchId
          in: query
          required: false
          schema:
            type: integer
            format: int64
          description: Branch ID for branch-specific payment configuration
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AddTokenBasedPaymentMethod'
        required: true
      responses:
        '200':
          description: 3DS authentication required - returns payload with redirect info
          content:
            application/json:
              schema:
                type: object
                additionalProperties: true
        '204':
          description: Payment method added successfully
      tags:
        - Payment
  /payment/googlepay:
    post:
      summary: POST /payment/googlepay
      description: Add Google Pay as a payment source.
      operationId: addGooglePay
      parameters:
        - name: userGroupId
          in: query
          required: false
          schema:
            type: integer
            format: int64
          description: User group ID for business account payment management
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AddTokenBasedPaymentMethod'
        required: true
      responses:
        '204':
          description: No Content
      tags:
        - Payment
  /payment/paypal:
    post:
      summary: POST /payment/paypal
      description: Initiate adding PayPal as a payment source. Returns the information needed to complete the PayPal authorization flow.
      operationId: addPayPal
      parameters:
        - name: userGroupId
          in: query
          required: false
          schema:
            type: integer
            format: int64
          description: User group ID for business account payment management
        - name: branchId
          in: query
          required: false
          schema:
            type: integer
            format: int64
          description: Branch ID for branch-specific payment configuration
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: object
                additionalProperties: true
      tags:
        - Payment
  /vouchers:
    get:
      summary: GET /vouchers
      description: Returns all available vouchers.
      operationId: getActiveConstraintVouchersOnBranch
      parameters:
        - name: branchId
          in: query
          required: false
          schema:
            type: integer
            format: int64
          description: Filter vouchers by branch
        - name: types
          in: query
          required: false
          schema:
            type: array
            items:
              type: string
              enum:
                - SIGNUP
                - PACKAGE
                - REFERRAL
                - PROMOTION
                - BY_ADMIN
                - UNKNOWN
                - SETTLEMENT
                - TOP_UP
                - CORRECTION
                - SUBSCRIPTION
                - REWARD
                - SINGLE_USE
                - SETTLEMENT_EXTERNAL
                - TRIGGERED
                - CUSTOMER_CARE
                - COLLECTION_INVOICE
          description: Filter vouchers by one or more voucher types
        - name: active
          in: query
          required: false
          schema:
            type: boolean
          description: When set together with branchId, returns only active constraint vouchers for the branch.
        - name: constraint
          in: query
          required: false
          schema:
            type: boolean
          description: When true, return only constraint-type vouchers
        - name: voucherType
          in: query
          required: false
          schema:
            type: string
          description: Filter vouchers by voucher type
        - name: page
          in: query
          required: false
          schema:
            type: integer
            format: int32
          description: Page number for pagination (zero-based)
        - name: size
          in: query
          required: false
          schema:
            type: integer
            format: int32
          description: Number of items per page
        - name: sort
          in: query
          required: false
          schema:
            type: array
            items:
              type: string
          description: Sorting criteria
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/ConstraintVoucher'
      tags:
        - Vouchers
  /vouchers/redeem:
    post:
      summary: POST /vouchers/redeem
      description: >-
        Redeems a voucher for the authenticated user. Returns only the first created voucher.
        Deprecated — use /vouchers/redeem-code instead, which returns all created vouchers.
      operationId: redeemVoucher
      deprecated: true
      parameters:
        - name: code
          in: query
          required: true
          schema:
            type: string
          description: The voucher code to redeem
        - name: branch
          in: query
          required: false
          schema:
            type: integer
            format: int64
          description: Branch ID to redeem the voucher on
        - name: extRef
          in: query
          required: false
          schema:
            type: string
          description: External reference for the voucher redemption
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Voucher'
      tags:
        - Vouchers
  /vouchers/redeem-code:
    post:
      summary: POST /vouchers/redeem-code
      description: >-
        Redeems a voucher code for the authenticated user. Returns all vouchers created
        from the redeemed voucherable's benefits. A single voucherable may produce multiple
        vouchers when it has multiple benefits configured (e.g., a value credit and free unlocks).
      operationId: redeemCode
      parameters:
        - name: code
          in: query
          required: true
          schema:
            type: string
          description: The voucher code to redeem
        - name: branch
          in: query
          required: false
          schema:
            type: integer
            format: int64
          description: Branch ID to redeem the voucher on
        - name: extRef
          in: query
          required: false
          schema:
            type: string
          description: External reference for the voucher redemption
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Voucher'
      tags:
        - Vouchers
  /resources/messages:
    get:
      summary: GET /resources/messages
      description: Retrieve all non-empty message resources translated for the specified locale.
      operationId: getNonEmptyMessageResources
      parameters:
        - name: locale
          in: query
          required: true
          schema:
            $ref: '#/components/schemas/Locale'
          description: The locale to retrieve translated messages for (e.g., en, de, fr)
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: object
                additionalProperties:
                  $ref: '#/components/schemas/MessageResource'
      tags:
        - Messages
  /resources/messages/languages:
    get:
      summary: GET /resources/messages/languages
      description: Retrieve all available languages for message resources.
      operationId: getLocales
      responses:
        '200':
          description: OK
          content:
            '*/*':
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Locale'
      tags:
        - Messages
  /tutorials:
    get:
      summary: GET /tutorials
      description: Retrieve all active tutorials with pagination support.
      operationId: findAllTutorials
      parameters:
        - name: page
          in: query
          required: false
          schema:
            type: integer
            default: 0
          description: Page number for pagination (zero-based)
        - name: size
          in: query
          required: false
          schema:
            type: integer
            default: 20
          description: Number of items per page
        - name: sort
          in: query
          required: false
          schema:
            type: string
          description: 'Sort criteria (e.g., id,asc). Default: id,asc'
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Tutorial'
      tags:
        - Tutorials
  /vehicles:
    get:
      summary: GET /vehicles
      description: Returns a list of available vehicles for the provided parameters. Supports filtering by location, branch, category, and battery level.
      operationId: getAvailableVehicles
      parameters:
        - name: branchId
          in: query
          required: false
          description: Filter vehicles by branch ID. If not provided, returns vehicles from all accessible branches.
          schema:
            type: integer
            format: int64
        - name: lat
          in: query
          required: false
          description: Latitude of the search center point. Must be provided together with lng and rad.
          schema:
            type: number
            format: double
        - name: lng
          in: query
          required: false
          description: Longitude of the search center point. Must be provided together with lat and rad.
          schema:
            type: number
            format: double
        - name: rad
          in: query
          required: false
          description: Search radius in miles from the center point (lat/lng). Must be provided together with lat and lng.
          schema:
            type: number
            format: double
        - name: categoryId
          in: query
          required: false
          description: Filter vehicles by one or more vehicle category IDs.
          schema:
            type: array
            items:
              type: integer
              format: int64
        - name: excludeStationedVehicles
          in: query
          required: false
          description: When true, excludes vehicles that are currently located in physical station slots.
          schema:
            type: boolean
            default: false
        - name: minStateOfCharge
          in: query
          required: false
          description: Minimum state of charge percentage (0-100) to filter vehicles. Only vehicles with battery level at or above this threshold are returned.
          schema:
            type: integer
            format: int32
            minimum: 0
            maximum: 100
        - name: maxStateOfCharge
          in: query
          required: false
          description: Maximum state of charge percentage (0-100) to filter vehicles. Only vehicles with battery level at or below this threshold are returned.
          schema:
            type: integer
            format: int32
            minimum: 0
            maximum: 100
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/VehicleList'
      tags:
        - Vehicles
  '/vehicles/{id}':
    get:
      summary: 'GET /vehicles/{id}'
      description: Retrieve the details of a specific vehicle by its ID.
      operationId: findVehiclesById
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: integer
            format: int64
          description: The unique identifier of the resource
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Vehicle'
      tags:
        - Vehicles
  '/vehicles/code/{code}':
    get:
      summary: 'GET /vehicles/code/{code}'
      description: Retrieve a vehicle by its QR/short code.
      operationId: findVehiclesByCode
      parameters:
        - name: code
          in: path
          required: true
          schema:
            type: string
          description: The code identifying the resource
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Vehicle'
      tags:
        - Vehicles
  '/vehicles/{id}/bluetooth/generate-tokens':
    post:
      summary: 'POST /vehicles/{id}/bluetooth/generate-tokens'
      description: 'Generate multiple bluetooth tokens for a vehicle'
      operationId: generateBluetoothTokens
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: integer
            format: int64
          description: The unique identifier of the resource
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/GenerateBluetoothTokenRequest'
        required: true
      responses:
        '201':
          description: Created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BluetoothTokenWrapper'
      tags:
        - Vehicles
  '/vehicles/{id}/damages':
    get:
      summary: 'GET /vehicles/{id}/damages'
      description: Retrieve all reported damages for a specific vehicle.
      operationId: getVehicleDamages
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: integer
            format: int64
          description: The unique identifier of the resource
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/DamageResponse'
      tags:
        - Vehicles
        - Damages
    post:
      summary: 'POST /vehicles/{id}/damages'
      description: Submit a new damage report for a vehicle, including damage location and optional images.
      operationId: submitVehicleDamage
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: integer
            format: int64
          description: The unique identifier of the resource
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/DamageSubmitRequest'
        required: true
      responses:
        '201':
          description: Created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DamageResponse'
      tags:
        - Vehicles
        - Damages
  '/vehicles/{id}/locate':
    post:
      summary: 'POST /vehicles/{id}/locate'
      description: Trigger a locate command on the vehicle (e.g., flash lights or honk horn) to help the user find it.
      operationId: locateById
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: integer
            format: int64
          description: The unique identifier of the resource
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Vehicle'
      tags:
        - Vehicles
  /bookings:
    post:
      summary: POST /bookings
      description: Create a new booking for a vehicle in a specified time range.
      operationId: createBooking
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AddBooking'
        required: true
      responses:
        '201':
          description: Created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Booking'
      tags:
        - Bookings
    get:
      summary: GET /bookings
      operationId: listBookings
      description: List all bookings matching the criteria.
      responses:
        '200':
          description: Returns all matching bookings
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/ListBooking'
      tags:
        - Bookings
      parameters:
        - schema:
            type: string
            enum:
              - UPCOMING
              - ACTIVE
              - PAST
              - CANCELED
            example: UPCOMING
          in: query
          name: view
          description: |
            Defines an optional pre-defined view on the bookings.

            * UPCOMING: returns all upcoming bookings that are started in the future
            * ACTIVE: returns all bookings which are currently active
            * PAST: returns all bookings from the past
            * CANCELED: returns all canceled bookings
  /bookings/active:
    get:
      summary: GET /bookings/active
      description: Retrieve all upcoming or currently active bookings for the authenticated user.
      operationId: getUpcomingOrActiveBookings
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Booking'
      tags:
        - Bookings
  /bookings/availability:
    get:
      summary: GET /bookings/availability
      description: Retrieve booking availability per day within the given date range, showing which vehicle categories have available vehicles.
      operationId: getBookingAvailability
      parameters:
        - name: branchId
          in: query
          required: false
          schema:
            type: integer
            format: int64
          description: Identifier of the branch to check availability for
        - name: startDate
          in: query
          required: true
          schema:
            type: string
            format: date-time
          description: Start date and time of the availability search range
        - name: endDate
          in: query
          required: true
          schema:
            type: string
            format: date-time
          description: End date and time of the availability search range
        - name: excludePastAvailability
          in: query
          required: false
          schema:
            type: boolean
            default: true
          description: When true (default), excludes availability for past dates
        - name: excludeBookingId
          in: query
          required: false
          schema:
            type: integer
            format: int64
          description: Exclude a specific booking from availability calculations (useful when editing an existing booking)
        - name: 'vehicleAttributes[ANY]'
          in: query
          required: false
          schema:
            type: array
            items:
              type: integer
              format: int64
          description: The vehicle attributes where any in the list have to match a given vehicle category.
        - name: 'vehicleAttributes[ALL]'
          in: query
          required: false
          schema:
            type: array
            items:
              type: integer
              format: int64
          description: The vehicle attributes where all in the list have to match a given vehicle category.
        - name: 'vehicleAttributes[ONE]'
          in: query
          required: false
          schema:
            type: array
            items:
              type: integer
              format: int64
          description: The vehicle attributes where exactly one in a vehicle attribute group has to match a given vehicle category.
        - name: includeWithPricingOnly
          in: query
          required: false
          schema:
            type: boolean
            default: true
          description: When true, only include categories that have pricing configured
        - name: includeWithRentalRequirementsOnly
          in: query
          required: false
          schema:
            type: boolean
            default: true
          description: When true, only include categories that have rental requirements configured
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/BookingAvailabilityDay'
      tags:
        - Bookings
  /bookings/available-categories:
    get:
      summary: GET /bookings/available-categories
      description: Retrieve available vehicle categories with pricing for the given time frame and optional filters.
      operationId: getAvailableCategories
      parameters:
        - name: branchId
          in: query
          required: false
          schema:
            type: integer
            format: int64
          description: Identifier of the branch to search for available categories
        - name: lat
          in: query
          required: false
          schema:
            type: number
            format: double
          description: Latitude for location-based branch resolution
        - name: lng
          in: query
          required: false
          schema:
            type: number
            format: double
          description: Longitude for location-based branch resolution
        - name: startTime
          in: query
          required: true
          schema:
            type: string
            format: date-time
          description: Start time of the booking period
        - name: endTime
          in: query
          required: true
          schema:
            type: string
            format: date-time
          description: End time of the booking period
        - name: excludeBookingId
          in: query
          required: false
          schema:
            type: integer
            format: int64
          description: Exclude a specific booking from availability calculations
        - name: 'vehicleAttributes[ANY]'
          in: query
          required: false
          schema:
            type: array
            items:
              type: integer
              format: int64
          description: The vehicle attributes where any in the list have to match a given vehicle category.
        - name: 'vehicleAttributes[ALL]'
          in: query
          required: false
          schema:
            type: array
            items:
              type: integer
              format: int64
          description: The vehicle attributes where all in the list have to match a given vehicle category.
        - name: 'vehicleAttributes[ONE]'
          in: query
          required: false
          schema:
            type: array
            items:
              type: integer
              format: int64
          description: The vehicle attributes where exactly one in a vehicle attribute group has to match a given vehicle category.
        - name: includeWithPricingOnly
          in: query
          required: false
          schema:
            type: boolean
            default: false
          description: When true, only include categories that have pricing configured
        - name: endBranchId
          in: query
          required: false
          schema:
            type: integer
            format: int64
          description: End branch for one-way bookings
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/CategoryWithPrice'
      tags:
        - Bookings
  /bookings/available-stations:
    get:
      summary: GET /bookings/available-stations
      operationId: getAvailableStations
      parameters:
        - name: startTime
          in: query
          schema:
            type: string
            format: date-time
          description: |-
            Start time and date of the intended booking.

            Required if `endTime` is set.
        - name: endTime
          in: query
          schema:
            type: string
            format: date-time
          description: |-
            End time and date of the intended booking.

            Required if `startTime` is set.
        - name: latMin
          in: query
          required: false
          schema:
            type: number
            format: double
          description: The minimum latitude (furthest south) of the search box for branches.
        - name: latMax
          in: query
          required: false
          schema:
            type: number
            format: double
          description: The maximum latitude (furthest north) of the search box for branches.
        - name: lngMin
          in: query
          required: false
          schema:
            type: number
            format: double
          description: The minimum longitude (furthest west) of the search box for branches.
        - name: lngMax
          in: query
          required: false
          schema:
            type: number
            format: double
          description: The maximum longitude (furthest east) of the search box for branches.
        - name: 'vehicleAttributes[ANY]'
          in: query
          required: false
          schema:
            type: array
            items:
              type: integer
              format: int64
          description: The vehicle attributes where any in the list have to match a given vehicle category.
        - name: 'vehicleAttributes[ALL]'
          in: query
          required: false
          schema:
            type: array
            items:
              type: integer
              format: int64
          description: The vehicle attributes where all in the list have to match a given vehicle category.
        - name: 'vehicleAttributes[ONE]'
          in: query
          required: false
          schema:
            type: array
            items:
              type: integer
              format: int64
          description: The vehicle attributes where exactly one in a vehicle attribute group has to match a given vehicle category.
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/StationBookingAvailability'
      tags:
        - Bookings
      description: |-
        Search for available stations (location branches) with available vehicles with the given filter criteria.

        This can be used to - for example - list all stations in the city of Vienna which have an electric vehicle available tomorrow from 08:00 until 14:00.

        This endpoint will return all stations that fit the geographic restrictions even if they do not have vehicles available, in this case the `availableCategories` of the corresponding branch will be empty.
    post:
      summary: POST /bookings/available-stations
      description: Search for stations with available vehicles for booking using advanced filter criteria including available timeslots.
      operationId: getAvailableStationsWithAvailableTimeslots
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/StationBookingAvailabilityRequest'
        required: true
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/StationBookingAvailability'
      tags:
        - Bookings
  /bookings/bookable-categories:
    get:
      summary: GET /bookings/bookable-categories
      description: Retrieve bookable vehicle categories for a specific branch and time range with pricing information.
      operationId: getBookableCategories
      parameters:
        - name: branchId
          in: query
          required: true
          schema:
            type: integer
            format: int64
          description: Identifier of the branch to check bookable categories for
        - name: startTime
          in: query
          required: true
          schema:
            type: string
            format: date-time
          description: Start time of the booking period
        - name: endTime
          in: query
          required: true
          schema:
            type: string
            format: date-time
          description: End time of the booking period
        - name: 'vehicleAttributes[ANY]'
          in: query
          required: false
          schema:
            type: array
            items:
              type: integer
              format: int64
          description: The vehicle attributes where any in the list have to match a given vehicle category.
        - name: 'vehicleAttributes[ALL]'
          in: query
          required: false
          schema:
            type: array
            items:
              type: integer
              format: int64
          description: The vehicle attributes where all in the list have to match a given vehicle category.
        - name: 'vehicleAttributes[ONE]'
          in: query
          required: false
          schema:
            type: array
            items:
              type: integer
              format: int64
          description: The vehicle attributes where exactly one in a vehicle attributes group has to match a given vehicle category.
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/CategoryWithPrice'
      tags:
        - Bookings
  '/bookings/user-group/{userGroupId}':
    get:
      summary: GET /bookings/user-group
      operationId: getUserGroupBookings
      parameters:
        - name: view
          in: query
          schema:
            type: string
            enum:
              - UPCOMING
              - ACTIVE
              - PAST
              - CANCELED
          description: |
            Defines an optional pre-defined view on the bookings.

            * UPCOMING: returns all upcoming bookings that are started in the future
            * ACTIVE: returns all bookings which are currently active
            * PAST: returns all bookings from the past
            * CANCELED: returns all canceled bookings
        - name: searchText
          in: query
          required: false
          schema:
            type: string
          description: Optional text to filter bookings by search criteria.
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/ListBooking'
        '403':
          description: The currently logged in user is not the owner of the user group that is provided.
        '404':
          description: Provided user group does not exist.
      tags:
        - Bookings
      description: |-
        Search for bookings that belong to a user group.

        Only the owner of the user group can retrieve the bookings for that group.
    parameters:
      - schema:
          type: integer
          format: int64
        name: userGroupId
        in: path
        required: true
        description: Id of the user group for which bookings are retrieved.
  '/bookings/{bookingId}':
    get:
      summary: 'GET /bookings/{bookingId}'
      description: Retrieve the details of a specific booking by its ID.
      operationId: getBookingById
      parameters:
        - name: bookingId
          in: path
          required: true
          schema:
            type: integer
            format: int64
          description: The unique identifier of the booking
        - name: userGroupId
          in: query
          required: false
          schema:
            type: integer
            format: int64
          description: 'Used to fetch a booking from business group by business owner. If an active user is not a business owner, then server will return the 403 Forbidden error.'
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Booking'
      tags:
        - Bookings
    post:
      summary: 'POST /bookings/{bookingId}'
      description: Pick up a previously created booking, transitioning it to an active rental.
      operationId: pickupBookingById
      parameters:
        - name: bookingId
          in: path
          required: true
          schema:
            type: integer
            format: int64
          description: The unique identifier of the booking
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Booking'
      tags:
        - Bookings
    delete:
      summary: 'DELETE /bookings/{bookingId}'
      description: Cancel an existing booking.
      operationId: cancelBooking
      parameters:
        - name: bookingId
          in: path
          required: true
          schema:
            type: integer
            format: int64
          description: The unique identifier of the booking
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Booking'
      tags:
        - Bookings
    patch:
      summary: 'PATCH /bookings/{bookingId}'
      description: Update an existing booking (e.g., change the time range or vehicle category).
      operationId: updateBookingById
      parameters:
        - name: bookingId
          in: path
          required: true
          schema:
            type: integer
            format: int64
          description: The unique identifier of the booking
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/BookingUpdateRequest'
        required: true
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Booking'
      tags:
        - Bookings
  '/bookings/{bookingId}/check-in':
    post:
      summary: 'POST /bookings/{bookingId}/check-in'
      description: Check in for a booking, confirming the user's presence at the pickup location.
      operationId: checkInForBooking
      parameters:
        - name: bookingId
          in: path
          required: true
          schema:
            type: integer
            format: int64
          description: The unique identifier of the booking
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Booking'
      tags:
        - Bookings
  '/bookings/{bookingId}/estimate-extension':
    parameters:
      - schema:
          type: number
        name: bookingId
        in: path
        required: true
        description: Id of the booking to be prolonged
    get:
      summary: GET /bookings/{bookingId}/estimate-extension
      operationId: estimateBookingExtension
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BookingPrice'
      tags:
        - Bookings
      parameters:
        - schema:
            type: string
            format: date-time
          in: query
          name: endTime
          required: false
          description: New end-time for the rental. If not provided, defaults to maximum possible extension.
      description: Estimate the price for extending a booking to a new end time. If no end time is provided, estimates the maximum possible extension.
  '/bookings/{bookingId}/extendable':
    parameters:
      - schema:
          type: number
        name: bookingId
        in: path
        required: true
        description: Id of the booking to be checked
    get:
      summary: GET /bookings/{bookingId}/extendable
      operationId: checkIfBookingIsExtendable
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  extendable:
                    type: boolean
                  extendableUpToTime:
                    type: string
                    format: date-time
      tags:
        - Bookings
      parameters:
        - schema:
            type: string
            format: date-time
          in: query
          name: endDate
          description: 'New end-time for the rental. If not set, it will check and give the max possible extension.'
      description: Check if the given booking is extendable.
  /booking-price-calculator:
    get:
      summary: GET /booking-price-calculator
      description: Calculate the estimated price for a booking based on branch, vehicle category or pricing bundle, time range, and optional additions.
      operationId: calculateBookingPrice
      parameters:
        - name: branchId
          in: query
          required: true
          schema:
            type: integer
            format: int64
          description: Identifier of the branch for the price calculation
        - name: pricingBundleId
          description: 'If pricingBundleId is not provided, then vehicleCategoryId must be provided'
          in: query
          required: false
          schema:
            type: integer
            format: int64
        - name: vehicleCategoryId
          description: 'If vehicleCategoryId is not provided, then pricingBundleId must be provided'
          in: query
          required: false
          schema:
            type: integer
            format: int64
        - name: startTime
          in: query
          required: true
          schema:
            type: string
            format: date-time
          description: Start time of the booking period
        - name: endTime
          in: query
          required: true
          schema:
            type: string
            format: date-time
          description: End time of the booking period
        - name: additions
          in: query
          required: false
          schema:
            type: array
            items:
              type: string
          description: List of rental addition codes to include in the calculation
        - name: distance
          in: query
          required: false
          schema:
            type: number
            format: double
          description: Expected distance in kilometers for distance-based pricing
        - name: guserId
          in: query
          required: false
          schema:
            type: integer
            format: int64
          description: 'User ID parameter. Note: in the frontend API context, this parameter is ignored — the server uses the authenticated user''s ID instead.'
        - name: userGroupCode
          in: query
          required: false
          schema:
            type: string
          description: User group code for group-specific pricing calculations
        - name: bookingId
          in: query
          required: false
          schema:
            type: integer
            format: int64
          description: booking ID for booking-specific pricing calculations
        - name: pricingBundleVersionId
          in: query
          required: false
          schema:
            type: integer
            format: int64
          description: Specific pricing bundle version ID for price calculation
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BookingPrice'
      tags:
        - Bookings
  /userevents:
    post:
      summary: POST /userevents
      description: Logs a user app event for analytics tracking. User apps should post APP_* event types; other operational event types are generated by the backend.
      operationId: publish
      parameters:
        - name: Device-Position
          in: header
          required: false
          schema:
            type: string
            example: "52.520008;13.404954"
          description: Optional current user/device position as latitude and longitude separated by semicolon or space.
        - name: type
          in: query
          required: true
          schema:
            type: string
            enum:
              - APP_LOGIN
              - APP_SIGNUP
              - APP_LOGOUT
              - APP_CLOSE
              - APP_MAP_NAVIGATION
              - APP_VEHICLE_SELECTION
              - APP_START
              - APP_INACTIVATE
              - APP_ACTIVATE
              - APP_BT_ACTION
              - APP_BT_ACTION_FAIL
              - APP_BT_LOCK
              - APP_BT_UNLOCK
          description: The type of user event to log
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              additionalProperties: true
      responses:
        '204':
          description: No Content
      tags:
        - Events
  /customer-identity-cards:
    get:
      summary: GET /customer-identity-cards
      operationId: getOwnCustomerIdentityCards
      description: List all customer identity cards assigned to the current user
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/CustomerIdentityCardResponse'
      tags:
        - Customer Identity Cards
  /vehicle-cards:
    get:
      summary: GET /vehicle-cards
      operationId: getVehicleCardsForRental
      description: |-
        List all vehicle cards assigned to a vehicle of an active rental.

        Vehicle cards can only be listed for active rentals. If a rental already ended or has been cancelled, this endpoint will return a 403 Forbidden error.
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/VehicleCardResponse'
        '403':
          description: If the rental is not active anymore (for example if it ended or has been cancelled).
      tags:
        - Vehicle Cards
      parameters:
        - schema:
            type: integer
            format: int64
          in: query
          name: rentalId
          required: true
          description: Id of the rental to list cards for
  /verification/init:
    post:
      summary: initialize a verification session
      tags:
        - Verifications
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: object
                x-examples:
                  Example 1:
                    type: ONFIDO_SDK
                    data:
                      sdkToken: eyJhbGciOiJFUzUxMiJ9.eyJleHAiOjE2OTk2Mzg0MTEsInBheWxvYWQiOnsiYXBwIjoiOWEwNGQ4NjgtODZlYi00YTQ4LWE1NDgtZTJhMjRjYjU1NTM4IiwiY2xpZW50X3V1aWQiOiIxNmVlNzA3My0yNGQ5LTRhNTItYmMzZC04ZTk5YzQ4YTc2NjEiLCJpc19zYW5kYm94Ijp0cnVlLCJpc19zZWxmX3NlcnZpY2VfdHJpYWwiOnRydWUsImlzX3RyaWFsIjp0cnVlLCJzYXJkaW5lX3Nlc3Npb24iOiJlZjk3OWJkNi00MTc0LTRkYTYtOGNmMS1iZjZhNGQ1NjM1ZWUiLCJoYXNfdXNhZ2VfcGxhbiI6dHJ1ZX0sInV1aWQiOiJwbGF0Zm9ybV9zdGF0aWNfYXBpX3Rva2VuX3V1aWQiLCJ1cmxzIjp7ImRldGVjdF9kb2N1bWVudF91cmwiOiJodHRwczovL3Nkay5vbmZpZG8uY29tIiwic3luY191cmwiOiJodHRwczovL3N5bmMub25maWRvLmNvbSIsImhvc3RlZF9zZGtfdXJsIjoiaHR0cHM6Ly9pZC5vbmZpZG8uY29tIiwiYXV0aF91cmwiOiJodHRwczovL2FwaS5vbmZpZG8uY29tIiwib25maWRvX2FwaV91cmwiOiJodHRwczovL2FwaS5vbmZpZG8uY29tIiwidGVsZXBob255X3VybCI6Imh0dHBzOi8vYXBpLm9uZmlkby5jb20ifX0.MIGHAkIAsT-73DjGdGgmwFZBvYIad0WEAif4v2DCO9JzuAApKAw8g8xXjJkGGRtZb6Yi2VneW23T-gwQu5hAcMURSSwjEp4CQRcVsVEclQ4hsPIm9G60lK33TaHqzMS3DkV6GMpHdp1faL_6rjsShRVDqH5DH2koTwkgzAjsX163slqVBduhuoX7
                      workflowRunId: 1c8c647f-fe90-46c1-a0cd-f3d063bb550e
                      applicantId: 9a04d868-86eb-4a48-a548-e2a24cb55538
                      type: SDK
                properties:
                  type:
                    enum:
                      - VERIFF_SDK
                      - ONFIDO_SDK
                      - ONFIDO_WEB
                  data:
                    type: object
              examples:
                Example 1:
                  value:
                    type: ONFIDO_SDK
                    data:
                      sdkToken: eyJhbGciOiJFUzUxMiJ9.eyJleHAiOjE2OTk2Mzg0MTEsInBheWxvYWQiOnsiYXBwIjoiOWEwNGQ4NjgtODZlYi00YTQ4LWE1NDgtZTJhMjRjYjU1NTM4IiwiY2xpZW50X3V1aWQiOiIxNmVlNzA3My0yNGQ5LTRhNTItYmMzZC04ZTk5YzQ4YTc2NjEiLCJpc19zYW5kYm94Ijp0cnVlLCJpc19zZWxmX3NlcnZpY2VfdHJpYWwiOnRydWUsImlzX3RyaWFsIjp0cnVlLCJzYXJkaW5lX3Nlc3Npb24iOiJlZjk3OWJkNi00MTc0LTRkYTYtOGNmMS1iZjZhNGQ1NjM1ZWUiLCJoYXNfdXNhZ2VfcGxhbiI6dHJ1ZX0sInV1aWQiOiJwbGF0Zm9ybV9zdGF0aWNfYXBpX3Rva2VuX3V1aWQiLCJ1cmxzIjp7ImRldGVjdF9kb2N1bWVudF91cmwiOiJodHRwczovL3Nkay5vbmZpZG8uY29tIiwic3luY191cmwiOiJodHRwczovL3N5bmMub25maWRvLmNvbSIsImhvc3RlZF9zZGtfdXJsIjoiaHR0cHM6Ly9pZC5vbmZpZG8uY29tIiwiYXV0aF91cmwiOiJodHRwczovL2FwaS5vbmZpZG8uY29tIiwib25maWRvX2FwaV91cmwiOiJodHRwczovL2FwaS5vbmZpZG8uY29tIiwidGVsZXBob255X3VybCI6Imh0dHBzOi8vYXBpLm9uZmlkby5jb20ifX0.MIGHAkIAsT-73DjGdGgmwFZBvYIad0WEAif4v2DCO9JzuAApKAw8g8xXjJkGGRtZb6Yi2VneW23T-gwQu5hAcMURSSwjEp4CQRcVsVEclQ4hsPIm9G60lK33TaHqzMS3DkV6GMpHdp1faL_6rjsShRVDqH5DH2koTwkgzAjsX163slqVBduhuoX7
                      workflowRunId: 1c8c647f-fe90-46c1-a0cd-f3d063bb550e
                      applicantId: 9a04d868-86eb-4a48-a548-e2a24cb55538
                      type: SDK
      operationId: post-verifications-init
      description: |-
        Wunder supports [Veriff](https://www.veriff.com/) and [Onfido](https://onfido.com/) as external systems for driving license verification.

        # Developer Resources

        ## Onfido

        - [Onfido on GitHub](https://github.com/onfido)
        - [React Native SDK](https://github.com/onfido/react-native-sdk)
        - [Web SDK](https://documentation.onfido.com/sdk/web/)
        - [Android SDK](https://documentation.onfido.com/sdk/android/)
        - [iOS SDK](https://documentation.onfido.com/sdk/ios/)


        **Hints**  
        The Web SDK relevant part for the integration starts at [4. Import the library<br>](https://documentation.onfido.com/sdk/web/#no--4-import-the-library)

        The React Native SDK relevant part for the integration starts at [4. Adding the Onfido React Native SDK to your project](https://github.com/onfido/react-native-sdk#4-adding-the-onfido-react-native-sdk-to-your-project)

        ## Veriff

        - Client Side integrations - [https://developers.veriff.com/#integrations](https://developers.veriff.com/#integrations)
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/InitVerification'
  /vehicle-attributes:
    get:
      summary: GET /vehicle-attributes
      operationId: getVehicleAttributes
      description: List all vehicle attributes available for filtering
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/VehicleAttributeGroupResponse'
      tags:
        - Vehicle Attributes
  '/rentals/user-group/{userGroupId}':
    parameters:
      - schema:
          type: integer
          format: int64
        name: userGroupId
        in: path
        required: true
        description: ID of the User Group
    get:
      summary: 'GET /rentals/user-group/{userGroupId}'
      tags:
        - Rentals
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/RentalList'
          headers: { }
      operationId: get-rentals-user-group-userGroupId
      description: Get all rentals of the given userGroup
      parameters:
        - schema:
            type: string
          in: query
          name: searchText
          description: Free text search over user name and branch name.
        - schema:
            type: boolean
          in: query
          name: onDemand
          description: If `true` only return onDemand rentals (Rentals without booking). If `false` return only rentals with booking. If not set or `null` return both.
        - schema:
            type: string
          in: query
          name: predicates
          description: This endpoint supports the use of queryDSL predicates to further filter the results.
        - schema:
            type: number
          in: query
          name: page
          description: 'Pagination: Selected page of the result'
        - schema:
            type: number
          in: query
          name: size
          description: 'Pagination: Elements per page'
  /physical-stations:
    get:
      summary: GET /physical-stations
      operationId: getPhysicalStations
      description: Retrieve physical stations with optional text search, distance calculation, and pagination
      parameters:
        - name: searchText
          in: query
          required: false
          schema:
            type: string
          description: Text to search for in station name or address (case-insensitive). When omitted, all stations are returned.
        - name: lat
          in: query
          required: false
          schema:
            type: number
            format: double
          description: Latitude for distance calculation and sorting. Must be provided together with `lng`; ignored if `lng` is missing.
        - name: lng
          in: query
          required: false
          schema:
            type: number
            format: double
          description: Longitude for distance calculation and sorting. Must be provided together with `lat`; ignored if `lat` is missing.
        - name: page
          in: query
          required: false
          schema:
            type: integer
          description: 'Pagination: Page number (zero-based). When omitted, all results are returned in a single page.'
        - name: size
          in: query
          required: false
          schema:
            type: integer
          description: 'Pagination: Elements per page. When omitted, all results are returned in a single page.'
      responses:
        '200':
          description: A list of physical station details
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/PhysicalStationDetails'
      tags:
        - Physical Stations
  '/physical-stations/{id}':
    get:
      summary: 'GET /physical-stations/{id}'
      operationId: getPhysicalStationsById
      description: Retrieve a specific physical station by its ID
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
          description: The unique identifier of the resource
      responses:
        '200':
          description: Details of the requested physical station
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PhysicalStationDetails'
      tags:
        - Physical Stations
  /on-demand-pricing-options:
    get:
      summary: GET /on-demand-pricing-options
      tags:
        - On-demand pricing
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/OnDemandPricingOptionDetails'
      operationId: get-pricing-options
      description: |-
        Get all pricing options for a vehicle or a branch+category combination.
        Use one of: `vehicleId`, `vehicleCode`, or `branchId`+`categoryId`.
      parameters:
        - schema:
            type: integer
            format: int64
          in: query
          name: vehicleId
          description: Vehicle identifier
        - schema:
            type: string
          in: query
          name: vehicleCode
          description: Vehicle code
        - schema:
            type: integer
            format: int64
          in: query
          name: branchId
          description: Branch identifier (use together with categoryId)
        - schema:
            type: integer
            format: int64
          in: query
          name: categoryId
          description: Vehicle category identifier (use together with branchId)
components:
  schemas:
    Balance:
      type: object
      properties:
        id:
          type: integer
          format: int64
        value:
          type: number
        remainingVouchersGrossValue:
          type: number
        remainingMinutesValue:
          type: number
        name:
          type: string
        defaultBalance:
          type: boolean
        currency:
          type: string
    BalanceUserResponse:
      description: Minimal user representation returned by balance user list endpoints. Only referralCode is mapped.
      type: object
      properties:
        referralCode:
          type: string
    Credits:
      type: object
      properties:
        remainingValueNet:
          type: number
        remainingValueGross:
          type: number
    Annotation:
      type: object
      properties:
        id:
          type: integer
          format: int64
        name:
          type: string
        properties:
          type: object
          additionalProperties: true
    GUser:
      description: Request body for updating user profile (PATCH /customers). All fields are optional.
      type: object
      properties:
        firstName:
          type: string
          minLength: 1
          maxLength: 90
        lastName:
          type: string
          minLength: 1
          maxLength: 90
        email:
          type: string
          pattern: "^[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+([a-zA-Z0-9!#$%&'*+/=?^_`{|}~.-][a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+)*[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]?@([a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)(\\.[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$"
        birthdate:
          type: string
          format: date
        phone:
          type: string
        language:
          type: string
          description: The user's desired language for UI and notifications. It must be a valid IETF BCP 47 language tag.
        customProperties:
          type: object
          additionalProperties: true
        receiveNewsletter:
          type: boolean
        newsletterOptions:
          type: object
          properties:
            receiveNews:
              type: boolean
            receiveMarketingOffers:
              type: boolean
        street:
          type: string
        postcode:
          type: string
        city:
          type: string
        country:
          type: string
        customExternalVerificationState:
          type: string
          enum:
            - UNVERIFIED
            - VERIFIED
        appsflyerId:
          type: string
        fileIds:
          type: array
          items:
            type: integer
            format: int64
    GUserResponse:
      type: object
      properties:
        id:
          readOnly: true
          type: integer
          format: int64
          description: Unique identifier of the user.
        firstName:
          type: string
          description: First name of the user.
        lastName:
          type: string
          description: Last name of the user.
        birthdate:
          type: string
          format: date
          description: Birth date of the user in yyyy-mm-dd format.
        email:
          type: string
          description: Email address of the user.
          pattern: "^[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+([a-zA-Z0-9!#$%&'*+/=?^_`{|}~.-][a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+)*[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]?@([a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)(\\.[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$"
        emailIsVerified:
          readOnly: true
          type: boolean
          description: Indicates if the user's email address has been verified.
        phone:
          type: string
          description: Phone number of the user.
        phoneIsVerified:
          readOnly: true
          type: boolean
          description: Indicates if the user's phone number has been verified.
        street:
          type: string
          description: Street address of the user.
        postcode:
          type: string
          description: Postal code of the user's address.
        city:
          type: string
          description: City of the user's address.
        country:
          type: string
          description: Country of the user's address.
        referralCode:
          readOnly: true
          type: string
          description: Referral code associated with the user.
        language:
          type: string
          description: The user's desired language for UI and notifications. It must be a valid IETF BCP 47 language tag.
        customProperties:
          type: object
          additionalProperties: true
          description: Custom properties associated with the user.
        licenseVerificationState:
          $ref: '#/components/schemas/DocumentVerificationState'
        idVerificationState:
          $ref: '#/components/schemas/DocumentVerificationState'
        manualVerificationState:
          type: string
          enum:
            - UNVERIFIED
            - PROCESSING
            - VERIFIED
            - REJECTED
            - RETRY
        customExternalVerificationState:
          type: string
          enum:
            - UNVERIFIED
            - VERIFIED
          description: Manual verification state of the user's driving license.
        paymentSourceIsAvailable:
          readOnly: true
          type: boolean
          description: Indicates if a payment source is available for the user.
        paymentState:
          type: string
          enum:
            - NONE
            - PUSH_INITIATED
            - PUSH_COMPLETED
            - SOURCE_ADDED
            - INVOICING
          description: Current payment state of the user.
        paymentStates:
          type: object
          additionalProperties:
            type: string
            enum:
              - NONE
              - PUSH_INITIATED
              - PUSH_COMPLETED
              - SOURCE_ADDED
              - INVOICING
          description: Map of branch ID to payment state.
        signupFeeSettled:
          readOnly: true
          type: boolean
          description: Indicates if the user has settled the sign-up fee.
        receiveNewsletter:
          type: boolean
          description: Indicates if the user has opted to receive newsletters.
        newsletterOptions:
          type: object
          properties:
            receiveNews:
              type: boolean
              description: Indicates if the user wants to receive news updates.
            receiveMarketingOffers:
              type: boolean
              description: Indicates if the user wants to receive marketing offers.
        rides:
          type: integer
          format: int64
          description: Total number of rides taken by the user.
        ridesKilometers:
          type: number
          format: double
          description: Total distance in kilometers of all rides taken by the user.
        co2SavedInG:
          type: number
          format: double
          description: 'Total CO2 saved, in grams, by the user.'
        balances:
          type: array
          items:
            $ref: '#/components/schemas/Balance'
          description: List of balances associated with the user.
        credits:
          $ref: '#/components/schemas/Credits'
          description: Credit details of the user.
        signInMethods:
          readOnly: true
          type: array
          items:
            type: string
            enum:
              - EMAIL
              - SMS
              - EMAIL_CODE
              - SOCIAL_GOOGLE
              - SOCIAL_APPLE
              - SOCIAL_FACEBOOK
              - API
              - PIM_OPENID
              - GAIYO
          description: Sign-in methods available to the user.
        requestedDeletion:
          readOnly: true
          type: boolean
          description: Indicates if the user has requested account deletion.
        appsflyerId:
          type: string
          example:
            "E8805AC2-80FB-48FC-98EA-34DD3CCE5759"
          description: Appsflyer's appsflyerId associated with the user.
    GUserSignedResponse:
      type: object
      properties:
        userId:
          type: integer
          format: int64
          description: Unique identifier of the user.
        authId:
          type: string
          description: The authentication id of the user.
        language:
          type: string
          description: Selected default language of the user.
        homeBillableBranchId:
          type: integer
          format: int64
          description: Identifier of the home billable branch of the user.
        jwt:
          type: string
          description: signed JWT that contains the same data and is signed by the server with HMAC
    UserGroupRequestUser:
      type: object
      properties:
        firstName:
          type: string
        lastName:
          type: string
        email:
          type: string
        phone:
          type: string
        referralCode:
          type: string
    AddUser:
      type: object
      required:
        - email
        - password
        - firstName
        - lastName
      properties:
        firstName:
          type: string
          minLength: 1
          maxLength: 90
        lastName:
          type: string
          minLength: 1
          maxLength: 90
        email:
          type: string
          pattern: "^[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+([a-zA-Z0-9!#$%&'*+/=?^_`{|}~.-][a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+)*[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]?@([a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)(\\.[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$"
        password:
          type: string
        language:
          type: string
          description: |-
            The user's desired language for UI and notifications. It must be a valid IETF BCP 47 language tag.
            If it is not set or invalid the HTTP header 'Accept-Language' will be used. If neither are valid, the default language of the system will be used.
        branchId:
          type: integer
          format: int64
        receiveNewsletter:
          type: boolean
        newsletterOptions:
          type: object
          properties:
            receiveNews:
              type: boolean
            receiveMarketingOffers:
              type: boolean
        oneSignalDeviceId:
          type: string
          pattern: '[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}'
        externalReference:
          type: string
        tncAccepted:
          type: boolean
          default: true
          description: |-
            When true (the default), the branch's Terms & Conditions acceptance is persisted for the newly created
            user. Send false to opt out and accept later.
    AddUserWithPhoneNumber:
      type: object
      required:
        - phoneNumber
        - branchId
      properties:
        phoneNumber:
          type: string
        language:
          type: string
          description: |-
            The user's desired language for UI and notifications. It must be a valid IETF BCP 47 language tag.
            If it is not set or invalid the HTTP header 'Accept-Language' will be used. If neither are valid, the default language of the system will be used.
        branchId:
          type: integer
          format: int64
        oneSignalDeviceId:
          type: string
        tncAccepted:
          type: boolean
          default: true
          description: |-
            When true (the default), the branch's Terms & Conditions acceptance is persisted for the newly created
            user. Send false to opt out and accept later. Ignored when the user already exists.
    AddUserWithEmailCode:
      type: object
      required:
        - email
        - branchId
      properties:
        email:
          type: string
        language:
          type: string
          description: |-
            The user's desired language for UI and notifications. It must be a valid IETF BCP 47 language tag.
            If it is not set or invalid the HTTP header 'Accept-Language' will be used. If neither are valid, the default language of the system will be used.
        branchId:
          type: integer
          format: int64
        tncAccepted:
          type: boolean
          default: true
          description: |-
            When true (the default), the branch's Terms & Conditions acceptance is persisted for the newly created
            user. Send false to opt out and accept later.
    SocialSignUpRequest:
      type: object
      required:
        - token
        - socialLoginType
        - branchId
      properties:
        token:
          type: string
        socialLoginType:
          type: string
          enum:
            - GOOGLE
            - APPLE
            - FACEBOOK
            - PIM_OPENID
        branchId:
          type: integer
          format: int64
        receiveNewsletter:
          type: boolean
        newsletterOptions:
          type: object
          properties:
            receiveNews:
              type: boolean
            receiveMarketingOffers:
              type: boolean
        oneSignalDeviceId:
          type: string
        tncAccepted:
          type: boolean
          default: true
          description: |-
            When true (the default), the branch's Terms & Conditions acceptance is persisted for the newly created
            user. Send false to opt out and accept later.
    ConstraintVoucherable:
      type: object
      description: A voucherable with constraint parameters (validity, discounts, rental limits).
      properties:
        branchId:
          type: integer
          format: int64
        code:
          type: string
        name:
          type: string
        description:
          type: string
        iconUrl:
          type: string
        value:
          readOnly: true
          type: number
        rentalRebate:
          type: number
        discount:
          type: number
        additionEntitlementCode:
          type: string
          description: Code of the rental addition this voucherable entitles.
        numberOfRentals:
          type: integer
          format: int32
        validityTimeUnit:
          type: string
          enum:
            - NANOS
            - MICROS
            - MILLIS
            - SECONDS
            - MINUTES
            - HOURS
            - HALF_DAYS
            - DAYS
            - WEEKS
            - MONTHS
            - YEARS
            - DECADES
            - CENTURIES
            - MILLENNIA
            - ERAS
            - FOREVER
        validityPeriod:
          type: integer
          format: int32
        validityDateUntil:
          type: string
          format: date-time
        applicablePriceType:
          type: string
          enum:
            - TIME_PRICE
            - DRIVING_PRICE
            - PARKING_PRICE
            - DISTANCE_PRICE
            - RESERVATION_PRICE
            - UNLOCK_FEE
          description: The pricing aspect this voucherable applies to.
        monetary:
          type: boolean
          description: Whether this voucherable applies a monetary discount.
        applicableBranchIds:
          type: array
          items:
            type: integer
            format: int64
        applicableVehicleCategoryIds:
          type: array
          items:
            type: integer
            format: int64
        costSources:
          type: object
          description: Map of cost source types to their applicable values.
          additionalProperties:
            type: array
            items:
              type: string
        customProperties:
          type: object
          additionalProperties: true
    GeofenceSurcharge:
      type: object
      description: >-
        A surcharge applied to rentals ended in a defined geographic area.
        Inherits all fields from ConstraintVoucherable plus geofence-specific properties.
      title: GeofenceSurcharge
      properties:
        type:
          type: string
          enum:
            - GeoFenceSurcharge
          description: The type of voucherable.
        branchId:
          type: integer
          description: The business unit it is configured on.
        value:
          type: number
          description: The value which would be added to the rental cost if the surcharge was applied.
        code:
          type: string
          description: A unique identifier within the system.
        name:
          type: string
        description:
          type: string
          description: Description of the voucherable to inform the user of its purpose.
        iconUrl:
          type: string
        rentalRebate:
          type: number
        discount:
          type: number
        additionEntitlementCode:
          type: string
        numberOfRentals:
          type: integer
          format: int32
        validityTimeUnit:
          type: string
        validityPeriod:
          type: integer
          format: int32
        validityDateUntil:
          type: string
          format: date-time
        applicablePriceType:
          type: string
        monetary:
          type: boolean
        costSources:
          type: object
          additionalProperties:
            type: array
            items:
              type: string
        customProperties:
          type: object
          additionalProperties: true
        applicableBranchIds:
          type: array
          description: List of ids of location branches on which the surcharge is applied.
          items:
            type: integer
            example: 1
        applicableVehicleCategoryIds:
          type: array
          description: List of ids of vehicle categories on which the surcharge is applied.
          items:
            type: integer
            example: 4
        applicableRentalType:
          type: string
          enum:
            - END_RENTAL
          example: END_RENTAL
          description: 'For what events of a rental this surcharge is applied. e.g. only if a rental is ended in the area, or started in the area.'
        geoFence:
          type: object
          description: The geofence outlining the area where the surcharge is applied. Will be a MultiPolygon in geojson format.
          properties:
            type:
              type: string
            coordinates:
              type: array
              items:
                type: array
                items:
                  type: array
                  items:
                    type: array
                    maxItems: 2
                    minItems: 2
                    items:
                      type: number
        recurrenceStartTime:
          type: string
          example: '10:30'
          description: The local time from when this surcharge is active.
        durationInMinutes:
          type: integer
          description: The amount of minutes the surcharge will be active for after the provided `recurrenceStartTime`.
          example: 120
        types:
          type: array
          description: deprecated
          items:
            type: string
            deprecated: true
      required:
        - type
        - branchId
        - value
        - code
        - geoFence
    GeofencePromotion:
      type: object
      description: >-
        A promotion applied to rentals started/ended in a defined geographic area.
        Every promotion will either have a discount or a rentalRebate, never both.
        Inherits all fields from ConstraintVoucherable plus geofence-specific properties.
      title: GeofencePromotion
      properties:
        type:
          type: string
          enum:
            - GeoFencePromotion
          description: The type of voucherable.
        branchId:
          type: integer
          description: The business unit it is configured on.
        value:
          type: number
        rentalRebate:
          type: number
          description: The amount that will be deducted from the rental in case the promotion is applied.
        discount:
          type: number
          description: The discount percentage that will be applied to the rental in case the promotion is applied.
        code:
          type: string
          description: A unique identifier within the system.
        name:
          type: string
        description:
          type: string
          description: Description of the voucherable to inform the user of its purpose.
        iconUrl:
          type: string
        additionEntitlementCode:
          type: string
        numberOfRentals:
          type: integer
          format: int32
        validityTimeUnit:
          type: string
        validityPeriod:
          type: integer
          format: int32
        validityDateUntil:
          type: string
          format: date-time
        applicablePriceType:
          type: string
        monetary:
          type: boolean
        costSources:
          type: object
          additionalProperties:
            type: array
            items:
              type: string
        customProperties:
          type: object
          additionalProperties: true
        applicableBranchIds:
          type: array
          description: List of ids of location branches on which the promotion is applied.
          items:
            type: integer
            example: 1
        applicableVehicleCategoryIds:
          type: array
          description: List of ids of vehicle categories on which the promotion is applied.
          items:
            type: integer
            example: 4
        applicableRentalType:
          type: string
          enum:
            - START_RENTAL
            - END_RENTAL
            - START_PLUS_END_RENTAL
            - START_OR_END_RENTAL
            - START_AND_END_RENTAL
          description: |-
            `START_RENTAL` - apply promotion on rentals starting in the geofence.\
            `END_RENTAL` - apply promotion on rentals ending in the geofence.\
            `START_PLUS_END_RENTAL` - apply promotion on starting a rental and ending a rental in the geofence (promotion gets applied twice).\
            `START_OR_END_RENTAL` - apply promotion on rentals that are started or ended in the geofence.\
            `START_AND_END_RENTAL` - apply promotion on rentals that are started and ended in the geofence.
          example: END_RENTAL
        geoFence:
          type: object
          description: The geofence outlining the area where the promotion is applied. Should be applied as a MultiPolygon in geojson format.
          properties:
            type:
              type: string
            coordinates:
              type: array
              items:
                type: array
                items:
                  type: array
                  items:
                    type: array
                    items:
                      type: number
        recurrenceStartTime:
          type: string
          example: '18:00'
          description: The local time from when this promotion is active.
        durationInMinutes:
          type: integer
          description: The amount of minutes the promotion will be active for after the provided `recurrenceStartTime`.
          example: 240
        types:
          type: array
          description: deprecated
          items:
            type: string
            deprecated: true
      required:
        - type
        - branchId
        - code
        - applicableRentalType
    UserGroupMemberView:
      type: object
      description: >-
        User group as seen by a regular member (GET /groups).
        Only basic identification fields are exposed.
      properties:
        code:
          type: string
        name:
          type: string
        approvalState:
          type: string
          enum:
            - APPROVED
            - PENDING
            - REJECTED
          description: Approval state of the user group membership.
    UserGroupAdminView:
      type: object
      description: >-
        User group as seen by a group admin (GET /groups-management).
        Includes all management fields.
      properties:
        id:
          type: integer
          format: int64
        email:
          type: string
        code:
          type: string
        name:
          type: string
        phone:
          type: string
        street:
          type: string
        postcode:
          type: string
        city:
          type: string
        country:
          type: string
        vatNumber:
          type: string
        companyRegistrationNumber:
          type: string
        billingPeriod:
          type: string
          enum:
            - NONE
            - WEEKLY
            - MONTHLY
        paymentState:
          type: string
          enum:
            - NONE
            - PUSH_INITIATED
            - PUSH_COMPLETED
            - SOURCE_ADDED
            - INVOICING
        checkRentalRequirements:
          type: boolean
        useReceiptInsteadOfInvoice:
          type: boolean
          description: Whether the user group receives receipts instead of invoices.
        defaultCostCenter:
          type: object
          properties:
            id:
              type: integer
              format: int64
            name:
              type: string
        approvalState:
          type: string
          enum:
            - APPROVED
            - PENDING
            - REJECTED
          description: Approval state of the user group membership.
        billingCycle:
          type: string
          enum:
            - PAY_AS_YOU_GO
            - HOURLY
            - DAILY
            - WEEKLY
            - BI_WEEKLY
            - MONTHLY
    UserGroupCreateRequest:
      type: object
      description: Request body for creating a new user group.
      properties:
        email:
          type: string
        name:
          type: string
        phone:
          type: string
        street:
          type: string
        postcode:
          type: string
        city:
          type: string
        country:
          type: string
        vatNumber:
          type: string
        companyRegistrationNumber:
          type: string
        billingPeriod:
          type: string
          enum:
            - NONE
            - WEEKLY
            - MONTHLY
        ownerId:
          type: integer
          format: int64
          description: ID of the user to set as owner. If omitted, the authenticated user becomes the owner.
        checkRentalRequirements:
          type: boolean
        useReceiptInsteadOfInvoice:
          type: boolean
        billingCycle:
          type: string
          enum:
            - PAY_AS_YOU_GO
            - HOURLY
            - DAILY
            - WEEKLY
            - BI_WEEKLY
            - MONTHLY
    UserGroupUpdate:
      type: object
      properties:
        name:
          type: string
        street:
          type: string
        postcode:
          type: string
        city:
          type: string
        country:
          type: string
        vatNumber:
          type: string
        companyRegistrationNumber:
          type: string
        billingPeriod:
          type: string
          enum:
            - NONE
            - WEEKLY
            - MONTHLY
        checkRentalRequirements:
          type: boolean
    UserGroupEmbedded:
      type: object
      description: User group summary as included in rental responses.
      properties:
        id:
          type: integer
          format: int64
        name:
          type: string
        code:
          type: string
    GUserGroupRequest:
      type: object
      description: |-
        Join request for a user group. Two views depending on the caller's role:
        - Member view: includes group, excludes guser and createdAt.
        - Group admin view: includes guser (limited info) and createdAt, excludes group.
      properties:
        id:
          type: integer
          format: int64
        group:
          $ref: '#/components/schemas/UserGroupMemberView'
          description: Present in member view only.
        guser:
          $ref: '#/components/schemas/UserGroupRequestUser'
          description: Present in group admin view only (limited to firstName, lastName, email, phone, referralCode).
        state:
          type: string
          enum:
            - REQUESTED
            - APPROVED
            - REJECTED
            - RETRACTED
        direction:
          type: string
          enum:
            - GROUP_TO_USER
            - USER_TO_GROUP
        requestReason:
          type: string
        rejectReason:
          type: string
        createdAt:
          type: string
          format: date-time
          description: Group admin view only.
        error:
          type: object
          description: Present when a join request creation failed for this member (in add-members response).
          properties:
            id:
              type: integer
              format: int64
            error:
              type: string
            referralCode:
              type: string
            email:
              type: string
            phone:
              type: string
    CostCenterRequest:
      type: object
      properties:
        name:
          type: string
          description: Name of the cost center. This has to be unique across the user group/business account.
        description:
          type: string
          description: Description of the cost center
        userGroupId:
          type: integer
          format: int64
          description: Identifier of the user group/business account this cost center belongs to.
        externalReference:
          type: string
          description: 'External reference of the cost center (e.g., in an accounting software)'
        contactEmail:
          type: string
          description: Email address to contact a responsible person/group of this cost center
        defaultForUserGroup:
          type: boolean
          description: Make this cost center a default one for a user group. Only applicable on a non first cost center creation.
      required:
        - name
    CostCenterPatch:
      type: object
      properties:
        name:
          type: string
          description: Name of the cost center. This has to be unique across the user group/business account.
        description:
          type: string
          description: Description of the cost center
        externalReference:
          type: string
          description: 'External reference of the cost center (e.g., in an accounting software)'
        contactEmail:
          type: string
          description: Email address to contact a responsible person/group of this cost center
        defaultForUserGroup:
          type: boolean
          description: 'If set to true, will make this cost center a default one for a user group, otherwise it will be ignored.'
        status:
          type: string
          enum:
            - ACTIVE
            - ARCHIVED
          description: 'Represents status of the cost center, which determines if the cost center is active or archived (soft deleted).'
    CostCenterResponse:
      type: object
      properties:
        id:
          type: integer
          format: int64
          description: Identifier of the cost center
        name:
          type: string
          description: Name of the cost center. This is unique across the user group/business account.
        description:
          type: string
          description: Description of the cost center
        userGroupId:
          type: integer
          format: int64
          description: Identifier of the user group/business account this cost center belongs to.
        externalReference:
          type: string
          description: 'External reference of the cost center (e.g., in an accounting software)'
        contactEmail:
          type: string
          description: Email address to contact a responsible person/group of this cost center
        defaultForUserGroup:
          type: boolean
          description: Describes if this cost center is a default one for a user group.
        status:
          type: string
          enum:
            - ACTIVE
            - ARCHIVED
          description: 'Represents status of the cost center, which determines if the cost center is active or archived (soft deleted).'
      required:
        - id
        - name
        - userGroupId
        - status
    TermsAndConditions:
      type: object
      properties:
        id:
          type: integer
          format: int64
        privacyGuidelinesUrl:
          type: string
          description: URL for privacy guidelines
        privacyGuidelinesText:
          type: string
          description: Text to display for the privacy guidelines URL
        termsAndConditionsUrl:
          type: string
          description: URL for terms and conditions
        termsAndConditionsText:
          type: string
          description: Text to display for the terms and conditions URL
        additionalTermsAndConditionsUrl:
          type: string
          description: URL for additional terms and conditions
        additionalTermsAndConditionsText:
          type: string
          description: Text to display for the additional terms and conditions URL
        disclaimer:
          type: object
          properties:
            text:
              type: string
              description: Text to display for the disclaimer
            url:
              type: string
              description: URL for disclaimer
            urlLabel:
              type: string
              description: label for the disclaimer URL
    BranchTermsAndConditions:
      type: object
      description: Terms and conditions associated with a specific branch
      properties:
        branchId:
          type: integer
          format: int64
          readOnly: true
          description: Identifier of the branch
        termsAndConditions:
          $ref: '#/components/schemas/TermsAndConditions'
    Part:
      type: object
      properties:
        name:
          type: string
        code:
          type: string
        critical:
          type: boolean
        posX:
          type: number
          format: double
        posY:
          type: number
          format: double
    VehicleCategoryFeature:
      type: object
      properties:
        icon:
          type: string
        title:
          type: string
    SharedVehicleProperties:
      type: object
      properties:
        imageUrl:
          type: string
        checksum:
          type: string
        parts:
          type: array
          items:
            $ref: '#/components/schemas/Part'
        cancellationTags:
          type: array
          items:
            type: string
        vehicleCategoryFeatures:
          type: array
          items:
            $ref: '#/components/schemas/VehicleCategoryFeature'
        concurrentRentalCount:
          type: integer
          format: int32
        concurrentBookingCount:
          type: integer
          format: int32
        disallowedRentalOperations:
          type: array
          items:
            type: string
    SOCLevels:
      type: object
      properties:
        medium:
          type: integer
          format: int32
        low:
          type: integer
          format: int32
        critical:
          type: integer
          format: int32
    IoTBatteryLevels:
      type: object
      properties:
        medium:
          type: number
          format: float
        low:
          type: number
          format: float
        critical:
          type: number
          format: float
    CoreVehicleProperties:
      type: object
      properties:
        socLevels:
          $ref: '#/components/schemas/SOCLevels'
        ioTBatteryLevels:
          $ref: '#/components/schemas/IoTBatteryLevels'
        rentalAdditionPriceCalcs:
          type: object
          additionalProperties:
            type: string
        priceCalcKey:
          type: string
        rentalRequirementsKey:
          type: string
        preEndRentalActionsKey:
          type: string
        remainingKilometers:
          type: integer
          format: int32
        chargingTimeFactor:
          type: number
          format: double
        bookingQuota:
          type: number
          format: double
        maxSpeedInWarningArea:
          type: integer
          format: int32
        maxSpeed:
          type: integer
          format: int32
        approachVehicleActions:
          type: array
          items:
            type: string
            enum:
              - START
              - STOP
              - SET_OUT_OF_ORDER
              - SET_OPERATIONAL
              - OPEN_SADDLE
              - LOCATE
              - REFRESH
              - DELAY
              - UPDATE_BRANCH_WITH_BUSINESS_AREA_STRICT
              - ADD_ANNOTATION
              - REMOVE_ANNOTATION
              - SET_MAX_SPEED
              - LOCK
              - UNLOCK
              - OPEN_TAILBOX
              - LOCK_TAILBOX
              - UNLOCK_TAILBOX
        deployVehicleActions:
          type: array
          items:
            type: string
            enum:
              - START
              - STOP
              - SET_OUT_OF_ORDER
              - SET_OPERATIONAL
              - OPEN_SADDLE
              - LOCATE
              - REFRESH
              - DELAY
              - UPDATE_BRANCH_WITH_BUSINESS_AREA_STRICT
              - ADD_ANNOTATION
              - REMOVE_ANNOTATION
              - SET_MAX_SPEED
              - LOCK
              - UNLOCK
              - OPEN_TAILBOX
              - LOCK_TAILBOX
              - UNLOCK_TAILBOX
        leaveVehicleActions:
          type: array
          items:
            type: string
            enum:
              - START
              - STOP
              - SET_OUT_OF_ORDER
              - SET_OPERATIONAL
              - OPEN_SADDLE
              - LOCATE
              - REFRESH
              - DELAY
              - UPDATE_BRANCH_WITH_BUSINESS_AREA_STRICT
              - ADD_ANNOTATION
              - REMOVE_ANNOTATION
              - SET_MAX_SPEED
              - LOCK
              - UNLOCK
              - OPEN_TAILBOX
              - LOCK_TAILBOX
              - UNLOCK_TAILBOX
        closeVehicleActions:
          type: array
          items:
            type: string
            enum:
              - START
              - STOP
              - SET_OUT_OF_ORDER
              - SET_OPERATIONAL
              - OPEN_SADDLE
              - LOCATE
              - REFRESH
              - DELAY
              - UPDATE_BRANCH_WITH_BUSINESS_AREA_STRICT
              - ADD_ANNOTATION
              - REMOVE_ANNOTATION
              - SET_MAX_SPEED
              - LOCK
              - UNLOCK
              - OPEN_TAILBOX
              - LOCK_TAILBOX
              - UNLOCK_TAILBOX
        tompProperties:
          type: object
          additionalProperties:
            type: string
        rentalOperationOverrides:
          type: object
          description: Map of rental action to overridden command ID.
          additionalProperties:
            type: integer
            format: int64
        useIoTSoCLevel:
          type: boolean
        useIoTBatteryLevel:
          type: boolean
        useHelmetsTracking:
          type: boolean
        ignoreSoC:
          type: boolean
        triggerDockingInfoUpdateEnabled:
          type: boolean
        triggerDockingInfoUpdateCommand:
          type: string
        stationChargingToggle:
          type: boolean
        chargingLimit:
          type: integer
          format: int32
        useOutOfRentalActivityMonitoring:
          type: boolean
        type:
          type: string
    VehicleCategory:
      type: object
      description: Vehicle category details.
      properties:
        id:
          type: integer
          format: int64
          readOnly: true
        parentId:
          type: integer
          format: int64
        name:
          type: string
          description: Translated category name.
        description:
          type: string
          description: Translated category description.
        appProperties:
          type: object
          additionalProperties: true
        sharedProperties:
          $ref: '#/components/schemas/SharedVehicleProperties'
        bookable:
          type: boolean
        vehicleAttributeIds:
          type: array
          items:
            type: integer
            format: int64
          description: List of identifiers of vehicle attributes of this vehicle category.
        vehicleAttributes:
          type: array
          items:
            $ref: '#/components/schemas/VehicleAttribute'
          description: List of vehicle attributes of this vehicle category.
    VehicleAttribute:
      type: object
      properties:
        id:
          type: integer
          format: int64
        name:
          type: string
    JsonGUser:
      type: object
      properties:
        id:
          type: integer
          format: int64
        firstName:
          type: string
        lastName:
          type: string
    Point:
      type: object
      x-examples:
        Vienna:
          type: Point
          coordinates:
            - 16.363449
            - 48.210033
      description: Describes a single point on a coordinate system
      properties:
        type:
          type: string
          default: Point
          description: The type is always set to 'Point'
        coordinates:
          type: array
          description: 'Contains two values: `[lng,lat]`'
          items:
            type: number
            format: double
    MultiPolygon:
      type: object
      description: GeoJSON MultiPolygon geometry.
      properties:
        type:
          type: string
          default: MultiPolygon
        coordinates:
          type: array
          description: Array of polygon coordinate arrays.
          items:
            type: array
            items:
              type: array
              items:
                type: array
                items:
                  type: number
                  format: double
    Station:
      type: object
      description: Station details.
      properties:
        id:
          type: integer
          format: int64
          readOnly: true
        name:
          type: string
        type:
          type: string
          enum:
            - VIRTUAL
            - DOCKING
            - RECOMMENDED
            - PROMOTION
        position:
          $ref: '#/components/schemas/Point'
        area:
          $ref: '#/components/schemas/MultiPolygon'
        state:
          type: string
          enum:
            - ACTIVE
            - INACTIVE
        validUntil:
          type: string
          format: date-time
        branchId:
          type: integer
          format: int64
        reward:
          $ref: '#/components/schemas/Reward'
    Reward:
      type: object
      description: A reward/voucherable that can be applied at a station.
      properties:
        id:
          type: integer
          format: int64
          readOnly: true
        branchId:
          type: integer
          format: int64
        value:
          type: number
        code:
          type: string
        name:
          type: string
        description:
          type: string
        iconUrl:
          type: string
        state:
          type: string
          enum:
            - ACTIVE
            - INACTIVE
            - EXPIRED
        rentalRebate:
          type: number
        numberOfRentals:
          type: integer
          format: int32
        validityTimeUnit:
          type: string
        validityPeriod:
          type: integer
          format: int32
        maxRedeemLimit:
          type: integer
          format: int64
        redeemCount:
          type: integer
          format: int64
        signup:
          type: boolean
        showInUserApp:
          type: boolean
        applicableBranchIds:
          type: array
          items:
            type: integer
            format: int64
        applicableVehicleCategoryIds:
          type: array
          items:
            type: integer
            format: int64
    Duration:
      type: string
      description: ISO-8601 duration string (e.g., "PT1H30M", "PT0S").
      example: PT1H30M
    JsonGroup:
      type: object
      properties:
        id:
          type: integer
          format: int64
        name:
          type: string
        code:
          type: string
          description: referral code of the user group
        email:
          type: string
        phone:
          type: string
    JsonModule:
      type: object
      properties:
        id:
          type: integer
          format: int64
        externalId:
          type: string
        secondaryExternalId:
          type: string
        iccid:
          type: string
        macAddress:
          type: string
        type:
          type: string
          enum:
            - NIU
            - NIU_MC
            - DUMMY
            - NIU_PRTCL
            - NINEBOT_ES2
            - CUCA_BIKE
            - TRACKER
            - COMODULE_NINEBOT_ES2
            - GOVECS_GOT
            - NINEBOT_ES2_TLT
            - MANUAL_KICKSCOOTER
            - MANUAL_BICYCLE
            - NIU_TLT
            - SUPER_SOCO_TLT_125
            - CAR_TLT
            - SEGWAY_V1
            - NIU_V2
            - CAR_TLT_RELAIS
            - LANNMARKER_ZIMO
            - INVERS_CAR
            - DEVICE_CLOUD
            - NIU_V2_READ
            - FITRIDER
            - STANDARD_FLEET
            - JAVA_DEVICE_CLOUD
    JsonVehicle:
      type: object
      properties:
        id:
          type: integer
          format: int64
        licensePlate:
          type: string
        code:
          type: string
        name:
          type: string
        chargingState:
          type: string
          enum:
            - UNKNOWN
            - UNPLUGGED
            - PLUGGED
            - CHARGING
        stateOfCharge:
          type: integer
          format: int32
        remainingKilometers:
          type: integer
          format: int32
        categoryId:
          type: integer
          format: int64
        benefits:
          type: array
          items:
            type: string
            enum:
              - DISCOUNTED
              - REWARDED
        rewardStationIds:
          type: array
          items:
            type: integer
            format: int64
        position:
          $ref: '#/components/schemas/Point'
        rentalState:
          $ref: '#/components/schemas/VehicleRentalState'
        module:
          $ref: '#/components/schemas/JsonModule'
    VehicleRentalState:
      type: string
      description: |-
        - `AVAILABLE`: The vehicle is available for rental.
        - `RESERVATION`: The vehicle currently has a rental in state RESERVATION associated.
        - `DRIVING`: The vehicle currently has a rental in state ACTIVE associated and the vehicle is in DRIVING mode.
        - `PARKING`: The vehicle currently has a rental in state ACTIVE associated and the vehicle is in PARKING mode.
        - `DELIVERED`: The vehicle is associated to a booking in state DELIVERED and ready for the user to turn the booking into a rental.
      enum:
        - AVAILABLE
        - RESERVATION
        - DRIVING
        - PARKING
        - DELIVERED
    BillingInformation:
      type: object
      properties:
        legalName:
          type: string
        vatNumber:
          type: string
        registrationNumber:
          type: string
        iban:
          type: string
        logoBase64:
          type: string
        currencySymbol:
          type: string
        bankingInformation:
          type: string
    AddressInfo:
      type: object
      properties:
        street:
          type: string
        postcode:
          type: string
        city:
          type: string
        country:
          type: string
    BranchContactInfo:
      type: object
      properties:
        publicName:
          type: string
        websiteUrl:
          type: string
        billingInformation:
          $ref: '#/components/schemas/BillingInformation'
        address:
          $ref: '#/components/schemas/AddressInfo'
        email:
          type: string
        phone:
          type: string
        locationGuidelines:
          type: string
        customFields:
          type: object
          additionalProperties:
            type: string
    JsonBranch:
      type: object
      properties:
        id:
          type: integer
          format: int64
        code:
          type: string
        name:
          type: string
        timeZoneId:
          $ref: '#/components/schemas/ZoneId'
        contactInfo:
          $ref: '#/components/schemas/BranchContactInfo'
        currency:
          type: string
    JsonRentalTimes:
      type: object
      properties:
        driving:
          $ref: '#/components/schemas/Duration'
        parking:
          $ref: '#/components/schemas/Duration'
    JsonRentalPrice:
      type: object
      properties:
        priceForReservationGross:
          type: number
        priceForDrivingGross:
          type: number
        priceForParkingGross:
          type: number
        nonRebatablePriceGross:
          type: number
        rebateGross:
          type: number
        priceGross:
          type: number
        surchargeGross:
          type: number
        priceForReservationNet:
          type: number
        priceForDrivingNet:
          type: number
        priceForParkingNet:
          type: number
        nonRebatablePriceNet:
          type: number
        rebateNet:
          type: number
        priceNet:
          type: number
        surchargeNet:
          type: number
    RentalFeedback:
      type: object
      properties:
        rating:
          type: integer
          format: int32
        ratingDescription:
          type: string
    Voucherable:
      type: object
      description: >-
        Lightweight voucherable representation used inside Voucher responses.
        When used as a standalone embedded object (e.g., inside Voucher.voucherable),
        only id, code, name, and description are populated.
      properties:
        id:
          type: integer
          format: int64
        branchId:
          type: integer
          format: int64
        value:
          type: number
        code:
          type: string
        name:
          type: string
        description:
          type: string
        iconUrl:
          type: string
        applicableBranchIds:
          type: array
          items:
            type: integer
            format: int64
        applicableVehicleCategoryIds:
          type: array
          items:
            type: integer
            format: int64
        customProperties:
          type: object
          additionalProperties: true
    AppliedRentalRebate:
      type: object
      properties:
        type:
          type: string
          enum:
            - GEOFENCE_PROMOTION
            - PACKAGE
            - SUBSCRIPTION
            - REWARD
            - FREE_REWARD
            - SINGLE_USE_VOUCHER
            - SIGNUP_REFERRAL
            - CASHBACK
            - TRIGGERED
            - CUSTOMER_CARE
            - VEHICLE_PROMOTION
            - PROMOTION
            - GEOFENCE_SURCHARGE
        voucherable:
          $ref: '#/components/schemas/Voucherable'
        name:
          type: string
        amountNet:
          type: number
        amountGross:
          type: number
    RentalList:
      type: object
      properties:
        id:
          type: integer
          format: int64
        rentalId:
          type: integer
          format: int64
        state:
          type: string
          enum:
            - RESERVATION
            - ACTIVE
            - EXPIRED
            - ENDED
            - CANCELLED
            - ENDED_NO_MOVEMENT
        startTime:
          type: string
          format: date-time
        driveStartTime:
          type: string
          format: date-time
        endTime:
          type: string
          format: date-time
        startKilometers:
          type: number
          format: double
        endKilometers:
          type: number
          format: double
        startAddress:
          type: string
        endAddress:
          type: string
        startPosition:
          $ref: '#/components/schemas/Point'
        endPosition:
          $ref: '#/components/schemas/Point'
        imageOfRouteUrl:
          type: string
        branchId:
          type: integer
          format: int64
        totalDuration:
          $ref: '#/components/schemas/Duration'
        priceGross:
          type: string
        priceGrossRaw:
          type: number
          description: Raw numeric price gross value.
        sumGross:
          type: string
        sumGrossRaw:
          type: number
          description: Raw numeric sum gross value.
        currency:
          type: string
        type:
          $ref: '#/components/schemas/RentalType'
        reason:
          type: string
        guser:
          $ref: '#/components/schemas/JsonGUser'
        group:
          $ref: '#/components/schemas/JsonGroup'
        vehicle:
          $ref: '#/components/schemas/JsonVehicle'
        branch:
          $ref: '#/components/schemas/JsonBranch'
        rentalTimes:
          $ref: '#/components/schemas/JsonRentalTimes'
        price:
          $ref: '#/components/schemas/JsonRentalPrice'
        estimatedPrice:
          $ref: '#/components/schemas/JsonRentalPrice'
        additions:
          type: array
          items:
            type: string
        distance:
          type: number
          format: double
        feedback:
          $ref: '#/components/schemas/RentalFeedback'
        bookingId:
          type: integer
          format: int64
        invoiceId:
          type: integer
          format: int64
        appliedRebates:
          type: array
          items:
            $ref: '#/components/schemas/AppliedRentalRebate'
        activeDeposit:
          type: boolean
        station:
          $ref: '#/components/schemas/RentalStation'
        pricingOption:
          $ref: '#/components/schemas/OnDemandPricingOptionDetails'
        priceV3:
          $ref: '#/components/schemas/PriceV3'
        priceV4:
          $ref: '#/components/schemas/PriceV4'
        rideMode:
          $ref: '#/components/schemas/RentalRideMode'
      x-stoplight:
        id: lj9rt4sah65h9
    Price:
      type: object
      properties:
        interval:
          type: object
          additionalProperties:
            $ref: '#/components/schemas/Price'
        gross:
          type: number
        grossString:
          type: string
        net:
          type: number
        netString:
          type: string
        timeUnit:
          type: string
          enum:
            - NANOSECONDS
            - MICROSECONDS
            - MILLISECONDS
            - SECONDS
            - MINUTES
            - HOURS
            - DAYS
    RentalDiscount:
      type: object
      properties:
        discountPercentage:
          type: number
        discountValue:
          type: number
    PricingInformation:
      type: object
      properties:
        unlock:
          $ref: '#/components/schemas/Price'
        driving:
          $ref: '#/components/schemas/Price'
        parking:
          $ref: '#/components/schemas/Price'
        reservation:
          $ref: '#/components/schemas/Price'
        drivingPerKilometer:
          $ref: '#/components/schemas/Price'
        estimation:
          $ref: '#/components/schemas/Price'
        discount:
          $ref: '#/components/schemas/RentalDiscount'
        surcharge:
          type: number
    ConstraintVoucher:
      type: object
      description: A redeemed voucher with constraint details (e.g., validity period, rental count).
      properties:
        rentalRebate:
          type: number
        rentalRebateNet:
          type: number
          description: Net rental rebate amount (computed from gross using tax rate).
        discount:
          type: number
        additionEntitlementCode:
          type: string
          description: Code of the rental addition this voucher entitles.
        numberOfRentals:
          type: integer
          format: int32
        remainingNumberOfRentals:
          type: integer
          format: int32
        validFrom:
          type: string
          format: date-time
        validUntil:
          type: string
          format: date-time
        applicablePriceType:
          type: string
          enum:
            - TIME_PRICE
            - DRIVING_PRICE
            - PARKING_PRICE
            - DISTANCE_PRICE
            - RESERVATION_PRICE
            - UNLOCK_FEE
        status:
          type: string
          enum:
            - ACTIVE
            - EXPIRED
            - USED_UP
            - CANCELED
            - NOT_REDEEMED
            - PENDING
        canceledAt:
          type: string
          format: date-time
        voucherType:
          type: string
          enum:
            - SIGNUP
            - PACKAGE
            - REFERRAL
            - PROMOTION
            - BY_ADMIN
            - UNKNOWN
            - SETTLEMENT
            - TOP_UP
            - CORRECTION
            - SUBSCRIPTION
            - REWARD
            - SINGLE_USE
            - SETTLEMENT_EXTERNAL
            - CASHBACK
            - TRIGGERED
            - CUSTOMER_CARE
            - COLLECTION_INVOICE
            - RIDE_PASS
            - RIDE_REWARD
        branch:
          type: integer
          format: int64
          deprecated: true
          description: 'Deprecated: use branchId instead.'
        branchId:
          type: integer
          format: int64
        name:
          type: string
        currency:
          type: string
        signup:
          type: boolean
        voucherableCode:
          type: string
        valueNet:
          type: number
        remainingValueNet:
          type: number
        valueGross:
          type: number
        remainingValueGross:
          type: number
        freeMinutes:
          type: number
          description: Original number of free minutes granted by the voucher.
        remainingFreeMinutes:
          type: number
          description: Remaining number of free minutes available on the voucher.
        redemptionCode:
          type: string
        description:
          type: string
        prerequisitesMet:
          type: boolean
    Vehicle:
      type: object
      description: Vehicle details as returned by GET /vehicles/{id} and GET /vehicles/code/{code}.
      properties:
        id:
          type: integer
          format: int64
          readOnly: true
        code:
          type: string
        licensePlate:
          type: string
        name:
          type: string
        stateOfCharge:
          type: integer
          format: int32
        position:
          $ref: '#/components/schemas/Point'
        address:
          type: string
        branchId:
          type: integer
          format: int64
        categoryId:
          type: integer
          format: int64
        customProperties:
          type: object
          additionalProperties: true
        currency:
          type: string
          readOnly: true
        type:
          type: string
          deprecated: true
          enum:
            - NIU
            - NIU_MC
            - DUMMY
            - NIU_PRTCL
            - NINEBOT_ES2
            - CUCA_BIKE
            - TRACKER
            - COMODULE_NINEBOT_ES2
            - GOVECS_GOT
            - NINEBOT_ES2_TLT
            - MANUAL_KICKSCOOTER
            - MANUAL_BICYCLE
            - NIU_TLT
            - SUPER_SOCO_TLT_125
            - CAR_TLT
            - SEGWAY_V1
            - NIU_V2
            - CAR_TLT_RELAIS
            - LANNMARKER_ZIMO
            - INVERS_CAR
            - DEVICE_CLOUD
            - NIU_V2_READ
        typeName:
          type: string
          deprecated: true
        numberOfPersons:
          type: integer
          format: int32
          deprecated: true
        remainingKilometers:
          type: integer
          format: int32
          readOnly: true
        pricing:
          $ref: '#/components/schemas/PricingInformation'
          readOnly: true
        applicableVouchers:
          type: array
          readOnly: true
          items:
            $ref: '#/components/schemas/ConstraintVoucher'
        rewardStationIds:
          type: array
          readOnly: true
          items:
            type: integer
            format: int64
        benefits:
          type: array
          readOnly: true
          items:
            type: string
            enum:
              - DISCOUNTED
              - REWARDED
        parkingReport:
          $ref: '#/components/schemas/ParkingReport'
          readOnly: true
    ParkingReport:
      type: object
      nullable: true
      description: Parking report describing where the vehicle is parked. Null if no report exists.
      properties:
        note:
          type: string
          description: Free-text description of the parking spot
    RentalPrice:
      type: object
      properties:
        priceForReservationNet:
          type: number
        priceForDrivingNet:
          type: number
        priceForParkingNet:
          type: number
        nonRebatablePriceNet:
          type: number
        priceForReservationGross:
          type: number
        priceForDrivingGross:
          type: number
        priceForParkingGross:
          type: number
        nonRebatablePriceGross:
          type: number
        rebateNet:
          type: number
        rebateGross:
          type: number
        surchargeNet:
          type: number
        surchargeGross:
          type: number
    Deposit:
      type: object
      properties:
        state:
          type: string
          enum:
            - ACTIVE
            - RELEASED
            - CHARGED
            - FAILED_TO_RELEASE
        expiresAt:
          type: string
          format: date-time
        amount:
          type: number
    Rental:
      type: object
      description: >-
        Rental details. The guser field is only present for BUSINESS-type rentals (limited to id, firstName, lastName).
        The vehicle object contains more fields for active/reserved rentals than for ended ones.
      properties:
        id:
          type: integer
          format: int64
        rentalId:
          type: integer
          format: int64
          deprecated: true
          description: Same as id. Deprecated.
        guserId:
          type: integer
          format: int64
        guser:
          description: >-
            Only set for BUSINESS-type rentals. Contains limited user info (id, firstName, lastName).
            Null for all other rental types.
          type:
            - 'object'
            - 'null'
          properties:
            id:
              type: integer
              format: int64
            firstName:
              type: string
            lastName:
              type: string
        createdAt:
          type: string
          format: date-time
          readOnly: true
        updatedAt:
          type: string
          format: date-time
          readOnly: true
        branchId:
          type: integer
          format: int64
        endBranchId:
          type: integer
          format: int64
        branchName:
          type: string
        endBranchName:
          type: string
        vehicle:
          $ref: '#/components/schemas/Vehicle'
          description: >-
            Vehicle data. For active or reserved rentals, includes full vehicle details.
            For ended or expired rentals, only basic fields are returned (id, code, licensePlate, name, categoryId, type, typeName).
        state:
          type: string
          enum:
            - RESERVATION
            - ACTIVE
            - EXPIRED
            - ENDED
            - CANCELLED
            - ENDED_NO_MOVEMENT
        startTime:
          type: string
          format: date-time
        driveStartTime:
          type: string
          format: date-time
        endTime:
          type: string
          format: date-time
        startKilometers:
          type: number
          format: double
        startPosition:
          $ref: '#/components/schemas/Point'
        startAddress:
          type: string
        fileIds:
          type: array
          description: Only available for ended rentals. Ignored for active/reserved.
          items:
            type: integer
            format: int64
        additions:
          type: array
          items:
            type: string
        totalDuration:
          $ref: '#/components/schemas/Duration'
        feedback:
          $ref: '#/components/schemas/RentalFeedback'
        bookingId:
          type: integer
          format: int64
        invoiceId:
          type: integer
          format: int64
        type:
          $ref: '#/components/schemas/RentalType'
        reason:
          type: string
        balanceName:
          type: string
        userGroupCode:
          type: string
        userGroup:
          $ref: '#/components/schemas/UserGroupEmbedded'
          description: Embedded user group (id, name, code). Mapped via userGroupEmbedded.
        price:
          $ref: '#/components/schemas/RentalPrice'
        estimatedPrice:
          $ref: '#/components/schemas/RentalPrice'
        pricingOption:
          $ref: '#/components/schemas/OnDemandPricingOptionDetails'
        currency:
          type: string
          readOnly: true
        appliedRebates:
          type: array
          items:
            $ref: '#/components/schemas/AppliedRentalRebate'
        annotations:
          type: array
          readOnly: true
          items:
            $ref: '#/components/schemas/Annotation'
        deposit:
          $ref: '#/components/schemas/Deposit'
        linkedRentalId:
          type: integer
          format: int64
        station:
          $ref: '#/components/schemas/RentalStation'
        invoice:
          $ref: '#/components/schemas/Invoice'
        startSoc:
          type: integer
          format: int32
        endSoc:
          type: integer
          format: int32
        priceV3:
          $ref: '#/components/schemas/PriceV3'
        priceV4:
          $ref: '#/components/schemas/PriceV4'
        pricingBundleVersion:
          $ref: '#/components/schemas/PricingBundleVersionEmbedded'
          readOnly: true
        rideMode:
          $ref: '#/components/schemas/RentalRideMode'
        phaseState:
          type: string
          description: Current phase state. Only present for ACTIVE rentals.
          enum:
            - DRIVING
            - PARKING
            - RESERVATION_FREE
            - RESERVATION_PAID
        encodedPolylineOfRoute:
          type: string
          description: Encoded polyline of the rental route. Only present for ended rentals.
        imageOfRouteUrl:
          type: string
          description: URL to a static image of the rental route. Only present for ended rentals.
        endKilometers:
          type: number
          format: double
          description: Vehicle odometer at rental end. Only present for ENDED rentals.
        distance:
          type: number
          format: double
          description: Distance driven in km (endKilometers - startKilometers, rounded up). Only present for ENDED rentals.
        endPosition:
          $ref: '#/components/schemas/Point'
          description: End position of the rental. Only present for ENDED rentals.
        endAddress:
          type: string
          description: Address where the rental ended. Only present for ENDED rentals.
        rentalTimes:
          type: object
          description: Breakdown of time spent in different rental modes. Only present for ENDED rentals.
          properties:
            driving:
              type: string
              description: ISO-8601 duration of driving time.
            parking:
              type: string
              description: ISO-8601 duration of parking time.
            reservation:
              type: string
              description: ISO-8601 duration of reservation time.
        co2SavedInG:
          type: number
          format: double
          description: CO2 saved in grams compared to a car trip. Only present for ENDED rentals.
      x-stoplight:
        id: vf29ctzs445op
    RentalStation:
      type: object
      properties:
        startStationId:
          type: string
          nullable: true
        returnStationId:
          type: string
          nullable: true
        reservedReturnStationId:
          type: integer
          format: int64
          nullable: true
    RentalState:
      type: string
      description: |-
        - `RESERVATION`: The vehicle is reserved but it has not been started yet.
        - `ACTIVE`: The rental has started, i.e., the vehicle has been started and used for driving. The vehicle is driving or parking.
        - `EXPIRED`: The reservation is expired, i.e., the vehicle is free for rental again afterwards.
        - `ENDED`: The rental is ended.
        - `CANCELLED`: The reservation is cancelled by the user.
        - `ENDED_NO_MOVEMENT`: The rental was started (i.e., ACTIVE) but the vehicle was not moved. These rentals will appear on the invoice with a price of 0.
      enum:
        - RESERVATION
        - ACTIVE
        - EXPIRED
        - ENDED
        - CANCELLED
        - ENDED_NO_MOVEMENT
    RentalType:
      type: string
      description: |-
        - `PERSONAL`: Default value, normal rental for personal use.
        - `BUSINESS`: The rental is created with a group ID (business account) and will be charged against the group's balance.
        - `SERVICE`: Rental is created by a service worker to relocate the vehicle.
      enum:
        - PERSONAL
        - BUSINESS
        - SERVICE
    RentalRideMode:
      type: string
      enum:
        - NORMAL
        - BEGINNER
    PricingBundleVersionEmbedded:
      type: object
      description: Pricing bundle version summary as included in rental and booking responses.
      properties:
        id:
          type: integer
          format: int64
        label:
          type: string
        revision:
          type: integer
          format: int64
        pricingBundle:
          type: object
          properties:
            id:
              type: integer
              format: int64
            name:
              type: string
            type:
              type: string
              enum:
                - BOOKING
                - ON_DEMAND_LEGACY
      readOnly: true
    AddRental:
      type: object
      properties:
        vehicleId:
          type: integer
          format: int64
        vehicleCode:
          type: string
        startRentalState:
          $ref: '#/components/schemas/RentalState'
        additions:
          type: array
          items:
            type: string
        paidReservationMinutes:
          type: integer
          format: int64
          minimum: 1
        userGroupCode:
          type: string
        type:
          $ref: '#/components/schemas/RentalType'
        source:
          type: string
          enum:
            - INTERNAL
            - TURNN
        reason:
          type: string
        ref:
          type: string
        linkedRentalId:
          type: integer
          format: int64
        priceSettingId:
          type: integer
          format: int64
          minimum: 0
        rideMode:
          $ref: '#/components/schemas/RentalRideMode'
    UpdateRental:
      type: object
      properties:
        additions:
          type: array
          items:
            type: string
        fileIds:
          type: array
          items:
            type: integer
            format: int64
          description: |-
            Files (e.g., images) to add to this rental, only possible if the rental ended already.
    RentalOperation:
      type: object
      required:
        - operationType
      properties:
        operationType:
          description: |-
            - `START`: start the rental if the vehicle was only reserved before (rental in state RESERVATION)
            - `END`: end an active rental, will perform end rental checks too
            - `DRIVE`: starts/powers the vehicle again and customer will be charged the drive rate again. needs to be an active rental
            - `PARK`: powers off the vehicle and customer will be charged the park rate. needs to be an active rental
            - `RENEW_RESERVATION`: renew the reservation (if rental in state RESERVATION)
            - `OPEN_TAILBOX`: open just the tailbox (if the vehicle has one)
          type: string
          enum:
            - START
            - END
            - DRIVE
            - PARK
            - RENEW_RESERVATION
            - OPEN_TAILBOX
        fileId:
          description: ID of a file that should be linked to the rental (only works on END operationType)
          type: integer
          format: int64
        vehicleCode:
          description: code of the vehicle. Not required but when passed it is verified that it matches the code of the vehicle and reject operations if it's not the same.
          type: string
        reason:
          description: |-
            Used on rental end to update the reason for a rental aka some description of why a rental was performed.
            This is mostly being used for business rentals where users have to document the purpose of the rental.
          type: string
        parkingReport:
          $ref: '#/components/schemas/ParkingReport'
          description: Optional parking report submitted when ending a rental. Only used with END operationType.
        communicationChannel:
          description: |-
            Defines if the device communication is via the API or via BLE (Bluetooth)

            - `API`: the backend will talk to the device to perform the requested operation
            - `BLE`: the client (ideally a mobile app) already executed the operation via Bluetooth but is telling the backend that it did so, we states can be updated
          type: string
          enum:
            - API
            - BLE
    RentalDrivingLogShort:
      type: object
      properties:
        required:
          type: boolean
        status:
          type: string
          enum:
            - OPEN
            - SUBMITTED
        dueDate:
          type: string
          format: date-time
    RentalDrivingLogUserResponse:
      type: object
      properties:
        rental:
          $ref: '#/components/schemas/RentalDrivingLogRentalResponse'
        status:
          type: string
          enum:
            - INVALID
            - VALID
            - SUBMITTED
        entries:
          type: array
          items:
            $ref: '#/components/schemas/DrivingLogEntryUserResponse'
        validationResult:
          $ref: '#/components/schemas/RentalDrivingLogValidationResult'
    RentalDrivingLogRentalResponse:
      type: object
      properties:
        id:
          type: integer
          format: int64
        startTime:
          type: string
          format: date-time
        endTime:
          type: string
          format: date-time
        startKilometers:
          type: number
          format: double
        endKilometers:
          type: number
          format: double
        distance:
          type: number
          format: double
          description: Distance driven (endKilometers - startKilometers, rounded up).
        reason:
          type: string
    DrivingLogEntryUserResponse:
      type: object
      properties:
        id:
          type: integer
          format: int64
        startKilometers:
          type: number
          format: double
          description: |-
            Start kilometers of the entry. 

            Has to be either the start kilometers of the rental or the end kiometers of the previous entry.
        endKilometers:
          type: number
          format: double
          description: |-
            End kilometers of the entry. 

            Has to be smaller or equal to the end kilometer of the rental.
        startDate:
          type: string
          format: date
          description: The date of the entry.
        startLocation:
          type: string
        endLocation:
          type: string
        reason:
          type: string
          description: Reason for the trip
        distance:
          type: number
          format: double
          description: Distance driven (endKilometers - startKilometers, rounded up).
        note:
          type: string
          description: Additional notes
        tripType:
          type: string
          description: Type of the trip (optional)
          enum:
            - BUSINESS
            - PRIVATE
            - TRIP_HOME
            - OTHER
      required:
        - startDate
    RentalDrivingLogEntryUserCreate:
      type: object
      properties:
        startKilometers:
          type: number
          format: double
        endKilometers:
          type: number
          format: double
        startLocation:
          type: string
        endLocation:
          type: string
        startDate:
          type: string
          format: date
        reason:
          type: string
        note:
          type: string
        tripType:
          type: string
          enum:
            - BUSINESS
            - PRIVATE
            - TRIP_HOME
            - OTHER
    RentalDrivingLogEntryUserUpdate:
      type: object
      properties:
        startKilometers:
          type: number
          format: double
        endKilometers:
          type: number
          format: double
        startLocation:
          type: string
        endLocation:
          type: string
        startDate:
          type: string
          format: date
        reason:
          type: string
        note:
          type: string
        tripType:
          type: string
          description: Type of the trip (optional)
          enum:
            - BUSINESS
            - PRIVATE
            - TRIP_HOME
            - OTHER
    RentalDrivingLogValidationResult:
      type: object
      properties:
        isValid:
          type: boolean
          description: Indicates if the driving log is valid or not.
        errorCode:
          type: string
          description: Error code if the driving log is not valid.
        errorMessage:
          type: string
          description: User message if the driving log is not valid
        entriesWithErrors:
          type: object
          additionalProperties:
            type: array
            items:
              $ref: '#/components/schemas/DrivingLogEntryValidationError'
          description: |-
            Entries with validation errors.

            The key always indicates the ID of the entry and each entry can have multiple validation errors.
      examples:
        - isValid: true
          errorCode: DL107
          errorMessage: Driving log is invalid
          entriesWithErrors:
            '1':
              - errorCode: DL109
                errorMessage: Driving log has no entry matching the start kilometers of the rental
                field: startKilometers
              - errorCode: DL111
                errorMessage: Driving log entry is outside the rental period
                field: startDate
            '2':
              - errorCode: DL109
                errorMessage: Driving log has no entry matching the start kilometers of the rental
                field: startKilometers
    DrivingLogEntryValidationError:
      type: object
      properties:
        errorCode:
          type: string
        errorMessage:
          type: string
        field:
          type: string
    File:
      type: object
      properties:
        id:
          type: integer
          format: int64
        fileName:
          type: string
        fileSize:
          type: integer
          format: int64
        mediaType:
          type: string
        isPublic:
          type: boolean
        state:
          type: string
          enum:
            - ACTIVE
            - INACTIVE
        downloadLink:
          type: string
    PricingBundlePrice:
      type: object
      properties:
        bookingPriceGross:
          type: number
        totalPriceGross:
          type: number
        additionsPriceGross:
          type: object
          additionalProperties:
            type: number
    PackageVoucherable:
      type: object
      description: A purchasable package. Contains ConstraintVoucherable fields plus package-specific pricing.
      properties:
        branchId:
          type: integer
          format: int64
        value:
          readOnly: true
          type: number
        code:
          type: string
        name:
          type: string
        description:
          type: string
        iconUrl:
          type: string
        signup:
          type: boolean
        applicableBranchIds:
          type: array
          items:
            type: integer
            format: int64
        applicableVehicleCategoryIds:
          type: array
          items:
            type: integer
            format: int64
        rentalRebate:
          type: number
        discount:
          type: number
        additionEntitlementCode:
          type: string
        numberOfRentals:
          type: integer
          format: int32
        validityTimeUnit:
          type: string
          enum:
            - NANOS
            - MICROS
            - MILLIS
            - SECONDS
            - MINUTES
            - HOURS
            - HALF_DAYS
            - DAYS
            - WEEKS
            - MONTHS
            - YEARS
            - DECADES
            - CENTURIES
            - MILLENNIA
            - ERAS
            - FOREVER
        validityPeriod:
          type: integer
          format: int32
        validityDateUntil:
          type: string
          format: date-time
        applicablePriceType:
          type: string
          enum:
            - TIME_PRICE
            - DRIVING_PRICE
            - PARKING_PRICE
            - DISTANCE_PRICE
            - RESERVATION_PRICE
            - UNLOCK_FEE
        monetary:
          type: boolean
        costSources:
          type: object
          additionalProperties:
            type: array
            items:
              type: string
        currency:
          type: string
          readOnly: true
        price:
          type: number
        priceDetails:
          type: object
          description: Tax breakdown of the package price.
          properties:
            net:
              type: number
            tax:
              type: number
            gross:
              type: number
            taxPercentage:
              type: number
        discountedPrice:
          type: number
        discountedPriceDetails:
          type: object
          description: Tax breakdown of the discounted price (when a promotion applies).
          properties:
            net:
              type: number
            tax:
              type: number
            gross:
              type: number
            taxPercentage:
              type: number
        appliedPromotion:
          type: object
          description: Applied promotion details (when a promotion code is used).
          properties:
            code:
              type: string
            discount:
              type: number
            amount:
              type: object
              properties:
                gross:
                  type: number
                net:
                  type: number
                tax:
                  type: number
        invoiceDescription:
          type: string
        highlight:
          type: boolean
        initialPackage:
          type: boolean
        customProperties:
          type: object
          additionalProperties: true
    BuyPackagePush:
      type: object
      properties:
        pushMethod:
          type: string
          enum:
            - IDEAL
            - SOFORT
            - BANCONTACT
            - APAYA
            - GENERIC
        info:
          type: string
        branch:
          type: integer
          format: int64
          deprecated: true
        branchId:
          type: integer
          format: int64
        packageCode:
          type: string
        promotionCode:
          type: string
        token:
          type: string
        paymentType:
          type: string
          enum:
            - CC
            - SEPA
            - PAYPAL
            - APPLEPAY
            - GOOGLEPAY
        additionalInformation:
          type: object
          additionalProperties: true
    BuyPackage:
      type: object
      required:
        - packageCode
      properties:
        branch:
          type: integer
          format: int64
          deprecated: true
        branchId:
          type: integer
          format: int64
        packageCode:
          type: string
        promotionCode:
          type: string
        token:
          type: string
        paymentType:
          type: string
          enum:
            - CC
            - SEPA
            - PAYPAL
            - APPLEPAY
            - GOOGLEPAY
        additionalInformation:
          type: object
          additionalProperties: true
    BalanceUpdateRental:
      type: object
      properties:
        state:
          type: string
          enum:
            - RESERVATION
            - ACTIVE
            - EXPIRED
            - ENDED
            - CANCELLED
            - ENDED_NO_MOVEMENT
        startTime:
          type: string
          format: date-time
        endTime:
          type: string
          format: date-time
    BalanceUpdateVoucher:
      type: object
      properties:
        type:
          type: string
          enum:
            - SIGNUP
            - PACKAGE
            - REFERRAL
            - PROMOTION
            - BY_ADMIN
            - UNKNOWN
            - SETTLEMENT
            - TOP_UP
            - CORRECTION
            - SUBSCRIPTION
            - REWARD
            - SINGLE_USE
            - SETTLEMENT_EXTERNAL
            - TRIGGERED
            - CUSTOMER_CARE
            - COLLECTION_INVOICE
        redemptionCode:
          type: string
    BalanceUpdateVoucherable:
      type: object
      properties:
        code:
          type: string
    BalanceUpdateBooking:
      type: object
      properties:
        state:
          type: string
          enum:
            - BOOKED
            - APPROVED
            - DELIVERED
            - SUCCESSFUL
            - CANCELED
            - ABORTED
            - EXPIRED
            - DECLINED
        startTime:
          type: string
          format: date-time
        endTime:
          type: string
          format: date-time
    BalanceUpdate:
      type: object
      properties:
        id:
          type: integer
          format: int64
        value:
          type: number
        rentalId:
          type: integer
          format: int64
        type:
          type: string
          enum:
            - SIGNUP
            - PACKAGE
            - REFERRAL
            - PROMOTION
            - CREDIT
            - RENTAL
            - SETTLEMENT
            - TOP_UP
            - CORRECTION
            - BOOKING_CANCELLATION
            - BOOKING_EXPIRED
            - INVALID
            - SINGLE_USE_VOUCHER
            - SUBSCRIPTION
            - REWARD
            - COLLECTION_INVOICE
            - REFUND
        createdAt:
          type: string
          format: date-time
        description:
          type: string
        rental:
          $ref: '#/components/schemas/BalanceUpdateRental'
        voucher:
          $ref: '#/components/schemas/BalanceUpdateVoucher'
        voucherable:
          $ref: '#/components/schemas/BalanceUpdateVoucherable'
        booking:
          $ref: '#/components/schemas/BalanceUpdateBooking'
        vehicleCategoryId:
          type: integer
          format: int64
    BalanceUser:
      type: object
      properties:
        email:
          type: string
        phone:
          type: string
        referralCode:
          type: string
    SettingSimple:
      type: object
      properties:
        key:
          type: string
        area:
          type: string
          enum:
            - APP
            - DASHBOARD
            - CORE
            - SHARED
        branchIds:
          type: array
          items:
            type: integer
            format: int64
        value:
          type: object
          additionalProperties: true
    UserSubscription:
      type: object
      description: >-
        A user's active subscription. remainingNumberOfRentals, remainingValueNet,
        and remainingValueGross are only populated in the list endpoint (GET /subscriptions without branchId).
      properties:
        id:
          type: integer
          format: int64
        subscription:
          $ref: '#/components/schemas/ConstraintVoucherable'
        switchingTarget:
          allOf:
            - $ref: '#/components/schemas/ConstraintVoucherable'
          nullable: true
          description: Pending switch target; populated only while state == SWITCHING.
        boughtAt:
          type: string
          format: date-time
        validUntil:
          type: string
          format: date-time
        autoRenewal:
          type: string
          enum:
            - ACTIVE
            - INACTIVE
            - FAILED
        canceled:
          type: boolean
        state:
          type: string
          enum:
            - RENEWING
            - EXPIRED
            - SWITCHING
            - SWITCHED
            - CANCELLED
        remainingNumberOfRentals:
          type: integer
          format: int32
        remainingValueNet:
          type: number
        remainingValueGross:
          type: number
        latestInvoiceId:
          type: integer
          format: int64
    SubscriptionSwitchRequest:
      type: object
      required:
        - targetSubscriptionCode
      properties:
        targetSubscriptionCode:
          type: string
          description: Code of the target subscription (tier) to switch to.
        switchImmediately:
          type: boolean
          description: >-
            true → terminate current subscription now (state → SWITCHED) and buy the target tier immediately.
            false → mark current subscription as SWITCHING; scheduler finalizes at the current subscription's validUntil.
          default: false
    SubscriptionVoucherable:
      description: A subscription available for purchase. Extends ConstraintVoucherable with pricing and subscription-specific fields.
      allOf:
        - $ref: '#/components/schemas/ConstraintVoucherable'
        - type: object
          properties:
            price:
              type: number
            invoiceDescription:
              type: string
            highlight:
              type: boolean
            currency:
              type: string
              readOnly: true
            signup:
              type: boolean
            showInUserApp:
              type: boolean
            state:
              type: string
              enum:
                - INACTIVE
                - ACTIVE
            interval:
              type: string
              enum:
                - DAILY
                - WEEKLY
                - MONTHLY
                - FIRST_OF_MONTH
                - YEARLY
                - FIRST_OF_YEAR
            initialPrice:
              type: number
            initialIterations:
              type: integer
              format: int32
            details:
              type: object
              additionalProperties: true
              description: Additional details map.
            customProperties:
              type: object
              additionalProperties: true
    Radar:
      type: object
      properties:
        id:
          type: integer
          format: int64
          readOnly: true
        startTime:
          type: string
          format: date-time
        endTime:
          type: string
          format: date-time
        address:
          type: string
        position:
          $ref: '#/components/schemas/Point'
        radius:
          type: integer
          format: int32
    RentalAddition:
      type: object
      description: A rental addition (e.g. insurance, child seat).
      properties:
        id:
          type: integer
          format: int64
          readOnly: true
        code:
          type: string
        name:
          type: string
          description: Translated addition name.
        description:
          type: string
          description: Translated addition description.
        isInternal:
          type: boolean
          description: Whether this rental addition is internal (not visible to end users).
        entitled:
          type: boolean
          description: Whether the current user is entitled to this addition.
        pricingInformation:
          $ref: '#/components/schemas/PricingInformation'
          description: Pricing details for this addition (set by the backend, not the mapper).
    AddMembers:
      type: object
      properties:
        emails:
          type: array
          items:
            type: string
        phones:
          type: array
          items:
            type: string
        codes:
          type: array
          items:
            type: string
        reason:
          type: string
    UserGroupMember:
      type: object
      properties:
        guserId:
          type: integer
          format: int64
        firstName:
          type: string
        lastName:
          type: string
        code:
          type: string
        email:
          type: string
        phone:
          type: string
        state:
          type: string
          enum:
            - ACTIVE
            - INACTIVE
        joinedAt:
          type: string
          format: date-time
          readOnly: true
          description: |-
            Timestamp when the user joined the user group.

            Note that this can be inaccurate in case a user left and re-joined the user group.
        superiorEmail:
          type: string
          description: The email of the superior of the user group member
        defaultCostCenter:
          type: object
          description: The default cost center for the user group member
          properties:
            id:
              type: integer
              format: int64
              description: The cost center identifier'
            name:
              type: string
              description: The cost center's name
        role:
          type: string
          enum:
            - OWNER
            - ADMIN
            - MEMBER
          description: 'The user group member role. The OWNER role is a read only role, and can''t be updated or assigned.'
    UserGroupMemberUpdate:
      type: object
      properties:
        defaultCostCenterId:
          type: integer
          format: int64
        state:
          type: string
          enum:
            - ACTIVE
            - INACTIVE
        superiorEmail:
          type: string
        role:
          type: string
          enum:
            - OWNER
            - ADMIN
            - MEMBER
          description: 'The user group member role. The OWNER role is a read only role, and can''t be updated or assigned.'
    UserGroupMemberUpdateFull:
      type: object
      required:
        - state
        - role
      properties:
        defaultCostCenterId:
          type: integer
          format: int64
        state:
          type: string
          enum:
            - ACTIVE
            - INACTIVE
        superiorEmail:
          type: string
        role:
          type: string
          enum:
            - OWNER
            - ADMIN
            - MEMBER
          description: 'The user group member role. The OWNER role is a read only role, and can''t be updated or assigned.'
    OneSignalSubscription:
      type: object
      description: Request body for registering a push notification subscription.
      required:
        - deviceId
      properties:
        deviceId:
          type: string
    ZoneId:
      type: string
      description: IANA time zone identifier (e.g., "Europe/Vienna").
      example: Europe/Vienna
    OpeningTimeEntry:
      type: object
      properties:
        day:
          type: string
          enum:
            - MONDAY
            - TUESDAY
            - WEDNESDAY
            - THURSDAY
            - FRIDAY
            - SATURDAY
            - SUNDAY
        slotNumber:
          type: integer
          format: int32
        state:
          type: string
          enum:
            - OPEN
            - CLOSED
        time:
          type: string
          format: partial-time
        prettyString:
          type: string
    OpeningInformation:
      type: object
      properties:
        openingTimeEntries:
          type: array
          items:
            $ref: '#/components/schemas/OpeningTimeEntry'
    Branch:
      type: object
      description: Branch (business unit) details.
      properties:
        id:
          type: integer
          format: int64
          readOnly: true
        code:
          type: string
        name:
          type: string
        state:
          type: string
          enum:
            - IN_PREPARATION
            - OPERATIONAL
            - MAINTENANCE
            - HIBERNATION
            - OUT_OF_BUSINESS
        businessArea:
          $ref: '#/components/schemas/MultiPolygon'
        position:
          $ref: '#/components/schemas/Point'
        timeZoneId:
          $ref: '#/components/schemas/ZoneId'
        types:
          type: array
          items:
            type: string
            enum:
              - FREE_FLOATING
              - STATION_BASED
              - RENTAL
              - BOOKING_TIMESLOT
              - BOOKING_FLOATING_TIME
              - CATEGORY
              - ALL
        billableBranchId:
          type: integer
          format: int64
        contactInfo:
          $ref: '#/components/schemas/BranchContactInfo'
        mapOverlayWarning:
          $ref: '#/components/schemas/MultiPolygon'
        mapOverlayWarningColor:
          type: string
        mapOverlayProhibited:
          $ref: '#/components/schemas/MultiPolygon'
        mapOverlayProhibitedColor:
          type: string
        appProperties:
          type: object
          additionalProperties: true
        openingInformation:
          $ref: '#/components/schemas/OpeningInformation'
        currency:
          type: string
        paymentProperties:
          type: object
          additionalProperties: true
    BranchResolverResult:
      type: object
      properties:
        branches:
          type: array
          items:
            $ref: '#/components/schemas/Branch'
        firstBranchHomeBillableBranch:
          type: boolean
        mapPosition:
          $ref: '#/components/schemas/Point'
    InvoicePrice:
      type: object
      properties:
        priceOfRentalsNet:
          type: number
        rebateNet:
          type: number
        subTotalNet:
          type: number
        paymentRebateNet:
          type: number
        priceOfRentalsGross:
          type: number
        rebateGross:
          type: number
        subTotalGross:
          type: number
        paymentRebateGross:
          type: number
        netPrice:
          type: number
        containedTax:
          type: number
        grossPrice:
          type: number
    Invoice:
      type: object
      description: Invoice details.
      properties:
        id:
          type: integer
          format: int64
        createdAt:
          type: string
          format: date-time
        updatedAt:
          type: string
          format: date-time
        invoiceId:
          type: string
        branchId:
          type: integer
          format: int64
        state:
          type: string
          deprecated: true
          description: 'Internal state of the invoice. Deprecated, use ''invoiceState'' instead.'
          enum:
            - OPEN
            - CLOSED
            - BILLED
            - PAID
            - EXCEPTION_OPENING
            - EXCEPTION_BILLING
            - EXCEPTION_SEPA
            - EXCEPTION_PAYING
            - IGNORE
            - DISPUTED
            - IN_PAYMENT
            - PUSH_WAITING_FOR_USER
            - PUSH_CANCELLED_BY_USER
            - PUSH_BANK_REFUSED
            - PUSH_ERROR_INITIALISING
            - REFUND_IN_PROGRESS
            - REFUNDED
            - EXCEPTION_REFUND
            - THREE_DS_WAITING_FOR_USER
            - THREE_DS_FAILED
            - COLLECTION
            - PAID_EXTERNALLY
            - REFUNDED_EXTERNALLY
            - UNKNOWN
            - BILLED_EXTERNAL_COLLECTION
            - CANCELLED_BY_REFUND
            - REFUNDED_BY_CANCELLATION
            - DISPUTE_LOST
            - NOTIFIED
            - EXCEPTION_NOTIFICATION
            - LOST
        invoiceState:
          type: string
          description: User facing state of the invoice.
          enum:
            - BILLED
            - SETTLED
            - PAYMENT_FAILED
            - REFUNDED
            - DUE
            - OVER_DUE
        title:
          type: string
          description: Display title of the invoice, derived from invoice line items.
        invoiceDate:
          type: string
          format: date-time
        dueDate:
          type: string
          format: date-time
          description: Date when the invoice is due (only applicable in case of external collection)
        price:
          $ref: '#/components/schemas/InvoicePrice'
        currency:
          type: string
        paymentId:
          type: integer
          format: int64
        paymentDetails:
          type: object
          properties:
            last4:
              type: string
              description: Last 4 digits - for example - of a credit card
            creditCardBrand:
              type: string
              description: brand of the credit card if payment was with a credit card
        costCenter:
          type: object
          description: Cost center of the invoice if applicable
          properties:
            id:
              type: integer
              format: int64
            name:
              type: string
              description: Name of the cost center
            externalReference:
              type: string
              description: External reference of the cost center
        isRetryable:
          type: boolean
          description: Whether the invoice payment can be retried (true when state is EXCEPTION_PAYING).
        type:
          type: string
          enum:
            - RECEIPT
            - INVOICE
            - UNKNOWN
          description: The type of this invoice document.
    GUserRentalRequirement:
      type: object
      properties:
        rentalRequirement:
          type: string
          enum:
            - SIGNUP
            - EMAIL
            - PHONE
            - FIRST_NAME
            - LAST_NAME
            - BIRTHDATE
            - STREET
            - POSTCODE
            - CITY
            - COUNTRY
            - PAYMENT_SOURCE
            - PAYMENT_PUSH
            - PAYMENT_ANY
            - SIGNUP_FEE_PUSH
            - SIGNUP_FEE_SOURCE
            - LICENSE
            - ID_DOCUMENT
            - MANUAL
            - MINIMUM_AGE
            - MAXIMUM_AGE
            - USER_HAVE_ENOUGH_BALANCE
            - USER_IS_NOT_LOCKED
            - TERMS_ACCEPTED_LATEST
            - TERMS_ACCEPTED
            - USER_HAS_NO_UNPAID_INVOICES
            - USER_REQUIRED_DRIVING_LICENCE_TYPE_PRESENT
            - UNKNOWN
            - CONFIGURATION_ISSUE
            - RENTAL_AUTHORITY
            - RIDE_PASS
            - INSUFFICIENT_B_CATEGORY_DURATION
            - POSITIVE_CREDIT
            - DISALLOW_CREDIT_CARD
            - DISALLOW_WALLET
            - CUSTOM_EXTERNAL_VERIFICATION
            - VEHICLE_IN_STATION_AREA
            - PREVIOUS_RENTALS
        fulfilled:
          type: boolean
        message:
          type: string
    RentalEndRequirementCheck:
      type: object
      properties:
        message:
          type: string
        code:
          type: string
    GUserRentalEndRequirements:
      type: object
      properties:
        fulfilled:
          type: boolean
        failedRequirements:
          type: array
          items:
            $ref: '#/components/schemas/RentalEndRequirementCheck'
    RentalEndCheckResult:
      type: object
      properties:
        requirements:
          description: Requirements that - if unfulfilled - prevent the ending of the rental.
          $ref: '#/components/schemas/GUserRentalEndRequirements'
        surcharges:
          type: array
          description: Surcharges that will be applied if the rental is ended in it's current location
          items:
            $ref: '#/components/schemas/RentalEndCheckGeofenceSurcharge'
    RentalEndCheckGeofenceSurcharge:
      type: object
      properties:
        code:
          type: string
          description: Code of the geofence surcharge that will be applied
        value:
          type: number
          description: Monetary value of the geofence surcharge
        name:
          type: string
          description: Name of the geofence surcharge
        description:
          type: string
          description: Description of the geofence surcharge
    PaymentSource:
      type: object
      description: Abstract payment source. The actual type is determined by the `type` field.
      properties:
        id:
          type: string
        type:
          type: string
          description: Payment method type.
          enum:
            - CC
            - SEPA
            - PAYPAL
            - APPLEPAY
            - GOOGLEPAY
        last4:
          type: string
        country:
          type: string
        fingerprint:
          type: string
        owner:
          type: string
        state:
          type: string
        branchIds:
          type: array
          items:
            type: integer
            format: int64
    ChangeSource:
      type: object
      required:
        - sourceId
      properties:
        sourceId:
          type: string
          minLength: 5
    AddTokenBasedPaymentMethod:
      type: object
      properties:
        token:
          type: string
    Voucher:
      type: object
      description: A redeemed voucher.
      properties:
        voucherableCode:
          type: string
        branch:
          type: integer
          format: int64
          deprecated: true
          description: Deprecated. Use branchId instead.
        branchId:
          type: integer
          format: int64
        name:
          type: string
          description: Translated voucher name.
        voucherType:
          type: string
          enum:
            - SIGNUP
            - PACKAGE
            - REFERRAL
            - PROMOTION
            - BY_ADMIN
            - UNKNOWN
            - SETTLEMENT
            - TOP_UP
            - CORRECTION
            - SUBSCRIPTION
            - REWARD
            - SINGLE_USE
            - SETTLEMENT_EXTERNAL
            - CASHBACK
            - TRIGGERED
            - CUSTOMER_CARE
            - COLLECTION_INVOICE
            - RIDE_PASS
            - RIDE_REWARD
        currency:
          type: string
          readOnly: true
        valueNet:
          type: number
        remainingValueNet:
          type: number
        valueGross:
          type: number
        remainingValueGross:
          type: number
        redemptionCode:
          type: string
        description:
          type: string
          description: Translated voucher description.
        signup:
          type: boolean
        prerequisitesMet:
          type: boolean
    Locale:
      type: object
      properties: { }
    MessageResource:
      type: object
      description: A translated message resource. Only the value is returned in frontend responses.
      properties:
        value:
          type: string
    TutorialSlide:
      type: object
      properties:
        title:
          type: string
        description:
          type: string
        image:
          type: string
        backgroundColour:
          type: string
        backgroundImage:
          type: string
        customCss:
          type: string
        rank:
          type: integer
          format: int32
        translationKeys:
          type: object
          additionalProperties:
            type: string
    Tutorial:
      type: object
      properties:
        id:
          type: integer
          format: int64
        name:
          type: string
        trigger:
          type: array
          items:
            type: string
            enum:
              - APP_START
              - MODE_SWITCH
              - VEHICLE_SELECTION
              - SIGNUP
              - FIRST_RENTAL
              - START_RENTAL
              - END_RENTAL
              - MENU
              - START_RESERVATION
              - MENU_LINK
        singleView:
          type: boolean
        slides:
          type: array
          items:
            $ref: '#/components/schemas/TutorialSlide'
        vehicleCategoryIds:
          type: array
          items:
            type: integer
            format: int64
        customerSupport:
          type: boolean
        doNotShowAgain:
          type: boolean
    JsonAnnotation:
      type: object
      properties:
        dtype:
          type: integer
          format: int32
        type:
          type: string
        id:
          readOnly: true
          type: integer
          format: int64
        name:
          type: string
        properties:
          type: object
          additionalProperties: true
    JsonTask:
      type: object
      properties:
        id:
          type: integer
          format: int64
        title:
          type: string
        description:
          type: string
        state:
          type: string
          enum:
            - NEW
            - IN_PROGRESS
            - RECURRING
            - COMPLETED
        priority:
          type: string
          enum:
            - LOW
            - NORMAL
            - HIGH
            - SEVERE
        category:
          type: string
          deprecated: true
          nullable: true
          description: >-
            Deprecated. Use `categoryInfo` instead.
            Contains the legacy enum value when the task's category matches a
            predefined system category. Omitted (null) when the task uses a
            custom category that does not correspond to any enum value.
            During migration, clients should prefer `categoryInfo` and treat
            this field as a legacy fallback only.
          enum:
            - MAINTENANCE
            - CLEANING
            - RELOCATION
            - INSPECTION
            - LOW_SOC
            - VEHICLE_SWAP
            - DAMAGE
            - ACCESS_AND_TELEMATICS
            - VEHICLE_FAULT
            - REGULATORY_AND_COMPLIANCE
            - BILLING_AND_CUSTOMER_CHARGE
            - ADMINISTRATIVE
        categoryInfo:
          description: >-
            The task's category as a structured object. Present whenever the
            task has a category assigned (both system and custom categories).
            Omitted when no category is set.
            Clients should prefer this field over the deprecated `category`
            enum. When both fields are present, `categoryInfo` is
            authoritative.
          $ref: '#/components/schemas/JsonTaskCategory'
        assignedTo:
          type: object
          properties:
            id:
              type: integer
              format: int64
            email:
              type: string
        createdAt:
          type: string
          format: date-time
    JsonTaskCategory:
      type: object
      description: >-
        Represents a task category. Can be a predefined system category or a
        custom category created by the operator. The `name` field matches the
        legacy `category` enum value for system categories.
      required:
        - id
        - name
      properties:
        id:
          type: integer
          format: int64
          description: Unique identifier of the category.
        name:
          type: string
          description: >-
            Display name of the category. For system categories this matches
            the legacy enum value; for custom categories it is
            operator-defined.
    JsonDamage:
      type: object
      properties:
        id:
          readOnly: true
          type: integer
          format: int64
        part:
          type: string
        description:
          type: string
        state:
          type: string
          enum:
            - NEW
            - APPROVED
            - UNDER_REPAIR
            - REPAIRED
            - IGNORED
        severity:
          type: string
          enum:
            - MINOR
            - MEDIUM
            - HIGH
            - CRITICAL
        reportedBy:
          type: object
          properties:
            id:
              type: integer
              format: int64
            email:
              type: string
        createdAt:
          readOnly: true
          type: string
          format: date-time
    JsonVehicleCategory:
      type: object
      properties:
        id:
          type: integer
          format: int64
        name:
          type: string
        coreProperties:
          $ref: '#/components/schemas/CoreVehicleProperties'
    VehicleList:
      type: object
      properties:
        id:
          type: integer
          format: int64
        code:
          type: string
        licensePlate:
          type: string
        name:
          type: string
        vin:
          type: string
        stateOfCharge:
          type: integer
          format: int32
        iotStateOfCharge:
          type: integer
          format: int32
        kilometers:
          type: number
          format: double
        rentalState:
          $ref: '#/components/schemas/VehicleRentalState'
        serviceStateV2:
          type: string
          enum:
            - FUNCTIONAL
            - INSPECT
            - RELOCATE
        batteryLevel:
          type: string
          enum:
            - UNKNOWN
            - HIGH
            - LOW
            - CRITICAL
            - MEDIUM
            - OPERATIONAL
            - OUT_OF_ORDER
            - OPERATIONAL_DB_VALUES
        updatedAt:
          type: string
          format: date-time
        branchId:
          type: integer
          format: int64
        categoryId:
          type: integer
          format: int64
        serviceStateV2LastModifiedAt:
          type: string
          format: date-time
        batteryLevelLastModifiedAt:
          type: string
          format: date-time
        rentalStateLastModifiedAt:
          type: string
          format: date-time
        powerStateLastModifiedAt:
          type: string
          format: date-time
        positionLastModifiedAt:
          type: string
          format: date-time
        lastEndedRentalAt:
          type: string
          format: date-time
        lastOperationalAt:
          type: string
          format: date-time
        lastOutOfOrderAt:
          type: string
          format: date-time
        lastOnlineAt:
          type: string
          format: date-time
        inactiveFor:
          $ref: '#/components/schemas/Duration'
        customProperties:
          type: object
          additionalProperties: true
        module:
          $ref: '#/components/schemas/JsonModule'
        iotModuleLevel:
          type: number
          format: float
        uuid:
          type: string
        createdAt:
          type: string
          format: date-time
        chargingState:
          type: string
          enum:
            - UNKNOWN
            - UNPLUGGED
            - PLUGGED
            - CHARGING
        powerState:
          type: string
          enum:
            - UNKNOWN
            - 'OFF'
            - 'ON'
        carLockState:
          type: string
          enum:
            - UNKNOWN
            - 'UNLOCKED'
            - 'LOCKED'
        position:
          $ref: '#/components/schemas/Point'
        address:
          type: string
        legalInspectionDate:
          type: string
          format: date
        openTasks:
          type: array
          items:
            $ref: '#/components/schemas/JsonTask'
          description: List of open tasks for this vehicle.
          deprecated: true
        openDamages:
          type: array
          items:
            $ref: '#/components/schemas/JsonDamage'
          description: List of open damages for this vehicle.
          deprecated: true
        openTasksCount:
          type: integer
          format: int64
          deprecated: true
          description: 'Deprecated. Use openTasks instead.'
        openDamagesCount:
          type: integer
          format: int64
          deprecated: true
          description: 'Deprecated. Use openDamages instead.'
        annotations:
          type: array
          items:
            $ref: '#/components/schemas/JsonAnnotation'
        hasOpenTasksForCurrentUser:
          type: boolean
        category:
          $ref: '#/components/schemas/JsonVehicleCategory'
        remainingKilometers:
          type: integer
          format: int32
        benefit:
          type: string
          enum:
            - DISCOUNTED
            - REWARDED
        benefits:
          type: array
          items:
            type: string
            enum:
              - DISCOUNTED
              - REWARDED
    GenerateBluetoothTokenRequest:
      type: object
      required:
        - parameters
      properties:
        parameters:
          type: object
          additionalProperties: true
    BluetoothToken:
      type: object
      properties:
        validFrom:
          type: string
          format: date-time
        validTo:
          type: string
          format: date-time
        deviceType:
          type: string
        bluetoothKeyId:
          type: string
        parameters:
          type: object
          additionalProperties: true
    BluetoothTokenWrapper:
      type: object
      properties:
        parkDriveToken:
          $ref: '#/components/schemas/BluetoothToken'
        startEndToken:
          $ref: '#/components/schemas/BluetoothToken'
    DamageSubmitRequest:
      description: >-
        Request body for submitting a new damage report on a vehicle.
      type: object
      required:
        - part
        - branchId
      properties:
        part:
          type: string
        branchId:
          type: integer
          format: int64
        state:
          type: string
          enum:
            - NEW
            - APPROVED
            - UNDER_REPAIR
            - REPAIRED
            - IGNORED
        severity:
          type: string
          enum:
            - MINOR
            - MEDIUM
            - HIGH
            - CRITICAL
        vehiclePosition:
          $ref: '#/components/schemas/Point'
        userPosition:
          $ref: '#/components/schemas/Point'
        currentRentalId:
          type: integer
          format: int64
        repairCode:
          type: string
        files:
          type: array
          items:
            $ref: '#/components/schemas/File'
    DamageResponse:
      description: >-
        Damage summary returned by vehicle-level damage endpoints.
        Only includes fields populated by the frontend mapper.
      type: object
      properties:
        id:
          readOnly: true
          type: integer
          format: int64
        part:
          type: string
        state:
          type: string
          enum:
            - NEW
            - APPROVED
            - UNDER_REPAIR
            - REPAIRED
            - IGNORED
        vehicleId:
          type: integer
          format: int64
        repairCode:
          type: string
    DamageFileResponse:
      type: object
      description: File attached to a damage report.
      required:
        - id
        - createdAt
        - updatedAt
        - fileSize
        - mediaType
        - downloadLink
      properties:
        id:
          type: integer
          format: int64
        createdAt:
          type: string
          format: date-time
        updatedAt:
          type: string
          format: date-time
        fileSize:
          type: integer
          format: int64
        mediaType:
          type: string
        downloadLink:
          type: string
    DamageWithFilesResponse:
      description: >-
        Damage report including file attachments. Returned by the rental
        damages endpoint.
      allOf:
        - $ref: '#/components/schemas/DamageResponse'
        - type: object
          properties:
            files:
              type: array
              items:
                $ref: '#/components/schemas/DamageFileResponse'
    JsonRental:
      type: object
      description: Embedded rental summary used in booking list responses.
      properties:
        id:
          type: integer
          format: int64
        state:
          type: string
          enum:
            - RESERVATION
            - ACTIVE
            - EXPIRED
            - ENDED
            - CANCELLED
            - ENDED_NO_MOVEMENT
        startTime:
          type: string
          format: date-time
        endTime:
          type: string
          format: date-time
        startAddress:
          type: string
        vehicle:
          type: object
          properties:
            licensePlate:
              type: string
            categoryId:
              type: integer
              format: int64
            id:
              type: integer
              format: int64
            name:
              type: string
        price:
          type: object
          properties:
            priceGross:
              type: number
        startKilometers:
          type: number
          format: double
        endKilometers:
          type: number
          format: double
        distance:
          type: number
          format: double
        rating:
          type: object
          properties:
            value:
              type: integer
              format: int32
            description:
              type: string
    Booking:
      type: object
      description: Booking details.
      properties:
        id:
          type: integer
          format: int64
        guserId:
          type: integer
          format: int64
        rentalId:
          type: integer
          format: int64
        rental:
          $ref: '#/components/schemas/Rental'
        branchId:
          type: integer
          format: int64
        branch:
          $ref: '#/components/schemas/Branch'
        endBranchId:
          type: integer
          format: int64
        endBranch:
          $ref: '#/components/schemas/Branch'
        vehicle:
          $ref: '#/components/schemas/JsonVehicle'
        vehicleCategoryId:
          type: integer
          format: int64
        startTime:
          type: string
          format: date-time
        endTime:
          type: string
          format: date-time
        state:
          type: string
          enum:
            - BOOKED
            - APPROVED
            - DELIVERED
            - SUCCESSFUL
            - CANCELED
            - ABORTED
            - EXPIRED
            - DECLINED
        type:
          type: string
          enum:
            - STATION
            - FLOATING
        invoice:
          $ref: '#/components/schemas/Invoice'
        costs:
          type: number
        startPosition:
          $ref: '#/components/schemas/Point'
        startPositionRadius:
          type: number
          format: double
        userGroupCode:
          type: string
        rentalType:
          $ref: '#/components/schemas/RentalType'
        reason:
          type: string
        rejectionReason:
          type: string
        additions:
          type: array
          items:
            type: string
        linkedBookingId:
          type: integer
          format: int64
        estimatedPrice:
          type: object
          description: Estimated price of the booking.
          properties:
            estimated:
              type: boolean
            grossPrice:
              type: number
              format: double
            netPrice:
              type: number
              format: double
            currency:
              type: string
        pricing:
          $ref: '#/components/schemas/BookingPricingDetails'
        cancellationInformation:
          type: object
          readOnly: true
          description: Information about whether and until when this booking can be cancelled.
          properties:
            canCancel:
              type: boolean
              description: Indicates if the booking can still be cancelled
            freeUntil:
              type: string
              format: date-time
              description: Indicates until which timestamp the booking can be cancelled without a fee
            estimatedFee:
              type: number
              format: double
              description: |-
                Provides an estimation of the cancellation fee at the time of the API response.

                Note that the actual fee could be higher on cancellation and can only be determined during cancellation.
        drivingLog:
          $ref: '#/components/schemas/RentalDrivingLogShort'
          description: >-
            Conditionally set for bookings with user groups when the rental is in an ended state.
            Contains driving log requirement status and submission deadline.
    ListBooking:
      type: object
      properties:
        id:
          type: integer
          format: int64
        state:
          type: string
          enum:
            - BOOKED
            - APPROVED
            - DELIVERED
            - SUCCESSFUL
            - CANCELED
            - ABORTED
            - EXPIRED
            - DECLINED
        startTime:
          type: string
          format: date-time
        endTime:
          type: string
          format: date-time
        vehicleCategoryId:
          type: integer
          format: int64
        type:
          type: string
          enum:
            - STATION
            - FLOATING
        rentalType:
          $ref: '#/components/schemas/RentalType'
        guser:
          $ref: '#/components/schemas/JsonGUser'
        group:
          $ref: '#/components/schemas/JsonGroup'
        branch:
          $ref: '#/components/schemas/JsonBranch'
        endBranch:
          $ref: '#/components/schemas/JsonBranch'
        rental:
          $ref: '#/components/schemas/JsonRental'
        vehicle:
          $ref: '#/components/schemas/JsonVehicle'
        plannedVehicle:
          $ref: '#/components/schemas/JsonVehicle'
        editableUntil:
          type: string
          format: date-time
          description: |-
            Point in time until this booking is editable.
            Not editable if `null`
        extendableUntil:
          type: string
          format: date-time
          description: |-
            Latest point in time to which this booking can be extended to.
            Not extendable if `null`
        price:
          type: object
          properties:
            estimated:
              type: boolean
              description: Indicates if the prices are only estimations of the final rental price.
            grossPrice:
              type: number
              format: double
              description: |-
                Gross price of the booking

                This is only an estimation if the booking is for a future rental.
            netPrice:
              type: number
              format: double
              description: |-
                Net price of the booking

                This is only an estimation if the booking is for a future rental.
            currency:
              type: string
              description: Currency the prices are in
        pricing:
          $ref: '#/components/schemas/BookingPricingDetails'
        drivingLog:
          $ref: '#/components/schemas/RentalDrivingLogShort'
        additions:
          type: array
          items:
            type: string
          description: booked additions for the trip
          example:
            - INSURANCE
            - CHILD_SEAT
        invoiceId:
          type: integer
          format: int64
        reason:
          type: string
    BookingPricingDetails:
      type: object
      x-examples:
        BookingPricingDetailsExample:
          value:
            timePrice:
              timeTotalGross: 8
              timeTotalNet: 6.67
              earlyReturn:
                remainingPriceDiscountPercentage: 20
              lateReturn:
                gracePeriod:
                  timeUnit: Minutes
                  value: 2
                cumulativePenalty:
                  timeUnit: Minutes
                  value: 1.5
            distancePrice:
              rate:
                included: 5
                rate: 2
              unit: KILOMETERS
            currency: EUR
      properties:
        timePrice:
          type: object
          description: Pricing details based on time.
          properties:
            timeTotalGross:
              type: number
              description: Total gross price for the rental time (without any distance)
            timeTotalNet:
              type: number
              description: Total gross price for the rental time (without any distance)
            earlyReturn:
              type: object
              description: Pricing discounts for early returns
              properties:
                remainingPriceDiscountPercentage:
                  type: number
            lateReturn:
              type: object
              description: Pricing penalties for late returns
              properties:
                gracePeriod:
                  type: object
                  description: Grace period for late returns
                  properties:
                    timeUnit:
                      type: string
                      enum:
                        - Minutes
                        - Hours
                        - Days
                    value:
                      type: number
                cumulativePenalty:
                  type: object
                  properties:
                    timeUnit:
                      type: string
                      enum:
                        - Minutes
                        - Hours
                        - Days
                    value:
                      type: number
        distancePrice:
          type: object
          description: Pricing details based on distance.
          properties:
            rate:
              type: object
              properties:
                included:
                  type: number
                  description: Included distance in the rental price
                rate:
                  type: number
                  description: Rate per distance unit
            unit:
              type: string
              enum:
                - KILOMETERS
                - MILES
              description: Distance unit
        currency:
          type: string
    AddBooking:
      type: object
      properties:
        branchId:
          type: integer
          format: int64
        endBranchId:
          type: integer
          format: int64
        vehicleCategoryId:
          type: integer
          format: int64
        startTime:
          type: string
          format: date-time
        endTime:
          type: string
          format: date-time
        startPosition:
          $ref: '#/components/schemas/Point'
        startPositionRadius:
          type: number
          format: double
        userGroupCode:
          type: string
        rentalType:
          $ref: '#/components/schemas/RentalType'
        rentalSource:
          type: string
          enum:
            - INTERNAL
            - TURNN
        reason:
          type: string
        externalReference:
          type: string
        additions:
          type: array
          items:
            type: string
        linkedBookingId:
          type: integer
          format: int64
        bookingRequest:
          type: boolean
          description: 'Create this booking as a request, which needs to be approved by operator.'
        costCenterId:
          type: integer
          format: int64
      required:
        - branchId
        - startTime
        - endTime
    BookingUpdateRequest:
      type: object
      properties:
        startTime:
          type: string
          format: date-time
        endTime:
          type: string
          format: date-time
        startPosition:
          $ref: '#/components/schemas/Point'
        startPositionRadius:
          type: number
          format: double
        reason:
          type: string
        vehicleCategoryId:
          type: integer
          format: int64
        additions:
          type: array
          items:
            type: string
        costCenterId:
          type: integer
          format: int64
          description: Set a cost center for the booking. Set to -1 to delete a cost center.
        endBranchId:
          type: integer
          format: int64
          description: Set end branch for the booking (used for A to B bookings only).
    TimeSlot:
      type: object
      properties:
        startTime:
          type: string
          format: partial-time
        endTime:
          type: string
          format: partial-time
    BookingAvailabilityDay:
      type: object
      properties:
        date:
          type: string
          format: date
        availableState:
          type: string
          enum:
            - AVAILABLE
            - UNAVAILABLE
            - PARTIALLY_AVAILABLE
        availableSlots:
          type: array
          items:
            $ref: '#/components/schemas/TimeSlot'
    CategoryWithPrice:
      type: object
      properties:
        categoryId:
          type: integer
          format: int64
        branchId:
          type: integer
          format: int64
        alternative:
          type: boolean
        netPrice:
          type: number
        grossPrice:
          type: number
        currency:
          type: string
        pricing:
          $ref: '#/components/schemas/BookingPricingDetails'
        applicableVouchers:
          type: array
          items:
            $ref: '#/components/schemas/ConstraintVoucher'
    StationBookingAvailability:
      title: StationBookingAvailability
      type: object
      x-examples:
        Vienna:
          branch:
            id: 3
            code: AT-VIE
            name: Vienna
            state: OPERATIONAL
            position:
              type: Point
              coordinates:
                - 16.363449
                - 48.210033
            currency: EUR
            billableBranchId: 6
          availableCategories:
            - categoryId: 35
              netPrice: 144.44
              grossPrice: 169
              currency: EUR
      properties:
        branch:
          type: object
          description: Station with a booking availability
          properties:
            id:
              type: integer
              format: int64
              description: Identifier of the branch
            code:
              type: string
              description: Code of the branch
            name:
              type: string
              description: Name of the branch
            state:
              type: string
              enum:
                - IN_PREPARATION
                - OPERATIONAL
                - MAINTENANCE
                - HIBERNATION
                - OUT_OF_BUSINESS
              description: Current state of the branch
            timeZoneId:
              $ref: '#/components/schemas/ZoneId'
            position:
              $ref: '#/components/schemas/Point'
            billableBranchId:
              type: integer
              format: int64
              description: Identifier of the billable branch this branch belongs to.
            currency:
              type: string
              description: Default currency of the branch
        availableCategories:
          type: array
          description: 'Available vehicle categories in this branch, can be empty if none are available.'
          items:
            type: object
            properties:
              id:
                type: integer
                format: int64
                description: Identifier of the vehicle category
              name:
                type: string
                description: Name of the vehicle category
              appProperties:
                type: string
              vehicleAttributes:
                type: array
                items:
                  type: object
                  properties:
                    id:
                      type: integer
                      format: int64
                    name:
                      type: string
              netPrice:
                type: number
                format: double
                description: |-
                  Estimated net price for the specified period.

                  Only returned if a request is made for a specific period.
              grossPrice:
                type: number
                format: double
                description: |-
                  Estimated gross price for the specified period.

                  Only returned if a request is made for a specific period.
              currency:
                type: string
                description: |-
                  Currency of the price estimation for the specified period.

                  Only returned if a request is made for a specific period.
              pricing:
                $ref: '#/components/schemas/BookingPricingDetails'
              availableTimeSlots:
                $ref: '#/components/schemas/DateTimeRange'
    StationBookingAvailabilityRequest:
      type: object
      properties:
        timeSlots:
          type: array
          items:
            $ref: '#/components/schemas/LocalDateTimeRange'
          description: 'If no value provided, then next 15 days will be taken into account.'
        dateFilterType:
          type: string
          enum:
            - SPECIFIC
            - FLEXIBLE
          default: FLEXIBLE
          description: |
            Status of the operation:
            - `SPECIFIC`: Return only available slots that start and end exactly by provided time slots.
            - `FLEXIBLE`: Return all available slots that start and end between provided time slots.
        latMin:
          type: number
          format: double
          description: The minimum latitude (furthest south) of the search box for branches.
        latMax:
          type: number
          format: double
          description: The maximum latitude (furthest north) of the search box for branches.
        lngMin:
          type: number
          format: double
          description: The minimum longitude (furthest west) of the search box for branches.
        lngMax:
          type: number
          format: double
          description: The maximum longitude (furthest east) of the search box for branches.
        stationId:
          type: integer
          format: int64
        endStationId:
          type: integer
          format: int64
        vehicleCategoryId:
          type: integer
          format: int64
        'vehicleAttributes[ANY]':
          type: array
          items:
            type: integer
            format: int64
          description: The vehicle attributes where any in the list have to match a given vehicle category.
        'vehicleAttributes[ALL]':
          type: array
          items:
            type: integer
            format: int64
          description: The vehicle attributes where all in the list have to match a given vehicle category.
        'vehicleAttributes[ONE]':
          type: array
          items:
            type: integer
            format: int64
          description: The vehicle attributes where exactly one in a vehicle attribute group has to match a given vehicle category.
    DateTimeRange:
      title: TimeSlot
      type: object
      properties:
        startTime:
          type: string
          format: date-time
          description: Start time of the time range.
        endTime:
          type: string
          format: date-time
          description: End time of the time range.
    LocalDateTimeRange:
      title: TimeSlot
      type: object
      properties:
        startTime:
          type: string
          format: date-time
          description: 'Start time of the time range. Time zone offset must not be provided, station''s time zone is taken into consideration'
          example: '2024-12-09T15:30:00'
        endTime:
          type: string
          format: date-time
          description: 'End time of the time range. Time zone offset must not be provided, station''s time zone is taken into consideration'
          example: '2024-12-09T16:30:00'
    BillingSummary:
      title: BillingSummary
      type: object
      x-examples:
        activeBillingCycle: MONTHLY
        activeBillingMode: INVOICING
        perBusinessUnitSummary:
          - currency: EUR
            businessUnitId: 1
            businessUnitName: Austria
            defaultBusinessUnit: true
            amount: 22
          - currency: BAM
            businessUnitId: 2
            businessUnitName: Bosnia and Herzegovina
            defaultBusinessUnit: false
            amount: 53
      properties:
        activeBillingCycle:
          type: string
          enum:
            - PAY_AS_YOU_GO
            - HOURLY
            - DAILY
            - WEEKLY
            - BI_WEEKLY
            - MONTHLY
          description: Currently active billing cycle
        activeBillingMode:
          type: string
          enum:
            - BALANCE_SETTLEMENT
            - INVOICING
          description: Active billing mode
        perBusinessUnitSummary:
          type: array
          description: ...
          items:
            type: object
            properties:
              currency:
                type: string
              businessUnitId:
                type: number
                format: int64
              businessUnitName:
                type: string
              defaultBusinessUnit:
                type: boolean
                description: Whether this business unit is default one for the user group.
              amount:
                type: number
                format: double
                description: 'Total amount on the balance, or in open invoices.'
    CustomerIdentityCardResponse:
      title: CustomerIdentityCardResponse
      type: object
      x-examples:
        id: 156
        cardNumber: '0010142'
      properties:
        id:
          type: integer
          format: int64
          description: Identifier of the customer identity card
        cardNumber:
          type: string
          description: Card number of the customer identity card
    VehicleCardResponse:
      title: VehicleCardResponse
      type: object
      x-examples:
        id: 156
        cardNumber: '0010142'
        pin: 4932
        instructions: Only to be used at OMV fuel stations
        type: FUEL
        provider: OMV
      properties:
        id:
          type: integer
          format: int64
          description: Identifier of the vehicle card
        cardNumber:
          type: string
          description: Card number of the vehicle card
        pin:
          type: string
          description: Optional PIN that is required when using the card.
        instructions:
          type: string
          description: Optional instructions on how to use the card.
        provider:
          type: string
          description: 'Name of the provider that issued the card (e.g., company providing the charging facilities).'
        type:
          type: string
          description: Type of the card describing it's purpose.
          enum:
            - FUEL
            - CHARGING
            - PARKING
            - ROADSIDE_ASSISTANCE
            - OTHER
    InitVerification:
      type: object
      x-examples:
        Example 1:
          supportedTypes:
            - VERIFF_SDK
            - ONFIDO_SDK
            - ONFIDO_WEB
      examples:
        - supportedTypes:
            - VERIFF_SDK
            - ONFIDO_SDK
            - ONFIDO_WEB
      properties:
        supportedTypes:
          type: array
          minItems: 1
          uniqueItems: true
          items:
            enum:
              - VERIFF_SDK
              - ONFIDO_SDK
              - ONFIDO_WEB
        documentVerificationType:
          type: string
          description: Default value is DRIVING_LICENSE.
          enum:
            - ANY
            - DRIVING_LICENSE
    VehicleAttributeGroupResponse:
      type: object
      properties:
        id:
          type: number
          format: int64
          example: 1
        name:
          type: string
          example: Vehicle Type
          description: Name of the attribute group
        order:
          type: number
          format: int32
          example: 1
          description: Order of the attribute group in which it should show up in the UI
        filterType:
          type: string
          enum:
            - ANY
            - ALL
            - ONE
          example: ANY
          description: When filtering if any or all selected attributes have to match the vehicle
        selectionType:
          type: string
          enum:
            - CHECKBOX
            - SWITCH
            - RADIO
          example: CHECKBOX
          description: How the selection should be rendered in the UI
        attributes:
          type: array
          items:
            $ref: '#/components/schemas/VehicleAttributeResponse'
    VehicleAttributeResponse:
      type: object
      properties:
        id:
          type: number
          format: int64
          example: 1
        name:
          type: string
          example: Sedan
          description: Name of the attribute
    BookingPrice:
      title: BookingPrice
      type: object
      description: Price details for a booking
      properties:
        estimated:
          type: boolean
          description: '`False` if this price is already final or `true` if it''s just an estimation'
        grossPrice:
          type: number
          description: The totol gross price of this booking
        netPrice:
          type: number
          description: The totol gross net of this booking
        currency:
          type: string
          description: Currency of this booking
        pricing:
          $ref: '#/components/schemas/BookingPricingDetails'
        additions:
          type: array
          items:
            $ref: '#/components/schemas/AdditionPrice'
      examples:
        - estimated: true
          grossPrice: 44.6
          netPrice: 36.9
          currency: EUR
          pricing:
            timePrice:
              timeTotalGross: 28.6
              timeTotalNet: 22.2
              earlyReturn:
                remainingPriceDiscountPercentage: 0.2
              lateReturn:
                gracePeriod:
                  timeUnit: Hours
                  value: 2
                cumulativePenalty:
                  timeUnit: Minutes
                  value: 0.2
            distancePrice:
              rate:
                included: 50
                rate: 0.4
              unit: KILOMETERS
            currency: string
          additions:
            - code: insurance
              price: 12.8
    AdditionPrice:
      title: AdditionPrice
      type: object
      properties:
        code:
          type: string
          description: Identifier of the addition
        name:
          type: string
          description: Human-readable name of the addition
        price:
          type: number
          description: Price of the addition (gross and estimated)
      description: Extras added to the pricing
    PhysicalStationDetails:
      type: object
      properties:
        id:
          type: string
        name:
          type: string
        branch:
          $ref: '#/components/schemas/JsonBranch'
        branchId:
          type: integer
          deprecated: true
          description: Deprecated
        currency:
          type: string
          deprecated: true
          description: Deprecated
        state:
          type: string
          enum:
            - OPEN
            - OUTSIDE_BUSINESS_HOURS
            - TEMPORARILY_CLOSED
        info:
          $ref: '#/components/schemas/PhysicalStationInfo'
        slots:
          $ref: '#/components/schemas/PhysicalStationSlotsAvailability'
          description: Deprecated
        availableCategories:
          type: array
          items:
            $ref: '#/components/schemas/PhysicalStationAvailableVehicleCategory'
        availableVehicles:
          type: array
          items:
            $ref: '#/components/schemas/PhysicalStationAvailableVehicle'
        availability:
          $ref: '#/components/schemas/PhysicalStationAvailability'
        distanceFromLocation:
          type: number
          format: double
          nullable: true
          description: Distance from the provided lat/lng coordinates to this station in kilometers. Null when no coordinates were provided.
    PhysicalStationInfo:
      type: object
      properties:
        address:
          type: string
          description: address of the station
        position:
          $ref: '#/components/schemas/Point'
        openingInformation:
          $ref: '#/components/schemas/OpeningInformation'
    PhysicalStationAvailability:
      type: object
      properties:
        totalAvailableVehiclesCount:
          type: integer
          description: Total number of available vehicles at this station
          format: int64
        totalAvailableParkingCount:
          type: integer
          format: int64
        slotsAvailability:
          $ref: '#/components/schemas/PhysicalStationSlotsAvailability'
        parkingAreaAvailability:
          $ref: '#/components/schemas/PhysicalStationParkingAreaAvailability'
    PhysicalStationSlotsAvailability:
      type: object
      properties:
        total:
          type: integer
          description: total number of slots in the station
        free:
          type: integer
          description: number of slots that are not occupied by a vehicle and can be used to dock another vehicle
        withAvailableVehicle:
          type: integer
          description: number of slots that have vehicles available for rental
    PhysicalStationParkingAreaAvailability:
      type: object
      title: Parking area availability
      properties:
        capacity:
          type: integer
          description: 'Total number of availabile parking places. If null, then there is unlimited parking.'
        availableParkingCount:
          type: integer
          description: 'Number of available parking spaces. If null, then it is unlimited.'
        availableVehiclesCount:
          type: integer
          description: Number of vehicles available for retnal
        reservedParkingCount:
          type: integer
          description: Number of parking spots reserved by active rentals
    PhysicalStationAvailableVehicle:
      type: object
      properties:
        id:
          type: integer
        name:
          type: string
          description: name of the vehicle
        licensePlate:
          type: string
          description: license plate number of the vehicle
        code:
          type: string
          description: code of the vehicle
        categoryId:
          type: integer
        soc:
          type: integer
          description: State of Charge of the vehicle
        remainingKilometers:
          type: number
          format: double
          description: Remaining kilometers with current charge. This value represents just an estimations.
    PhysicalStationAvailableVehicleCategory:
      type: object
      properties:
        id:
          type: integer
        name:
          type: string
          description: Name of the vehicle category
        imageUrl:
          type: string
          description: URL to an image representing this vehicle category
        pricing:
          $ref: '#/components/schemas/PricingInformation'
        defaultPricingOption:
          $ref: '#/components/schemas/OnDemandPricingOptionDetails'
        availableVehicles:
          type: integer
          description: Number of available vehicles in this category within the station
    OnDemandPricingOptionDetails:
      type: object
      x-examples:
        Example 1:
          priceSettingId: 1038
          pricingDetails:
            name: Base
            currency: BAM
            onDemandRentalPricingDetails:
              timeUnit: MINUTES
              type: ENDING_TIMESLOT
              pricePerKilometerIncludedInMaxPrice: false
              timeslots:
                '0':
                  pricePerUnitDriving:
                    gross: 0.43
                    net: 0.37
                    tax: 0.06
                  pricePerUnitParking:
                    gross: 0
                    net: 0
                    tax: 0
                  pricePerKilometer:
                    gross: 0.39
                    net: 0.33
                    tax: 0.06
                  includedKilometerCount: 100
            onDemandExtendedReservationPricingDetails:
              timeUnit: MINUTES
              intervalPrice:
                '5':
                  gross: 2.5
                  net: 2.14
                  tax: 0.36
                '10':
                  gross: 5
                  net: 4.27
                  tax: 0.73
                '15':
                  gross: 7.5
                  net: 6.41
                  tax: 1.09
          defaultForCategoryAndBranch: true
      properties:
        priceSettingId:
          type: integer
          format: int64
        pricingDetails:
          type: object
          properties:
            name:
              type: string
            currency:
              type: string
            onDemandRentalPricingDetails:
              type: object
              properties:
                timeUnit:
                  type: string
                  enum:
                    - MINUTES
                    - HOURS
                    - DAYS
                    - SECONDS
                type:
                  type: string
                  enum:
                    - ENDING_TIMESLOT
                    - CUMULATIVE_TIMESLOTS
                pricePerKilometerIncludedInMaxPrice:
                  type: boolean
                unlockFee:
                  $ref: '#/components/schemas/PriceDetails'
                timeslots:
                  type: object
                  properties:
                    '0':
                      type: object
                      properties:
                        basePrice:
                          $ref: '#/components/schemas/PriceDetails'
                        pricePerUnitDriving:
                          $ref: '#/components/schemas/PriceDetails'
                        pricePerUnitParking:
                          $ref: '#/components/schemas/PriceDetails'
                        pricePerKilometer:
                          $ref: '#/components/schemas/PriceDetails'
                        includedKilometerCount:
                          type: integer
                        includedUnitCount:
                          type: integer
                        maxPrice:
                          $ref: '#/components/schemas/PriceDetails'
            onDemandExtendedReservationPricingDetails:
              type: object
              properties:
                timeUnit:
                  type: string
                  enum:
                    - MINUTES
                    - HOURS
                    - DAYS
                    - SECONDS
                intervalPrice:
                  type: object
                  properties:
                    '5':
                      $ref: '#/components/schemas/PriceDetails'
                    '10':
                      $ref: '#/components/schemas/PriceDetails'
                    '15':
                      $ref: '#/components/schemas/PriceDetails'
                reservationUnitPrice:
                  $ref: '#/components/schemas/PriceDetails'
        defaultForCategoryAndBranch:
          type: boolean
    PriceDetails:
      title: PriceDetails
      type: object
      description: 'Price details with gorss, net and tax valuels'
      properties:
        gross:
          type: number
          format: double
        net:
          type: number
          format: double
        tax:
          type: number
          format: double
    DocumentVerificationState:
      title: Driving License Verification State
      type: string
      enum:
        - UNVERIFIED
        - CREATED
        - PROCESSING
        - VERIFIED
        - REJECTED
        - RETRY
        - VERIFIED_BUT_NEEDS_CHECK
        - EXPIRED_LICENSE
        - REVIEW
        - PENDING_REVERIFICATION
      description: |-
        - `UNVERIFIED`: No verification has started.
        - `CREATED`: Verification has been initiated.
        - `PROCESSING`: User uploaded data and verification is in progress.
        - `VERIFIED`: User has been verified successfully. User is able to create bookings and rentals. User is able to re-verify its driving license depending on configuration of the system.
        - `REJECTED`: User couldn't be verified.
        - `RETRY`: User needs to try again. User is able to re-verify its driving license.
        - `VERIFIED_BUT_NEEDS_CHECK`: Verification successful but they need additional processing.
        - `EXPIRED_LICENSE`: Document valid until date is before now. User is able to re-verify its driving license.
        - `REVIEW`: Verification needs to be reviewed by customer's team (only active when using fully-automatic mode on Veriff).
        - `PENDING_REVERIFICATION`: User has to reverify his driving license again.
    PriceCategoryType:
      type: string
      enum:
        - UNLOCK_FEE
        - TIME
        - DISTANCE
        - PARKING
        - DRIVING
        - RESERVATION
        - UNCATEGORIZED
        - NON_REBATEABLE
    PriceV3:
      type: object
      properties:
        rebates:
          type: object
          properties:
            '{rebateIdentifier}':
              type: object
              properties:
                '{PriceType}':
                  additionalProperties:
                    $ref: '#/components/schemas/PriceCategoryType'
                  type: number
                  format: double
        rebatesTotal:
          type: object
          properties:
            '{rebateIdentifier}':
              type: number
              format: double
        additions:
          type: object
          properties:
            '{additionIdentifier}':
              type: object
              properties:
                '{PriceType}':
                  additionalProperties:
                    $ref: '#/components/schemas/PriceCategoryType'
                  type: number
                  format: double
        additionsTotal:
          type: object
          properties:
            '{additionIdentifier}':
              type: number
              format: double
        surcharges:
          type: object
          properties:
            '{surchargeIdentifier}':
              type: object
              properties:
                '{PriceType}':
                  additionalProperties:
                    $ref: '#/components/schemas/PriceCategoryType'
                  type: number
                  format: double
        surchargesTotal:
          type: object
          properties:
            '{surchargeIdentifier}':
              type: number
              format: double
        penalties:
          type: object
          properties:
            '{penaltyIdentifier}':
              type: object
              properties:
                '{PriceType}':
                  additionalProperties:
                    $ref: '#/components/schemas/PriceCategoryType'
                  type: number
                  format: double
        penaltiesTotal:
          type: object
          properties:
            '{penaltyIdentifier}':
              type: number
              format: double
        price:
          type: object
          properties:
            '{PriceType}':
              additionalProperties:
                $ref: '#/components/schemas/PriceCategoryType'
              type: number
              format: double
        taxPercentage:
          type: number
          format: double
        scale:
          type: integer
          format: int32
        currency:
          type: string
        totalGross:
          type: number
          format: double
        totalNet:
          type: number
          format: double
        tax:
          type: number
          format: double
    PriceV4:
      type: object
      x-examples:
        Example 1:
          taxSplit:
            '0.0000':
              tax: 0
              price: { }
              scale: 2
              rebates: { }
              currency: null
              totalNet: 70
              additions:
                INSURANCE:
                  DRIVING: 50
                  PARKING: 0
                  RESERVATION: 0
                  NON_REBATEABLE: 0
                BASIC_INSURANCE:
                  DRIVING: 20
                  PARKING: 0
                  RESERVATION: 0
                  NON_REBATEABLE: 0
              penalties: { }
              surcharges: { }
              totalGross: 70
              taxPercentage: 0
            '10.0000':
              tax: 21.73
              price:
                DRIVING: 229
                PARKING: 0
                RESERVATION: 0
                NON_REBATEABLE: 0
              scale: 2
              rebates: { }
              currency: null
              totalNet: 217.27
              additions:
                HELMET:
                  DRIVING: 10
                  PARKING: 0
                  RESERVATION: 0
                  NON_REBATEABLE: 0
              penalties: { }
              surcharges: { }
              totalGross: 239
              taxPercentage: 10
          totalNet: 287.27
          totalTax: 21.73
          totalGross: 309
      properties:
        taxSplit:
          type: object
          additionalProperties:
            $ref: '#/components/schemas/PriceV3'
        totalNet:
          type: number
        totalTax:
          type: number
        totalGross:
          type: number
    TermsAndConditionsAccepted:
      type: object
      description: Terms and conditions acceptance status for a branch.
      properties:
        state:
          type: string
          enum:
            - ACCEPTED
            - NOT_ACCEPTED
        branchId:
          type: integer
          format: int64
        latestTermsAndConditions:
          $ref: '#/components/schemas/TermsAndConditions'
  securitySchemes:
    jwtAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT
security:
  - jwtAuth: [ ]
