openapi: 3.1.0
info:
  title: SMS Valet Backend
  version: dev
paths:
  /api/v1/register/:
    post:
      tags:
        - register
      summary: Create Registration
      operationId: create_registration_api_v1_register__post
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/RegistrationCreate'
        required: true
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RegistrationResponse'
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /api/v1/sites/{site_code}/config:
    get:
      tags:
        - sites
      summary: Get Site Config
      description: 사이트 코드로 설정 조회 (프론트엔드용).
      operationId: get_site_config_api_v1_sites__site_code__config_get
      parameters:
        - name: site_code
          in: path
          required: true
          schema:
            type: string
            title: Site Code
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /api/v1/sites:
    get:
      tags:
        - sites
      summary: List Sites
      description: |-
        공개 사이트 목록.

        domain 파라미터 (선택):
          - 미지정: 활성 사이트 전체
          - 지정: site.code == domain (1:1 매칭) 인 사이트만
      operationId: list_sites_api_v1_sites_get
      parameters:
        - name: domain
          in: query
          required: false
          schema:
            anyOf:
              - type: string
              - type: 'null'
            title: Domain
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /api/v1/sites/{site_id}:
    get:
      tags:
        - sites
      summary: Get Site
      operationId: get_site_api_v1_sites__site_id__get
      parameters:
        - name: site_id
          in: path
          required: true
          schema:
            type: string
            title: Site Id
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /api/v1/sites/{site_id}/slot-availability:
    get:
      tags:
        - sites
      summary: Get Slot Availability
      description: 사이트별 시간대 가용성. 실제 예약 DB에서 슬롯별 입/출차 점유 수를 계산.
      operationId: get_slot_availability_api_v1_sites__site_id__slot_availability_get
      parameters:
        - name: site_id
          in: path
          required: true
          schema:
            type: string
            title: Site Id
        - name: arrival_time
          in: query
          required: true
          schema:
            type: string
            title: Arrival Time
        - name: pickup_time
          in: query
          required: true
          schema:
            type: string
            title: Pickup Time
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /api/v1/vehicles/info:
    post:
      tags:
        - vehicles
      summary: Get Vehicle Info
      operationId: get_vehicle_info_api_v1_vehicles_info_post
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/VehicleInfoRequest'
        required: true
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /api/v1/vehicles/validate:
    post:
      tags:
        - vehicles
      summary: Validate Vehicle
      operationId: validate_vehicle_api_v1_vehicles_validate_post
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/VehicleValidateRequest'
        required: true
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /api/v1/admin/version:
    get:
      tags:
        - admin
        - admin
      summary: Get Version
      description: 백엔드 버전 정보 반환 (인증 불필요).
      operationId: get_version_api_v1_admin_version_get
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
  /api/v1/admin/login:
    post:
      tags:
        - admin
        - admin
      summary: Admin Login
      operationId: admin_login_api_v1_admin_login_post
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AdminLoginBody'
        required: true
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /api/v1/admin/profile:
    get:
      tags:
        - admin
        - admin
      summary: Get Profile
      operationId: get_profile_api_v1_admin_profile_get
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
      security:
        - OAuth2PasswordBearer: []
  /api/v1/admin/profile/settings:
    put:
      tags:
        - admin
        - admin
      summary: Update Profile Settings
      operationId: update_profile_settings_api_v1_admin_profile_settings_put
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ProfileSettingsUpdate'
        required: true
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
      security:
        - OAuth2PasswordBearer: []
  /api/v1/admin/profile/change-password:
    post:
      tags:
        - admin
        - admin
      summary: Change Password
      description: Cognito를 통한 비밀번호 변경. 프론트에서 Cognito access token을 사용.
      operationId: change_password_api_v1_admin_profile_change_password_post
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PasswordChangeBody'
        required: true
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
      security:
        - OAuth2PasswordBearer: []
  /api/v1/admin/notifications:
    get:
      tags:
        - admin
        - admin
      summary: List Notifications
      operationId: list_notifications_api_v1_admin_notifications_get
      security:
        - OAuth2PasswordBearer: []
      parameters:
        - name: unread_only
          in: query
          required: false
          schema:
            type: boolean
            default: false
            title: Unread Only
        - name: category
          in: query
          required: false
          schema:
            anyOf:
              - type: string
              - type: 'null'
            title: Category
        - name: limit
          in: query
          required: false
          schema:
            type: integer
            maximum: 200
            minimum: 1
            default: 50
            title: Limit
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /api/v1/admin/notifications/{notification_id}/read:
    put:
      tags:
        - admin
        - admin
      summary: Mark Notification Read
      operationId: >-
        mark_notification_read_api_v1_admin_notifications__notification_id__read_put
      security:
        - OAuth2PasswordBearer: []
      parameters:
        - name: notification_id
          in: path
          required: true
          schema:
            type: integer
            title: Notification Id
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /api/v1/admin/notifications/read-all:
    put:
      tags:
        - admin
        - admin
      summary: Mark All Notifications Read
      operationId: mark_all_notifications_read_api_v1_admin_notifications_read_all_put
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
      security:
        - OAuth2PasswordBearer: []
  /api/v1/admin/action-logs:
    get:
      tags:
        - admin
        - admin
      summary: List Action Logs
      operationId: list_action_logs_api_v1_admin_action_logs_get
      security:
        - OAuth2PasswordBearer: []
      parameters:
        - name: target_type
          in: query
          required: false
          schema:
            anyOf:
              - type: string
              - type: 'null'
            title: Target Type
        - name: target_id
          in: query
          required: false
          schema:
            anyOf:
              - type: string
              - type: 'null'
            title: Target Id
        - name: limit
          in: query
          required: false
          schema:
            type: integer
            maximum: 200
            minimum: 1
            default: 50
            title: Limit
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /api/v1/admin/stats:
    get:
      tags:
        - admin
        - admin
      summary: Get Stats
      operationId: get_stats_api_v1_admin_stats_get
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
      security:
        - OAuth2PasswordBearer: []
  /api/v1/admin/dashboard-overview:
    get:
      tags:
        - admin
        - admin
      summary: Get Dashboard Overview
      description: 운영 대시보드 — 사이트별 로봇 현황 + 전체 로봇 상태 통계.
      operationId: get_dashboard_overview_api_v1_admin_dashboard_overview_get
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
      security:
        - OAuth2PasswordBearer: []
  /api/v1/admin/process-no-shows:
    post:
      tags:
        - admin
        - admin
      summary: Trigger No Show Processing
      description: |-
        미이용 자동 처리: confirmed 상태인 예약 중 버퍼 시간이 지난 건을 no_show로 전환.
        NOTE: 스케줄러의 process_no_shows는 아직 동기이므로 별도 세션 사용.
      operationId: trigger_no_show_processing_api_v1_admin_process_no_shows_post
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
      security:
        - OAuth2PasswordBearer: []
  /api/v1/admin/vehicle-owners/search:
    get:
      tags:
        - admin
        - admin
      summary: Search Vehicle Owners
      description: |-
        이미 등록된(VehicleOwner) 차량을 차량번호/전화번호로 부분 검색.
        관리자 예약 생성 모달에서 차량 선택용으로 사용. role: master/operator만 허용.
      operationId: search_vehicle_owners_api_v1_admin_vehicle_owners_search_get
      security:
        - OAuth2PasswordBearer: []
      parameters:
        - name: q
          in: query
          required: true
          schema:
            type: string
            minLength: 2
            description: 차량번호 일부 또는 휴대폰번호 일부
            title: Q
          description: 차량번호 일부 또는 휴대폰번호 일부
        - name: limit
          in: query
          required: false
          schema:
            type: integer
            maximum: 50
            minimum: 1
            default: 20
            title: Limit
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /api/v1/admin/reservations:
    post:
      tags:
        - admin
        - admin
      summary: Admin Create Reservation
      description: |-
        관리자가 이미 등록된 차량(VehicleOwner)에 한해 예약을 대신 생성한다.
        - OTP/KCB 본인인증, 개인정보 동의 검증을 생략한다.
        - 차량 제원 제한(restriction_validator)은 적용하지 않는다(관리자 판단).
        - blackout, slot 충돌, 중복 예약 방지는 그대로 적용한다.
        - 초기 상태는 'confirmed'(관리자 보증). 알림톡은 VALET_RES_02 로 발송한다.
      operationId: admin_create_reservation_api_v1_admin_reservations_post
      security:
        - OAuth2PasswordBearer: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AdminReservationCreateBody'
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
    get:
      tags:
        - admin
        - admin
      summary: List Reservations
      operationId: list_reservations_api_v1_admin_reservations_get
      security:
        - OAuth2PasswordBearer: []
      parameters:
        - name: site_id
          in: query
          required: false
          schema:
            anyOf:
              - type: string
              - type: 'null'
            title: Site Id
        - name: status
          in: query
          required: false
          schema:
            anyOf:
              - type: string
              - type: 'null'
            title: Status
        - name: date_from
          in: query
          required: false
          schema:
            anyOf:
              - type: string
                format: date
              - type: 'null'
            title: Date From
        - name: date_to
          in: query
          required: false
          schema:
            anyOf:
              - type: string
                format: date
              - type: 'null'
            title: Date To
        - name: search
          in: query
          required: false
          schema:
            anyOf:
              - type: string
              - type: 'null'
            title: Search
        - name: vehicle_number
          in: query
          required: false
          schema:
            anyOf:
              - type: string
              - type: 'null'
            title: Vehicle Number
        - name: owner_name
          in: query
          required: false
          schema:
            anyOf:
              - type: string
              - type: 'null'
            title: Owner Name
        - name: is_reparked
          in: query
          required: false
          schema:
            anyOf:
              - type: boolean
              - type: 'null'
            title: Is Reparked
        - name: page
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            default: 1
            title: Page
        - name: size
          in: query
          required: false
          schema:
            type: integer
            maximum: 100
            minimum: 1
            default: 20
            title: Size
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /api/v1/admin/reservations/{reservation_id}:
    get:
      tags:
        - admin
        - admin
      summary: Get Reservation Detail
      operationId: get_reservation_detail_api_v1_admin_reservations__reservation_id__get
      security:
        - OAuth2PasswordBearer: []
      parameters:
        - name: reservation_id
          in: path
          required: true
          schema:
            type: integer
            title: Reservation Id
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
    delete:
      tags:
        - admin
        - admin
      summary: Delete Reservation
      operationId: delete_reservation_api_v1_admin_reservations__reservation_id__delete
      security:
        - OAuth2PasswordBearer: []
      parameters:
        - name: reservation_id
          in: path
          required: true
          schema:
            type: integer
            title: Reservation Id
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
    put:
      tags:
        - admin
        - admin
      summary: Update Reservation
      operationId: update_reservation_api_v1_admin_reservations__reservation_id__put
      security:
        - OAuth2PasswordBearer: []
      parameters:
        - name: reservation_id
          in: path
          required: true
          schema:
            type: integer
            title: Reservation Id
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ReservationUpdateBody'
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /api/v1/admin/reservations/{reservation_id}/status:
    put:
      tags:
        - admin
        - admin
      summary: Update Reservation Status
      operationId: >-
        update_reservation_status_api_v1_admin_reservations__reservation_id__status_put
      security:
        - OAuth2PasswordBearer: []
      parameters:
        - name: reservation_id
          in: path
          required: true
          schema:
            type: integer
            title: Reservation Id
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ReservationStatusUpdate'
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /api/v1/admin/sites:
    get:
      tags:
        - admin
        - admin
      summary: List Sites Admin
      operationId: list_sites_admin_api_v1_admin_sites_get
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
      security:
        - OAuth2PasswordBearer: []
    post:
      tags:
        - admin
        - admin
      summary: Create Site Admin
      operationId: create_site_admin_api_v1_admin_sites_post
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SiteCreateUpdate'
        required: true
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
      security:
        - OAuth2PasswordBearer: []
  /api/v1/admin/sites/{site_id}:
    put:
      tags:
        - admin
        - admin
      summary: Update Site Admin
      operationId: update_site_admin_api_v1_admin_sites__site_id__put
      security:
        - OAuth2PasswordBearer: []
      parameters:
        - name: site_id
          in: path
          required: true
          schema:
            type: string
            title: Site Id
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SiteCreateUpdate'
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
    delete:
      tags:
        - admin
        - admin
      summary: Delete Site Admin
      operationId: delete_site_admin_api_v1_admin_sites__site_id__delete
      security:
        - OAuth2PasswordBearer: []
      parameters:
        - name: site_id
          in: path
          required: true
          schema:
            type: string
            title: Site Id
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /api/v1/admin/sites/{site_id}/background-image:
    post:
      tags:
        - admin
        - admin
      summary: 주차장 홈 배경 이미지 업로드
      operationId: >-
        upload_site_background_api_v1_admin_sites__site_id__background_image_post
      security:
        - OAuth2PasswordBearer: []
      parameters:
        - name: site_id
          in: path
          required: true
          schema:
            type: string
            title: Site Id
      requestBody:
        required: true
        content:
          multipart/form-data:
            schema:
              $ref: >-
                #/components/schemas/Body_upload_site_background_api_v1_admin_sites__site_id__background_image_post
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
    delete:
      tags:
        - admin
        - admin
      summary: 주차장 홈 배경 이미지 삭제
      operationId: >-
        delete_site_background_api_v1_admin_sites__site_id__background_image_delete
      security:
        - OAuth2PasswordBearer: []
      parameters:
        - name: site_id
          in: path
          required: true
          schema:
            type: string
            title: Site Id
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /api/v1/admin/sites/{site_id}/operation-policy:
    get:
      tags:
        - admin
        - admin
      summary: Get Operation Policy
      operationId: get_operation_policy_api_v1_admin_sites__site_id__operation_policy_get
      security:
        - OAuth2PasswordBearer: []
      parameters:
        - name: site_id
          in: path
          required: true
          schema:
            type: string
            title: Site Id
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
    put:
      tags:
        - admin
        - admin
      summary: Update Operation Policy
      operationId: >-
        update_operation_policy_api_v1_admin_sites__site_id__operation_policy_put
      security:
        - OAuth2PasswordBearer: []
      parameters:
        - name: site_id
          in: path
          required: true
          schema:
            type: string
            title: Site Id
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/OperationPolicyUpdate'
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /api/v1/admin/notification-templates:
    get:
      tags:
        - admin
        - admin
      summary: List Notification Templates
      operationId: list_notification_templates_api_v1_admin_notification_templates_get
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
      security:
        - OAuth2PasswordBearer: []
  /api/v1/admin/notification-templates/{template_id}:
    put:
      tags:
        - admin
        - admin
      summary: Update Notification Template
      operationId: >-
        update_notification_template_api_v1_admin_notification_templates__template_id__put
      security:
        - OAuth2PasswordBearer: []
      parameters:
        - name: template_id
          in: path
          required: true
          schema:
            type: integer
            title: Template Id
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/NotificationTemplateUpdate'
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /api/v1/admin/notifications/send:
    post:
      tags:
        - admin
        - admin
      summary: Manual Send
      description: 수동 발송 (실제 SMS 연동은 스텁).
      operationId: manual_send_api_v1_admin_notifications_send_post
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ManualSendBody'
        required: true
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
      security:
        - OAuth2PasswordBearer: []
  /api/v1/admin/vehicles/lookup-spec:
    post:
      tags:
        - admin
        - admin
      summary: Admin Lookup Vehicle Spec
      description: |-
        관리자 등록/예약 생성 화면에서 차량 제원을 즉시 조회.
        CVMIS(365 API) 단독, DB 저장 없이 결과만 반환. master/operator만 허용.
      operationId: admin_lookup_vehicle_spec_api_v1_admin_vehicles_lookup_spec_post
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/VehicleSpecLookupBody'
        required: true
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
      security:
        - OAuth2PasswordBearer: []
  /api/v1/admin/registrations:
    post:
      tags:
        - admin
        - admin
      summary: Admin Create Registration
      description: |-
        관리자가 직접 차량을 등록한다. CVMIS 제원 자동 조회, OTP/동의 생략.
        - 동일 사이트에 동일 차량번호의 active 등록이 있으면 409.
        - VehicleOwner upsert (CVMIS 제원 반영, 동의 시각은 NULL — 본인동의 없음).
        - Registration.status = 'active' 로 즉시 등록.
        - VALET_REG_02 알림톡 + sms-backend 차량/등록 동기화.
      operationId: admin_create_registration_api_v1_admin_registrations_post
      security:
        - OAuth2PasswordBearer: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AdminRegistrationCreateBody'
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
    get:
      tags:
        - admin
        - admin
      summary: List Registrations
      operationId: list_registrations_api_v1_admin_registrations_get
      security:
        - OAuth2PasswordBearer: []
      parameters:
        - name: page
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            default: 1
            title: Page
        - name: size
          in: query
          required: false
          schema:
            type: integer
            maximum: 100
            minimum: 1
            default: 20
            title: Size
        - name: status
          in: query
          required: false
          schema:
            anyOf:
              - type: string
              - type: 'null'
            title: Status
        - name: search
          in: query
          required: false
          schema:
            anyOf:
              - type: string
              - type: 'null'
            title: Search
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /api/v1/admin/registrations/export:
    get:
      tags:
        - admin
        - admin
      summary: 등록 엑셀 내보내기
      description: 선택 또는 전체 등록 내역을 엑셀(.xlsx)로 내보낸다.
      operationId: export_registrations_api_v1_admin_registrations_export_get
      security:
        - OAuth2PasswordBearer: []
      parameters:
        - name: ids
          in: query
          required: false
          schema:
            anyOf:
              - type: string
              - type: 'null'
            description: 내보낼 등록 ID (쉼표 구분). 미입력 시 전체
            title: Ids
          description: 내보낼 등록 ID (쉼표 구분). 미입력 시 전체
        - name: status
          in: query
          required: false
          schema:
            anyOf:
              - type: string
              - type: 'null'
            title: Status
        - name: search
          in: query
          required: false
          schema:
            anyOf:
              - type: string
              - type: 'null'
            title: Search
        - name: site_id
          in: query
          required: false
          schema:
            anyOf:
              - type: string
              - type: 'null'
            title: Site Id
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /api/v1/admin/registrations/{registration_id}:
    get:
      tags:
        - admin
        - admin
      summary: Get Registration Detail
      operationId: get_registration_detail_api_v1_admin_registrations__registration_id__get
      security:
        - OAuth2PasswordBearer: []
      parameters:
        - name: registration_id
          in: path
          required: true
          schema:
            type: integer
            title: Registration Id
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
    delete:
      tags:
        - admin
        - admin
      summary: Delete Registration
      operationId: delete_registration_api_v1_admin_registrations__registration_id__delete
      security:
        - OAuth2PasswordBearer: []
      parameters:
        - name: registration_id
          in: path
          required: true
          schema:
            type: integer
            title: Registration Id
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /api/v1/admin/registrations/{registration_id}/status:
    put:
      tags:
        - admin
        - admin
      summary: Update Registration Status
      operationId: >-
        update_registration_status_api_v1_admin_registrations__registration_id__status_put
      security:
        - OAuth2PasswordBearer: []
      parameters:
        - name: registration_id
          in: path
          required: true
          schema:
            type: integer
            title: Registration Id
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/RegistrationStatusBody'
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /api/v1/admin/registrations/bulk-upload/template:
    get:
      tags:
        - admin
        - admin
      summary: 등록 엑셀 템플릿 다운로드
      description: 등록 일괄 업로드용 엑셀 템플릿(.xlsx) 다운로드.
      operationId: >-
        download_registration_template_api_v1_admin_registrations_bulk_upload_template_get
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
      security:
        - OAuth2PasswordBearer: []
  /api/v1/admin/registrations/bulk-upload:
    post:
      tags:
        - admin
        - admin
      summary: 등록 엑셀 일괄 업로드
      description: |-
        엑셀로 차량 등록 일괄 처리. Registration + VehicleOwner 동시 upsert.
        컬럼: 차량번호(필수), 전화번호(필수), 이름, 차종, 연식
      operationId: bulk_upload_registrations_api_v1_admin_registrations_bulk_upload_post
      security:
        - OAuth2PasswordBearer: []
      parameters:
        - name: site_id
          in: query
          required: true
          schema:
            type: string
            description: 등록할 사이트 ID
            title: Site Id
          description: 등록할 사이트 ID
        - name: skip_duplicates
          in: query
          required: false
          schema:
            type: boolean
            description: 'True: 이미 등록된 차량번호 건너뜀, False: 에러'
            default: true
            title: Skip Duplicates
          description: 'True: 이미 등록된 차량번호 건너뜀, False: 에러'
      requestBody:
        required: true
        content:
          multipart/form-data:
            schema:
              $ref: >-
                #/components/schemas/Body_bulk_upload_registrations_api_v1_admin_registrations_bulk_upload_post
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /api/v1/admin/robots:
    get:
      tags:
        - admin
        - admin
      summary: List Robots Admin
      operationId: list_robots_admin_api_v1_admin_robots_get
      security:
        - OAuth2PasswordBearer: []
      parameters:
        - name: search
          in: query
          required: false
          schema:
            anyOf:
              - type: string
              - type: 'null'
            title: Search
        - name: status
          in: query
          required: false
          schema:
            anyOf:
              - type: string
              - type: 'null'
            title: Status
        - name: page
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            default: 1
            title: Page
        - name: size
          in: query
          required: false
          schema:
            type: integer
            maximum: 100
            minimum: 1
            default: 20
            title: Size
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
    post:
      tags:
        - admin
        - admin
      summary: Create Robot Admin
      operationId: create_robot_admin_api_v1_admin_robots_post
      security:
        - OAuth2PasswordBearer: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AdminRobotCreate'
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /api/v1/admin/robots/suggest-name:
    get:
      tags:
        - admin
        - admin
      summary: Suggest Robot Name
      description: '모델+MVP 기반 로봇 이름 자동 제안 (예: PARKIE-A001).'
      operationId: suggest_robot_name_api_v1_admin_robots_suggest_name_get
      security:
        - OAuth2PasswordBearer: []
      parameters:
        - name: model_id
          in: query
          required: true
          schema:
            type: string
            title: Model Id
        - name: mvp_version
          in: query
          required: false
          schema:
            type: integer
            default: 1
            title: Mvp Version
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /api/v1/admin/robots/validate-name:
    get:
      tags:
        - admin
        - admin
      summary: Validate Robot Name
      description: 로봇 이름 중복 확인.
      operationId: validate_robot_name_api_v1_admin_robots_validate_name_get
      security:
        - OAuth2PasswordBearer: []
      parameters:
        - name: name
          in: query
          required: true
          schema:
            type: string
            title: Name
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /api/v1/admin/robots/{robot_id}:
    get:
      tags:
        - admin
        - admin
      summary: Get Robot Admin
      operationId: get_robot_admin_api_v1_admin_robots__robot_id__get
      security:
        - OAuth2PasswordBearer: []
      parameters:
        - name: robot_id
          in: path
          required: true
          schema:
            type: string
            title: Robot Id
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
    put:
      tags:
        - admin
        - admin
      summary: Update Robot Admin
      operationId: update_robot_admin_api_v1_admin_robots__robot_id__put
      security:
        - OAuth2PasswordBearer: []
      parameters:
        - name: robot_id
          in: path
          required: true
          schema:
            type: string
            title: Robot Id
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AdminRobotUpdate'
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
    delete:
      tags:
        - admin
        - admin
      summary: Delete Robot Admin
      operationId: delete_robot_admin_api_v1_admin_robots__robot_id__delete
      security:
        - OAuth2PasswordBearer: []
      parameters:
        - name: robot_id
          in: path
          required: true
          schema:
            type: string
            title: Robot Id
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /api/v1/admin/vehicles/restriction-rules:
    get:
      tags:
        - admin
        - admin
      summary: List Restriction Rules
      operationId: list_restriction_rules_api_v1_admin_vehicles_restriction_rules_get
      security:
        - OAuth2PasswordBearer: []
      parameters:
        - name: site_id
          in: query
          required: false
          schema:
            anyOf:
              - type: string
              - type: 'null'
            title: Site Id
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
    post:
      tags:
        - admin
        - admin
      summary: Create Restriction Rule
      operationId: create_restriction_rule_api_v1_admin_vehicles_restriction_rules_post
      security:
        - OAuth2PasswordBearer: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/RestrictionRuleCreate'
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /api/v1/admin/vehicles/restriction-rules/{rule_id}:
    delete:
      tags:
        - admin
        - admin
      summary: Delete Restriction Rule
      operationId: >-
        delete_restriction_rule_api_v1_admin_vehicles_restriction_rules__rule_id__delete
      security:
        - OAuth2PasswordBearer: []
      parameters:
        - name: rule_id
          in: path
          required: true
          schema:
            type: string
            title: Rule Id
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /api/v1/admin/vehicles/restriction-models:
    get:
      tags:
        - admin
        - admin
      summary: List Restriction Models
      operationId: list_restriction_models_api_v1_admin_vehicles_restriction_models_get
      security:
        - OAuth2PasswordBearer: []
      parameters:
        - name: site_id
          in: query
          required: false
          schema:
            anyOf:
              - type: string
              - type: 'null'
            title: Site Id
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
    post:
      tags:
        - admin
        - admin
      summary: Create Restriction Model
      operationId: create_restriction_model_api_v1_admin_vehicles_restriction_models_post
      security:
        - OAuth2PasswordBearer: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/RestrictionModelCreate'
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /api/v1/admin/vehicles/restriction-models/{model_id}:
    delete:
      tags:
        - admin
        - admin
      summary: Delete Restriction Model
      operationId: >-
        delete_restriction_model_api_v1_admin_vehicles_restriction_models__model_id__delete
      security:
        - OAuth2PasswordBearer: []
      parameters:
        - name: model_id
          in: path
          required: true
          schema:
            type: string
            title: Model Id
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /api/v1/admin/vehicles/spec-models:
    get:
      tags:
        - admin
        - admin
      summary: Search Spec Models
      description: VehicleSpec 테이블에서 모델명 검색 (중복 제거).
      operationId: search_spec_models_api_v1_admin_vehicles_spec_models_get
      security:
        - OAuth2PasswordBearer: []
      parameters:
        - name: q
          in: query
          required: false
          schema:
            type: string
            minLength: 0
            default: ''
            title: Q
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /api/v1/admin/vehicles/restriction-preview:
    get:
      tags:
        - admin
        - admin
      summary: Restriction Preview
      description: 현재 규칙+직접 지정에 매칭되는 차량 제원 미리보기.
      operationId: restriction_preview_api_v1_admin_vehicles_restriction_preview_get
      security:
        - OAuth2PasswordBearer: []
      parameters:
        - name: site_id
          in: query
          required: false
          schema:
            anyOf:
              - type: string
              - type: 'null'
            title: Site Id
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /api/v1/identity/check:
    post:
      tags:
        - identity
      summary: Identity Check
      description: 차량번호 + 휴대폰번호 조합이 DB에 있는지 확인.
      operationId: identity_check_api_v1_identity_check_post
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/IdentityCheckRequest'
        required: true
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /api/v1/identity/otp/send:
    post:
      tags:
        - identity
      summary: Otp Send
      description: 카카오톡 알림톡 OTP 발송.
      operationId: otp_send_api_v1_identity_otp_send_post
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/OtpSendRequest'
        required: true
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /api/v1/identity/otp/verify:
    post:
      tags:
        - identity
      summary: Otp Verify
      description: OTP 검증.
      operationId: otp_verify_api_v1_identity_otp_verify_post
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/OtpVerifyRequest'
        required: true
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /api/v1/identity/otp/send-lookup:
    post:
      tags:
        - identity
      summary: Otp Send Lookup
      description: 마이페이지 전용 OTP 발송.
      operationId: otp_send_lookup_api_v1_identity_otp_send_lookup_post
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/LookupOtpSendRequest'
        required: true
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /api/v1/identity/otp/verify-lookup:
    post:
      tags:
        - identity
      summary: Otp Verify Lookup
      description: 마이페이지 전용 OTP 검증.
      operationId: otp_verify_lookup_api_v1_identity_otp_verify_lookup_post
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/LookupOtpVerifyRequest'
        required: true
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /api/v1/identity/otp/send-proxy:
    post:
      tags:
        - identity
      summary: Otp Send Proxy
      description: 신규 사용자용 phone-only OTP 발송. VehicleOwner 사전 존재 불필요.
      operationId: otp_send_proxy_api_v1_identity_otp_send_proxy_post
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ProxyOtpSendRequest'
        required: true
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /api/v1/identity/otp/verify-proxy:
    post:
      tags:
        - identity
      summary: Otp Verify Proxy
      description: |-
        phone-only OTP 검증 + 선택적으로 site_id 가 주어지면 해당 사이트의
        내 차량 목록(Registration / 활성 Reservation)을 함께 반환.
      operationId: otp_verify_proxy_api_v1_identity_otp_verify_proxy_post
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ProxyOtpVerifyRequest'
        required: true
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /api/v1/identity/kcb/request:
    post:
      tags:
        - identity
      summary: Kcb Request
      description: KCB 제3자 정보제공동의 요청.
      operationId: kcb_request_api_v1_identity_kcb_request_post
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/KcbRequestBody'
        required: true
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /api/v1/identity/kcb/consent-form/{token}:
    get:
      tags:
        - identity
      summary: Kcb Consent Form
      description: |-
        KCB 제3자 정보제공동의 POST form 페이지.

        KOTSA 가이드에 따라 hidden form + POST submit 방식으로 동의 페이지를 호출합니다.
      operationId: kcb_consent_form_api_v1_identity_kcb_consent_form__token__get
      parameters:
        - name: token
          in: path
          required: true
          schema:
            type: string
            title: Token
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /api/v1/identity/kcb/callback:
    get:
      tags:
        - identity
      summary: Kcb Callback
      description: KOTSA 동의 완료 후 콜백.
      operationId: kcb_callback_api_v1_identity_kcb_callback_get
      parameters:
        - name: token
          in: query
          required: true
          schema:
            type: string
            title: Token
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /api/v1/identity/cvmis/test:
    get:
      tags:
        - identity
      summary: Cvmis Test
      description: |-
        CVMIS 직접 연동 테스트 (KCB 동의 없이 차량번호로 원문 조회).

        개발/스테이지 전용 — 암복호화·전자서명·서버 연결 동시 검증.
        예: GET /api/v1/identity/cvmis/test?vhcl_no=15부9134
      operationId: cvmis_test_api_v1_identity_cvmis_test_get
      parameters:
        - name: vhcl_no
          in: query
          required: true
          schema:
            type: string
            title: Vhcl No
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /api/v1/identity/kcb/status/{token}:
    get:
      tags:
        - identity
      summary: Kcb Status
      description: KCB 동의 상태 확인.
      operationId: kcb_status_api_v1_identity_kcb_status__token__get
      parameters:
        - name: token
          in: path
          required: true
          schema:
            type: string
            title: Token
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /api/v1/identity/vehicle-owner:
    post:
      tags:
        - identity
      summary: Save Vehicle Owner
      description: 차량 소유자 정보를 DB에 저장/업데이트.
      operationId: save_vehicle_owner_api_v1_identity_vehicle_owner_post
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/VehicleOwnerSaveRequest'
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
    delete:
      tags:
        - identity
      summary: Delete Vehicle Owner
      description: 마이페이지 '내 차량' 삭제 — 조회 세션(token)으로 본인 차량 프로필 삭제.
      operationId: delete_vehicle_owner_api_v1_identity_vehicle_owner_delete
      parameters:
        - name: phone_number
          in: query
          required: true
          schema:
            type: string
            title: Phone Number
        - name: token
          in: query
          required: true
          schema:
            type: string
            title: Token
        - name: vehicle_number
          in: query
          required: true
          schema:
            type: string
            title: Vehicle Number
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /api/v1/identity/vehicle-owners:
    get:
      tags:
        - identity
      summary: List Vehicle Owners
      description: 마이페이지 '내 차량' — 조회 세션(token)으로 본인 휴대폰의 저장 차량 목록 반환.
      operationId: list_vehicle_owners_api_v1_identity_vehicle_owners_get
      parameters:
        - name: phone_number
          in: query
          required: true
          schema:
            type: string
            title: Phone Number
        - name: token
          in: query
          required: true
          schema:
            type: string
            title: Token
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /api/v1/reservations:
    post:
      tags:
        - reservations
      summary: Create Reservation
      operationId: create_reservation_api_v1_reservations_post
      parameters:
        - name: Idempotency-Key
          in: header
          required: false
          schema:
            anyOf:
              - type: string
              - type: 'null'
            title: Idempotency-Key
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ReservationCreateBody'
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /api/v1/reservations/lookup:
    get:
      tags:
        - reservations
      summary: Lookup Reservations
      operationId: lookup_reservations_api_v1_reservations_lookup_get
      parameters:
        - name: phone_number
          in: query
          required: true
          schema:
            type: string
            title: Phone Number
        - name: token
          in: query
          required: true
          schema:
            type: string
            title: Token
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /api/v1/reservations/{reservation_id}/cancel:
    put:
      tags:
        - reservations
      summary: Cancel Reservation
      operationId: cancel_reservation_api_v1_reservations__reservation_id__cancel_put
      parameters:
        - name: reservation_id
          in: path
          required: true
          schema:
            type: integer
            title: Reservation Id
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ReservationCancelBody'
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /api/v1/registrations:
    post:
      tags:
        - registrations
      summary: Create Registration
      operationId: create_registration_api_v1_registrations_post
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/RegistrationCreateBody'
        required: true
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /api/v1/registrations/lookup:
    get:
      tags:
        - registrations
      summary: Lookup Registrations
      operationId: lookup_registrations_api_v1_registrations_lookup_get
      parameters:
        - name: phone_number
          in: query
          required: true
          schema:
            type: string
            title: Phone Number
        - name: token
          in: query
          required: true
          schema:
            type: string
            title: Token
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /api/v1/registrations/{registration_id}/cancel:
    put:
      tags:
        - registrations
      summary: Cancel Registration
      operationId: cancel_registration_api_v1_registrations__registration_id__cancel_put
      parameters:
        - name: registration_id
          in: path
          required: true
          schema:
            type: integer
            title: Registration Id
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/RegistrationCancelBody'
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /api/v1/auth/login:
    post:
      tags:
        - auth
      summary: 로그인 요청
      description: API 통신 전용 토큰을 발급합니다.
      operationId: auth_login_api_v1_auth_login_post
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
  /api/v1/internal/sites/{site_code}/settings:
    get:
      tags:
        - internal
      summary: Get Site Settings
      description: |-
        사이트 코드로 SMS 연동 설정을 조회한다. (sms-backend → sms-valet)

        대소문자 구분 없음. 예: /api/v1/internal/sites/gas/settings
      operationId: get_site_settings_api_v1_internal_sites__site_code__settings_get
      security:
        - HTTPBearer: []
      parameters:
        - name: site_code
          in: path
          required: true
          schema:
            type: string
            title: Site Code
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /api/v1/internal/vehicles/verify:
    get:
      tags:
        - internal
      summary: Verify Vehicle
      description: 차량번호와 사이트ID(또는 사이트코드)로 예약/등록 여부를 검증한다. (sms-backend → sms-valet)
      operationId: verify_vehicle_api_v1_internal_vehicles_verify_get
      security:
        - HTTPBearer: []
      parameters:
        - name: vehicle_number
          in: query
          required: true
          schema:
            type: string
            description: 차량번호
            title: Vehicle Number
          description: 차량번호
        - name: site_id
          in: query
          required: true
          schema:
            type: string
            description: 주차장 ID 또는 사이트 코드
            title: Site Id
          description: 주차장 ID 또는 사이트 코드
        - name: auto_checkin
          in: query
          required: false
          schema:
            type: boolean
            description: 매칭 시 자동 checked_in 전환
            default: false
            title: Auto Checkin
          description: 매칭 시 자동 checked_in 전환
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /api/v1/internal/carry-complete:
    post:
      tags:
        - internal
      summary: Carry Complete
      description: |-
        sms-backend → valet-backend: 입차/출차 완료 콜백.

        - IN: 예약 상태를 checked_in으로 전환 + VALET_CHK_01 알림톡
        - OUT: 예약 상태를 completed로 전환 + VALET_OUT_01 알림톡
      operationId: carry_complete_api_v1_internal_carry_complete_post
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CarryCompleteBody'
        required: true
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
      security:
        - HTTPBearer: []
  /api/v1/internal/reservations/self-exit:
    post:
      tags:
        - internal
      summary: Reservation Self Exit
      description: |-
        sms-backend → valet-backend: 자주식 출차 콜백.

        운영시간 외 안쪽 LPR 인식 → sms-backend가 cancel-request 처리 후 이 API 호출.
        예약 상태를 completed로 전환 + VALET_OUT_02 알림톡.
      operationId: reservation_self_exit_api_v1_internal_reservations_self_exit_post
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SelfExitBody'
        required: true
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
      security:
        - HTTPBearer: []
  /api/v1/internal/reservations/repark-notice:
    post:
      tags:
        - internal
      summary: Reservation Repark Notice
      description: |-
        sms-backend → valet-backend: 미픽업 차량 BUFFER 자동 재주차 통보.

        sms-backend의 UnpickedReparkService가 예약 종료 + N분 경과 후
        차량을 픽업존 → BUFFER 주차면으로 자동 이동시켰을 때 호출된다.
        valet은 사용자 알림톡(VALET_REPARK_01) 발송을 담당한다.
      operationId: >-
        reservation_repark_notice_api_v1_internal_reservations_repark_notice_post
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ReparkNoticeBody'
        required: true
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
      security:
        - HTTPBearer: []
  /api/v1/internal/pass-vehicle-entry:
    post:
      tags:
        - internal
      summary: Pass Vehicle Entry
      description: |-
        sms-backend → valet: PassVehicle LPR 매칭 시 capacity 검증 + 입차 로그 기록.

        응답:
          200: 입차 허용 (entry_log_id 반환)
          403: PASS_VEHICLE_NOT_FOUND / NOT_YET_VALID / EXPIRED
          422: FULL (만차 → 화이트리스트라도 거절)

        PassVehicle 은 Reservation 을 생성하지 않는다. PassVehicleEntryLog 만 기록되며,
        이후 carry-complete OUT 이벤트 도착 시 exit_time 이 채워진다.
      operationId: pass_vehicle_entry_api_v1_internal_pass_vehicle_entry_post
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PassVehicleEntryBody'
        required: true
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
      security:
        - HTTPBearer: []
  /api/v1/admin/sites/{site_id}/floors:
    get:
      tags:
        - parking-spaces
      summary: 층 목록 조회
      operationId: list_floors_api_v1_admin_sites__site_id__floors_get
      security:
        - OAuth2PasswordBearer: []
      parameters:
        - name: site_id
          in: path
          required: true
          schema:
            type: string
            title: Site Id
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
    post:
      tags:
        - parking-spaces
      summary: 층 추가
      operationId: create_floor_api_v1_admin_sites__site_id__floors_post
      security:
        - OAuth2PasswordBearer: []
      parameters:
        - name: site_id
          in: path
          required: true
          schema:
            type: string
            title: Site Id
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/FloorCreate'
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /api/v1/admin/sites/{site_id}/floors/{floor_id}:
    put:
      tags:
        - parking-spaces
      summary: 층 수정
      operationId: update_floor_api_v1_admin_sites__site_id__floors__floor_id__put
      security:
        - OAuth2PasswordBearer: []
      parameters:
        - name: site_id
          in: path
          required: true
          schema:
            type: string
            title: Site Id
        - name: floor_id
          in: path
          required: true
          schema:
            type: string
            title: Floor Id
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/FloorUpdate'
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
    delete:
      tags:
        - parking-spaces
      summary: 층 삭제
      operationId: delete_floor_api_v1_admin_sites__site_id__floors__floor_id__delete
      security:
        - OAuth2PasswordBearer: []
      parameters:
        - name: site_id
          in: path
          required: true
          schema:
            type: string
            title: Site Id
        - name: floor_id
          in: path
          required: true
          schema:
            type: string
            title: Floor Id
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /api/v1/admin/sites/{site_id}/floors/{floor_id}/blueprint:
    post:
      tags:
        - parking-spaces
      summary: 층 도면 업로드
      operationId: >-
        upload_blueprint_api_v1_admin_sites__site_id__floors__floor_id__blueprint_post
      security:
        - OAuth2PasswordBearer: []
      parameters:
        - name: site_id
          in: path
          required: true
          schema:
            type: string
            title: Site Id
        - name: floor_id
          in: path
          required: true
          schema:
            type: string
            title: Floor Id
      requestBody:
        required: true
        content:
          multipart/form-data:
            schema:
              $ref: >-
                #/components/schemas/Body_upload_blueprint_api_v1_admin_sites__site_id__floors__floor_id__blueprint_post
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
    delete:
      tags:
        - parking-spaces
      summary: 층 도면 삭제
      operationId: >-
        delete_blueprint_api_v1_admin_sites__site_id__floors__floor_id__blueprint_delete
      security:
        - OAuth2PasswordBearer: []
      parameters:
        - name: site_id
          in: path
          required: true
          schema:
            type: string
            title: Site Id
        - name: floor_id
          in: path
          required: true
          schema:
            type: string
            title: Floor Id
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /api/v1/admin/sites/{site_id}/parking-spaces:
    get:
      tags:
        - parking-spaces
      summary: 주차면 목록 조회
      operationId: list_parking_spaces_api_v1_admin_sites__site_id__parking_spaces_get
      security:
        - OAuth2PasswordBearer: []
      parameters:
        - name: site_id
          in: path
          required: true
          schema:
            type: string
            title: Site Id
        - name: floor_id
          in: query
          required: false
          schema:
            anyOf:
              - type: string
              - type: 'null'
            title: Floor Id
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
    post:
      tags:
        - parking-spaces
      summary: 주차면 추가
      operationId: create_parking_space_api_v1_admin_sites__site_id__parking_spaces_post
      security:
        - OAuth2PasswordBearer: []
      parameters:
        - name: site_id
          in: path
          required: true
          schema:
            type: string
            title: Site Id
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ParkingSpaceCreate'
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /api/v1/admin/sites/{site_id}/parking-spaces/{space_id}:
    put:
      tags:
        - parking-spaces
      summary: 주차면 수정
      operationId: >-
        update_parking_space_api_v1_admin_sites__site_id__parking_spaces__space_id__put
      security:
        - OAuth2PasswordBearer: []
      parameters:
        - name: site_id
          in: path
          required: true
          schema:
            type: string
            title: Site Id
        - name: space_id
          in: path
          required: true
          schema:
            type: string
            title: Space Id
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ParkingSpaceUpdate'
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
    delete:
      tags:
        - parking-spaces
      summary: 주차면 삭제
      operationId: >-
        delete_parking_space_api_v1_admin_sites__site_id__parking_spaces__space_id__delete
      security:
        - OAuth2PasswordBearer: []
      parameters:
        - name: site_id
          in: path
          required: true
          schema:
            type: string
            title: Site Id
        - name: space_id
          in: path
          required: true
          schema:
            type: string
            title: Space Id
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /api/v1/admin/sites/{site_id}/parking-spaces/batch-positions:
    put:
      tags:
        - parking-spaces
      summary: 주차면 위치 일괄 업데이트
      operationId: >-
        batch_update_positions_api_v1_admin_sites__site_id__parking_spaces_batch_positions_put
      security:
        - OAuth2PasswordBearer: []
      parameters:
        - name: site_id
          in: path
          required: true
          schema:
            type: string
            title: Site Id
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/BatchPositionUpdate'
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /api/v1/admin/sites/{site_id}/parking-spaces/export:
    get:
      tags:
        - parking-spaces
      summary: 주차면 맵 내보내기 (JSON)
      description: 사이트의 층 + 주차면 설정을 JSON으로 내보냅니다. 스테이지 → 운영 맵 이전에 활용.
      operationId: >-
        export_parking_map_api_v1_admin_sites__site_id__parking_spaces_export_get
      security:
        - OAuth2PasswordBearer: []
      parameters:
        - name: site_id
          in: path
          required: true
          schema:
            type: string
            title: Site Id
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /api/v1/admin/sites/{site_id}/parking-spaces/import:
    post:
      tags:
        - parking-spaces
      summary: 주차면 맵 가져오기 (JSON)
      description: |-
        export로 내보낸 JSON을 가져와 층 + 주차면을 생성/업데이트합니다.
        - mode=upsert (기본): 이름 기준으로 없으면 생성, 있으면 업데이트
        - mode=replace: 기존 층/주차면 전체 삭제 후 재생성
      operationId: >-
        import_parking_map_api_v1_admin_sites__site_id__parking_spaces_import_post
      security:
        - OAuth2PasswordBearer: []
      parameters:
        - name: site_id
          in: path
          required: true
          schema:
            type: string
            title: Site Id
        - name: mode
          in: query
          required: false
          schema:
            type: string
            default: upsert
            title: Mode
      requestBody:
        required: true
        content:
          multipart/form-data:
            schema:
              $ref: >-
                #/components/schemas/Body_import_parking_map_api_v1_admin_sites__site_id__parking_spaces_import_post
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /api/v1/admin/system-settings/public/app:
    get:
      tags:
        - system-settings
        - system-settings
      summary: Get Public App Settings
      description: SmartAppBanner에서 사용하는 공개 설정.
      operationId: get_public_app_settings_api_v1_admin_system_settings_public_app_get
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublicAppSettings'
  /api/v1/admin/system-settings:
    get:
      tags:
        - system-settings
        - system-settings
      summary: Get System Settings
      description: 전체 시스템 설정 조회 (마스터 전용).
      operationId: get_system_settings_api_v1_admin_system_settings_get
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SystemSettingsResponse'
      security:
        - OAuth2PasswordBearer: []
    put:
      tags:
        - system-settings
        - system-settings
      summary: Update System Settings
      description: 시스템 설정 일괄 수정 (마스터 전용).
      operationId: update_system_settings_api_v1_admin_system_settings_put
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SystemSettingsUpdate'
        required: true
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SystemSettingsResponse'
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
      security:
        - OAuth2PasswordBearer: []
  /api/v1/admin/sites/{site_id}/blackouts:
    get:
      tags:
        - admin-blackout
      summary: List Blackouts
      operationId: list_blackouts_api_v1_admin_sites__site_id__blackouts_get
      security:
        - OAuth2PasswordBearer: []
      parameters:
        - name: site_id
          in: path
          required: true
          schema:
            type: string
            title: Site Id
        - name: include_inactive
          in: query
          required: false
          schema:
            type: boolean
            default: false
            title: Include Inactive
        - name: include_past
          in: query
          required: false
          schema:
            type: boolean
            default: false
            title: Include Past
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
    post:
      tags:
        - admin-blackout
      summary: Create Blackout
      operationId: create_blackout_api_v1_admin_sites__site_id__blackouts_post
      security:
        - OAuth2PasswordBearer: []
      parameters:
        - name: site_id
          in: path
          required: true
          schema:
            type: string
            title: Site Id
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/BlackoutCreateBody'
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /api/v1/admin/sites/{site_id}/blackouts/{blackout_id}:
    patch:
      tags:
        - admin-blackout
      summary: Update Blackout
      operationId: >-
        update_blackout_api_v1_admin_sites__site_id__blackouts__blackout_id__patch
      security:
        - OAuth2PasswordBearer: []
      parameters:
        - name: site_id
          in: path
          required: true
          schema:
            type: string
            title: Site Id
        - name: blackout_id
          in: path
          required: true
          schema:
            type: integer
            title: Blackout Id
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/BlackoutUpdateBody'
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
    delete:
      tags:
        - admin-blackout
      summary: Delete Blackout
      operationId: >-
        delete_blackout_api_v1_admin_sites__site_id__blackouts__blackout_id__delete
      security:
        - OAuth2PasswordBearer: []
      parameters:
        - name: site_id
          in: path
          required: true
          schema:
            type: string
            title: Site Id
        - name: blackout_id
          in: path
          required: true
          schema:
            type: integer
            title: Blackout Id
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /api/v1/admin/sites/{site_id}/blackouts/{blackout_id}/affected-reservations:
    get:
      tags:
        - admin-blackout
      summary: Affected Reservations
      operationId: >-
        affected_reservations_api_v1_admin_sites__site_id__blackouts__blackout_id__affected_reservations_get
      security:
        - OAuth2PasswordBearer: []
      parameters:
        - name: site_id
          in: path
          required: true
          schema:
            type: string
            title: Site Id
        - name: blackout_id
          in: path
          required: true
          schema:
            type: integer
            title: Blackout Id
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /api/v1/sites/{site_id}/blackouts:
    get:
      tags:
        - blackout
      summary: Public List Blackouts
      description: |-
        사용자 프론트엔드 달력에서 비활성 처리할 차단 기간 조회.

        from/to 미지정 시 "지금부터 90일" 범위를 기본값으로 사용.
        인증 불필요 (사이트 운영 정보는 공개로 간주).
      operationId: public_list_blackouts_api_v1_sites__site_id__blackouts_get
      parameters:
        - name: site_id
          in: path
          required: true
          schema:
            type: string
            title: Site Id
        - name: from
          in: query
          required: false
          schema:
            anyOf:
              - type: string
                format: date-time
              - type: 'null'
            title: From
        - name: to
          in: query
          required: false
          schema:
            anyOf:
              - type: string
                format: date-time
              - type: 'null'
            title: To
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /api/v1/admin/sites/{site_id}/pass-vehicles:
    get:
      tags:
        - admin-pass-vehicle
      summary: List Pass Vehicles
      operationId: list_pass_vehicles_api_v1_admin_sites__site_id__pass_vehicles_get
      security:
        - OAuth2PasswordBearer: []
      parameters:
        - name: site_id
          in: path
          required: true
          schema:
            type: string
            title: Site Id
        - name: include_inactive
          in: query
          required: false
          schema:
            type: boolean
            description: 비활성화 항목 포함 (기본 true — 운영자가 toggle 보고 싶음)
            default: true
            title: Include Inactive
          description: 비활성화 항목 포함 (기본 true — 운영자가 toggle 보고 싶음)
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
    post:
      tags:
        - admin-pass-vehicle
      summary: Create Pass Vehicle
      operationId: create_pass_vehicle_api_v1_admin_sites__site_id__pass_vehicles_post
      security:
        - OAuth2PasswordBearer: []
      parameters:
        - name: site_id
          in: path
          required: true
          schema:
            type: string
            title: Site Id
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PassVehicleCreateBody'
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /api/v1/admin/sites/{site_id}/pass-vehicles/{pass_id}:
    patch:
      tags:
        - admin-pass-vehicle
      summary: Update Pass Vehicle
      operationId: >-
        update_pass_vehicle_api_v1_admin_sites__site_id__pass_vehicles__pass_id__patch
      security:
        - OAuth2PasswordBearer: []
      parameters:
        - name: site_id
          in: path
          required: true
          schema:
            type: string
            title: Site Id
        - name: pass_id
          in: path
          required: true
          schema:
            type: integer
            title: Pass Id
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PassVehicleUpdateBody'
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
    delete:
      tags:
        - admin-pass-vehicle
      summary: Delete Pass Vehicle
      operationId: >-
        delete_pass_vehicle_api_v1_admin_sites__site_id__pass_vehicles__pass_id__delete
      security:
        - OAuth2PasswordBearer: []
      parameters:
        - name: site_id
          in: path
          required: true
          schema:
            type: string
            title: Site Id
        - name: pass_id
          in: path
          required: true
          schema:
            type: integer
            title: Pass Id
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /api/v1/admin/sites/{site_id}/pass-vehicles/{pass_id}/entry-logs:
    get:
      tags:
        - admin-pass-vehicle
      summary: List Entry Logs
      operationId: >-
        list_entry_logs_api_v1_admin_sites__site_id__pass_vehicles__pass_id__entry_logs_get
      security:
        - OAuth2PasswordBearer: []
      parameters:
        - name: site_id
          in: path
          required: true
          schema:
            type: string
            title: Site Id
        - name: pass_id
          in: path
          required: true
          schema:
            type: integer
            title: Pass Id
        - name: limit
          in: query
          required: false
          schema:
            type: integer
            maximum: 200
            minimum: 1
            default: 50
            title: Limit
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /api/v1/admin/reservations/{reservation_id}/approval-context:
    get:
      tags:
        - admin-approval
      summary: Approval Context
      description: |-
        승인 UI가 1회 호출로 필요한 모든 데이터를 받을 수 있도록 집계.

        이 스켈레톤은 다음을 제공한다:
        - 예약 기본 정보
        - 사이트 캐파 (활성 주차면 수)
        - 장기 점유(overstay) 차량 수
        - 타겟 시간대의 동시 활성 예약 수 + 승인 전/후 이용률
        - 사용자 과거 이력 (총 / 노쇼 / 취소 / 완료)
        - 정책 체크 (booking window, blackout)
        - 리스크 스코어 + 권장 액션

        풀 구현(§12.3.1) 과의 차이 (TODO):
        - hourly_timeline (시간대별 점유 히트맵)
        - 로봇 가용성 — 별도 API 통합 필요
        - 중복 승인 softlock — Redis 도입 후 추가
      operationId: >-
        approval_context_api_v1_admin_reservations__reservation_id__approval_context_get
      security:
        - OAuth2PasswordBearer: []
      parameters:
        - name: reservation_id
          in: path
          required: true
          schema:
            type: integer
            title: Reservation Id
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /api/v1/robots/{robot_id}:
    get:
      tags:
        - robots
      summary: Get Robot
      description: 로봇 상세 정보 조회 (사이트명, 모델 정보 포함).
      operationId: get_robot_api_v1_robots__robot_id__get
      security:
        - OAuth2PasswordBearer: []
      parameters:
        - name: robot_id
          in: path
          required: true
          schema:
            type: string
            title: Robot Id
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /api/v1/robots:
    post:
      tags:
        - robots
      summary: Create Robot
      description: 로봇 출하 등록. Master 전용. 시리얼 번호 자동 생성.
      operationId: create_robot_api_v1_robots_post
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/RobotCreateRequest'
        required: true
      responses:
        '201':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RobotCreateResponse'
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
      security:
        - OAuth2PasswordBearer: []
  /api/v1/robots/{robot_id}/move:
    post:
      tags:
        - robots
      summary: Move Robot
      description: 로봇 사이트 이동. Master 전용.
      operationId: move_robot_api_v1_robots__robot_id__move_post
      security:
        - OAuth2PasswordBearer: []
      parameters:
        - name: robot_id
          in: path
          required: true
          schema:
            type: string
            title: Robot Id
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/RobotMoveRequest'
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RobotMoveResponse'
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /api/v1/robots/{robot_id}/movements:
    get:
      tags:
        - robots
      summary: List Movements
      description: 로봇 이동 이력 조회. 전 역할 접근 가능 (사이트 범위 자동 적용).
      operationId: list_movements_api_v1_robots__robot_id__movements_get
      security:
        - OAuth2PasswordBearer: []
      parameters:
        - name: robot_id
          in: path
          required: true
          schema:
            type: string
            title: Robot Id
        - name: movement_type
          in: query
          required: false
          schema:
            anyOf:
              - type: string
              - type: 'null'
            title: Movement Type
        - name: date_from
          in: query
          required: false
          schema:
            anyOf:
              - type: string
                format: date
              - type: 'null'
            title: Date From
        - name: date_to
          in: query
          required: false
          schema:
            anyOf:
              - type: string
                format: date
              - type: 'null'
            title: Date To
        - name: page
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            default: 1
            title: Page
        - name: size
          in: query
          required: false
          schema:
            type: integer
            maximum: 100
            minimum: 1
            default: 20
            title: Size
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MovementHistoryResponse'
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /api/v1/robots/verify-token:
    post:
      tags:
        - robots
      summary: Verify Token
      description: SMS 인증 토큰 검증. 공개 엔드포인트 (API Key 인증은 별도 미들웨어).
      operationId: verify_token_api_v1_robots_verify_token_post
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/TokenVerifyRequest'
        required: true
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TokenVerifyResponse'
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /api/v1/robots/{robot_id}/regenerate-token:
    post:
      tags:
        - robots
      summary: Regenerate Token
      description: 인증 토큰 재발급. Master 전용. 평문 토큰 1회 반환.
      operationId: regenerate_token_api_v1_robots__robot_id__regenerate_token_post
      security:
        - OAuth2PasswordBearer: []
      parameters:
        - name: robot_id
          in: path
          required: true
          schema:
            type: string
            title: Robot Id
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TokenRegenerateResponse'
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /api/v1/robots/import:
    post:
      tags:
        - robots
      summary: Import Robots
      description: CSV 파일로 로봇 일괄 등록. Master 전용.
      operationId: import_robots_api_v1_robots_import_post
      requestBody:
        content:
          multipart/form-data:
            schema:
              $ref: >-
                #/components/schemas/Body_import_robots_api_v1_robots_import_post
        required: true
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
      security:
        - OAuth2PasswordBearer: []
  /api/v1/maintenance/{maintenance_id}:
    get:
      tags:
        - maintenance
      summary: Get Maintenance
      description: 정비 요청 상세 조회.
      operationId: get_maintenance_api_v1_maintenance__maintenance_id__get
      security:
        - OAuth2PasswordBearer: []
      parameters:
        - name: maintenance_id
          in: path
          required: true
          schema:
            type: string
            title: Maintenance Id
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MaintenanceDetailResponse'
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
    put:
      tags:
        - maintenance
      summary: Update Maintenance
      description: 정비 요청 수정 (상태, 메모, 배정 기술자 등).
      operationId: update_maintenance_api_v1_maintenance__maintenance_id__put
      security:
        - OAuth2PasswordBearer: []
      parameters:
        - name: maintenance_id
          in: path
          required: true
          schema:
            type: string
            title: Maintenance Id
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/MaintenanceUpdateRequest'
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MaintenanceUpdateResponse'
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /api/v1/maintenance/{maintenance_id}/repair-log:
    put:
      tags:
        - maintenance
      summary: Update Repair Log
      description: 수리 이력 기록. Master 또는 본인 배정 Technician.
      operationId: update_repair_log_api_v1_maintenance__maintenance_id__repair_log_put
      security:
        - OAuth2PasswordBearer: []
      parameters:
        - name: maintenance_id
          in: path
          required: true
          schema:
            type: string
            title: Maintenance Id
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/RepairLogRequest'
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RepairLogResponse'
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /api/v1/admin/users/sync:
    post:
      tags:
        - users
      summary: Sync Cognito Users
      operationId: sync_cognito_users_api_v1_admin_users_sync_post
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
      security:
        - OAuth2PasswordBearer: []
  /api/v1/admin/users:
    get:
      tags:
        - users
      summary: List Users
      operationId: list_users_api_v1_admin_users_get
      security:
        - OAuth2PasswordBearer: []
      parameters:
        - name: search
          in: query
          required: false
          schema:
            anyOf:
              - type: string
              - type: 'null'
            description: 이름 또는 이메일 검색
            title: Search
          description: 이름 또는 이메일 검색
        - name: role
          in: query
          required: false
          schema:
            anyOf:
              - type: string
              - type: 'null'
            description: 역할 필터
            title: Role
          description: 역할 필터
        - name: page
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            default: 1
            title: Page
        - name: size
          in: query
          required: false
          schema:
            type: integer
            maximum: 100
            minimum: 1
            default: 20
            title: Size
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UserListResponse'
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
    post:
      tags:
        - users
      summary: Create User
      operationId: create_user_api_v1_admin_users_post
      security:
        - OAuth2PasswordBearer: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UserCreateRequest'
      responses:
        '201':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /api/v1/admin/users/{user_id}:
    get:
      tags:
        - users
      summary: Get User
      operationId: get_user_api_v1_admin_users__user_id__get
      security:
        - OAuth2PasswordBearer: []
      parameters:
        - name: user_id
          in: path
          required: true
          schema:
            type: string
            title: User Id
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UserDetailResponse'
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
    put:
      tags:
        - users
      summary: Update User
      operationId: update_user_api_v1_admin_users__user_id__put
      security:
        - OAuth2PasswordBearer: []
      parameters:
        - name: user_id
          in: path
          required: true
          schema:
            type: string
            title: User Id
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UserUpdateRequest'
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UserUpdateResponse'
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
    delete:
      tags:
        - users
      summary: Delete User
      operationId: delete_user_api_v1_admin_users__user_id__delete
      security:
        - OAuth2PasswordBearer: []
      parameters:
        - name: user_id
          in: path
          required: true
          schema:
            type: string
            title: User Id
      responses:
        '204':
          description: Successful Response
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /api/v1/admin/users/{user_id}/reset-password:
    post:
      tags:
        - users
      summary: Reset User Password
      operationId: reset_user_password_api_v1_admin_users__user_id__reset_password_post
      security:
        - OAuth2PasswordBearer: []
      parameters:
        - name: user_id
          in: path
          required: true
          schema:
            type: string
            title: User Id
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ResetPasswordRequest'
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /api/v1/products:
    get:
      tags:
        - products
      summary: List Products
      description: 제품 모델 목록 조회 (HW 릴리즈 포함).
      operationId: list_products_api_v1_products_get
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProductListResponse'
      security:
        - OAuth2PasswordBearer: []
    post:
      tags:
        - products
      summary: Create Product
      description: 제품 모델 생성. Master 전용.
      operationId: create_product_api_v1_products_post
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ProductCreateRequest'
        required: true
      responses:
        '201':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProductCreateResponse'
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
      security:
        - OAuth2PasswordBearer: []
  /api/v1/products/{product_id}:
    get:
      tags:
        - products
      summary: Get Product
      description: 제품 모델 상세 조회.
      operationId: get_product_api_v1_products__product_id__get
      security:
        - OAuth2PasswordBearer: []
      parameters:
        - name: product_id
          in: path
          required: true
          schema:
            type: string
            title: Product Id
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProductDetailResponse'
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
    put:
      tags:
        - products
      summary: Update Product
      description: 제품 모델 수정. Master 전용.
      operationId: update_product_api_v1_products__product_id__put
      security:
        - OAuth2PasswordBearer: []
      parameters:
        - name: product_id
          in: path
          required: true
          schema:
            type: string
            title: Product Id
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ProductUpdateRequest'
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProductDetailResponse'
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
    delete:
      tags:
        - products
      summary: Delete Product
      description: 제품 모델 삭제. Master 전용.
      operationId: delete_product_api_v1_products__product_id__delete
      security:
        - OAuth2PasswordBearer: []
      parameters:
        - name: product_id
          in: path
          required: true
          schema:
            type: string
            title: Product Id
      responses:
        '204':
          description: Successful Response
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /api/v1/products/{product_id}/releases:
    post:
      tags:
        - products
      summary: Create Release
      description: HW 릴리즈 추가. Master 전용.
      operationId: create_release_api_v1_products__product_id__releases_post
      security:
        - OAuth2PasswordBearer: []
      parameters:
        - name: product_id
          in: path
          required: true
          schema:
            type: string
            title: Product Id
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/HwReleaseCreateRequest'
      responses:
        '201':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HwReleaseItem'
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /api/v1/products/{product_id}/releases/{release_id}:
    put:
      tags:
        - products
      summary: Update Release
      description: HW 릴리즈 수정. Master 전용.
      operationId: update_release_api_v1_products__product_id__releases__release_id__put
      security:
        - OAuth2PasswordBearer: []
      parameters:
        - name: product_id
          in: path
          required: true
          schema:
            type: string
            title: Product Id
        - name: release_id
          in: path
          required: true
          schema:
            type: string
            title: Release Id
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/HwReleaseUpdateRequest'
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HwReleaseItem'
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
    delete:
      tags:
        - products
      summary: Delete Release
      description: HW 릴리즈 삭제. Master 전용.
      operationId: delete_release_api_v1_products__product_id__releases__release_id__delete
      security:
        - OAuth2PasswordBearer: []
      parameters:
        - name: product_id
          in: path
          required: true
          schema:
            type: string
            title: Product Id
        - name: release_id
          in: path
          required: true
          schema:
            type: string
            title: Release Id
      responses:
        '204':
          description: Successful Response
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /api/v1/vehicles/specs:
    get:
      tags:
        - vehicles
      summary: List Vehicle Specs
      description: 차량 제원 목록 조회 (검색, 연식/차종 필터, 정렬, 페이지네이션).
      operationId: list_vehicle_specs_api_v1_vehicles_specs_get
      security:
        - OAuth2PasswordBearer: []
      parameters:
        - name: search
          in: query
          required: false
          schema:
            anyOf:
              - type: string
              - type: 'null'
            description: 제조사/모델명 검색
            title: Search
          description: 제조사/모델명 검색
        - name: year
          in: query
          required: false
          schema:
            anyOf:
              - type: integer
              - type: 'null'
            description: 연식 필터
            title: Year
          description: 연식 필터
        - name: category
          in: query
          required: false
          schema:
            anyOf:
              - type: string
              - type: 'null'
            description: 차종 필터
            title: Category
          description: 차종 필터
        - name: sort_by
          in: query
          required: false
          schema:
            anyOf:
              - type: string
              - type: 'null'
            description: >-
              정렬 컬럼 (model, year, vehicle_total_length, vehicle_width,
              vehicle_height, vehicle_weight)
            title: Sort By
          description: >-
            정렬 컬럼 (model, year, vehicle_total_length, vehicle_width,
            vehicle_height, vehicle_weight)
        - name: sort_order
          in: query
          required: false
          schema:
            anyOf:
              - type: string
              - type: 'null'
            description: 정렬 방향 (asc / desc)
            title: Sort Order
          description: 정렬 방향 (asc / desc)
        - name: page
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            default: 1
            title: Page
        - name: size
          in: query
          required: false
          schema:
            type: integer
            maximum: 100
            minimum: 1
            default: 20
            title: Size
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/VehicleSpecListResponse'
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
    post:
      tags:
        - vehicles
      summary: Create Vehicle Spec
      description: 차량 제원 등록. Master 전용.
      operationId: create_vehicle_spec_api_v1_vehicles_specs_post
      security:
        - OAuth2PasswordBearer: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/VehicleSpecCreate'
      responses:
        '201':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/VehicleSpecResponse'
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
    delete:
      tags:
        - vehicles
      summary: Delete All Vehicle Specs
      description: 차량 제원 전체 삭제. Master 전용.
      operationId: delete_all_vehicle_specs_api_v1_vehicles_specs_delete
      security:
        - OAuth2PasswordBearer: []
      responses:
        '204':
          description: Successful Response
  /api/v1/vehicles/specs/{spec_id}:
    put:
      tags:
        - vehicles
      summary: Update Vehicle Spec
      description: 차량 제원 수정. Master 전용.
      operationId: update_vehicle_spec_api_v1_vehicles_specs__spec_id__put
      security:
        - OAuth2PasswordBearer: []
      parameters:
        - name: spec_id
          in: path
          required: true
          schema:
            type: string
            title: Spec Id
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/VehicleSpecUpdate'
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/VehicleSpecResponse'
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
    delete:
      tags:
        - vehicles
      summary: Delete Vehicle Spec
      description: 차량 제원 삭제. Master 전용.
      operationId: delete_vehicle_spec_api_v1_vehicles_specs__spec_id__delete
      security:
        - OAuth2PasswordBearer: []
      parameters:
        - name: spec_id
          in: path
          required: true
          schema:
            type: string
            title: Spec Id
      responses:
        '204':
          description: Successful Response
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /api/v1/vehicles/specs/import:
    post:
      tags:
        - vehicles
      summary: Import Vehicle Specs
      description: CSV/Excel 파일로 차량 제원 일괄 등록. Master 전용.
      operationId: import_vehicle_specs_api_v1_vehicles_specs_import_post
      requestBody:
        content:
          multipart/form-data:
            schema:
              $ref: >-
                #/components/schemas/Body_import_vehicle_specs_api_v1_vehicles_specs_import_post
        required: true
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ImportResult'
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
      security:
        - OAuth2PasswordBearer: []
  /metrics:
    get:
      summary: Metrics
      description: Endpoint that serves Prometheus metrics.
      operationId: metrics_metrics_get
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
  /health:
    get:
      summary: Health Check
      operationId: health_check_health_get
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
components:
  schemas:
    AdminLoginBody:
      properties:
        username:
          type: string
          title: Username
          default: ''
        access_token:
          anyOf:
            - type: string
            - type: 'null'
          title: Access Token
      type: object
      title: AdminLoginBody
    AdminRegistrationCreateBody:
      properties:
        site_id:
          type: string
          title: Site Id
        vehicle_number:
          type: string
          title: Vehicle Number
        phone_number:
          type: string
          title: Phone Number
        owner_name:
          anyOf:
            - type: string
            - type: 'null'
          title: Owner Name
        is_disabled:
          type: boolean
          title: Is Disabled
          default: false
        is_multi_child:
          type: boolean
          title: Is Multi Child
          default: false
        skip_spec_lookup:
          type: boolean
          title: Skip Spec Lookup
          default: false
        vehicle_model_name:
          anyOf:
            - type: string
            - type: 'null'
          title: Vehicle Model Name
      type: object
      required:
        - site_id
        - vehicle_number
        - phone_number
      title: AdminRegistrationCreateBody
      description: |-
        관리자 등록 생성 — CVMIS(365 API) 제원 자동 조회 후 등록. 동의/OTP 생략.
        CVMIS 실패 시 vehicle_model_name(수동 입력)으로 진행, 차종이 비어 있어도 등록 가능.
    AdminReservationCreateBody:
      properties:
        site_id:
          type: string
          title: Site Id
        vehicle_number:
          type: string
          title: Vehicle Number
        phone_number:
          type: string
          title: Phone Number
        entry_time:
          type: string
          title: Entry Time
        exit_time:
          type: string
          title: Exit Time
        owner_name:
          anyOf:
            - type: string
            - type: 'null'
          title: Owner Name
        is_disabled:
          type: boolean
          title: Is Disabled
          default: false
        is_multi_child:
          type: boolean
          title: Is Multi Child
          default: false
        create_vehicle:
          type: boolean
          title: Create Vehicle
          default: false
        vehicle_model_name:
          anyOf:
            - type: string
            - type: 'null'
          title: Vehicle Model Name
      type: object
      required:
        - site_id
        - vehicle_number
        - phone_number
        - entry_time
        - exit_time
      title: AdminReservationCreateBody
      description: |-
        관리자 예약 생성 — 동의/OTP 절차 생략.
        create_vehicle=False: 이미 등록된(VehicleOwner) 차량만 허용.
        create_vehicle=True : CVMIS 제원 조회로 VehicleOwner 자동 생성 후 예약.
                               CVMIS 실패 시 vehicle_model_name(수동 입력)으로 진행.
    AdminRobotCreate:
      properties:
        name:
          type: string
          title: Name
        mac_address:
          anyOf:
            - type: string
            - type: 'null'
          title: Mac Address
        model_id:
          anyOf:
            - type: string
            - type: 'null'
          title: Model Id
        mvp_version:
          anyOf:
            - type: integer
            - type: 'null'
          title: Mvp Version
        sw_version:
          anyOf:
            - type: string
            - type: 'null'
          title: Sw Version
        hw_release_id:
          anyOf:
            - type: string
            - type: 'null'
          title: Hw Release Id
        initial_site_id:
          anyOf:
            - type: string
            - type: 'null'
          title: Initial Site Id
      type: object
      required:
        - name
      title: AdminRobotCreate
    AdminRobotUpdate:
      properties:
        name:
          anyOf:
            - type: string
            - type: 'null'
          title: Name
        part_number:
          anyOf:
            - type: string
            - type: 'null'
          title: Part Number
        wifi_mac:
          anyOf:
            - type: string
            - type: 'null'
          title: Wifi Mac
        lte_mac:
          anyOf:
            - type: string
            - type: 'null'
          title: Lte Mac
        hw_version:
          anyOf:
            - type: string
            - type: 'null'
          title: Hw Version
        sw_version:
          anyOf:
            - type: string
            - type: 'null'
          title: Sw Version
        status:
          anyOf:
            - type: string
            - type: 'null'
          title: Status
        current_site_id:
          anyOf:
            - type: string
            - type: 'null'
          title: Current Site Id
      type: object
      title: AdminRobotUpdate
    BatchPositionUpdate:
      properties:
        updates:
          items:
            $ref: '#/components/schemas/PositionItem'
          type: array
          title: Updates
      type: object
      required:
        - updates
      title: BatchPositionUpdate
    BlackoutCreateBody:
      properties:
        start_at:
          type: string
          format: date-time
          title: Start At
        end_at:
          type: string
          format: date-time
          title: End At
        reason:
          anyOf:
            - type: string
              maxLength: 200
            - type: 'null'
          title: Reason
        is_active:
          type: boolean
          title: Is Active
          default: true
      type: object
      required:
        - start_at
        - end_at
      title: BlackoutCreateBody
    BlackoutUpdateBody:
      properties:
        start_at:
          anyOf:
            - type: string
              format: date-time
            - type: 'null'
          title: Start At
        end_at:
          anyOf:
            - type: string
              format: date-time
            - type: 'null'
          title: End At
        reason:
          anyOf:
            - type: string
              maxLength: 200
            - type: 'null'
          title: Reason
        is_active:
          anyOf:
            - type: boolean
            - type: 'null'
          title: Is Active
      type: object
      title: BlackoutUpdateBody
    Body_bulk_upload_registrations_api_v1_admin_registrations_bulk_upload_post:
      properties:
        file:
          type: string
          format: binary
          title: File
      type: object
      required:
        - file
      title: >-
        Body_bulk_upload_registrations_api_v1_admin_registrations_bulk_upload_post
    Body_import_parking_map_api_v1_admin_sites__site_id__parking_spaces_import_post:
      properties:
        file:
          type: string
          format: binary
          title: File
      type: object
      required:
        - file
      title: >-
        Body_import_parking_map_api_v1_admin_sites__site_id__parking_spaces_import_post
    Body_import_robots_api_v1_robots_import_post:
      properties:
        file:
          type: string
          format: binary
          title: File
          description: CSV 파일
      type: object
      required:
        - file
      title: Body_import_robots_api_v1_robots_import_post
    Body_import_vehicle_specs_api_v1_vehicles_specs_import_post:
      properties:
        file:
          type: string
          format: binary
          title: File
          description: CSV 또는 Excel(.xlsx) 파일
      type: object
      required:
        - file
      title: Body_import_vehicle_specs_api_v1_vehicles_specs_import_post
    Body_upload_blueprint_api_v1_admin_sites__site_id__floors__floor_id__blueprint_post:
      properties:
        file:
          type: string
          format: binary
          title: File
      type: object
      required:
        - file
      title: >-
        Body_upload_blueprint_api_v1_admin_sites__site_id__floors__floor_id__blueprint_post
    Body_upload_site_background_api_v1_admin_sites__site_id__background_image_post:
      properties:
        file:
          type: string
          format: binary
          title: File
      type: object
      required:
        - file
      title: >-
        Body_upload_site_background_api_v1_admin_sites__site_id__background_image_post
    CarryCompleteBody:
      properties:
        event_type:
          type: string
          title: Event Type
        vehicle_number:
          type: string
          title: Vehicle Number
        site_id:
          type: string
          title: Site Id
        parking_space:
          anyOf:
            - type: string
            - type: 'null'
          title: Parking Space
        completed_at:
          anyOf:
            - type: string
            - type: 'null'
          title: Completed At
        duration_minutes:
          anyOf:
            - type: integer
            - type: 'null'
          title: Duration Minutes
      type: object
      required:
        - event_type
        - vehicle_number
        - site_id
      title: CarryCompleteBody
    FloorCreate:
      properties:
        name:
          type: string
          title: Name
        sort_order:
          type: integer
          title: Sort Order
          default: 0
      type: object
      required:
        - name
      title: FloorCreate
    FloorUpdate:
      properties:
        name:
          anyOf:
            - type: string
            - type: 'null'
          title: Name
        sort_order:
          anyOf:
            - type: integer
            - type: 'null'
          title: Sort Order
        blueprint_url:
          anyOf:
            - type: string
            - type: 'null'
          title: Blueprint Url
        blueprint_x:
          anyOf:
            - type: number
            - type: 'null'
          title: Blueprint X
        blueprint_y:
          anyOf:
            - type: number
            - type: 'null'
          title: Blueprint Y
        blueprint_scale:
          anyOf:
            - type: number
            - type: 'null'
          title: Blueprint Scale
        blueprint_rotation:
          anyOf:
            - type: number
            - type: 'null'
          title: Blueprint Rotation
      type: object
      title: FloorUpdate
    HTTPValidationError:
      properties:
        detail:
          items:
            $ref: '#/components/schemas/ValidationError'
          type: array
          title: Detail
      type: object
      title: HTTPValidationError
    HwReleaseCreateRequest:
      properties:
        part_number:
          anyOf:
            - type: string
            - type: 'null'
          title: Part Number
        release_number:
          anyOf:
            - type: string
            - type: 'null'
          title: Release Number
        mvp_version:
          anyOf:
            - type: integer
            - type: 'null'
          title: Mvp Version
        unit_prefix:
          anyOf:
            - type: string
            - type: 'null'
          title: Unit Prefix
        release_date:
          anyOf:
            - type: string
              format: date
            - type: 'null'
          title: Release Date
        latest_sw_version:
          anyOf:
            - type: string
            - type: 'null'
          title: Latest Sw Version
        description:
          anyOf:
            - type: string
            - type: 'null'
          title: Description
        spec_dimensions:
          anyOf:
            - additionalProperties: true
              type: object
            - type: 'null'
          title: Spec Dimensions
        spec_weight:
          anyOf:
            - additionalProperties: true
              type: object
            - type: 'null'
          title: Spec Weight
        spec_performance:
          anyOf:
            - additionalProperties: true
              type: object
            - type: 'null'
          title: Spec Performance
        spec_battery:
          anyOf:
            - additionalProperties: true
              type: object
            - type: 'null'
          title: Spec Battery
        spec_sensors:
          anyOf:
            - additionalProperties: true
              type: object
            - type: 'null'
          title: Spec Sensors
        spec_motor:
          anyOf:
            - additionalProperties: true
              type: object
            - type: 'null'
          title: Spec Motor
        spec_communication:
          anyOf:
            - additionalProperties: true
              type: object
            - type: 'null'
          title: Spec Communication
        spec_environment:
          anyOf:
            - additionalProperties: true
              type: object
            - type: 'null'
          title: Spec Environment
        spec_etc:
          anyOf:
            - additionalProperties: true
              type: object
            - type: 'null'
          title: Spec Etc
      type: object
      title: HwReleaseCreateRequest
    HwReleaseItem:
      properties:
        id:
          type: string
          title: Id
        part_number:
          type: string
          title: Part Number
        release_number:
          anyOf:
            - type: string
            - type: 'null'
          title: Release Number
        mvp_version:
          anyOf:
            - type: integer
            - type: 'null'
          title: Mvp Version
        unit_prefix:
          anyOf:
            - type: string
            - type: 'null'
          title: Unit Prefix
        release_date:
          anyOf:
            - type: string
              format: date
            - type: 'null'
          title: Release Date
        latest_sw_version:
          anyOf:
            - type: string
            - type: 'null'
          title: Latest Sw Version
        description:
          anyOf:
            - type: string
            - type: 'null'
          title: Description
        spec_dimensions:
          anyOf:
            - additionalProperties: true
              type: object
            - type: 'null'
          title: Spec Dimensions
        spec_weight:
          anyOf:
            - additionalProperties: true
              type: object
            - type: 'null'
          title: Spec Weight
        spec_performance:
          anyOf:
            - additionalProperties: true
              type: object
            - type: 'null'
          title: Spec Performance
        spec_battery:
          anyOf:
            - additionalProperties: true
              type: object
            - type: 'null'
          title: Spec Battery
        spec_sensors:
          anyOf:
            - additionalProperties: true
              type: object
            - type: 'null'
          title: Spec Sensors
        spec_motor:
          anyOf:
            - additionalProperties: true
              type: object
            - type: 'null'
          title: Spec Motor
        spec_communication:
          anyOf:
            - additionalProperties: true
              type: object
            - type: 'null'
          title: Spec Communication
        spec_environment:
          anyOf:
            - additionalProperties: true
              type: object
            - type: 'null'
          title: Spec Environment
        spec_etc:
          anyOf:
            - additionalProperties: true
              type: object
            - type: 'null'
          title: Spec Etc
        created_at:
          anyOf:
            - type: string
              format: date-time
            - type: 'null'
          title: Created At
      type: object
      required:
        - id
        - part_number
      title: HwReleaseItem
    HwReleaseUpdateRequest:
      properties:
        part_number:
          anyOf:
            - type: string
            - type: 'null'
          title: Part Number
        release_number:
          anyOf:
            - type: string
            - type: 'null'
          title: Release Number
        mvp_version:
          anyOf:
            - type: integer
            - type: 'null'
          title: Mvp Version
        unit_prefix:
          anyOf:
            - type: string
            - type: 'null'
          title: Unit Prefix
        release_date:
          anyOf:
            - type: string
              format: date
            - type: 'null'
          title: Release Date
        latest_sw_version:
          anyOf:
            - type: string
            - type: 'null'
          title: Latest Sw Version
        description:
          anyOf:
            - type: string
            - type: 'null'
          title: Description
        spec_dimensions:
          anyOf:
            - additionalProperties: true
              type: object
            - type: 'null'
          title: Spec Dimensions
        spec_weight:
          anyOf:
            - additionalProperties: true
              type: object
            - type: 'null'
          title: Spec Weight
        spec_performance:
          anyOf:
            - additionalProperties: true
              type: object
            - type: 'null'
          title: Spec Performance
        spec_battery:
          anyOf:
            - additionalProperties: true
              type: object
            - type: 'null'
          title: Spec Battery
        spec_sensors:
          anyOf:
            - additionalProperties: true
              type: object
            - type: 'null'
          title: Spec Sensors
        spec_motor:
          anyOf:
            - additionalProperties: true
              type: object
            - type: 'null'
          title: Spec Motor
        spec_communication:
          anyOf:
            - additionalProperties: true
              type: object
            - type: 'null'
          title: Spec Communication
        spec_environment:
          anyOf:
            - additionalProperties: true
              type: object
            - type: 'null'
          title: Spec Environment
        spec_etc:
          anyOf:
            - additionalProperties: true
              type: object
            - type: 'null'
          title: Spec Etc
      type: object
      title: HwReleaseUpdateRequest
    IdentityCheckRequest:
      properties:
        vehicle_number:
          type: string
          title: Vehicle Number
        phone_number:
          type: string
          title: Phone Number
        site_id:
          anyOf:
            - type: string
            - type: 'null'
          title: Site Id
      type: object
      required:
        - vehicle_number
        - phone_number
      title: IdentityCheckRequest
    ImportResult:
      properties:
        total_rows:
          type: integer
          title: Total Rows
        imported:
          type: integer
          title: Imported
        updated:
          type: integer
          title: Updated
          default: 0
        skipped:
          type: integer
          title: Skipped
        errors:
          items:
            type: string
          type: array
          title: Errors
      type: object
      required:
        - total_rows
        - imported
        - skipped
        - errors
      title: ImportResult
    KcbRequestBody:
      properties:
        car_owner:
          anyOf:
            - type: string
            - type: 'null'
          title: Car Owner
        car_reg_no:
          anyOf:
            - type: string
            - type: 'null'
          title: Car Reg No
        phone_number:
          anyOf:
            - type: string
            - type: 'null'
          title: Phone Number
      type: object
      title: KcbRequestBody
      description: |-
        KCB 제3자 정보제공동의 요청.

        car_owner + car_reg_no: 고정방식일 경우 필수 (PDF p.8)
        phone_number: 본인인증용 (선택 - 기존 호환)
    LookupOtpSendRequest:
      properties:
        phone_number:
          type: string
          title: Phone Number
      type: object
      required:
        - phone_number
      title: LookupOtpSendRequest
    LookupOtpVerifyRequest:
      properties:
        phone_number:
          type: string
          title: Phone Number
        otp_code:
          type: string
          title: Otp Code
      type: object
      required:
        - phone_number
        - otp_code
      title: LookupOtpVerifyRequest
    MaintenanceDetailResponse:
      properties:
        id:
          type: string
          title: Id
        robot_id:
          type: string
          title: Robot Id
        robot_name:
          anyOf:
            - type: string
            - type: 'null'
          title: Robot Name
        robot_serial_number:
          anyOf:
            - type: string
            - type: 'null'
          title: Robot Serial Number
        maintenance_type:
          type: string
          title: Maintenance Type
        status:
          type: string
          title: Status
        priority:
          type: string
          title: Priority
        description:
          anyOf:
            - type: string
            - type: 'null'
          title: Description
        notes:
          anyOf:
            - type: string
            - type: 'null'
          title: Notes
        request_site:
          anyOf:
            - type: string
            - type: 'null'
          title: Request Site
        requester_id:
          anyOf:
            - type: string
            - type: 'null'
          title: Requester Id
        requester_name:
          anyOf:
            - type: string
            - type: 'null'
          title: Requester Name
        assigned_technician_id:
          anyOf:
            - type: string
            - type: 'null'
          title: Assigned Technician Id
        assigned_technician_name:
          anyOf:
            - type: string
            - type: 'null'
          title: Assigned Technician Name
        repair_details:
          anyOf:
            - additionalProperties: true
              type: object
            - type: 'null'
          title: Repair Details
        request_date:
          anyOf:
            - type: string
              format: date-time
            - type: 'null'
          title: Request Date
        started_at:
          anyOf:
            - type: string
              format: date-time
            - type: 'null'
          title: Started At
        completed_at:
          anyOf:
            - type: string
              format: date-time
            - type: 'null'
          title: Completed At
        created_at:
          anyOf:
            - type: string
              format: date-time
            - type: 'null'
          title: Created At
        updated_at:
          anyOf:
            - type: string
              format: date-time
            - type: 'null'
          title: Updated At
      type: object
      required:
        - id
        - robot_id
        - maintenance_type
        - status
        - priority
      title: MaintenanceDetailResponse
    MaintenanceUpdateRequest:
      properties:
        status:
          anyOf:
            - type: string
            - type: 'null'
          title: Status
        priority:
          anyOf:
            - type: string
            - type: 'null'
          title: Priority
        notes:
          anyOf:
            - type: string
            - type: 'null'
          title: Notes
        assigned_technician_id:
          anyOf:
            - type: string
            - type: 'null'
          title: Assigned Technician Id
        description:
          anyOf:
            - type: string
            - type: 'null'
          title: Description
      type: object
      title: MaintenanceUpdateRequest
    MaintenanceUpdateResponse:
      properties:
        id:
          type: string
          title: Id
        status:
          type: string
          title: Status
        priority:
          type: string
          title: Priority
        notes:
          anyOf:
            - type: string
            - type: 'null'
          title: Notes
        assigned_technician_id:
          anyOf:
            - type: string
            - type: 'null'
          title: Assigned Technician Id
        description:
          anyOf:
            - type: string
            - type: 'null'
          title: Description
        updated_at:
          anyOf:
            - type: string
              format: date-time
            - type: 'null'
          title: Updated At
      type: object
      required:
        - id
        - status
        - priority
      title: MaintenanceUpdateResponse
    ManualSendBody:
      properties:
        recipient_phone:
          anyOf:
            - type: string
            - type: 'null'
          title: Recipient Phone
        message:
          type: string
          title: Message
        broadcast:
          type: boolean
          title: Broadcast
          default: false
      type: object
      required:
        - message
      title: ManualSendBody
    MovementHistoryItem:
      properties:
        id:
          type: string
          title: Id
        from_site_id:
          anyOf:
            - type: string
            - type: 'null'
          title: From Site Id
        from_site_name:
          anyOf:
            - type: string
            - type: 'null'
          title: From Site Name
        from_site_code:
          anyOf:
            - type: string
            - type: 'null'
          title: From Site Code
        to_site_id:
          anyOf:
            - type: string
            - type: 'null'
          title: To Site Id
        to_site_name:
          anyOf:
            - type: string
            - type: 'null'
          title: To Site Name
        to_site_code:
          anyOf:
            - type: string
            - type: 'null'
          title: To Site Code
        movement_type:
          type: string
          title: Movement Type
        reason:
          anyOf:
            - type: string
            - type: 'null'
          title: Reason
        notes:
          anyOf:
            - type: string
            - type: 'null'
          title: Notes
        moved_by_id:
          anyOf:
            - type: string
            - type: 'null'
          title: Moved By Id
        moved_by_name:
          anyOf:
            - type: string
            - type: 'null'
          title: Moved By Name
        moved_at:
          type: string
          format: date-time
          title: Moved At
      type: object
      required:
        - id
        - from_site_id
        - from_site_name
        - from_site_code
        - to_site_id
        - to_site_name
        - to_site_code
        - movement_type
        - reason
        - notes
        - moved_by_id
        - moved_by_name
        - moved_at
      title: MovementHistoryItem
    MovementHistoryResponse:
      properties:
        items:
          items:
            $ref: '#/components/schemas/MovementHistoryItem'
          type: array
          title: Items
        total:
          type: integer
          title: Total
        page:
          type: integer
          title: Page
        size:
          type: integer
          title: Size
      type: object
      required:
        - items
        - total
        - page
        - size
      title: MovementHistoryResponse
    NotificationTemplateUpdate:
      properties:
        template_code:
          anyOf:
            - type: string
            - type: 'null'
          title: Template Code
        template_body:
          anyOf:
            - type: string
            - type: 'null'
          title: Template Body
        is_active:
          anyOf:
            - type: boolean
            - type: 'null'
          title: Is Active
      type: object
      title: NotificationTemplateUpdate
    OperationPolicyUpdate:
      properties:
        operating_start:
          anyOf:
            - type: string
            - type: 'null'
          title: Operating Start
        operating_end:
          anyOf:
            - type: string
            - type: 'null'
          title: Operating End
        operating_days:
          anyOf:
            - type: string
            - type: 'null'
          title: Operating Days
        temporary_extension_end:
          anyOf:
            - type: string
            - type: 'null'
          title: Temporary Extension End
        slot_duration_minutes:
          anyOf:
            - type: integer
            - type: 'null'
          title: Slot Duration Minutes
        max_entry_per_slot:
          anyOf:
            - type: integer
            - type: 'null'
          title: Max Entry Per Slot
        max_exit_per_slot:
          anyOf:
            - type: integer
            - type: 'null'
          title: Max Exit Per Slot
        booking_cap_percent:
          anyOf:
            - type: integer
            - type: 'null'
          title: Booking Cap Percent
        vehicle_height_check_enabled:
          anyOf:
            - type: boolean
            - type: 'null'
          title: Vehicle Height Check Enabled
        deferred_gate_processing:
          anyOf:
            - type: boolean
            - type: 'null'
          title: Deferred Gate Processing
        allow_unregistered_vehicle:
          anyOf:
            - type: boolean
            - type: 'null'
          title: Allow Unregistered Vehicle
      type: object
      title: OperationPolicyUpdate
    OtpSendRequest:
      properties:
        vehicle_number:
          type: string
          title: Vehicle Number
        phone_number:
          type: string
          title: Phone Number
        site_id:
          anyOf:
            - type: string
            - type: 'null'
          title: Site Id
      type: object
      required:
        - vehicle_number
        - phone_number
      title: OtpSendRequest
    OtpVerifyRequest:
      properties:
        vehicle_number:
          type: string
          title: Vehicle Number
        phone_number:
          type: string
          title: Phone Number
        otp_code:
          type: string
          title: Otp Code
      type: object
      required:
        - vehicle_number
        - phone_number
        - otp_code
      title: OtpVerifyRequest
    ParkingSpaceCreate:
      properties:
        floor_id:
          type: string
          title: Floor Id
        name:
          type: string
          title: Name
        type:
          type: string
          title: Type
          default: space
        priority:
          type: integer
          title: Priority
          default: 0
        is_active:
          type: boolean
          title: Is Active
          default: true
        width:
          type: number
          title: Width
          default: 2.5
        length:
          type: number
          title: Length
          default: 5
        align_type:
          type: string
          title: Align Type
          default: edge_rear
        position_x:
          type: number
          title: Position X
          default: 0
        position_y:
          type: number
          title: Position Y
          default: 0
        rotation:
          type: number
          title: Rotation
          default: 0
        estimated_job_time:
          anyOf:
            - type: integer
            - type: 'null'
          title: Estimated Job Time
        parking_direction:
          anyOf:
            - type: string
            - type: 'null'
          title: Parking Direction
      type: object
      required:
        - floor_id
        - name
      title: ParkingSpaceCreate
    ParkingSpaceUpdate:
      properties:
        name:
          anyOf:
            - type: string
            - type: 'null'
          title: Name
        type:
          anyOf:
            - type: string
            - type: 'null'
          title: Type
        priority:
          anyOf:
            - type: integer
            - type: 'null'
          title: Priority
        is_active:
          anyOf:
            - type: boolean
            - type: 'null'
          title: Is Active
        width:
          anyOf:
            - type: number
            - type: 'null'
          title: Width
        length:
          anyOf:
            - type: number
            - type: 'null'
          title: Length
        align_type:
          anyOf:
            - type: string
            - type: 'null'
          title: Align Type
        position_x:
          anyOf:
            - type: number
            - type: 'null'
          title: Position X
        position_y:
          anyOf:
            - type: number
            - type: 'null'
          title: Position Y
        rotation:
          anyOf:
            - type: number
            - type: 'null'
          title: Rotation
        estimated_job_time:
          anyOf:
            - type: integer
            - type: 'null'
          title: Estimated Job Time
        parking_direction:
          anyOf:
            - type: string
            - type: 'null'
          title: Parking Direction
      type: object
      title: ParkingSpaceUpdate
    PassVehicleCreateBody:
      properties:
        vehicle_number:
          type: string
          maxLength: 20
          minLength: 1
          title: Vehicle Number
        owner_name:
          anyOf:
            - type: string
              maxLength: 100
            - type: 'null'
          title: Owner Name
        phone_number:
          anyOf:
            - type: string
              maxLength: 20
            - type: 'null'
          title: Phone Number
        reason:
          anyOf:
            - type: string
              maxLength: 200
            - type: 'null'
          title: Reason
        is_active:
          type: boolean
          title: Is Active
          default: true
        valid_from:
          anyOf:
            - type: string
              format: date-time
            - type: 'null'
          title: Valid From
        valid_until:
          anyOf:
            - type: string
              format: date-time
            - type: 'null'
          title: Valid Until
      type: object
      required:
        - vehicle_number
      title: PassVehicleCreateBody
    PassVehicleEntryBody:
      properties:
        site_id:
          type: string
          title: Site Id
        vehicle_number:
          type: string
          title: Vehicle Number
        entry_time:
          anyOf:
            - type: string
            - type: 'null'
          title: Entry Time
      type: object
      required:
        - site_id
        - vehicle_number
      title: PassVehicleEntryBody
    PassVehicleUpdateBody:
      properties:
        owner_name:
          anyOf:
            - type: string
              maxLength: 100
            - type: 'null'
          title: Owner Name
        phone_number:
          anyOf:
            - type: string
              maxLength: 20
            - type: 'null'
          title: Phone Number
        reason:
          anyOf:
            - type: string
              maxLength: 200
            - type: 'null'
          title: Reason
        is_active:
          anyOf:
            - type: boolean
            - type: 'null'
          title: Is Active
        valid_from:
          anyOf:
            - type: string
              format: date-time
            - type: 'null'
          title: Valid From
        valid_until:
          anyOf:
            - type: string
              format: date-time
            - type: 'null'
          title: Valid Until
      type: object
      title: PassVehicleUpdateBody
    PasswordChangeBody:
      properties:
        old_password:
          type: string
          title: Old Password
        new_password:
          type: string
          title: New Password
      type: object
      required:
        - old_password
        - new_password
      title: PasswordChangeBody
    PositionItem:
      properties:
        id:
          type: string
          title: Id
        position_x:
          type: number
          title: Position X
        position_y:
          type: number
          title: Position Y
        rotation:
          type: number
          title: Rotation
          default: 0
      type: object
      required:
        - id
        - position_x
        - position_y
      title: PositionItem
    ProductCreateRequest:
      properties:
        code:
          type: string
          title: Code
        name:
          type: string
          title: Name
        description:
          anyOf:
            - type: string
            - type: 'null'
          title: Description
        is_active:
          type: boolean
          title: Is Active
          default: true
        mvp_specs:
          anyOf:
            - additionalProperties: true
              type: object
            - type: 'null'
          title: Mvp Specs
      type: object
      required:
        - code
        - name
      title: ProductCreateRequest
    ProductCreateResponse:
      properties:
        id:
          type: string
          title: Id
        code:
          type: string
          title: Code
        name:
          type: string
          title: Name
        description:
          anyOf:
            - type: string
            - type: 'null'
          title: Description
        is_active:
          type: boolean
          title: Is Active
          default: true
        mvp_specs:
          anyOf:
            - additionalProperties: true
              type: object
            - type: 'null'
          title: Mvp Specs
        created_at:
          anyOf:
            - type: string
              format: date-time
            - type: 'null'
          title: Created At
      type: object
      required:
        - id
        - code
        - name
      title: ProductCreateResponse
    ProductDetailResponse:
      properties:
        id:
          type: string
          title: Id
        code:
          type: string
          title: Code
        name:
          type: string
          title: Name
        description:
          anyOf:
            - type: string
            - type: 'null'
          title: Description
        is_active:
          type: boolean
          title: Is Active
          default: true
        mvp_specs:
          anyOf:
            - additionalProperties: true
              type: object
            - type: 'null'
          title: Mvp Specs
        releases:
          items:
            $ref: '#/components/schemas/HwReleaseItem'
          type: array
          title: Releases
          default: []
        created_at:
          anyOf:
            - type: string
              format: date-time
            - type: 'null'
          title: Created At
        updated_at:
          anyOf:
            - type: string
              format: date-time
            - type: 'null'
          title: Updated At
      type: object
      required:
        - id
        - code
        - name
      title: ProductDetailResponse
    ProductListItem:
      properties:
        id:
          type: string
          title: Id
        code:
          type: string
          title: Code
        name:
          type: string
          title: Name
        description:
          anyOf:
            - type: string
            - type: 'null'
          title: Description
        is_active:
          type: boolean
          title: Is Active
          default: true
        mvp_specs:
          anyOf:
            - additionalProperties: true
              type: object
            - type: 'null'
          title: Mvp Specs
        releases:
          items:
            $ref: '#/components/schemas/HwReleaseItem'
          type: array
          title: Releases
          default: []
        created_at:
          anyOf:
            - type: string
              format: date-time
            - type: 'null'
          title: Created At
      type: object
      required:
        - id
        - code
        - name
      title: ProductListItem
    ProductListResponse:
      properties:
        items:
          items:
            $ref: '#/components/schemas/ProductListItem'
          type: array
          title: Items
        total:
          type: integer
          title: Total
      type: object
      required:
        - items
        - total
      title: ProductListResponse
    ProductUpdateRequest:
      properties:
        code:
          anyOf:
            - type: string
            - type: 'null'
          title: Code
        name:
          anyOf:
            - type: string
            - type: 'null'
          title: Name
        description:
          anyOf:
            - type: string
            - type: 'null'
          title: Description
        is_active:
          anyOf:
            - type: boolean
            - type: 'null'
          title: Is Active
        mvp_specs:
          anyOf:
            - additionalProperties: true
              type: object
            - type: 'null'
          title: Mvp Specs
      type: object
      title: ProductUpdateRequest
    ProfileSettingsUpdate:
      properties:
        notif_auto_dismiss_minutes:
          anyOf:
            - type: integer
            - type: 'null'
          title: Notif Auto Dismiss Minutes
      type: object
      title: ProfileSettingsUpdate
    ProxyOtpSendRequest:
      properties:
        phone_number:
          type: string
          title: Phone Number
      type: object
      required:
        - phone_number
      title: ProxyOtpSendRequest
      description: 신규 사용자용 phone-only OTP 발송.
    ProxyOtpVerifyRequest:
      properties:
        phone_number:
          type: string
          title: Phone Number
        otp_code:
          type: string
          title: Otp Code
        site_id:
          anyOf:
            - type: string
            - type: 'null'
          title: Site Id
      type: object
      required:
        - phone_number
        - otp_code
      title: ProxyOtpVerifyRequest
    PublicAppSettings:
      properties:
        app_version:
          type: string
          title: App Version
        app_download_url:
          type: string
          title: App Download Url
        app_banner_dismiss_days:
          type: integer
          title: App Banner Dismiss Days
      type: object
      required:
        - app_version
        - app_download_url
        - app_banner_dismiss_days
      title: PublicAppSettings
    RegistrationCancelBody:
      properties:
        phone_number:
          type: string
          title: Phone Number
      type: object
      required:
        - phone_number
      title: RegistrationCancelBody
    RegistrationCreate:
      properties:
        site_id:
          type: string
          title: Site Id
        car_number:
          type: string
          title: Car Number
        phone_number:
          type: string
          title: Phone Number
      type: object
      required:
        - site_id
        - car_number
        - phone_number
      title: RegistrationCreate
    RegistrationCreateBody:
      properties:
        site_id:
          type: string
          title: Site Id
        vehicle_number:
          type: string
          title: Vehicle Number
        phone_number:
          type: string
          title: Phone Number
        owner_name:
          anyOf:
            - type: string
            - type: 'null'
          title: Owner Name
        is_disabled:
          type: boolean
          title: Is Disabled
          default: false
        is_multi_child:
          type: boolean
          title: Is Multi Child
          default: false
        verification_token:
          anyOf:
            - type: string
            - type: 'null'
          title: Verification Token
        personal_info_consent:
          type: boolean
          title: Personal Info Consent
          default: false
        third_party_consent:
          type: boolean
          title: Third Party Consent
          default: false
      type: object
      required:
        - site_id
        - vehicle_number
        - phone_number
      title: RegistrationCreateBody
    RegistrationResponse:
      properties:
        success:
          type: boolean
          title: Success
        message:
          type: string
          title: Message
        data:
          anyOf:
            - additionalProperties: true
              type: object
            - type: 'null'
          title: Data
      type: object
      required:
        - success
        - message
      title: RegistrationResponse
    RegistrationStatusBody:
      properties:
        status:
          type: string
          title: Status
      type: object
      required:
        - status
      title: RegistrationStatusBody
    RepairLogRequest:
      properties:
        work_description:
          type: string
          title: Work Description
        replaced_parts:
          anyOf:
            - items:
                $ref: '#/components/schemas/ReplacedPart'
              type: array
            - type: 'null'
          title: Replaced Parts
          default: []
        duration_minutes:
          anyOf:
            - type: integer
            - type: 'null'
          title: Duration Minutes
        result:
          type: string
          enum:
            - completed
            - partial
            - failed
          title: Result
        root_cause:
          anyOf:
            - type: string
            - type: 'null'
          title: Root Cause
      type: object
      required:
        - work_description
        - result
      title: RepairLogRequest
    RepairLogResponse:
      properties:
        maintenance_id:
          type: string
          title: Maintenance Id
        status:
          type: string
          title: Status
        repair_details:
          additionalProperties: true
          type: object
          title: Repair Details
        updated_at:
          type: string
          format: date-time
          title: Updated At
      type: object
      required:
        - maintenance_id
        - status
        - repair_details
        - updated_at
      title: RepairLogResponse
    ReparkNoticeBody:
      properties:
        vehicle_number:
          type: string
          title: Vehicle Number
        site_id:
          type: string
          title: Site Id
        buffer_space:
          type: string
          title: Buffer Space
        processed_at:
          anyOf:
            - type: string
            - type: 'null'
          title: Processed At
      type: object
      required:
        - vehicle_number
        - site_id
        - buffer_space
      title: ReparkNoticeBody
    ReplacedPart:
      properties:
        part_name:
          type: string
          title: Part Name
        part_number:
          anyOf:
            - type: string
            - type: 'null'
          title: Part Number
        quantity:
          type: integer
          title: Quantity
          default: 1
        condition:
          type: string
          title: Condition
          default: new
      type: object
      required:
        - part_name
      title: ReplacedPart
    ReservationCancelBody:
      properties:
        phone_number:
          type: string
          title: Phone Number
      type: object
      required:
        - phone_number
      title: ReservationCancelBody
    ReservationCreateBody:
      properties:
        site_id:
          type: string
          title: Site Id
        entry_time:
          type: string
          title: Entry Time
        exit_time:
          type: string
          title: Exit Time
        vehicle_number:
          type: string
          title: Vehicle Number
        phone_number:
          type: string
          title: Phone Number
        owner_name:
          anyOf:
            - type: string
            - type: 'null'
          title: Owner Name
        is_disabled:
          type: boolean
          title: Is Disabled
          default: false
        is_multi_child:
          type: boolean
          title: Is Multi Child
          default: false
        verification_token:
          anyOf:
            - type: string
            - type: 'null'
          title: Verification Token
        personal_info_consent:
          type: boolean
          title: Personal Info Consent
          default: false
        third_party_consent:
          type: boolean
          title: Third Party Consent
          default: false
      type: object
      required:
        - site_id
        - entry_time
        - exit_time
        - vehicle_number
        - phone_number
      title: ReservationCreateBody
    ReservationStatusUpdate:
      properties:
        status:
          type: string
          title: Status
      type: object
      required:
        - status
      title: ReservationStatusUpdate
    ReservationUpdateBody:
      properties:
        status:
          anyOf:
            - type: string
            - type: 'null'
          title: Status
        entry_time:
          anyOf:
            - type: string
            - type: 'null'
          title: Entry Time
        exit_time:
          anyOf:
            - type: string
            - type: 'null'
          title: Exit Time
      type: object
      title: ReservationUpdateBody
    ResetPasswordRequest:
      properties:
        new_password:
          type: string
          title: New Password
      type: object
      required:
        - new_password
      title: ResetPasswordRequest
    RestrictionModelCreate:
      properties:
        site_id:
          type: string
          title: Site Id
        model_name:
          type: string
          title: Model Name
        manufacturer:
          anyOf:
            - type: string
            - type: 'null'
          title: Manufacturer
        year_from:
          anyOf:
            - type: integer
            - type: 'null'
          title: Year From
        year_to:
          anyOf:
            - type: integer
            - type: 'null'
          title: Year To
      type: object
      required:
        - site_id
        - model_name
      title: RestrictionModelCreate
    RestrictionRuleCreate:
      properties:
        site_id:
          type: string
          title: Site Id
        rule_type:
          type: string
          title: Rule Type
        threshold_mm:
          type: integer
          title: Threshold Mm
      type: object
      required:
        - site_id
        - rule_type
        - threshold_mm
      title: RestrictionRuleCreate
    RobotCreateRequest:
      properties:
        model_id:
          type: string
          title: Model Id
        hw_release_id:
          type: string
          title: Hw Release Id
        wifi_mac:
          type: string
          title: Wifi Mac
        lte_mac:
          anyOf:
            - type: string
            - type: 'null'
          title: Lte Mac
        name:
          anyOf:
            - type: string
            - type: 'null'
          title: Name
        initial_site_id:
          type: string
          title: Initial Site Id
        hw_version:
          anyOf:
            - type: string
            - type: 'null'
          title: Hw Version
        sw_version:
          anyOf:
            - type: string
            - type: 'null'
          title: Sw Version
        manufactured_at:
          anyOf:
            - type: string
              format: date
            - type: 'null'
          title: Manufactured At
        generate_auth_token:
          type: boolean
          title: Generate Auth Token
          default: true
      type: object
      required:
        - model_id
        - hw_release_id
        - wifi_mac
        - initial_site_id
      title: RobotCreateRequest
    RobotCreateResponse:
      properties:
        id:
          type: string
          title: Id
        serial_number:
          type: string
          title: Serial Number
        wifi_mac:
          type: string
          title: Wifi Mac
        lte_mac:
          anyOf:
            - type: string
            - type: 'null'
          title: Lte Mac
        part_number:
          type: string
          title: Part Number
        model_name:
          type: string
          title: Model Name
        status:
          type: string
          title: Status
        current_site_id:
          type: string
          title: Current Site Id
        home_site_id:
          type: string
          title: Home Site Id
        auth_token:
          anyOf:
            - type: string
            - type: 'null'
          title: Auth Token
        provisioning_data:
          anyOf:
            - additionalProperties: true
              type: object
            - type: 'null'
          title: Provisioning Data
        created_at:
          type: string
          format: date-time
          title: Created At
      type: object
      required:
        - id
        - serial_number
        - wifi_mac
        - lte_mac
        - part_number
        - model_name
        - status
        - current_site_id
        - home_site_id
        - created_at
      title: RobotCreateResponse
    RobotMoveRequest:
      properties:
        movement_type:
          type: string
          enum:
            - relocation
            - repair_send
            - repair_return
            - decommission
          title: Movement Type
        to_site_id:
          anyOf:
            - type: string
            - type: 'null'
          title: To Site Id
        reason:
          type: string
          title: Reason
        notes:
          anyOf:
            - type: string
            - type: 'null'
          title: Notes
      type: object
      required:
        - movement_type
        - reason
      title: RobotMoveRequest
    RobotMoveResponse:
      properties:
        movement_id:
          type: string
          title: Movement Id
        robot_id:
          type: string
          title: Robot Id
        serial_number:
          type: string
          title: Serial Number
        from_site_id:
          anyOf:
            - type: string
            - type: 'null'
          title: From Site Id
        from_site_name:
          anyOf:
            - type: string
            - type: 'null'
          title: From Site Name
        to_site_id:
          anyOf:
            - type: string
            - type: 'null'
          title: To Site Id
        to_site_name:
          anyOf:
            - type: string
            - type: 'null'
          title: To Site Name
        movement_type:
          type: string
          title: Movement Type
        previous_status:
          type: string
          title: Previous Status
        new_status:
          type: string
          title: New Status
        moved_at:
          type: string
          format: date-time
          title: Moved At
      type: object
      required:
        - movement_id
        - robot_id
        - serial_number
        - from_site_id
        - from_site_name
        - to_site_id
        - to_site_name
        - movement_type
        - previous_status
        - new_status
        - moved_at
      title: RobotMoveResponse
    SelfExitBody:
      properties:
        vehicle_number:
          type: string
          title: Vehicle Number
        site_id:
          type: string
          title: Site Id
        exit_time:
          anyOf:
            - type: string
            - type: 'null'
          title: Exit Time
      type: object
      required:
        - vehicle_number
        - site_id
      title: SelfExitBody
    SiteCreateUpdate:
      properties:
        code:
          anyOf:
            - type: string
            - type: 'null'
          title: Code
        name:
          anyOf:
            - type: string
            - type: 'null'
          title: Name
        address:
          anyOf:
            - type: string
            - type: 'null'
          title: Address
        total_capacity:
          anyOf:
            - type: integer
            - type: 'null'
          title: Total Capacity
        operating_start:
          anyOf:
            - type: string
            - type: 'null'
          title: Operating Start
        operating_end:
          anyOf:
            - type: string
            - type: 'null'
          title: Operating End
        operating_days:
          anyOf:
            - type: string
            - type: 'null'
          title: Operating Days
        slot_duration_minutes:
          anyOf:
            - type: integer
            - type: 'null'
          title: Slot Duration Minutes
        max_entry_per_slot:
          anyOf:
            - type: integer
            - type: 'null'
          title: Max Entry Per Slot
        max_exit_per_slot:
          anyOf:
            - type: integer
            - type: 'null'
          title: Max Exit Per Slot
        is_active:
          anyOf:
            - type: boolean
            - type: 'null'
          title: Is Active
        requires_reservation:
          anyOf:
            - type: boolean
            - type: 'null'
          title: Requires Reservation
        requires_admin_approval:
          anyOf:
            - type: boolean
            - type: 'null'
          title: Requires Admin Approval
        no_show_buffer_minutes:
          anyOf:
            - type: integer
            - type: 'null'
          title: No Show Buffer Minutes
        cancel_deadline_minutes:
          anyOf:
            - type: integer
            - type: 'null'
          title: Cancel Deadline Minutes
        latitude:
          anyOf:
            - type: number
            - type: 'null'
          title: Latitude
        longitude:
          anyOf:
            - type: number
            - type: 'null'
          title: Longitude
        site_url:
          anyOf:
            - type: string
            - type: 'null'
          title: Site Url
        otp_expiry_minutes:
          anyOf:
            - type: integer
            - type: 'null'
          title: Otp Expiry Minutes
        booking_window_days:
          anyOf:
            - type: integer
            - type: 'null'
          title: Booking Window Days
        booking_min_lead_minutes:
          anyOf:
            - type: integer
            - type: 'null'
          title: Booking Min Lead Minutes
        hero_tagline:
          anyOf:
            - type: string
            - type: 'null'
          title: Hero Tagline
        hero_subtitle:
          anyOf:
            - type: string
            - type: 'null'
          title: Hero Subtitle
        primary_card_title:
          anyOf:
            - type: string
            - type: 'null'
          title: Primary Card Title
        primary_card_subtitle:
          anyOf:
            - type: string
            - type: 'null'
          title: Primary Card Subtitle
      type: object
      title: SiteCreateUpdate
    SystemSettingItem:
      properties:
        key:
          type: string
          title: Key
        value:
          type: string
          title: Value
        description:
          anyOf:
            - type: string
            - type: 'null'
          title: Description
      type: object
      required:
        - key
        - value
      title: SystemSettingItem
    SystemSettingsResponse:
      properties:
        settings:
          items:
            $ref: '#/components/schemas/SystemSettingItem'
          type: array
          title: Settings
      type: object
      required:
        - settings
      title: SystemSettingsResponse
    SystemSettingsUpdate:
      properties:
        settings:
          additionalProperties:
            type: string
          type: object
          title: Settings
      type: object
      required:
        - settings
      title: SystemSettingsUpdate
    TokenRegenerateResponse:
      properties:
        robot_id:
          type: string
          title: Robot Id
        serial_number:
          type: string
          title: Serial Number
        auth_token:
          type: string
          title: Auth Token
      type: object
      required:
        - robot_id
        - serial_number
        - auth_token
      title: TokenRegenerateResponse
    TokenVerifyRequest:
      properties:
        serial_number:
          type: string
          title: Serial Number
        auth_token:
          type: string
          title: Auth Token
        mac_address:
          type: string
          title: Mac Address
      type: object
      required:
        - serial_number
        - auth_token
        - mac_address
      title: TokenVerifyRequest
    TokenVerifyResponse:
      properties:
        valid:
          type: boolean
          title: Valid
        robot_id:
          anyOf:
            - type: string
            - type: 'null'
          title: Robot Id
        serial_number:
          type: string
          title: Serial Number
        model_name:
          anyOf:
            - type: string
            - type: 'null'
          title: Model Name
        site_id:
          anyOf:
            - type: string
            - type: 'null'
          title: Site Id
        site_code:
          anyOf:
            - type: string
            - type: 'null'
          title: Site Code
        mac_updated:
          type: boolean
          title: Mac Updated
          default: false
      type: object
      required:
        - valid
        - serial_number
      title: TokenVerifyResponse
    UserCreateRequest:
      properties:
        username:
          type: string
          title: Username
        email:
          type: string
          title: Email
        password:
          type: string
          title: Password
        role:
          type: string
          title: Role
          default: viewer
        family_name:
          anyOf:
            - type: string
            - type: 'null'
          title: Family Name
        given_name:
          anyOf:
            - type: string
            - type: 'null'
          title: Given Name
        phone_number:
          anyOf:
            - type: string
            - type: 'null'
          title: Phone Number
        accessible_sites:
          anyOf:
            - items:
                type: string
              type: array
            - type: 'null'
          title: Accessible Sites
        has_all_sites_access:
          type: boolean
          title: Has All Sites Access
          default: false
      type: object
      required:
        - username
        - email
        - password
      title: UserCreateRequest
    UserDetailResponse:
      properties:
        id:
          type: string
          title: Id
        username:
          anyOf:
            - type: string
            - type: 'null'
          title: Username
        email:
          anyOf:
            - type: string
            - type: 'null'
          title: Email
        family_name:
          anyOf:
            - type: string
            - type: 'null'
          title: Family Name
        given_name:
          anyOf:
            - type: string
            - type: 'null'
          title: Given Name
        name:
          anyOf:
            - type: string
            - type: 'null'
          title: Name
        phone_number:
          anyOf:
            - type: string
            - type: 'null'
          title: Phone Number
        role:
          type: string
          title: Role
        is_active:
          type: boolean
          title: Is Active
          default: true
        has_all_sites_access:
          type: boolean
          title: Has All Sites Access
          default: false
        accessible_sites:
          anyOf:
            - items:
                type: string
              type: array
            - type: 'null'
          title: Accessible Sites
        notification_settings:
          anyOf:
            - additionalProperties: true
              type: object
            - type: 'null'
          title: Notification Settings
        last_login:
          anyOf:
            - type: string
              format: date-time
            - type: 'null'
          title: Last Login
        created_at:
          anyOf:
            - type: string
              format: date-time
            - type: 'null'
          title: Created At
        updated_at:
          anyOf:
            - type: string
              format: date-time
            - type: 'null'
          title: Updated At
      type: object
      required:
        - id
        - role
      title: UserDetailResponse
    UserListItem:
      properties:
        id:
          type: string
          title: Id
        username:
          anyOf:
            - type: string
            - type: 'null'
          title: Username
        email:
          anyOf:
            - type: string
            - type: 'null'
          title: Email
        name:
          anyOf:
            - type: string
            - type: 'null'
          title: Name
        role:
          type: string
          title: Role
        is_active:
          type: boolean
          title: Is Active
          default: true
        has_all_sites_access:
          type: boolean
          title: Has All Sites Access
          default: false
        accessible_sites:
          anyOf:
            - items:
                type: string
              type: array
            - type: 'null'
          title: Accessible Sites
        last_login:
          anyOf:
            - type: string
              format: date-time
            - type: 'null'
          title: Last Login
        created_at:
          anyOf:
            - type: string
              format: date-time
            - type: 'null'
          title: Created At
      type: object
      required:
        - id
        - role
      title: UserListItem
    UserListResponse:
      properties:
        items:
          items:
            $ref: '#/components/schemas/UserListItem'
          type: array
          title: Items
        total:
          type: integer
          title: Total
        page:
          type: integer
          title: Page
        size:
          type: integer
          title: Size
      type: object
      required:
        - items
        - total
        - page
        - size
      title: UserListResponse
    UserUpdateRequest:
      properties:
        role:
          anyOf:
            - type: string
            - type: 'null'
          title: Role
        is_active:
          anyOf:
            - type: boolean
            - type: 'null'
          title: Is Active
        accessible_sites:
          anyOf:
            - items:
                type: string
              type: array
            - type: 'null'
          title: Accessible Sites
        has_all_sites_access:
          anyOf:
            - type: boolean
            - type: 'null'
          title: Has All Sites Access
      type: object
      title: UserUpdateRequest
    UserUpdateResponse:
      properties:
        id:
          type: string
          title: Id
        role:
          type: string
          title: Role
        is_active:
          type: boolean
          title: Is Active
          default: true
        has_all_sites_access:
          type: boolean
          title: Has All Sites Access
        accessible_sites:
          anyOf:
            - items:
                type: string
              type: array
            - type: 'null'
          title: Accessible Sites
        updated_at:
          anyOf:
            - type: string
              format: date-time
            - type: 'null'
          title: Updated At
      type: object
      required:
        - id
        - role
        - has_all_sites_access
      title: UserUpdateResponse
    ValidationError:
      properties:
        loc:
          items:
            anyOf:
              - type: string
              - type: integer
          type: array
          title: Location
        msg:
          type: string
          title: Message
        type:
          type: string
          title: Error Type
      type: object
      required:
        - loc
        - msg
        - type
      title: ValidationError
    VehicleInfoRequest:
      properties:
        vehicleNumber:
          type: string
          maxLength: 10
          minLength: 7
          title: Vehiclenumber
        ownerName:
          type: string
          title: Ownername
          default: ''
      type: object
      required:
        - vehicleNumber
      title: VehicleInfoRequest
    VehicleOwnerSaveRequest:
      properties:
        vehicle_number:
          type: string
          title: Vehicle Number
        phone_number:
          type: string
          title: Phone Number
        owner_name:
          anyOf:
            - type: string
            - type: 'null'
          title: Owner Name
        personal_info_consent:
          anyOf:
            - type: boolean
            - type: 'null'
          title: Personal Info Consent
        third_party_consent:
          anyOf:
            - type: boolean
            - type: 'null'
          title: Third Party Consent
        vehicle_owner_type:
          anyOf:
            - type: string
            - type: 'null'
          title: Vehicle Owner Type
        specs_source:
          anyOf:
            - type: string
            - type: 'null'
          title: Specs Source
        non_self_acknowledged:
          anyOf:
            - type: boolean
            - type: 'null'
          title: Non Self Acknowledged
        vehicle_model_name:
          anyOf:
            - type: string
            - type: 'null'
          title: Vehicle Model Name
        vehicle_model_year:
          anyOf:
            - type: string
            - type: 'null'
          title: Vehicle Model Year
        vehicle_weight:
          anyOf:
            - type: number
            - type: 'null'
          title: Vehicle Weight
        vehicle_total_length:
          anyOf:
            - type: number
            - type: 'null'
          title: Vehicle Total Length
        vehicle_width:
          anyOf:
            - type: number
            - type: 'null'
          title: Vehicle Width
        vehicle_height:
          anyOf:
            - type: number
            - type: 'null'
          title: Vehicle Height
        vehicle_wheel_base:
          anyOf:
            - type: number
            - type: 'null'
          title: Vehicle Wheel Base
        vehicle_tread_front:
          anyOf:
            - type: number
            - type: 'null'
          title: Vehicle Tread Front
        vehicle_tread_rear:
          anyOf:
            - type: number
            - type: 'null'
          title: Vehicle Tread Rear
        vehicle_tire_size_front:
          anyOf:
            - type: string
            - type: 'null'
          title: Vehicle Tire Size Front
        vehicle_tire_size_rear:
          anyOf:
            - type: string
            - type: 'null'
          title: Vehicle Tire Size Rear
        vehicle_overhang_front:
          anyOf:
            - type: number
            - type: 'null'
          title: Vehicle Overhang Front
        vehicle_overhang_rear:
          anyOf:
            - type: number
            - type: 'null'
          title: Vehicle Overhang Rear
        vehicle_ground_clearance_front:
          anyOf:
            - type: number
            - type: 'null'
          title: Vehicle Ground Clearance Front
        vehicle_ground_clearance_rear:
          anyOf:
            - type: number
            - type: 'null'
          title: Vehicle Ground Clearance Rear
      type: object
      required:
        - vehicle_number
        - phone_number
      title: VehicleOwnerSaveRequest
    VehicleSpecCreate:
      properties:
        manufacturer:
          type: string
          maxLength: 100
          title: Manufacturer
          description: 제조사
        vehicle_model_name:
          type: string
          maxLength: 100
          title: Vehicle Model Name
          description: 모델명
        vehicle_model_year:
          anyOf:
            - type: string
            - type: 'null'
          title: Vehicle Model Year
          description: 연식
        vehicle_total_length:
          anyOf:
            - type: number
            - type: 'null'
          title: Vehicle Total Length
          description: 전장
        vehicle_width:
          anyOf:
            - type: number
            - type: 'null'
          title: Vehicle Width
          description: 전폭
        vehicle_height:
          anyOf:
            - type: number
            - type: 'null'
          title: Vehicle Height
          description: 전고
        vehicle_weight:
          anyOf:
            - type: number
            - type: 'null'
          title: Vehicle Weight
          description: 중량
        vehicle_wheel_base:
          anyOf:
            - type: number
            - type: 'null'
          title: Vehicle Wheel Base
          description: 축거
        vehicle_overhang_front:
          anyOf:
            - type: number
            - type: 'null'
          title: Vehicle Overhang Front
          description: 전오버행
        vehicle_overhang_rear:
          anyOf:
            - type: number
            - type: 'null'
          title: Vehicle Overhang Rear
          description: 후오버행
        vehicle_tread_front:
          anyOf:
            - type: number
            - type: 'null'
          title: Vehicle Tread Front
          description: 전윤거
        vehicle_tread_rear:
          anyOf:
            - type: number
            - type: 'null'
          title: Vehicle Tread Rear
          description: 후윤거
        vehicle_tire_size_front:
          anyOf:
            - type: string
              maxLength: 100
            - type: 'null'
          title: Vehicle Tire Size Front
          description: 전타이어
        vehicle_tire_size_rear:
          anyOf:
            - type: string
              maxLength: 100
            - type: 'null'
          title: Vehicle Tire Size Rear
          description: 후타이어
        category:
          anyOf:
            - type: string
              maxLength: 50
            - type: 'null'
          title: Category
          description: 차종
      type: object
      required:
        - manufacturer
        - vehicle_model_name
      title: VehicleSpecCreate
    VehicleSpecListResponse:
      properties:
        items:
          items:
            $ref: '#/components/schemas/VehicleSpecResponse'
          type: array
          title: Items
        total:
          type: integer
          title: Total
        page:
          type: integer
          title: Page
        size:
          type: integer
          title: Size
      type: object
      required:
        - items
        - total
        - page
        - size
      title: VehicleSpecListResponse
    VehicleSpecLookupBody:
      properties:
        vehicle_number:
          type: string
          title: Vehicle Number
      type: object
      required:
        - vehicle_number
      title: VehicleSpecLookupBody
    VehicleSpecResponse:
      properties:
        id:
          type: string
          title: Id
        manufacturer:
          type: string
          title: Manufacturer
        vehicle_model_name:
          type: string
          title: Vehicle Model Name
        vehicle_model_year:
          anyOf:
            - type: string
            - type: 'null'
          title: Vehicle Model Year
        vehicle_total_length:
          anyOf:
            - type: number
            - type: 'null'
          title: Vehicle Total Length
        vehicle_width:
          anyOf:
            - type: number
            - type: 'null'
          title: Vehicle Width
        vehicle_height:
          anyOf:
            - type: number
            - type: 'null'
          title: Vehicle Height
        vehicle_weight:
          anyOf:
            - type: number
            - type: 'null'
          title: Vehicle Weight
        vehicle_wheel_base:
          anyOf:
            - type: number
            - type: 'null'
          title: Vehicle Wheel Base
        vehicle_overhang_front:
          anyOf:
            - type: number
            - type: 'null'
          title: Vehicle Overhang Front
        vehicle_overhang_rear:
          anyOf:
            - type: number
            - type: 'null'
          title: Vehicle Overhang Rear
        vehicle_tread_front:
          anyOf:
            - type: number
            - type: 'null'
          title: Vehicle Tread Front
        vehicle_tread_rear:
          anyOf:
            - type: number
            - type: 'null'
          title: Vehicle Tread Rear
        vehicle_tire_size_front:
          anyOf:
            - type: string
            - type: 'null'
          title: Vehicle Tire Size Front
        vehicle_tire_size_rear:
          anyOf:
            - type: string
            - type: 'null'
          title: Vehicle Tire Size Rear
        category:
          anyOf:
            - type: string
            - type: 'null'
          title: Category
        created_at:
          anyOf:
            - type: string
              format: date-time
            - type: 'null'
          title: Created At
        updated_at:
          anyOf:
            - type: string
              format: date-time
            - type: 'null'
          title: Updated At
      type: object
      required:
        - id
        - manufacturer
        - vehicle_model_name
        - vehicle_model_year
        - vehicle_total_length
        - vehicle_width
        - vehicle_height
        - vehicle_weight
        - category
        - created_at
        - updated_at
      title: VehicleSpecResponse
    VehicleSpecUpdate:
      properties:
        manufacturer:
          anyOf:
            - type: string
              maxLength: 100
            - type: 'null'
          title: Manufacturer
        vehicle_model_name:
          anyOf:
            - type: string
              maxLength: 100
            - type: 'null'
          title: Vehicle Model Name
        vehicle_model_year:
          anyOf:
            - type: string
            - type: 'null'
          title: Vehicle Model Year
        vehicle_total_length:
          anyOf:
            - type: number
            - type: 'null'
          title: Vehicle Total Length
        vehicle_width:
          anyOf:
            - type: number
            - type: 'null'
          title: Vehicle Width
        vehicle_height:
          anyOf:
            - type: number
            - type: 'null'
          title: Vehicle Height
        vehicle_weight:
          anyOf:
            - type: number
            - type: 'null'
          title: Vehicle Weight
        vehicle_wheel_base:
          anyOf:
            - type: number
            - type: 'null'
          title: Vehicle Wheel Base
        vehicle_overhang_front:
          anyOf:
            - type: number
            - type: 'null'
          title: Vehicle Overhang Front
        vehicle_overhang_rear:
          anyOf:
            - type: number
            - type: 'null'
          title: Vehicle Overhang Rear
        vehicle_tread_front:
          anyOf:
            - type: number
            - type: 'null'
          title: Vehicle Tread Front
        vehicle_tread_rear:
          anyOf:
            - type: number
            - type: 'null'
          title: Vehicle Tread Rear
        vehicle_tire_size_front:
          anyOf:
            - type: string
              maxLength: 100
            - type: 'null'
          title: Vehicle Tire Size Front
        vehicle_tire_size_rear:
          anyOf:
            - type: string
              maxLength: 100
            - type: 'null'
          title: Vehicle Tire Size Rear
        category:
          anyOf:
            - type: string
              maxLength: 50
            - type: 'null'
          title: Category
      type: object
      title: VehicleSpecUpdate
    VehicleValidateRequest:
      properties:
        vehicleNumber:
          type: string
          maxLength: 10
          minLength: 7
          title: Vehiclenumber
      type: object
      required:
        - vehicleNumber
      title: VehicleValidateRequest
  securitySchemes:
    OAuth2PasswordBearer:
      type: oauth2
      flows:
        password:
          scopes: {}
          tokenUrl: /api/v1/admin/login
    HTTPBearer:
      type: http
      description: 서비스 토큰 (/api/v1/auth/login 에서 발급)
      scheme: bearer
