openapi: 3.1.0
info:
  title: ONDA Vendor API 3.0
  description: ONDA Vendor API 3.0 — 공급사(Vendor) 연동 API
  version: 3.0.0
servers:
  - url: https://vendor.dapi.tport.dev
    description: 개발(alpha) 환경 — HUB API 서버 (공급사 → ONDA)
tags:
  - name: content-meta
    description: 코드 카탈로그
    x-displayName: 코드 카탈로그
  - name: content-property
    description: 숙소 관리
    x-displayName: 숙소 관리
  - name: content-roomtype
    description: 객실타입 관리
    x-displayName: 객실타입 관리
  - name: content-rateplan-model
    description: 요금제 모델 관리
    x-displayName: 요금제 모델 관리
  - name: content-rateplan
    description: 요금제 관리
    x-displayName: 요금제 관리
  - name: ari
    description: 재고/요금/영업일 설정
    x-displayName: 재고/요금/영업일 설정
  - name: reservation
    description: 예약 조회 및 정산
    x-displayName: 예약 조회 및 정산
  - name: channel
    description: 채널 정보/설정/상태 관리
    x-displayName: 채널 정보 조회
  - name: channel-open
    description: 숙소별 채널 신청 및 상태 조회
    x-displayName: 채널 신청 및 상태
  - name: channel-setting
    description: 숙소/객실/요금제 채널별 설정
    x-displayName: 채널별 판매 설정
  - name: channel-mapping
    description: 채널 매핑 관리
    x-displayName: 채널 매핑 관리
  - name: webhook-ari
    description: 재고/요금 조회 (공급사 구현)
    x-displayName: 취소/환불 정책 조회
  - name: webhook-reservation
    description: 예약 처리 (공급사 구현)
    x-displayName: 예약 처리
components:
  securitySchemes:
    Authorization:
      type: apiKey
      in: header
      name: Authorization
      description: Vendor access token
  schemas:
    MetaResponse:
      type: object
      properties:
        data:
          type: object
          properties:
            classification:
              type: array
              items:
                $ref: "#/components/schemas/MetaCodeNode"
            property:
              type: array
              items:
                $ref: "#/components/schemas/MetaCodeNode"
            facility:
              type: array
              items:
                $ref: "#/components/schemas/MetaCodeNode"
            service:
              type: array
              items:
                $ref: "#/components/schemas/MetaCodeNode"
            attraction:
              type: array
              items:
                $ref: "#/components/schemas/MetaCodeNode"
            roomtype:
              type: array
              items:
                $ref: "#/components/schemas/MetaCodeNode"
            amenity:
              type: array
              items:
                $ref: "#/components/schemas/MetaCodeNode"
            view:
              type: array
              items:
                $ref: "#/components/schemas/MetaCodeNode"
          required:
            - classification
            - property
            - facility
            - service
            - attraction
            - roomtype
            - amenity
            - view
          description: code_type별 코드 카탈로그
      required:
        - data
    MetaCodeNode:
      type: object
      properties:
        code:
          type: string
          description: pcs.codes.code
          example: FACI1D300030
        name:
          type: string
          description: locale별 코드명
          example: 주차장
        children:
          type: array
          items:
            $ref: "#/components/schemas/MetaCodeNode"
          description: 하위 코드 목록 (하위 코드가 없는 leaf 노드는 생략)
      required:
        - code
        - name
    PostPropertyBody:
      type: object
      properties:
        status:
          $ref: "#/components/schemas/ContentStatus"
        i18n:
          type: array
          items:
            $ref: "#/components/schemas/PropertyI18n"
          description: locale별 콘텐츠. (등록시 ko-KR 필수, locale 당 1개)
        email:
          type: string
          format: email
          description: 대표 이메일
          example: hello@example.com
        phone:
          type: string
          description: 대표 전화
          example: 02-0000-0000
        sms_phone:
          type: string
          description: SMS 발신 번호
        checkin:
          type: string
          pattern: ^\d{2}:\d{2}$
          description: 체크인 시각 (HH:mm)
          example: 15:00
        checkout:
          type: string
          pattern: ^\d{2}:\d{2}$
          description: 체크아웃 시각 (HH:mm)
          example: 11:00
        website:
          type: string
          format: uri
          description: 대표 웹사이트
        refunds:
          type: object
          additionalProperties:
            type: number
          description: "환불 정책. 키는 체크인 며칠 전인지를 나타내는 `0d`·`1d` 형식이고, 값은 환불율(%)입니다. 예를 들어 `1d: 30` 은 체크인 1일 전에 취소하면 30%를 환불한다는 뜻입니다."
          example:
            0d: 0
            1d: 30
            2d: 50
            3d: 70
            4d: 80
            5d: 90
            6d: 100
        classifications:
          type: array
          items:
            type: string
          description: 숙소 분류
        property_tags:
          type: array
          items:
            type: string
          description: 숙소 태그
        facility_tags:
          type: array
          items:
            type: string
          description: 시설 태그
        service_tags:
          type: array
          items:
            type: string
          description: 서비스 태그
        attraction_tags:
          type: array
          items:
            type: string
          description: 주변 명소 태그
        photos:
          type: array
          items:
            $ref: "#/components/schemas/Photo"
          description: 숙소 이미지
        settings:
          type: object
          properties:
            extra_adult_price:
              type:
                - integer
                - "null"
              minimum: 0
              description: 숙소 기본 추가 성인요금 (정수 KRW, null 전송 시 미설정으로 초기화)
          description: 숙소 설정
        id:
          type: string
          maxLength: 40
          description: 공급사 숙소 ID (최대 40자)
          example: VP-001
      required:
        - id
    ContentStatus:
      type: string
      enum:
        - enabled
        - disabled
      description: 상태
      example: enabled
    PropertyI18n:
      type: object
      properties:
        locale:
          $ref: "#/components/schemas/Locale"
        name:
          type: string
          description: 숙소명
          example: 서울 호텔
        description:
          type: string
          description: 숙소 설명
        address:
          type: string
          description: 주소 (도로명 또는 지번) 한 줄.
          example: 서울특별시 중구 을지로 30
        address_detail:
          type: string
          description: 상세주소 (건물명/동/층/호수). address 와 함께 입력한다.
          example: 10층 1001호
        notice:
          type: string
          description: 안내사항
        reservation_description:
          type: string
          description: 예약 안내
        refunds_description:
          type: string
          description: 환불 안내
      required:
        - locale
    Locale:
      type: string
      enum:
        - ko-KR
        - en-US
        - zh-CN
        - ja-JP
        - vn-VN
        - th-TH
        - zh-TW
      description: locale
      example: ko-KR
    Photo:
      type: object
      properties:
        url:
          type: string
          description: 이미지 URL
          example: https://cdn.example.com/p/1.jpg
        description:
          type: string
          description: 이미지 설명
        order:
          type: integer
          minimum: 0
          description: 정렬 순서
          example: 0
      required:
        - url
        - order
    PropertyContent:
      type: object
      properties:
        id:
          type: string
          description: 공급사 숙소 ID
          example: VP-001
        status:
          $ref: "#/components/schemas/ContentStatus"
        i18n:
          type: array
          items:
            $ref: "#/components/schemas/PropertyI18n"
        email:
          type: string
        phone:
          type: string
        sms_phone:
          type: string
        checkin:
          type: string
          description: 체크인 시각 (HH:mm)
          example: 15:00
        checkout:
          type: string
          description: 체크아웃 시각 (HH:mm)
          example: 11:00
        website:
          type: string
        refunds:
          description: "환불 정책. 키는 체크인 며칠 전인지를 나타내는 `0d`·`1d` 형식이고, 값은 환불율(%)입니다."
          type: object
          additionalProperties:
            type: number
        classifications:
          type: array
          items:
            type: string
        property_tags:
          type: array
          items:
            type: string
        facility_tags:
          type: array
          items:
            type: string
        service_tags:
          type: array
          items:
            type: string
        attraction_tags:
          type: array
          items:
            type: string
        photos:
          type: array
          items:
            $ref: "#/components/schemas/Photo"
        settings:
          type: object
          properties:
            extra_adult_price:
              type:
                - number
                - "null"
          required:
            - extra_adult_price
      required:
        - id
        - status
        - i18n
        - classifications
        - property_tags
        - facility_tags
        - service_tags
        - attraction_tags
        - photos
        - settings
    PatchPropertyBody:
      type: object
      properties:
        status:
          $ref: "#/components/schemas/ContentStatus"
        i18n:
          type: array
          items:
            $ref: "#/components/schemas/PropertyI18n"
          description: locale별 콘텐츠. (등록시 ko-KR 필수, locale 당 1개)
        email:
          type: string
          format: email
          description: 대표 이메일
          example: hello@example.com
        phone:
          type: string
          description: 대표 전화
          example: 02-0000-0000
        sms_phone:
          type: string
          description: SMS 발신 번호
        checkin:
          type: string
          pattern: ^\d{2}:\d{2}$
          description: 체크인 시각 (HH:mm)
          example: 15:00
        checkout:
          type: string
          pattern: ^\d{2}:\d{2}$
          description: 체크아웃 시각 (HH:mm)
          example: 11:00
        website:
          type: string
          format: uri
          description: 대표 웹사이트
        refunds:
          type: object
          additionalProperties:
            type: number
          description: "환불 정책. 키는 체크인 며칠 전인지를 나타내는 `0d`·`1d` 형식이고, 값은 환불율(%)입니다. 보낸 맵으로 전체가 교체되므로, 일부만 바꿀 때도 전체 정책을 담아 보내세요."
          example:
            0d: 0
            1d: 30
            2d: 50
            3d: 70
            4d: 80
            5d: 90
            6d: 100
        classifications:
          type: array
          items:
            type: string
          description: 숙소 분류
        property_tags:
          type: array
          items:
            type: string
          description: 숙소 태그
        facility_tags:
          type: array
          items:
            type: string
          description: 시설 태그
        service_tags:
          type: array
          items:
            type: string
          description: 서비스 태그
        attraction_tags:
          type: array
          items:
            type: string
          description: 주변 명소 태그
        photos:
          type: array
          items:
            $ref: "#/components/schemas/Photo"
          description: 숙소 이미지
        settings:
          type: object
          properties:
            extra_adult_price:
              type:
                - integer
                - "null"
              minimum: 0
              description: 숙소 기본 추가 성인요금 (정수 KRW, null 전송 시 미설정으로 초기화)
          description: 숙소 설정
    PostRoomtypeBody:
      type: object
      properties:
        status:
          $ref: "#/components/schemas/ContentStatus"
        i18n:
          type: array
          items:
            $ref: "#/components/schemas/RoomtypeI18nItem"
          description: locale별 콘텐츠. (등록시 ko-KR 필수)
        min_stay:
          type: integer
          exclusiveMinimum: 0
          description: 최소 숙박
        max_stay:
          type: integer
          exclusiveMinimum: 0
          description: 최대 숙박
        size:
          type: number
          description: 면적
        standard_capacity:
          type: integer
          exclusiveMinimum: 0
          description: 기준 인원
        max_capacity:
          type: integer
          exclusiveMinimum: 0
          description: 최대 인원
        roomtype_tags:
          type: array
          items:
            type: string
          description: 객실 태그
        amenity_tags:
          type: array
          items:
            type: string
          description: 편의시설 태그
        view_tags:
          type: array
          items:
            type: string
          description: 객실 전망 태그
        details:
          $ref: "#/components/schemas/RoomtypeDetails"
        bedtype:
          $ref: "#/components/schemas/Bedtype"
        photos:
          type: array
          items:
            $ref: "#/components/schemas/Photo"
          description: 객실 이미지
        id:
          type: string
          maxLength: 40
          description: 공급사 객실 ID (최대 40자)
          example: VRT-001
      required:
        - id
    RoomtypeI18nItem:
      type: object
      properties:
        locale:
          $ref: "#/components/schemas/Locale"
        name:
          type: string
          description: 객실명
          example: 디럭스 더블
        description:
          type: string
          description: 객실 설명
      required:
        - locale
    RoomtypeDetails:
      type: object
      additionalProperties:
        type: number
      description: "객실 구성. 키는 `room`·`bedroom`·`bathroom` 같은 구성 요소이고, 값은 개수입니다."
      example:
        room: 1
        bedroom: 1
        bathroom: 1
    Bedtype:
      type: object
      properties:
        single_beds:
          type: integer
          minimum: 0
          description: 싱글 베드 수
        double_beds:
          type: integer
          minimum: 0
          description: 더블 베드 수
        bunk_beds:
          type: integer
          minimum: 0
          description: 벙커(이층) 베드 수
    RoomtypeContent:
      type: object
      properties:
        id:
          type: string
          description: 공급사 객실 ID
          example: VRT-001
        status:
          $ref: "#/components/schemas/ContentStatus"
        i18n:
          type: array
          items:
            $ref: "#/components/schemas/RoomtypeI18nItem"
        min_stay:
          type: number
        max_stay:
          type: number
        size:
          type: number
        standard_capacity:
          type: number
        max_capacity:
          type: number
        roomtype_tags:
          type: array
          items:
            type: string
        amenity_tags:
          type: array
          items:
            type: string
        view_tags:
          type: array
          items:
            type: string
        details:
          $ref: "#/components/schemas/RoomtypeDetails"
        bedtype:
          $ref: "#/components/schemas/Bedtype"
        photos:
          type: array
          items:
            $ref: "#/components/schemas/Photo"
      required:
        - id
        - status
        - i18n
        - roomtype_tags
        - amenity_tags
        - view_tags
        - photos
    PatchRoomtypeBody:
      type: object
      properties:
        status:
          $ref: "#/components/schemas/ContentStatus"
        i18n:
          type: array
          items:
            $ref: "#/components/schemas/RoomtypeI18nItem"
          description: locale별 콘텐츠. (등록시 ko-KR 필수)
        min_stay:
          type: integer
          exclusiveMinimum: 0
          description: 최소 숙박
        max_stay:
          type: integer
          exclusiveMinimum: 0
          description: 최대 숙박
        size:
          type: number
          description: 면적
        standard_capacity:
          type: integer
          exclusiveMinimum: 0
          description: 기준 인원
        max_capacity:
          type: integer
          exclusiveMinimum: 0
          description: 최대 인원
        roomtype_tags:
          type: array
          items:
            type: string
          description: 객실 태그
        amenity_tags:
          type: array
          items:
            type: string
          description: 편의시설 태그
        view_tags:
          type: array
          items:
            type: string
          description: 객실 전망 태그
        details:
          $ref: "#/components/schemas/RoomtypeDetails"
        bedtype:
          $ref: "#/components/schemas/Bedtype"
        photos:
          type: array
          items:
            $ref: "#/components/schemas/Photo"
          description: 객실 이미지
    PostRateplanModelBody:
      type: object
      properties:
        type:
          $ref: "#/components/schemas/RateplanModelType"
        i18n:
          type: array
          items:
            $ref: "#/components/schemas/RateplanModelI18nItem"
          minItems: 1
          description: locale별 콘텐츠. (ko-KR 필수)
        sale_from:
          type: string
          format: date
          description: 판매 시작일
        sale_to:
          type: string
          format: date
          description: 판매 종료일
        min_los:
          type: integer
          exclusiveMinimum: 0
          description: 최소 숙박
        max_los:
          type: integer
          exclusiveMinimum: 0
          description: 최대 숙박
        refundable:
          type: boolean
          description: 환불 가능 여부
        meals:
          $ref: "#/components/schemas/Meals"
        channels:
          type: array
          items:
            type: integer
            exclusiveMinimum: 0
          description: 판매 채널 ID 목록.
        id:
          type: string
          maxLength: 40
          description: 공급사 요금제 모델 ID (최대 40자)
          example: VRPM-001
      required:
        - i18n
        - id
    RateplanModelType:
      type: string
      enum:
        - standalone
        - package
      description: 요금제 모델 타입 (standalone | package). package 는 기준 요금 대비 차분(rate_modify) 모델
      example: standalone
    RateplanModelI18nItem:
      type: object
      properties:
        locale:
          $ref: "#/components/schemas/Locale"
        name:
          type: string
          description: 요금제 모델명
          example: 기본 요금
        description:
          type: string
          description: 요금제 모델 설명
      required:
        - locale
    Meals:
      type: object
      properties:
        breakfast:
          type: boolean
          description: 조식 제공 여부
        lunch:
          type: boolean
          description: 중식 제공 여부
        dinner:
          type: boolean
          description: 석식 제공 여부
      required:
        - breakfast
        - lunch
        - dinner
      description: 식사 제공 여부
    RateplanModelContent:
      type: object
      properties:
        id:
          type: string
          description: 공급사 요금제 모델 ID
          example: VRPM-001
        vendor_property_id:
          type: string
          description: 공급사 숙소 ID
          example: VP-001
        type:
          $ref: "#/components/schemas/RateplanModelType"
        i18n:
          type: array
          items:
            $ref: "#/components/schemas/RateplanModelI18nItem"
          minItems: 1
          description: locale별 콘텐츠. (ko-KR 필수)
        sale_from:
          type: string
        sale_to:
          type: string
        min_los:
          type: number
        max_los:
          type: number
        refundable:
          type: boolean
        meals:
          $ref: "#/components/schemas/Meals"
        channels:
          type: array
          items:
            type: integer
            exclusiveMinimum: 0
          description: 현재 판매 채널 ID 목록. 전체 채널 판매면 필드가 없다.
      required:
        - id
        - vendor_property_id
        - type
        - i18n
        - refundable
    PatchRateplanModelBody:
      type: object
      properties:
        type:
          $ref: "#/components/schemas/RateplanModelType"
        i18n:
          type: array
          items:
            $ref: "#/components/schemas/RateplanModelI18nItem"
          minItems: 1
          description: locale별 콘텐츠. (ko-KR 필수)
        sale_from:
          type:
            - string
            - "null"
          format: date
          description: 판매 시작일 (null 전송 시 미설정으로 초기화)
        sale_to:
          type:
            - string
            - "null"
          format: date
          description: 판매 종료일 (null 전송 시 미설정으로 초기화)
        min_los:
          type:
            - integer
            - "null"
          exclusiveMinimum: 0
          description: 최소 숙박 (null 전송 시 미설정으로 초기화)
        max_los:
          type:
            - integer
            - "null"
          exclusiveMinimum: 0
          description: 최대 숙박 (null 전송 시 미설정으로 초기화)
        refundable:
          type: boolean
          description: 환불 가능 여부
        meals:
          $ref: "#/components/schemas/Meals"
        channels:
          type:
            - array
            - "null"
          items:
            type: integer
            exclusiveMinimum: 0
          description: 판매 채널 ID 목록. null 또는 빈 배열 전송 시 전체 채널 판매로 초기화
      required:
        - i18n
    PostRateplanBody:
      type: object
      properties:
        status:
          $ref: "#/components/schemas/ContentStatus"
        id:
          type: string
          maxLength: 40
          description: 공급사 요금제 ID (최대 40자)
          example: VRP-001
        vendor_rateplan_model_id:
          type: string
          maxLength: 40
          description: 공급사 요금제 모델 ID (최대 40자)
          example: VRPM-001
      required:
        - id
        - vendor_rateplan_model_id
    RateplanContent:
      type: object
      properties:
        id:
          type: string
          description: 공급사 요금제 ID
          example: VRP-001
        vendor_property_id:
          type: string
          description: 공급사 숙소 ID
          example: VP-001
        vendor_roomtype_id:
          type: string
          description: 공급사 객실 ID
          example: VRT-001
        vendor_rateplan_model_id:
          type: string
          description: 공급사 요금제 모델 ID
          example: VRPM-001
        status:
          $ref: "#/components/schemas/ContentStatus"
        type:
          $ref: "#/components/schemas/RateplanModelType"
      required:
        - id
        - vendor_property_id
        - vendor_roomtype_id
        - vendor_rateplan_model_id
        - status
        - type
    PatchRateplanBody:
      type: object
      properties:
        status:
          $ref: "#/components/schemas/ContentStatus"
  parameters: {}
paths:
  /gds/vendor/bookings:
    get:
      operationId: get-settlement-comparison
      tags:
        - reservation
      summary: 정산 비교 조회
      description: |-
        - 정산 금액 데이터를 조회합니다. 공급사 내부 정산과 대조할 때 사용합니다.
        - `option`으로 기준일을 고릅니다. `checkin`은 체크인일, `checkout`은 체크아웃일 기준이며 `from`·`to`와 함께 필수입니다.
        - `offset`과 `limit`으로 페이지를 나눠 가져옵니다. `vendor_property_id`를 주면 특정 숙소로 좁힐 수 있습니다.
        - 수수료를 뺀 정산 예정 금액은 `net_price`입니다.
      security:
        - Authorization: []
      parameters:
        - schema:
            type: string
            enum:
              - checkin
              - checkout
            description: 조회 기준
            example: checkin
          required: true
          description: 조회 기준
          name: option
          in: query
        - schema:
            type: string
            description: 시작일 (YYYY-MM-DD)
            example: 2024-07-01
          required: true
          description: 시작일 (YYYY-MM-DD)
          name: from
          in: query
        - schema:
            type: string
            description: 종료일 (YYYY-MM-DD)
            example: 2024-07-31
          required: true
          description: 종료일 (YYYY-MM-DD)
          name: to
          in: query
        - schema:
            type: string
            description: 공급사 숙소 ID
            example: VP-001
          required: false
          description: 공급사 숙소 ID
          name: vendor_property_id
          in: query
        - schema:
            type: string
            description: 오프셋
            example: "0"
          required: true
          description: 오프셋
          name: offset
          in: query
        - schema:
            type: string
            description: 조회 제한
            example: "50"
          required: false
          description: 조회 제한
          name: limit
          in: query
      responses:
        "200":
          description: 정산 비교 데이터
          content:
            application/json:
              schema:
                type: object
                properties:
                  count:
                    type: number
                    description: 총 건수
                    example: 100
                  offset:
                    type: number
                    description: 오프셋
                    example: 0
                  limit:
                    type: number
                    description: 조회 제한
                    example: 50
                  reservations:
                    type: array
                    items:
                      type: object
                      properties:
                        booking_number:
                          type: string
                          description: 예약 번호
                          example: BK-20240101-001
                        channel_booking_number:
                          type: string
                          description: 채널 예약 번호
                          example: CH-001
                        status:
                          type: string
                          description: 예약 상태
                          example: confirmed
                        type:
                          type:
                            - string
                            - "null"
                          enum:
                            - dayuse
                            - overnight
                            - null
                          description: 대실/숙박 구분 (대실=dayuse, 숙박=overnight). 구분 정보가 없는 예약은 null
                          example: overnight
                        property_id:
                          type: string
                          description: PCS 숙소 ID
                          example: "12345"
                        vendor_property_id:
                          type: string
                          description: 공급사 숙소 ID
                          example: VP-001
                        checkin:
                          type: string
                          format: date-time
                          description: 체크인 일시 (ISO8601, 오프셋 포함)
                          example: 2026-01-20T15:00:00+09:00
                        checkout:
                          type: string
                          format: date-time
                          description: 체크아웃 일시 (ISO8601, 오프셋 포함)
                          example: 2026-01-21T11:00:00+09:00
                        currency:
                          type: string
                          description: 통화 코드
                          example: KRW
                        price_type:
                          type: string
                          description: 요금 유형
                          example: net
                        total_amount:
                          type: number
                          description: 총액
                          example: 150000
                        refund_amount:
                          type: number
                          description: 환불액
                          example: 0
                        charged_amount:
                          type: number
                          description: 청구액
                          example: 150000
                        net_price:
                          type: number
                          description: 순수익
                          example: 135000
                        reserved_at:
                          type: string
                          format: date-time
                          description: 예약일시 (ISO8601, 오프셋 포함) — 게스트가 판매 채널에서 예약한 시각
                          example: 2026-01-01T09:59:00+09:00
                        confirmed_at:
                          type:
                            - string
                            - "null"
                          format: date-time
                          description: 확정일시 (ISO8601, 오프셋 포함) — 판매 채널에서 예약이 확정된 시각. 미확정 예약은 null
                          example: 2026-01-01T10:01:00+09:00
                        canceled_at:
                          type:
                            - string
                            - "null"
                          format: date-time
                          description: 취소일시 (ISO8601, 오프셋 포함) — 판매 채널에서 예약이 취소된 시각. 취소되지 않은 예약은 null
                          example: 2026-01-02T09:00:00+09:00
                        created_at:
                          type: string
                          format: date-time
                          description: 생성일시 (ISO8601, 오프셋 포함) — 예약 데이터가 최초 등록된 시각
                          example: 2026-01-01T10:00:00+09:00
                      required:
                        - booking_number
                        - channel_booking_number
                        - status
                        - type
                        - property_id
                        - vendor_property_id
                        - checkin
                        - checkout
                        - currency
                        - price_type
                        - total_amount
                        - refund_amount
                        - charged_amount
                        - net_price
                        - reserved_at
                        - confirmed_at
                        - canceled_at
                        - created_at
                    description: 예약 목록
                required:
                  - count
                  - offset
                  - limit
                  - reservations
        "400":
          description: Bad Request
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Invalid Parameter.
                required:
                  - message
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Unauthorized
                required:
                  - message
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Forbidden
                required:
                  - message
        "404":
          description: Not Found
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Not Found
                required:
                  - message
  /gds/vendor/booking/{vendor_booking_number}:
    get:
      operationId: get-booking
      tags:
        - reservation
      summary: 예약 조회
      description: |-
        - 예약 번호로 예약 한 건의 상세를 조회합니다.
        - 공급사 예약은 `gds_sub_booking_number` 기준으로 생성됩니다. 하나의 `gds_booking_number`에 여러 건이 대응할 수 있습니다.
        - 투숙 정보·금액·상태와 채널 정보를 함께 확인할 수 있습니다.
      security:
        - Authorization: []
      parameters:
        - schema:
            type: string
            description: 공급사 예약 번호
            example: VB-001
          required: true
          description: 공급사 예약 번호
          name: vendor_booking_number
          in: path
      responses:
        "200":
          description: 예약 정보
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                    description: 에러 메시지
                    example: ""
                  bookingNumber:
                    type: string
                    description: 공급사 예약 번호
                    example: VB-001
                  status:
                    type: string
                    description: 예약 상태
                    example: confirmed
                  type:
                    type:
                      - string
                      - "null"
                    enum:
                      - dayuse
                      - overnight
                      - null
                    description: 대실/숙박 구분 (대실=dayuse, 숙박=overnight). 구분 정보가 없는 예약은 null
                    example: overnight
                  property_id:
                    type: string
                    description: 공급사 숙소 ID
                    example: VP-001
                  roomtype_id:
                    type: string
                    description: 공급사 객실 ID
                    example: VRT-001
                  checkin:
                    type: string
                    format: date-time
                    description: 체크인 일시 (ISO8601, 오프셋 포함)
                    example: 2026-01-20T15:00:00+09:00
                  checkout:
                    type: string
                    format: date-time
                    description: 체크아웃 일시 (ISO8601, 오프셋 포함)
                    example: 2026-01-21T11:00:00+09:00
                  currency:
                    type: string
                    description: 통화
                    example: KRW
                  amount:
                    type: number
                    description: 총 금액
                    example: 150000
                  guest:
                    type: object
                    properties:
                      name:
                        type: string
                        description: 투숙객 이름
                      adults:
                        type: number
                        description: 성인 수
                      children:
                        type: number
                        description: 아동 수
                      infants:
                        type: number
                        description: 유아 수
                      pets:
                        type: number
                        description: 반려동물 수
                      cars:
                        type: number
                        description: 차량 수
                    required:
                      - name
                      - adults
                      - children
                      - infants
                      - pets
                      - cars
                  booker:
                    type: object
                    properties:
                      name:
                        type: string
                        description: 예약자 이름
                      email:
                        type: string
                        description: 예약자 이메일
                      phone:
                        type: string
                        description: 예약자 연락처
                    required:
                      - name
                      - email
                      - phone
                  reserved_at:
                    type: string
                    format: date-time
                    description: 예약일시 (ISO8601, 오프셋 포함) — 게스트가 판매 채널에서 예약한 시각
                    example: 2026-01-01T09:59:00+09:00
                  confirmed_at:
                    type:
                      - string
                      - "null"
                    format: date-time
                    description: 확정일시 (ISO8601, 오프셋 포함) — 판매 채널에서 예약이 확정된 시각. 미확정 예약은 null
                    example: 2026-01-01T10:01:00+09:00
                  canceled_at:
                    type:
                      - string
                      - "null"
                    format: date-time
                    description: 취소일시 (ISO8601, 오프셋 포함) — 판매 채널에서 예약이 취소된 시각. 취소되지 않은 예약은 null
                    example: 2026-01-02T09:00:00+09:00
                  update_at:
                    type: string
                    format: date-time
                    description: 수정일시 (ISO8601, 오프셋 포함) — 예약 정보가 마지막으로 변경된 시각
                    example: 2026-01-01T10:01:00+09:00
                  request_at:
                    type: string
                    format: date-time
                    description: 조회일시 (ISO8601, 오프셋 포함) — 이 응답이 생성된 시각
                    example: 2026-01-01T10:00:00+09:00
                required:
                  - error
                  - bookingNumber
                  - status
                  - type
                  - property_id
                  - roomtype_id
                  - checkin
                  - checkout
                  - currency
                  - amount
                  - guest
                  - booker
                  - reserved_at
                  - confirmed_at
                  - canceled_at
                  - update_at
                  - request_at
        "400":
          description: Bad Request
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Invalid Parameter.
                required:
                  - message
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Unauthorized
                required:
                  - message
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Forbidden
                required:
                  - message
        "404":
          description: Not Found
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Not Found
                required:
                  - message
  /gds/vendor/bookinglist:
    get:
      operationId: list-bookings
      tags:
        - reservation
      summary: 예약 리스트 조회
      description: |-
        - 기간으로 예약 목록을 조회합니다.
        - `from`과 `to`가 필수입니다.
        - 예약 처리 자체는 ONDA가 공급사 엔드포인트를 호출하는 방식이므로, 이 API는 공급사가 자기 데이터와 대조하거나 누락을 찾을 때 사용합니다.
      security:
        - Authorization: []
      parameters:
        - schema:
            type: string
            description: 시작일 (YYYY-MM-DD)
            example: 2024-07-01
          required: true
          description: 시작일 (YYYY-MM-DD)
          name: from
          in: query
        - schema:
            type: string
            description: 종료일 (YYYY-MM-DD)
            example: 2024-07-31
          required: true
          description: 종료일 (YYYY-MM-DD)
          name: to
          in: query
      responses:
        "200":
          description: 예약 목록
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  properties:
                    booking_number:
                      type: string
                      description: 공급사 예약 번호
                      example: VB-001
                    reservation_status:
                      type: string
                      description: 예약 상태
                      example: confirmed
                  required:
                    - booking_number
                    - reservation_status
        "400":
          description: Bad Request
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Invalid Parameter.
                required:
                  - message
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Unauthorized
                required:
                  - message
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Forbidden
                required:
                  - message
        "404":
          description: Not Found
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Not Found
                required:
                  - message
  /gds/vendor/properties/{vendor_property_id}/ari:
    post:
      operationId: push-rates
      tags:
        - ari
      summary: 요금/영업일 전송
      description: |-
        - 요금·영업일을 설정합니다.
        - 항목마다 `is_business_day`와 `net_price` 또는 `sale_price`가 필수입니다.
        - `channels`의 각 채널에는 `is_business_day`와 항목에 보낸 요금 필드를 똑같이 넣어야 합니다(빠뜨리거나 항목에 없는 요금 필드를 넣으면 400).
        - `channels`에 없는 채널의 요금·영업일 설정은 구간(from-to) 내에서 삭제됩니다(생략/빈 배열 = 전 채널 설정 삭제).
        - 대실(dayuse) 항목에만 use_from/use_to/use_time을 보낼 수 있습니다(use_time 단위는 분).
        - 재고는 재고 전송 API(`POST /gds/vendor/properties/{vendor_property_id}/ari/avails`)를 사용하세요.
      security:
        - Authorization: []
      parameters:
        - schema:
            type: string
            description: 공급사 숙소 ID
            example: VP-001
          required: true
          description: 공급사 숙소 ID
          name: vendor_property_id
          in: path
      requestBody:
        content:
          application/json:
            schema:
              type: array
              items:
                type: object
                properties:
                  vendor_roomtype_id:
                    type: string
                    minLength: 1
                  vendor_rateplan_id:
                    type: string
                    minLength: 1
                  type:
                    type: string
                    enum:
                      - dayuse
                      - overnight
                  from:
                    type: string
                    format: date
                  to:
                    type: string
                    format: date
                  basic_price:
                    type: number
                    minimum: 0
                  net_price:
                    type: number
                    minimum: 0
                  sale_price:
                    type: number
                    minimum: 0
                  is_business_day:
                    type: number
                    enum:
                      - 0
                      - 1
                  use_from:
                    type: string
                    pattern: ^([01]\d|2[0-3]):[0-5]\d$
                  use_to:
                    type: string
                    pattern: ^([01]\d|2[0-3]):[0-5]\d$
                  use_time:
                    type: integer
                    minimum: 120
                  channels:
                    type: array
                    items:
                      type: object
                      properties:
                        channel_id:
                          type: integer
                          exclusiveMinimum: 0
                        basic_price:
                          type: number
                          minimum: 0
                        net_price:
                          type: number
                          minimum: 0
                        sale_price:
                          type: number
                          minimum: 0
                        is_business_day:
                          type: number
                          enum:
                            - 0
                            - 1
                        use_from:
                          type: string
                          pattern: ^([01]\d|2[0-3]):[0-5]\d$
                        use_to:
                          type: string
                          pattern: ^([01]\d|2[0-3]):[0-5]\d$
                        use_time:
                          type: integer
                          minimum: 120
                      required:
                        - channel_id
                        - is_business_day
                      description: 채널별 설정. is_business_day 는 필수이고, 항목에 보낸 요금 필드를 똑같이 넣어야 합니다(빠뜨리거나 항목에
                        없는 요금 필드를 보내면 400). 배열에 없는 채널의 설정은 구간 내에서 삭제됩니다
                required:
                  - vendor_roomtype_id
                  - vendor_rateplan_id
                  - type
                  - from
                  - to
                  - is_business_day
                description: ARI 인입 항목(숙박/대실) — 요금/영업일. default + channels[] 선언적 reconcile
      responses:
        "200":
          description: 설정 결과
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                    description: 에러 메시지 (성공 시 빈 문자열)
                    example: ""
                required:
                  - error
        "400":
          description: Bad Request
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Invalid Parameter.
                required:
                  - message
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Unauthorized
                required:
                  - message
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Forbidden
                required:
                  - message
        "404":
          description: Not Found
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Not Found
                required:
                  - message
  /gds/vendor/properties/{vendor_property_id}/ari/avails:
    post:
      operationId: push-avails
      tags:
        - ari
      summary: 재고 전송
      description: |-
        - 재고(vacancy)를 설정합니다(항목당 `vacancy` 필수).
        - 재고는 객실(roomtype) 단위로 반영됩니다.
        - `channels` 배열에 없는 채널의 재고 설정은 구간(from-to) 내에서 삭제됩니다(생략/빈 배열 = 전 채널 재고 설정 삭제).
        - 기간은 항목당 최대 730일입니다.
      security:
        - Authorization: []
      parameters:
        - schema:
            type: string
            description: 공급사 숙소 ID
            example: VP-001
          required: true
          description: 공급사 숙소 ID
          name: vendor_property_id
          in: path
      requestBody:
        content:
          application/json:
            schema:
              type: array
              items:
                type: object
                properties:
                  vendor_roomtype_id:
                    type: string
                    minLength: 1
                  type:
                    type: string
                    enum:
                      - dayuse
                      - overnight
                  from:
                    type: string
                    format: date
                  to:
                    type: string
                    format: date
                  vacancy:
                    type: integer
                    minimum: 0
                  min_los:
                    type: integer
                    minimum: 0
                  max_los:
                    type: integer
                    minimum: 0
                  channels:
                    type: array
                    items:
                      type: object
                      properties:
                        channel_id:
                          type: integer
                          exclusiveMinimum: 0
                        vacancy:
                          type: integer
                          minimum: 0
                      required:
                        - channel_id
                        - vacancy
                      additionalProperties: false
                      description: 채널 재고 오버라이드(vacancy 필수). 배열에 없는 채널의 재고 오버라이드는 구간 내 삭제
                required:
                  - vendor_roomtype_id
                  - type
                  - from
                  - to
                  - vacancy
                additionalProperties: false
                description: 재고 전용 ARI 인입 항목(숙박/대실). default 재고(+LOS) + channels[] 재고 선언적
                  reconcile
      responses:
        "200":
          description: 설정 결과
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                    description: 에러 메시지 (성공 시 빈 문자열)
                    example: ""
                required:
                  - error
        "400":
          description: Bad Request
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Invalid Parameter.
                required:
                  - message
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Unauthorized
                required:
                  - message
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Forbidden
                required:
                  - message
        "404":
          description: Not Found
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Not Found
                required:
                  - message
  /gds/vendor/meta:
    get:
      operationId: get-meta-codes
      tags:
        - content-meta
      summary: 코드 카탈로그 조회
      description: |-
        - 콘텐츠 push에 사용할 pcs.codes.code 값을 code_type별 계층 트리로 조회합니다.
        - 하위 코드가 없는 leaf 노드는 children 필드를 생략합니다.
      security:
        - Authorization: []
      parameters:
        - schema:
            type: string
            enum:
              - ko-KR
              - en-US
              - zh-CN
              - ja-JP
              - vn-VN
              - th-TH
              - zh-TW
            default: ko-KR
            description: 코드명 locale
            example: ko-KR
          required: false
          description: 코드명 locale
          name: locale
          in: query
      responses:
        "200":
          description: 코드 카탈로그
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/MetaResponse"
        "400":
          description: Bad Request
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Invalid locale
                required:
                  - message
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Unauthorized
                required:
                  - message
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Forbidden
                required:
                  - message
  /gds/vendor/properties:
    post:
      operationId: create-property
      tags:
        - content-property
      summary: 숙소 생성
      description: |-
        - 공급사 숙소를 ONDA에 생성합니다. 객실타입·요금제 모델·요금제가 모두 이 숙소 하위에 생성되므로 콘텐츠 연동의 첫 단계입니다.
        - `id`(공급사 숙소 ID)가 필수이며, 숙소명은 `i18n`의 `ko-kr`에 담습니다.
        - `classifications`·`property_tags`·`facility_tags` 등 코드성 필드에는 코드 카탈로그 조회로 받은 코드만 사용할 수 있습니다.
        - `settings.extra_adult_price`는 숙소 기본 추가 성인요금(정수 KRW)으로, 인원 기반 요금을 쓰는 채널에 반영됩니다.
        - 이미 존재하는 `id`로 다시 호출하면 `409`가 반환됩니다. 기존 숙소를 바꾸려면 숙소 수정을 사용하세요.
      security:
        - Authorization: []
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/PostPropertyBody"
      responses:
        "200":
          description: 생성 결과
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                    description: 에러 메시지 (성공 시 빈 문자열)
                    example: ""
                required:
                  - error
        "400":
          description: Bad Request (식별자 path/body 불일치 등)
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Invalid Parameter.
                required:
                  - message
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Unauthorized
                required:
                  - message
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Forbidden
                required:
                  - message
        "404":
          description: Not Found
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Not Found
                required:
                  - message
        "409":
          description: Conflict (이미 존재하는 id)
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Property already exists
                required:
                  - message
    get:
      operationId: list-properties
      tags:
        - content-property
      summary: 숙소 목록 조회
      description: |-
        - 공급사가 등록한 숙소 목록을 조회합니다.
        - 3.0에서 콘텐츠는 공급사가 ONDA로 전송하는 것이 기본이므로, 조회는 전송 결과를 확인하거나 장애 시 대조하는 보조 수단입니다.
        - ONDA에 저장된 값을 그대로 반환하므로, 공급사 데이터와 어긋나는 항목을 찾을 때 사용합니다.
      security:
        - Authorization: []
      responses:
        "200":
          description: 숙소 목록
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  properties:
                    id:
                      type: string
                      description: 숙소 ID
                      example: PROP123
                    name:
                      type: string
                      description: 숙소명
                      example: 서울 호텔
                    status:
                      type: string
                      enum:
                        - enabled
                        - disabled
                      description: 상태
                  required:
                    - id
                    - name
                    - status
        "400":
          description: Bad Request (식별자 path/body 불일치 등)
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Invalid Parameter.
                required:
                  - message
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Unauthorized
                required:
                  - message
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Forbidden
                required:
                  - message
        "404":
          description: Not Found
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Not Found
                required:
                  - message
        "409":
          description: Conflict (이미 존재하는 id)
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Property already exists
                required:
                  - message
  /gds/vendor/properties/{vendor_property_id}:
    get:
      operationId: get-property
      tags:
        - content-property
      summary: 숙소 단건 조회
      description: |-
        - 숙소 한 건의 콘텐츠와 판매 상태를 조회합니다.
        - 3.0에서 콘텐츠는 공급사가 ONDA로 전송하는 것이 기본이므로, 조회는 전송 결과를 확인하는 보조 수단입니다.
        - 경로의 `vendor_property_id`는 공급사가 숙소 생성 시 보낸 `id`입니다.
      security:
        - Authorization: []
      parameters:
        - schema:
            type: string
            description: 공급사 숙소 ID
            example: VP-001
          required: true
          description: 공급사 숙소 ID
          name: vendor_property_id
          in: path
      responses:
        "200":
          description: 숙소 콘텐츠
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/PropertyContent"
        "400":
          description: Bad Request (식별자 path/body 불일치 등)
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Invalid Parameter.
                required:
                  - message
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Unauthorized
                required:
                  - message
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Forbidden
                required:
                  - message
        "404":
          description: Not Found
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Not Found
                required:
                  - message
        "409":
          description: Conflict (이미 존재하는 id)
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Property already exists
                required:
                  - message
    patch:
      operationId: update-property
      tags:
        - content-property
      summary: 숙소 수정
      description: |-
        - 숙소 콘텐츠와 판매 상태를 수정합니다.
        - RFC 7396 JSON Merge Patch를 따릅니다. 생략한 필드는 기존값이 유지되고, `null`을 보내면 해당 값이 초기화됩니다.
        - 판매 중지·재개도 이 API로 처리합니다. `status`만 담아 보내면 나머지 콘텐츠는 그대로 유지됩니다.
        - `settings.extra_adult_price`에 `null`을 보내면 숙소 기본 추가 성인요금이 미설정으로 돌아갑니다.
        - 경로의 `vendor_property_id`와 본문의 식별자가 어긋나면 `400`이 반환됩니다.
      security:
        - Authorization: []
      parameters:
        - schema:
            type: string
            description: 공급사 숙소 ID
            example: VP-001
          required: true
          description: 공급사 숙소 ID
          name: vendor_property_id
          in: path
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/PatchPropertyBody"
      responses:
        "200":
          description: 수정 결과
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                    description: 에러 메시지 (성공 시 빈 문자열)
                    example: ""
                required:
                  - error
        "400":
          description: Bad Request (식별자 path/body 불일치 등)
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Invalid Parameter.
                required:
                  - message
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Unauthorized
                required:
                  - message
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Forbidden
                required:
                  - message
        "404":
          description: Not Found
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Not Found
                required:
                  - message
        "409":
          description: Conflict (이미 존재하는 id)
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Property already exists
                required:
                  - message
  /gds/vendor/properties/{vendor_property_id}/roomtypes:
    post:
      operationId: create-roomtype
      tags:
        - content-roomtype
      summary: 객실타입 생성
      description: |-
        - 숙소 하위에 객실타입을 생성합니다. 숙소를 먼저 생성해야 호출할 수 있습니다.
        - `id`(공급사 객실타입 ID)가 필수이며, 객실명은 `i18n`의 `ko-kr`에 담습니다.
        - `roomtype_tags`·`amenity_tags`·`view_tags` 등 코드성 필드에는 코드 카탈로그 조회로 받은 코드만 사용할 수 있습니다.
        - 재고는 객실타입 단위로 관리되므로, 여기서 만든 `id`가 이후 재고 전송의 기준이 됩니다.
        - 이미 존재하는 `id`로 다시 호출하면 `409`가 반환됩니다.
      security:
        - Authorization: []
      parameters:
        - schema:
            type: string
            description: 공급사 숙소 ID
            example: VP-001
          required: true
          description: 공급사 숙소 ID
          name: vendor_property_id
          in: path
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/PostRoomtypeBody"
      responses:
        "200":
          description: 생성 결과
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                    description: 에러 메시지 (성공 시 빈 문자열)
                    example: ""
                required:
                  - error
        "400":
          description: Bad Request (식별자 path/body 불일치 등)
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Invalid Parameter.
                required:
                  - message
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Unauthorized
                required:
                  - message
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Forbidden
                required:
                  - message
        "404":
          description: Not Found
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Not Found
                required:
                  - message
        "409":
          description: Conflict (이미 존재하는 id)
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Property already exists
                required:
                  - message
    get:
      operationId: list-roomtypes
      tags:
        - content-roomtype
      summary: 객실타입 목록 조회
      description: |-
        - 숙소에 속한 객실타입 목록을 조회합니다. 응답에는 각 객실타입에 연결된 요금제 정보도 함께 담깁니다.
        - 3.0에서 콘텐츠는 공급사가 ONDA로 전송하는 것이 기본이므로, 조회는 전송 결과를 확인하는 보조 수단입니다.
        - 객실타입과 요금제의 연결 상태를 한 번에 확인할 때 유용합니다.
      security:
        - Authorization: []
      parameters:
        - schema:
            type: string
            description: 공급사 숙소 ID
            example: VP-001
          required: true
          description: 공급사 숙소 ID
          name: vendor_property_id
          in: path
      responses:
        "200":
          description: 객실타입 목록
          content:
            application/json:
              schema:
                type: object
                properties:
                  property_id:
                    type: string
                    description: 숙소 ID
                    example: "12345"
                  roomtypes:
                    type: array
                    items:
                      type: object
                      properties:
                        id:
                          type: string
                          description: 객실타입 ID
                          example: RT-001
                        name:
                          type: string
                          description: 객실타입명
                          example: 디럭스 더블
                        status:
                          type: string
                          description: 상태
                          example: enabled
                        rateplans:
                          type: array
                          items:
                            type: object
                            properties:
                              rateplan_id:
                                type: string
                                description: 요금제 ID
                                example: RP-001
                              rateplan_name:
                                type: string
                                description: 요금제명
                                example: 기본 요금
                              rateplan_status:
                                type: string
                                description: 요금제 상태
                                example: enabled
                              rateplan_type:
                                type: string
                                description: 요금제 유형
                                example: standard
                              rateplan_description:
                                type: string
                                description: 요금제 설명
                                example: 조식 포함
                              updated_at:
                                type: string
                                format: date-time
                                description: 수정일시 (ISO8601, 오프셋 포함)
                                example: 2024-07-01T10:00:00+09:00
                            required:
                              - rateplan_id
                              - rateplan_name
                              - rateplan_status
                              - rateplan_type
                              - rateplan_description
                              - updated_at
                          description: 요금제 목록
                        updated_at:
                          type: string
                          format: date-time
                          description: 수정일시 (ISO8601, 오프셋 포함)
                          example: 2024-07-01T10:00:00+09:00
                      required:
                        - id
                        - name
                        - status
                        - rateplans
                        - updated_at
                    description: 객실타입 목록
                required:
                  - property_id
                  - roomtypes
        "400":
          description: Bad Request (식별자 path/body 불일치 등)
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Invalid Parameter.
                required:
                  - message
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Unauthorized
                required:
                  - message
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Forbidden
                required:
                  - message
        "404":
          description: Not Found
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Not Found
                required:
                  - message
        "409":
          description: Conflict (이미 존재하는 id)
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Property already exists
                required:
                  - message
  /gds/vendor/properties/{vendor_property_id}/roomtypes/{vendor_roomtype_id}:
    get:
      operationId: get-roomtype
      tags:
        - content-roomtype
      summary: 객실타입 단건 조회
      description: |-
        - 객실타입 한 건의 콘텐츠와 판매 상태를 조회합니다.
        - 3.0에서 콘텐츠는 공급사가 ONDA로 전송하는 것이 기본이므로, 조회는 전송 결과를 확인하는 보조 수단입니다.
        - 경로의 `vendor_roomtype_id`는 공급사가 객실타입 생성 시 보낸 `id`입니다.
      security:
        - Authorization: []
      parameters:
        - schema:
            type: string
            description: 공급사 숙소 ID
            example: VP-001
          required: true
          description: 공급사 숙소 ID
          name: vendor_property_id
          in: path
        - schema:
            type: string
            description: 공급사 객실 ID
            example: VRT-001
          required: true
          description: 공급사 객실 ID
          name: vendor_roomtype_id
          in: path
      responses:
        "200":
          description: 객실타입 콘텐츠
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/RoomtypeContent"
        "400":
          description: Bad Request (식별자 path/body 불일치 등)
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Invalid Parameter.
                required:
                  - message
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Unauthorized
                required:
                  - message
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Forbidden
                required:
                  - message
        "404":
          description: Not Found
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Not Found
                required:
                  - message
        "409":
          description: Conflict (이미 존재하는 id)
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Property already exists
                required:
                  - message
    patch:
      operationId: update-roomtype
      tags:
        - content-roomtype
      summary: 객실타입 수정
      description: |-
        - 객실타입 콘텐츠와 판매 상태를 수정합니다.
        - RFC 7396 JSON Merge Patch를 따릅니다. 생략한 필드는 기존값이 유지되고, `null`을 보내면 해당 값이 초기화됩니다.
        - 판매 중지·재개도 이 API로 처리합니다. `status`만 담아 보내면 나머지 콘텐츠는 그대로 유지됩니다.
        - 경로의 식별자와 본문의 식별자가 어긋나면 `400`이 반환됩니다.
      security:
        - Authorization: []
      parameters:
        - schema:
            type: string
            description: 공급사 숙소 ID
            example: VP-001
          required: true
          description: 공급사 숙소 ID
          name: vendor_property_id
          in: path
        - schema:
            type: string
            description: 공급사 객실 ID
            example: VRT-001
          required: true
          description: 공급사 객실 ID
          name: vendor_roomtype_id
          in: path
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/PatchRoomtypeBody"
      responses:
        "200":
          description: 수정 결과
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                    description: 에러 메시지 (성공 시 빈 문자열)
                    example: ""
                required:
                  - error
        "400":
          description: Bad Request (식별자 path/body 불일치 등)
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Invalid Parameter.
                required:
                  - message
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Unauthorized
                required:
                  - message
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Forbidden
                required:
                  - message
        "404":
          description: Not Found
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Not Found
                required:
                  - message
        "409":
          description: Conflict (이미 존재하는 id)
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Property already exists
                required:
                  - message
  /gds/vendor/properties/{vendor_property_id}/rateplan-models:
    post:
      operationId: create-rateplan-model
      tags:
        - content-rateplan-model
      summary: 요금제 모델 생성
      description: |-
        - 숙소 단위로 요금제 모델을 생성합니다. 요금제는 객실타입과 이 모델의 결합으로 정의되므로, 요금제를 만들기 전에 먼저 생성해야 합니다.
        - `id`와 `i18n`(`ko-kr` 필수)이 필요합니다.
        - `type`이 `standalone`인 모델은 숙소당 1개만 만들 수 있고 반드시 있어야 합니다. `package`는 개수 제한이 없습니다.
        - `sale_from`과 `sale_to`는 두 값을 모두 보내거나 모두 생략해야 하며, 한쪽만 보내면 거부됩니다. `max_los`를 `0`으로 두면 최대 숙박일 제한이 없습니다.
        - `channels`를 보내면 해당 채널에서만 판매되고, 생략하면 전 채널에서 판매됩니다.
        - 이미 존재하는 `id`는 `409`, 참조나 불변식을 위반하면 `422`가 반환됩니다.
      security:
        - Authorization: []
      parameters:
        - schema:
            type: string
            description: 공급사 숙소 ID
            example: VP-001
          required: true
          description: 공급사 숙소 ID
          name: vendor_property_id
          in: path
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/PostRateplanModelBody"
      responses:
        "200":
          description: 생성 결과
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                    description: 에러 메시지 (성공 시 빈 문자열)
                    example: ""
                required:
                  - error
        "400":
          description: Bad Request (식별자 path/body 불일치 등)
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Invalid Parameter.
                required:
                  - message
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Unauthorized
                required:
                  - message
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Forbidden
                required:
                  - message
        "404":
          description: Not Found
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Not Found
                required:
                  - message
        "409":
          description: Conflict (이미 존재하는 id)
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Property already exists
                required:
                  - message
        "422":
          description: Unprocessable Entity (참조/invariant 위반)
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Unprocessable Entity
                required:
                  - message
    get:
      operationId: list-rateplan-models
      tags:
        - content-rateplan-model
      summary: 요금제 모델 목록 조회
      description: |-
        - 숙소에 등록된 요금제 모델 목록을 조회합니다.
        - 3.0에서 콘텐츠는 공급사가 ONDA로 전송하는 것이 기본이므로, 조회는 전송 결과를 확인하는 보조 수단입니다.
        - 요금제를 만들기 전에 결합할 모델의 `id`를 확인할 때 사용할 수 있습니다.
      security:
        - Authorization: []
      parameters:
        - schema:
            type: string
            description: 공급사 숙소 ID
            example: VP-001
          required: true
          description: 공급사 숙소 ID
          name: vendor_property_id
          in: path
      responses:
        "200":
          description: 요금제 모델 목록
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/RateplanModelContent"
        "400":
          description: Bad Request (식별자 path/body 불일치 등)
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Invalid Parameter.
                required:
                  - message
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Unauthorized
                required:
                  - message
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Forbidden
                required:
                  - message
        "404":
          description: Not Found
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Not Found
                required:
                  - message
        "409":
          description: Conflict (이미 존재하는 id)
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Property already exists
                required:
                  - message
  /gds/vendor/properties/{vendor_property_id}/rateplan-models/{vendor_rateplan_model_id}:
    get:
      operationId: get-rateplan-model
      tags:
        - content-rateplan-model
      summary: 요금제 모델 단건 조회
      description: |-
        - 요금제 모델 한 건의 판매 조건을 조회합니다.
        - 3.0에서 콘텐츠는 공급사가 ONDA로 전송하는 것이 기본이므로, 조회는 전송 결과를 확인하는 보조 수단입니다.
        - 판매 기간·숙박일수·환불 여부·판매 채널 등 이 모델을 참조하는 요금제에 공통 적용되는 조건을 확인할 수 있습니다.
      security:
        - Authorization: []
      parameters:
        - schema:
            type: string
            description: 공급사 숙소 ID
            example: VP-001
          required: true
          description: 공급사 숙소 ID
          name: vendor_property_id
          in: path
        - schema:
            type: string
            description: 공급사 요금제 모델 ID
            example: VRPM-001
          required: true
          description: 공급사 요금제 모델 ID
          name: vendor_rateplan_model_id
          in: path
      responses:
        "200":
          description: 요금제 모델 콘텐츠
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/RateplanModelContent"
        "400":
          description: Bad Request (식별자 path/body 불일치 등)
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Invalid Parameter.
                required:
                  - message
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Unauthorized
                required:
                  - message
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Forbidden
                required:
                  - message
        "404":
          description: Not Found
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Not Found
                required:
                  - message
        "409":
          description: Conflict (이미 존재하는 id)
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Property already exists
                required:
                  - message
    patch:
      operationId: update-rateplan-model
      tags:
        - content-rateplan-model
      summary: 요금제 모델 수정
      description: |-
        - 요금제 모델의 판매 조건을 수정합니다. 이 모델을 참조하는 모든 요금제에 함께 적용됩니다.
        - RFC 7396 JSON Merge Patch를 따르며, `i18n`은 수정 요청에도 필요합니다.
        - `channels`를 수정하면 요금제 매핑이 달라집니다. 채널을 추가하면 추가된 채널에만 매핑이 새로 생기고, 채널을 빼도 이미 만들어진 매핑은 삭제되지 않습니다. 빈 배열로 두면 생성 가능한 모든 채널에 매핑이 만들어집니다.
        - `sale_from`과 `sale_to`는 두 값을 모두 보내거나 모두 생략해야 합니다.
        - 참조나 불변식을 위반하면 `422`가 반환됩니다.
      security:
        - Authorization: []
      parameters:
        - schema:
            type: string
            description: 공급사 숙소 ID
            example: VP-001
          required: true
          description: 공급사 숙소 ID
          name: vendor_property_id
          in: path
        - schema:
            type: string
            description: 공급사 요금제 모델 ID
            example: VRPM-001
          required: true
          description: 공급사 요금제 모델 ID
          name: vendor_rateplan_model_id
          in: path
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/PatchRateplanModelBody"
      responses:
        "200":
          description: 수정 결과
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                    description: 에러 메시지 (성공 시 빈 문자열)
                    example: ""
                required:
                  - error
        "400":
          description: Bad Request (식별자 path/body 불일치 등)
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Invalid Parameter.
                required:
                  - message
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Unauthorized
                required:
                  - message
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Forbidden
                required:
                  - message
        "404":
          description: Not Found
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Not Found
                required:
                  - message
        "409":
          description: Conflict (이미 존재하는 id)
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Property already exists
                required:
                  - message
        "422":
          description: Unprocessable Entity (참조/invariant 위반)
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Unprocessable Entity
                required:
                  - message
  /gds/vendor/properties/{vendor_property_id}/roomtypes/{vendor_roomtype_id}/rateplans:
    post:
      operationId: create-rateplan
      tags:
        - content-rateplan
      summary: 요금제 생성
      description: |-
        - 객실타입 하위에 요금제를 생성합니다. 요금·영업일 전송의 기준 단위이므로, 판매를 시작하려면 반드시 필요합니다.
        - `id`와 `vendor_rateplan_model_id`가 필수입니다. `vendor_rateplan_model_id`로 요금제 모델과 결합되어 판매 조건이 정해집니다.
        - 결합할 요금제 모델과 객실타입이 모두 먼저 생성돼 있어야 합니다.
        - 이미 존재하는 `id`는 `409`, 참조하는 요금제 모델이 없거나 불변식을 위반하면 `422`가 반환됩니다.
      security:
        - Authorization: []
      parameters:
        - schema:
            type: string
            description: 공급사 숙소 ID
            example: VP-001
          required: true
          description: 공급사 숙소 ID
          name: vendor_property_id
          in: path
        - schema:
            type: string
            description: 공급사 객실 ID
            example: VRT-001
          required: true
          description: 공급사 객실 ID
          name: vendor_roomtype_id
          in: path
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/PostRateplanBody"
      responses:
        "200":
          description: 생성 결과
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                    description: 에러 메시지 (성공 시 빈 문자열)
                    example: ""
                required:
                  - error
        "400":
          description: Bad Request (식별자 path/body 불일치 등)
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Invalid Parameter.
                required:
                  - message
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Unauthorized
                required:
                  - message
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Forbidden
                required:
                  - message
        "404":
          description: Not Found
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Not Found
                required:
                  - message
        "409":
          description: Conflict (이미 존재하는 id)
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Property already exists
                required:
                  - message
        "422":
          description: Unprocessable Entity (참조/invariant 위반)
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Unprocessable Entity
                required:
                  - message
    get:
      operationId: list-rateplans
      tags:
        - content-rateplan
      summary: 요금제 목록 조회
      description: |-
        - 객실타입에 연결된 요금제 목록을 조회합니다.
        - 3.0에서 콘텐츠는 공급사가 ONDA로 전송하는 것이 기본이므로, 조회는 전송 결과를 확인하는 보조 수단입니다.
        - 요금·영업일 전송에 사용할 `vendor_rateplan_id`를 확인할 때 사용합니다.
      security:
        - Authorization: []
      parameters:
        - schema:
            type: string
            description: 공급사 숙소 ID
            example: VP-001
          required: true
          description: 공급사 숙소 ID
          name: vendor_property_id
          in: path
        - schema:
            type: string
            description: 공급사 객실 ID
            example: VRT-001
          required: true
          description: 공급사 객실 ID
          name: vendor_roomtype_id
          in: path
      responses:
        "200":
          description: 요금제 목록
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/RateplanContent"
        "400":
          description: Bad Request (식별자 path/body 불일치 등)
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Invalid Parameter.
                required:
                  - message
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Unauthorized
                required:
                  - message
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Forbidden
                required:
                  - message
        "404":
          description: Not Found
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Not Found
                required:
                  - message
        "409":
          description: Conflict (이미 존재하는 id)
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Property already exists
                required:
                  - message
  /gds/vendor/properties/{vendor_property_id}/roomtypes/{vendor_roomtype_id}/rateplans/{vendor_rateplan_id}:
    get:
      operationId: get-rateplan
      tags:
        - content-rateplan
      summary: 요금제 단건 조회
      description: |-
        - 요금제 한 건의 정보와 판매 상태를 조회합니다.
        - 3.0에서 콘텐츠는 공급사가 ONDA로 전송하는 것이 기본이므로, 조회는 전송 결과를 확인하는 보조 수단입니다.
        - 어떤 요금제 모델과 결합돼 있는지 확인할 수 있습니다.
      security:
        - Authorization: []
      parameters:
        - schema:
            type: string
            description: 공급사 숙소 ID
            example: VP-001
          required: true
          description: 공급사 숙소 ID
          name: vendor_property_id
          in: path
        - schema:
            type: string
            description: 공급사 객실 ID
            example: VRT-001
          required: true
          description: 공급사 객실 ID
          name: vendor_roomtype_id
          in: path
        - schema:
            type: string
            description: 공급사 요금제 ID
            example: VRP-001
          required: true
          description: 공급사 요금제 ID
          name: vendor_rateplan_id
          in: path
      responses:
        "200":
          description: 요금제 콘텐츠
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/RateplanContent"
        "400":
          description: Bad Request (식별자 path/body 불일치 등)
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Invalid Parameter.
                required:
                  - message
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Unauthorized
                required:
                  - message
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Forbidden
                required:
                  - message
        "404":
          description: Not Found
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Not Found
                required:
                  - message
        "409":
          description: Conflict (이미 존재하는 id)
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Property already exists
                required:
                  - message
    patch:
      operationId: update-rateplan
      tags:
        - content-rateplan
      summary: 요금제 수정
      description: |-
        - 요금제의 판매 상태를 수정합니다.
        - RFC 7396 JSON Merge Patch를 따릅니다. 생략한 필드는 기존값이 유지됩니다.
        - 판매 조건(판매 기간·숙박일수·환불 여부 등)은 요금제가 아니라 결합된 요금제 모델에서 관리하므로, 조건을 바꾸려면 요금제 모델 수정을 사용하세요.
        - 경로의 식별자와 본문의 식별자가 어긋나면 `400`이 반환됩니다.
      security:
        - Authorization: []
      parameters:
        - schema:
            type: string
            description: 공급사 숙소 ID
            example: VP-001
          required: true
          description: 공급사 숙소 ID
          name: vendor_property_id
          in: path
        - schema:
            type: string
            description: 공급사 객실 ID
            example: VRT-001
          required: true
          description: 공급사 객실 ID
          name: vendor_roomtype_id
          in: path
        - schema:
            type: string
            description: 공급사 요금제 ID
            example: VRP-001
          required: true
          description: 공급사 요금제 ID
          name: vendor_rateplan_id
          in: path
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/PatchRateplanBody"
      responses:
        "200":
          description: 수정 결과
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                    description: 에러 메시지 (성공 시 빈 문자열)
                    example: ""
                required:
                  - error
        "400":
          description: Bad Request (식별자 path/body 불일치 등)
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Invalid Parameter.
                required:
                  - message
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Unauthorized
                required:
                  - message
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Forbidden
                required:
                  - message
        "404":
          description: Not Found
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Not Found
                required:
                  - message
        "409":
          description: Conflict (이미 존재하는 id)
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Property already exists
                required:
                  - message
  /gds/vendor/channels:
    get:
      operationId: list-channels
      tags:
        - channel
      security:
        - Authorization: []
      summary: 판매 채널 조회
      description: |-
        - 공급사의 판매 채널 목록을 조회합니다.
        - 응답의 `processing_mode` 로 채널별 오픈 신청 처리 방식(auto_approve / external_review)을 확인할 수 있습니다.
      responses:
        "200":
          description: 채널 목록
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  properties:
                    id:
                      type: number
                      description: 채널 ID
                      example: 2
                    name:
                      type: string
                      description: 채널명
                      example: 네이버
                    status:
                      type: string
                      enum:
                        - enabled
                        - disabled
                      description: 상태
                    currency:
                      type: string
                      description: 통화 코드
                      example: KRW
                    booking_number_prefix:
                      type: string
                      description: 예약 번호 접두사
                      example: NV
                    processing_mode:
                      type: string
                      enum:
                        - auto_approve
                        - external_review
                      description: 오픈 신청 처리 방식. auto_approve 채널은 신청 즉시 활성화되고, external_review 채널은 운영자
                        승인을 거친다.
                      example: auto_approve
                    channel_type:
                      type: string
                      enum:
                        - hub
                        - cms
                      description: 채널 연동 방식. hub 는 Hub 기반 연동이고, cms 는 공급사가 채널 상품을 직접 매핑하는 연동이다.
                      example: cms
                    requires_cms_authorization:
                      type: boolean
                      description: CMS 인증 필요 여부
                      example: false
                  required:
                    - id
                    - name
                    - status
                    - currency
                    - booking_number_prefix
                    - processing_mode
                    - channel_type
                    - requires_cms_authorization
        "400":
          description: Bad Request
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Invalid Parameter.
                required:
                  - message
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Unauthorized
                required:
                  - message
        "500":
          description: Internal Server Error
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Internal Server Error
                required:
                  - message
  /gds/vendor/channels/{channel_id}/properties/{channel_property_id}:
    get:
      operationId: get-channel-property
      tags:
        - channel
      security:
        - Authorization: []
      summary: 채널 숙소 정보 조회
      description: |-
        - 채널 측에 등록된 숙소와 그 하위 객실·요금제 정보를 조회합니다.
        - 직연동 채널에서 매핑을 만들기 전에 호출해, 연결할 채널 객실 ID와 요금제 ID 후보를 확보하는 용도입니다.
        - 응답의 `channel_parent_rateplan_id`는 부모 요금제를 가리킵니다. 이 요금제에 요금을 따로 보내도 채널에 반영되지 않고, 부모 요금제의 요금을 따라 자동으로 변동합니다.
        - 채널 측 조회를 거치므로 채널 상황에 따라 `500`이 날 수 있습니다. 재시도 처리를 두는 편이 안전합니다.
      parameters:
        - schema:
            type: string
            description: 채널 아이디
            example: "1"
          required: true
          description: 채널 아이디
          name: channel_id
          in: path
        - schema:
            type: string
            description: 채널 숙소 아이디
            example: CP-001
          required: true
          description: 채널 숙소 아이디
          name: channel_property_id
          in: path
      responses:
        "200":
          description: 채널 숙소 정보 조회 성공
          content:
            application/json:
              schema:
                type: object
                properties:
                  channel_id:
                    type: string
                    description: 채널 아이디
                    example: "1"
                  channel_property_id:
                    type: string
                    description: 채널 숙소 아이디
                    example: CP-001
                  name:
                    type: string
                    description: 채널 숙소명
                    example: 온다호텔 강남
                  status:
                    type: string
                    description: 채널 숙소 상태
                    example: enabled
                  pricing_model:
                    type:
                      - string
                      - "null"
                    description: "채널이 준 pricing 값 그대로다. 채널마다 값 체계가 다르고(예: ctrip 은 Standard/OBP), 채널이
                      주지 않으면 null 이다."
                    example: Standard
                  roomtypes:
                    type: array
                    items:
                      type: object
                      properties:
                        channel_roomtype_id:
                          type: string
                          description: 채널 객실 아이디
                          example: CRT-001
                        name:
                          type: string
                          description: 채널 객실 이름
                          example: 디럭스 더블
                        status:
                          type: string
                          description: 채널 객실 상태
                          example: enabled
                      required:
                        - channel_roomtype_id
                        - name
                        - status
                  rateplans:
                    type: array
                    items:
                      type: object
                      properties:
                        channel_rateplan_id:
                          type: string
                          description: 채널 요금제 아이디
                          example: CRP-001
                        name:
                          type: string
                          description: 채널 요금제 이름
                          example: 조식 포함
                        channel_roomtype_id:
                          type: string
                          description: 채널 객실 아이디
                          example: CRT-001
                        channel_parent_rateplan_id:
                          type:
                            - string
                            - "null"
                          description: 부모 요금제의 채널 아이디. 자식 요금제일 때만 값이 있고 그 외에는 null 이다. booking.com 과 agoda
                            채널만 값을 채운다.
                          example: CRP-000
                        status:
                          type: string
                          description: 채널 요금제 상태
                          example: enabled
                        type:
                          type: string
                          enum:
                            - dayuse
                            - overnight
                          description: 대실과 숙박 구분. dayuse 가 대실, overnight 이 숙박이다.
                          example: overnight
                      required:
                        - channel_rateplan_id
                        - name
                        - channel_roomtype_id
                        - channel_parent_rateplan_id
                        - status
                        - type
                required:
                  - channel_id
                  - channel_property_id
                  - status
                  - pricing_model
                  - roomtypes
                  - rateplans
        "400":
          description: Bad Request
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Invalid Parameter.
                required:
                  - message
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Unauthorized
                required:
                  - message
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Forbidden
                required:
                  - message
        "404":
          description: Not Found
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Not Found
                required:
                  - message
        "500":
          description: Internal Server Error
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Internal Server Error
                required:
                  - message
  /gds/vendor/properties/{vendor_property_id}/channels/{channel_id}/settings:
    get:
      operationId: get-property-channel-settings
      tags:
        - channel-setting
      security:
        - Authorization: []
      summary: 숙소 채널 설정 조회
      description: |-
        - 숙소에 대한 채널별 부가 설정을 조회합니다.
        - 저장된 값이 없으면 빈 객체가 반환됩니다. 설정하지 않은 상태와 오류를 구분해 처리하세요.
        - 설정 항목은 채널마다 다릅니다. 인원 추가요금 방식처럼 일부 채널에서만 쓰이는 항목이 있습니다.
      parameters:
        - schema:
            type: string
            description: 공급사 숙소 아이디
            example: VP-001
          required: true
          description: 공급사 숙소 아이디
          name: vendor_property_id
          in: path
        - schema:
            type: string
            description: 채널 아이디
            example: "24"
          required: true
          description: 채널 아이디
          name: channel_id
          in: path
      responses:
        "200":
          description: 채널 설정 조회 성공. 저장된 값이 없으면 빈 객체 반환.
          content:
            application/json:
              schema:
                type: object
                properties:
                  pricing_model:
                    type: string
                    enum:
                      - OBP
                      - Standard
                    description: 요금 모델
                    example: Standard
                description: 채널별 설정 응답. 저장된 필드만 담기고, 설정하지 않은 필드는 생략된다.
        "400":
          description: Bad Request
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Invalid Parameter.
                required:
                  - message
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Unauthorized
                required:
                  - message
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Forbidden
                required:
                  - message
        "404":
          description: Not Found
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Not Found
                required:
                  - message
        "500":
          description: Internal Server Error
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Internal Server Error
                required:
                  - message
    patch:
      operationId: update-property-channel-settings
      tags:
        - channel-setting
      security:
        - Authorization: []
      summary: 숙소 채널 설정 저장
      description: RFC 7396 JSON Merge Patch. null 인 경우 해당 키를 삭제합니다.
      parameters:
        - schema:
            type: string
            description: 공급사 숙소 아이디
            example: VP-001
          required: true
          description: 공급사 숙소 아이디
          name: vendor_property_id
          in: path
        - schema:
            type: string
            description: 채널 아이디
            example: "24"
          required: true
          description: 채널 아이디
          name: channel_id
          in: path
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                pricing_model:
                  type:
                    - string
                    - "null"
                  enum:
                    - OBP
                    - Standard
                    - null
                  description: 요금 모델
                  example: Standard
              additionalProperties: false
              description: 채널별 설정. 모든 지원 채널이 같은 스키마를 쓴다. 필드를 null 로 보내면 삭제되고 생략하면 기존 값이 유지된다.
                허용되지 않은 필드는 400 으로 거부된다.
      responses:
        "200":
          description: 채널 설정 저장 성공. 저장 후의 전체 설정 반환.
          content:
            application/json:
              schema:
                type: object
                properties:
                  pricing_model:
                    type: string
                    enum:
                      - OBP
                      - Standard
                    description: 요금 모델
                    example: Standard
                description: 채널별 설정 응답. 저장된 필드만 담기고, 설정하지 않은 필드는 생략된다.
        "400":
          description: Bad Request
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Invalid Parameter.
                required:
                  - message
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Unauthorized
                required:
                  - message
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Forbidden
                required:
                  - message
        "404":
          description: Not Found
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Not Found
                required:
                  - message
        "500":
          description: Internal Server Error
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Internal Server Error
                required:
                  - message
  /gds/vendor/properties/{vendor_property_id}/roomtypes/{vendor_roomtype_id}/channels/{channel_id}/settings:
    get:
      operationId: get-roomtype-channel-settings
      tags:
        - channel-setting
      security:
        - Authorization: []
      summary: 객실 채널 설정 조회
      description: |-
        - 공급사의 객실에 대한 채널별 설정을 조회합니다.
        - 저장된 값이 없으면 빈 객체 반환.
      parameters:
        - schema:
            type: string
            description: 공급사 숙소 아이디
            example: VP-001
          required: true
          description: 공급사 숙소 아이디
          name: vendor_property_id
          in: path
        - schema:
            type: string
            description: 공급사 객실 아이디
            example: VRT-001
          required: true
          description: 공급사 객실 아이디
          name: vendor_roomtype_id
          in: path
        - schema:
            type: string
            description: 채널 아이디
            example: "133"
          required: true
          description: 채널 아이디
          name: channel_id
          in: path
      responses:
        "200":
          description: 객실 채널 설정 조회 성공
          content:
            application/json:
              schema:
                type: object
                properties:
                  booking_lead_time_hours:
                    type: number
                    enum:
                      - 1
                      - 2
                      - 3
                      - 4
                      - 5
                      - 6
                      - 7
                      - 8
                      - 9
                      - 10
                      - 11
                      - 12
                      - 13
                      - 14
                      - 15
                      - 16
                      - 17
                      - 18
                      - 19
                      - 20
                      - 21
                      - 22
                      - 23
                      - 24
                      - 48
                      - 72
                      - 168
                    description: "예약 리드 타임 시간 (Airbnb 허용값: 1-24, 48, 72, 168)"
                    example: 24
                  allow_request_to_book:
                    type: boolean
                    description: 리드타임 미달 예약 요청 허용
                    example: false
                  default_min_nights:
                    type: integer
                    minimum: 0
                    description: 기본 최소 숙박일
                    example: 2
                  included_guests:
                    type: integer
                    minimum: 0
                    description: 기본 포함 인원
                    example: 2
                  weekly_discount_percentage:
                    type: number
                    minimum: 0
                    maximum: 100
                    description: 주간 할인율 (0~100)
                    example: 10
                  monthly_discount_percentage:
                    type: number
                    minimum: 0
                    maximum: 100
                    description: 월간 할인율 (0~100)
                    example: 20
                  cleaning_fee:
                    type: number
                    minimum: 0
                    description: 청소비
                    example: 30000
                description: 채널별 객실 설정 응답. 저장된 필드만 담기고, 설정하지 않은 필드는 생략된다.
        "400":
          description: Bad Request
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Invalid Parameter.
                required:
                  - message
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Unauthorized
                required:
                  - message
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Forbidden
                required:
                  - message
        "404":
          description: Not Found
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Not Found
                required:
                  - message
        "500":
          description: Internal Server Error
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Internal Server Error
                required:
                  - message
    patch:
      operationId: update-roomtype-channel-settings
      tags:
        - channel-setting
      security:
        - Authorization: []
      summary: 객실 채널 설정 저장
      description: RFC 7396 JSON Merge Patch. null 인 경우 해당 키를 삭제합니다.
      parameters:
        - schema:
            type: string
            description: 공급사 숙소 아이디
            example: VP-001
          required: true
          description: 공급사 숙소 아이디
          name: vendor_property_id
          in: path
        - schema:
            type: string
            description: 공급사 객실 아이디
            example: VRT-001
          required: true
          description: 공급사 객실 아이디
          name: vendor_roomtype_id
          in: path
        - schema:
            type: string
            description: 채널 아이디
            example: "133"
          required: true
          description: 채널 아이디
          name: channel_id
          in: path
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                booking_lead_time_hours:
                  type:
                    - number
                    - "null"
                  enum:
                    - 1
                    - 2
                    - 3
                    - 4
                    - 5
                    - 6
                    - 7
                    - 8
                    - 9
                    - 10
                    - 11
                    - 12
                    - 13
                    - 14
                    - 15
                    - 16
                    - 17
                    - 18
                    - 19
                    - 20
                    - 21
                    - 22
                    - 23
                    - 24
                    - 48
                    - 72
                    - 168
                    - null
                  description: "예약 리드 타임 시간 (Airbnb 허용값: 1-24, 48, 72, 168)"
                  example: 24
                allow_request_to_book:
                  type:
                    - boolean
                    - "null"
                  description: 리드타임 미달 예약을 요청 형태로 허용 여부 (Airbnb)
                  example: false
                default_min_nights:
                  type:
                    - integer
                    - "null"
                  minimum: 0
                  description: 기본 최소 숙박일
                  example: 2
                included_guests:
                  type:
                    - integer
                    - "null"
                  minimum: 0
                  description: 기본 포함 인원
                  example: 2
                weekly_discount_percentage:
                  type:
                    - number
                    - "null"
                  minimum: 0
                  maximum: 100
                  description: 주간 할인율 (0~100)
                  example: 10
                monthly_discount_percentage:
                  type:
                    - number
                    - "null"
                  minimum: 0
                  maximum: 100
                  description: 월간 할인율 (0~100)
                  example: 20
                cleaning_fee:
                  type:
                    - number
                    - "null"
                  minimum: 0
                  description: 청소비
                  example: 30000
              additionalProperties: false
              description: 채널별 객실 설정. 필드를 null 로 보내면 삭제되고 생략하면 기존 값이 유지된다. 허용되지 않은 필드는 400 으로
                거부된다.
      responses:
        "200":
          description: 객실 채널 설정 저장 성공. 저장 후의 전체 설정 반환.
          content:
            application/json:
              schema:
                type: object
                properties:
                  booking_lead_time_hours:
                    type: number
                    enum:
                      - 1
                      - 2
                      - 3
                      - 4
                      - 5
                      - 6
                      - 7
                      - 8
                      - 9
                      - 10
                      - 11
                      - 12
                      - 13
                      - 14
                      - 15
                      - 16
                      - 17
                      - 18
                      - 19
                      - 20
                      - 21
                      - 22
                      - 23
                      - 24
                      - 48
                      - 72
                      - 168
                    description: "예약 리드 타임 시간 (Airbnb 허용값: 1-24, 48, 72, 168)"
                    example: 24
                  allow_request_to_book:
                    type: boolean
                    description: 리드타임 미달 예약 요청 허용
                    example: false
                  default_min_nights:
                    type: integer
                    minimum: 0
                    description: 기본 최소 숙박일
                    example: 2
                  included_guests:
                    type: integer
                    minimum: 0
                    description: 기본 포함 인원
                    example: 2
                  weekly_discount_percentage:
                    type: number
                    minimum: 0
                    maximum: 100
                    description: 주간 할인율 (0~100)
                    example: 10
                  monthly_discount_percentage:
                    type: number
                    minimum: 0
                    maximum: 100
                    description: 월간 할인율 (0~100)
                    example: 20
                  cleaning_fee:
                    type: number
                    minimum: 0
                    description: 청소비
                    example: 30000
                description: 채널별 객실 설정 응답. 저장된 필드만 담기고, 설정하지 않은 필드는 생략된다.
        "400":
          description: Bad Request
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Invalid Parameter.
                required:
                  - message
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Unauthorized
                required:
                  - message
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Forbidden
                required:
                  - message
        "404":
          description: Not Found
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Not Found
                required:
                  - message
        "500":
          description: Internal Server Error
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Internal Server Error
                required:
                  - message
  /gds/vendor/properties/{vendor_property_id}/channels/{channel_id}/mappings:
    get:
      operationId: get-property-mapping
      tags:
        - channel-mapping
      security:
        - Authorization: []
      summary: 숙소 매핑 조회
      description: |-
        - 숙소와 채널 사이의 매핑 상태를 조회합니다.
        - 응답의 `channel_property_id`에 값이 있으면 채널 측 숙소와 연결된 상태입니다. 채널 오픈이 끝났는지 판단하는 기준으로 사용합니다.
        - 매핑은 직연동 채널에서만 사용합니다. 플러스 채널은 ONDA가 매핑을 관리하므로 대상이 아닙니다.
      parameters:
        - schema:
            type: string
            description: 채널 아이디
            example: "1"
          required: true
          description: 채널 아이디
          name: channel_id
          in: path
        - schema:
            type: string
            description: 공급사 숙소 아이디
            example: VP-001
          required: true
          description: 공급사 숙소 아이디
          name: vendor_property_id
          in: path
      responses:
        "200":
          description: 숙소 매핑 조회 성공
          content:
            application/json:
              schema:
                type: object
                properties:
                  vendor_property_id:
                    type: string
                    description: 공급사 숙소 아이디
                    example: VP-001
                  channel_id:
                    type: string
                    description: 채널 아이디
                    example: "1"
                  channel_name:
                    type: string
                    description: 채널 이름
                    example: Booking.com
                  channel_property_id:
                    type: string
                    description: 채널 숙소 아이디
                    example: CP-001
                  status:
                    type: string
                    description: 숙소 매핑 상태
                    example: enabled
                  roomtype_mappings:
                    type: array
                    items:
                      type: object
                      properties:
                        vendor_roomtype_id:
                          type: string
                          description: 공급사 객실 아이디
                          example: VRT-001
                        channel_roomtype_id:
                          type:
                            - string
                            - "null"
                          description: 채널 객실 아이디. CMS 채널 응답에만 포함된다.
                          example: CRT-001
                        status:
                          type: string
                          description: 매핑 상태
                          example: enabled
                      required:
                        - vendor_roomtype_id
                        - status
                  rateplan_mappings:
                    type: array
                    items:
                      type: object
                      properties:
                        vendor_rateplan_id:
                          type: string
                          description: 공급사 요금제 아이디
                          example: VRP-001
                        vendor_roomtype_id:
                          type: string
                          description: 공급사 객실 아이디
                          example: VRT-001
                        channel_rateplan_id:
                          type:
                            - string
                            - "null"
                          description: 채널 요금제 아이디. CMS 채널 응답에만 포함된다.
                          example: CRP-001
                        status:
                          type: string
                          description: 매핑 상태
                          example: enabled
                      required:
                        - vendor_rateplan_id
                        - vendor_roomtype_id
                        - status
                required:
                  - vendor_property_id
                  - channel_id
                  - channel_name
                  - status
                  - roomtype_mappings
                  - rateplan_mappings
        "400":
          description: Bad Request
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Invalid Parameter.
                required:
                  - message
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Unauthorized
                required:
                  - message
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Forbidden
                required:
                  - message
        "404":
          description: Not Found
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Not Found
                required:
                  - message
        "500":
          description: Internal Server Error
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Internal Server Error
                required:
                  - message
    patch:
      operationId: update-property-mapping
      tags:
        - channel-mapping
      security:
        - Authorization: []
      summary: 숙소 매핑 수정
      description: |-
        - 숙소와 채널 사이의 매핑을 수정합니다.
        - `channel_property_id`에 채널 측 숙소 ID를 넣어 연결하고, `status`로 매핑을 켜고 끕니다.
        - `null`을 보내면 매핑이 초기화되고, 생략하면 기존 값이 유지됩니다. 매핑 삭제용 `DELETE`가 따로 없으므로 판매를 중지할 때도 `null`을 사용합니다.
        - 직연동 채널에서만 수정할 수 있습니다.
      parameters:
        - schema:
            type: string
            description: 채널 아이디
            example: "1"
          required: true
          description: 채널 아이디
          name: channel_id
          in: path
        - schema:
            type: string
            description: 공급사 숙소 아이디
            example: VP-001
          required: true
          description: 공급사 숙소 아이디
          name: vendor_property_id
          in: path
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                channel_property_id:
                  type:
                    - string
                    - "null"
                  minLength: 1
                  description: 채널 숙소 아이디. CMS 채널만 수정할 수 있다. null 을 보내면 초기화되고 생략하면 기존 값이 유지된다.
                  example: CP-001
                status:
                  type: string
                  enum:
                    - enabled
                    - disabled
                  description: 매핑 상태
                  example: enabled
              additionalProperties: false
      responses:
        "200":
          description: 숙소 매핑 수정 성공
          content:
            application/json:
              schema:
                type: object
                properties:
                  vendor_property_id:
                    type: string
                    description: 공급사 숙소 아이디
                    example: VP-001
                  channel_id:
                    type: string
                    description: 채널 아이디
                    example: "1"
                  channel_name:
                    type: string
                    description: 채널 이름
                    example: Booking.com
                  channel_property_id:
                    type: string
                    description: 채널 숙소 아이디
                    example: CP-001
                  status:
                    type: string
                    description: 숙소 매핑 상태
                    example: enabled
                  roomtype_mappings:
                    type: array
                    items:
                      type: object
                      properties:
                        vendor_roomtype_id:
                          type: string
                          description: 공급사 객실 아이디
                          example: VRT-001
                        channel_roomtype_id:
                          type:
                            - string
                            - "null"
                          description: 채널 객실 아이디. CMS 채널 응답에만 포함된다.
                          example: CRT-001
                        status:
                          type: string
                          description: 매핑 상태
                          example: enabled
                      required:
                        - vendor_roomtype_id
                        - status
                  rateplan_mappings:
                    type: array
                    items:
                      type: object
                      properties:
                        vendor_rateplan_id:
                          type: string
                          description: 공급사 요금제 아이디
                          example: VRP-001
                        vendor_roomtype_id:
                          type: string
                          description: 공급사 객실 아이디
                          example: VRT-001
                        channel_rateplan_id:
                          type:
                            - string
                            - "null"
                          description: 채널 요금제 아이디. CMS 채널 응답에만 포함된다.
                          example: CRP-001
                        status:
                          type: string
                          description: 매핑 상태
                          example: enabled
                      required:
                        - vendor_rateplan_id
                        - vendor_roomtype_id
                        - status
                required:
                  - vendor_property_id
                  - channel_id
                  - channel_name
                  - status
                  - roomtype_mappings
                  - rateplan_mappings
        "400":
          description: Bad Request
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Invalid Parameter.
                required:
                  - message
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Unauthorized
                required:
                  - message
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Forbidden
                required:
                  - message
        "404":
          description: Not Found
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Not Found
                required:
                  - message
        "500":
          description: Internal Server Error
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Internal Server Error
                required:
                  - message
  /gds/vendor/properties/{vendor_property_id}/roomtypes/{vendor_roomtype_id}/channels/{channel_id}/mappings:
    get:
      operationId: get-roomtype-mapping
      tags:
        - channel-mapping
      security:
        - Authorization: []
      summary: 객실 매핑 조회
      description: |-
        - 객실타입과 채널 객실 사이의 매핑 상태를 조회합니다.
        - 숙소 매핑이 끝난 뒤에 의미가 있습니다. 숙소가 연결되지 않은 상태에서는 객실 매핑을 만들 수 없습니다.
        - 매핑은 직연동 채널에서만 사용합니다.
      parameters:
        - schema:
            type: string
            description: 채널 아이디
            example: "1"
          required: true
          description: 채널 아이디
          name: channel_id
          in: path
        - schema:
            type: string
            description: 공급사 숙소 아이디
            example: VP-001
          required: true
          description: 공급사 숙소 아이디
          name: vendor_property_id
          in: path
        - schema:
            type: string
            description: 공급사 객실 아이디
            example: VRT-001
          required: true
          description: 공급사 객실 아이디
          name: vendor_roomtype_id
          in: path
      responses:
        "200":
          description: 객실 매핑 조회 성공
          content:
            application/json:
              schema:
                type: object
                properties:
                  vendor_roomtype_id:
                    type: string
                    description: 공급사 객실 아이디
                    example: VRT-001
                  channel_roomtype_id:
                    type:
                      - string
                      - "null"
                    description: 채널 객실 아이디. CMS 채널 응답에만 포함된다.
                    example: CRT-001
                  status:
                    type: string
                    description: 매핑 상태
                    example: enabled
                  rateplan_mappings:
                    type: array
                    items:
                      type: object
                      properties:
                        vendor_rateplan_id:
                          type: string
                          description: 공급사 요금제 아이디
                          example: VRP-001
                        vendor_roomtype_id:
                          type: string
                          description: 공급사 객실 아이디
                          example: VRT-001
                        channel_rateplan_id:
                          type:
                            - string
                            - "null"
                          description: 채널 요금제 아이디. CMS 채널 응답에만 포함된다.
                          example: CRP-001
                        status:
                          type: string
                          description: 매핑 상태
                          example: enabled
                      required:
                        - vendor_rateplan_id
                        - vendor_roomtype_id
                        - status
                required:
                  - vendor_roomtype_id
                  - status
                  - rateplan_mappings
        "400":
          description: Bad Request
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Invalid Parameter.
                required:
                  - message
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Unauthorized
                required:
                  - message
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Forbidden
                required:
                  - message
        "404":
          description: Not Found
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Not Found
                required:
                  - message
        "500":
          description: Internal Server Error
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Internal Server Error
                required:
                  - message
    patch:
      operationId: update-roomtype-mapping
      tags:
        - channel-mapping
      security:
        - Authorization: []
      summary: 객실 매핑 수정
      description: |-
        - 객실타입과 채널 객실 사이의 매핑을 수정합니다.
        - `channel_roomtype_id`에 채널 측 객실 ID를 넣어 연결하고, `status`로 매핑을 켜고 끕니다.
        - `null`을 보내면 매핑이 초기화되고, 생략하면 기존 값이 유지됩니다.
        - 숙소 매핑을 먼저 끝내야 하며, 직연동 채널에서만 수정할 수 있습니다.
      parameters:
        - schema:
            type: string
            description: 채널 아이디
            example: "1"
          required: true
          description: 채널 아이디
          name: channel_id
          in: path
        - schema:
            type: string
            description: 공급사 숙소 아이디
            example: VP-001
          required: true
          description: 공급사 숙소 아이디
          name: vendor_property_id
          in: path
        - schema:
            type: string
            description: 공급사 객실 아이디
            example: VRT-001
          required: true
          description: 공급사 객실 아이디
          name: vendor_roomtype_id
          in: path
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                channel_roomtype_id:
                  type:
                    - string
                    - "null"
                  minLength: 1
                  description: 채널 객실 아이디. CMS 채널만 수정할 수 있다. null 을 보내면 초기화되고 생략하면 기존 값이 유지된다.
                  example: CRT-001
                status:
                  type: string
                  enum:
                    - enabled
                    - disabled
                  description: 매핑 상태
                  example: enabled
              additionalProperties: false
      responses:
        "200":
          description: 객실 매핑 수정 성공
          content:
            application/json:
              schema:
                type: object
                properties:
                  vendor_roomtype_id:
                    type: string
                    description: 공급사 객실 아이디
                    example: VRT-001
                  channel_roomtype_id:
                    type:
                      - string
                      - "null"
                    description: 채널 객실 아이디. CMS 채널 응답에만 포함된다.
                    example: CRT-001
                  status:
                    type: string
                    description: 매핑 상태
                    example: enabled
                  rateplan_mappings:
                    type: array
                    items:
                      type: object
                      properties:
                        vendor_rateplan_id:
                          type: string
                          description: 공급사 요금제 아이디
                          example: VRP-001
                        vendor_roomtype_id:
                          type: string
                          description: 공급사 객실 아이디
                          example: VRT-001
                        channel_rateplan_id:
                          type:
                            - string
                            - "null"
                          description: 채널 요금제 아이디. CMS 채널 응답에만 포함된다.
                          example: CRP-001
                        status:
                          type: string
                          description: 매핑 상태
                          example: enabled
                      required:
                        - vendor_rateplan_id
                        - vendor_roomtype_id
                        - status
                required:
                  - vendor_roomtype_id
                  - status
                  - rateplan_mappings
        "400":
          description: Bad Request
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Invalid Parameter.
                required:
                  - message
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Unauthorized
                required:
                  - message
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Forbidden
                required:
                  - message
        "404":
          description: Not Found
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Not Found
                required:
                  - message
        "500":
          description: Internal Server Error
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Internal Server Error
                required:
                  - message
  /gds/vendor/properties/{vendor_property_id}/roomtypes/{vendor_roomtype_id}/rateplans/{vendor_rateplan_id}/channels/{channel_id}/mappings:
    get:
      operationId: get-rateplan-mapping
      tags:
        - channel-mapping
      security:
        - Authorization: []
      summary: 요금제 매핑 조회
      description: |-
        - 요금제와 채널 요금제 사이의 매핑 상태를 조회합니다.
        - 숙소·객실 매핑이 끝난 뒤에 의미가 있습니다. 매핑은 숙소에서 객실, 요금제 순으로 이어집니다.
        - 매핑은 직연동 채널에서만 사용합니다.
      parameters:
        - schema:
            type: string
            description: 채널 아이디
            example: "1"
          required: true
          description: 채널 아이디
          name: channel_id
          in: path
        - schema:
            type: string
            description: 공급사 숙소 아이디
            example: VP-001
          required: true
          description: 공급사 숙소 아이디
          name: vendor_property_id
          in: path
        - schema:
            type: string
            description: 공급사 객실 아이디
            example: VRT-001
          required: true
          description: 공급사 객실 아이디
          name: vendor_roomtype_id
          in: path
        - schema:
            type: string
            description: 공급사 요금제 아이디
            example: VRP-001
          required: true
          description: 공급사 요금제 아이디
          name: vendor_rateplan_id
          in: path
      responses:
        "200":
          description: 요금제 매핑 조회 성공
          content:
            application/json:
              schema:
                type: object
                properties:
                  vendor_rateplan_id:
                    type: string
                    description: 공급사 요금제 아이디
                    example: VRP-001
                  vendor_roomtype_id:
                    type: string
                    description: 공급사 객실 아이디
                    example: VRT-001
                  channel_rateplan_id:
                    type:
                      - string
                      - "null"
                    description: 채널 요금제 아이디. CMS 채널 응답에만 포함된다.
                    example: CRP-001
                  status:
                    type: string
                    description: 매핑 상태
                    example: enabled
                required:
                  - vendor_rateplan_id
                  - vendor_roomtype_id
                  - status
        "400":
          description: Bad Request
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Invalid Parameter.
                required:
                  - message
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Unauthorized
                required:
                  - message
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Forbidden
                required:
                  - message
        "404":
          description: Not Found
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Not Found
                required:
                  - message
        "500":
          description: Internal Server Error
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Internal Server Error
                required:
                  - message
    patch:
      operationId: update-rateplan-mapping
      tags:
        - channel-mapping
      security:
        - Authorization: []
      summary: 요금제 매핑 수정
      description: |-
        - 요금제와 채널 요금제 사이의 매핑을 수정합니다.
        - `channel_rateplan_id`에 채널 측 요금제 ID를 넣어 연결하고, `status`로 매핑을 켜고 끕니다.
        - `null`을 보내면 매핑이 초기화되고, 생략하면 기존 값이 유지됩니다.
        - 요금제 개념이 없는 채널에서는 `0`으로 매핑합니다.
        - 숙소·객실 매핑을 먼저 끝내야 하며, 직연동 채널에서만 수정할 수 있습니다.
      parameters:
        - schema:
            type: string
            description: 채널 아이디
            example: "1"
          required: true
          description: 채널 아이디
          name: channel_id
          in: path
        - schema:
            type: string
            description: 공급사 숙소 아이디
            example: VP-001
          required: true
          description: 공급사 숙소 아이디
          name: vendor_property_id
          in: path
        - schema:
            type: string
            description: 공급사 객실 아이디
            example: VRT-001
          required: true
          description: 공급사 객실 아이디
          name: vendor_roomtype_id
          in: path
        - schema:
            type: string
            description: 공급사 요금제 아이디
            example: VRP-001
          required: true
          description: 공급사 요금제 아이디
          name: vendor_rateplan_id
          in: path
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                channel_rateplan_id:
                  type:
                    - string
                    - "null"
                  minLength: 1
                  description: 채널 요금제 아이디. CMS 채널만 수정할 수 있다. null 을 보내면 초기화되고 생략하면 기존 값이 유지된다.
                  example: CRP-001
                status:
                  type: string
                  enum:
                    - enabled
                    - disabled
                  description: 매핑 상태
                  example: enabled
              additionalProperties: false
      responses:
        "200":
          description: 요금제 매핑 수정 성공
          content:
            application/json:
              schema:
                type: object
                properties:
                  vendor_rateplan_id:
                    type: string
                    description: 공급사 요금제 아이디
                    example: VRP-001
                  vendor_roomtype_id:
                    type: string
                    description: 공급사 객실 아이디
                    example: VRT-001
                  channel_rateplan_id:
                    type:
                      - string
                      - "null"
                    description: 채널 요금제 아이디. CMS 채널 응답에만 포함된다.
                    example: CRP-001
                  status:
                    type: string
                    description: 매핑 상태
                    example: enabled
                required:
                  - vendor_rateplan_id
                  - vendor_roomtype_id
                  - status
        "400":
          description: Bad Request
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Invalid Parameter.
                required:
                  - message
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Unauthorized
                required:
                  - message
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Forbidden
                required:
                  - message
        "404":
          description: Not Found
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Not Found
                required:
                  - message
        "500":
          description: Internal Server Error
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Internal Server Error
                required:
                  - message
  /gds/vendor/channels/{channel_id}/authorization:
    get:
      operationId: get-channel-authorization-url
      tags:
        - channel
      security:
        - Authorization: []
      summary: 채널 인증 URL 조회
      description: |-
        - **에어비앤비 전용입니다.** 채널 메타의 `requires_cms_authorization`이 `true`인 채널에서만 사용하며, 현재 해당하는 채널은 에어비앤비뿐입니다. 다른 채널에 호출하면 `403`이 반환됩니다.
        - 에어비앤비는 숙소마다 호스트 계정의 OAuth 승인이 필요합니다. 이 API로 인증 URL을 발급받아 호스트를 이동시키고, 승인이 끝나야 객실·요금제 매핑을 진행할 수 있습니다.
        - 호스트가 인증을 마치면 `redirect_url`로 `?auth_result=success|fail`이 붙어 복귀합니다.
        - `auth_result`는 화면 힌트이며, 연동 완료 판정은 숙소 매핑 조회의 `channel_property_id` 존재 여부를 기준으로 합니다.
        - 발급된 인증 URL은 1시간 내에 사용해야 하며, 만료되면 새로 발급해야 합니다. 호스트가 버튼을 누르는 시점에 발급하세요.
        - 인증은 숙소 단위로 진행되므로, 같은 호스트 계정이 여러 숙소를 운영해도 숙소마다 반복해야 합니다.
      parameters:
        - schema:
            type: string
            description: 채널 아이디
            example: "1"
          required: true
          description: 채널 아이디
          name: channel_id
          in: path
        - schema:
            type: string
            description: 공급사 숙소 아이디
            example: VP-001
          required: true
          description: 공급사 숙소 아이디
          name: vendor_property_id
          in: query
        - schema:
            type: string
            format: uri
            description: 인증 완료 후 복귀할 리다이렉트 URL. 복귀 시 `?auth_result=success|fail` 쿼리가 덧붙고, 기존
              쿼리는 보존된다.
            example: https://vendor.example.com/callback
          required: true
          description: 인증 완료 후 복귀할 리다이렉트 URL. 복귀 시 `?auth_result=success|fail` 쿼리가 덧붙고, 기존
            쿼리는 보존된다.
          name: redirect_url
          in: query
      responses:
        "200":
          description: 채널 인증 URL 조회 성공
          content:
            application/json:
              schema:
                type: object
                properties:
                  url:
                    type: string
                    description: 채널 인증 URL
                    example: https://channel.example.com/oauth/authorize?state=abc
                required:
                  - url
        "400":
          description: Bad Request
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Invalid Parameter.
                required:
                  - message
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Unauthorized
                required:
                  - message
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Forbidden
                required:
                  - message
        "404":
          description: Not Found
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Not Found
                required:
                  - message
        "500":
          description: Internal Server Error
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Internal Server Error
                required:
                  - message
  /gds/vendor/properties/{vendor_property_id}/channels:
    get:
      operationId: list-property-channel-requests
      tags:
        - channel-open
      security:
        - Authorization: []
      summary: 숙소별 채널 신청 목록
      description: 현재 공급사 화이트리스트나 채널 상태와 무관하게 숙소에서 실제 신청 이력이 있는 채널과 각 채널의 최신 신청 상태를 조회합니다.
      parameters:
        - schema:
            type: string
            description: 공급사 숙소 아이디
            example: VP-001
          required: true
          description: 공급사 숙소 아이디
          name: vendor_property_id
          in: path
      responses:
        "200":
          description: 신청 이력이 없으면 빈 배열을 반환하는 채널 신청 현황 목록입니다.
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  properties:
                    channel_id:
                      type: number
                      description: 채널 ID
                      example: 1
                    channel_name:
                      type: string
                      description: 채널명
                      example: 온다
                    processing_mode:
                      type: string
                      enum:
                        - auto_approve
                        - external_review
                      description: 처리 방식. auto_approve 채널은 신청 즉시 활성화되고, external_review 채널은 운영자 승인을
                        거친다.
                      example: auto_approve
                    description:
                      type: string
                      description: 채널 설명
                      example: 온다 자체 판매 채널
                    request_type:
                      type: string
                      enum:
                        - on
                        - off
                      description: 최신 신청 타입
                      example: on
                    request_status:
                      type: string
                      enum:
                        - pending
                        - confirm
                        - reject
                      description: 최신 신청 상태
                      example: confirm
                  required:
                    - channel_id
                    - channel_name
                    - processing_mode
                    - request_type
                    - request_status
        "400":
          description: Bad Request
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Invalid Parameter.
                required:
                  - message
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Unauthorized
                required:
                  - message
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Forbidden
                required:
                  - message
        "404":
          description: Not Found
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Not Found
                required:
                  - message
        "500":
          description: Internal Server Error
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Internal Server Error
                required:
                  - message
  /gds/vendor/properties/{vendor_property_id}/channels/{channel_id}:
    post:
      operationId: create-property-channel-request
      tags:
        - channel-open
      security:
        - Authorization: []
      summary: 숙소별 채널 신청
      description: |-
        - 해당 채널에 판매 시작(ON) 또는 종료(OFF) 신청을 생성합니다.
        - ON 신청 시 공통 사전 검증을 수행하며, 조건 미충족 시 즉시 reject 처리됩니다.
        - 단 CMS 연동 채널은 숙소 이미지, 숙소 카테고리, 객실 이미지 조건을 검사하지 않습니다.
        - OFF 요청은 모든 채널에서 즉시 자동 승인 처리됩니다.
      parameters:
        - schema:
            type: string
            description: 공급사 숙소 아이디
            example: VP-001
          required: true
          description: 공급사 숙소 아이디
          name: vendor_property_id
          in: path
        - schema:
            type: string
            description: 채널 아이디
            example: "2"
          required: true
          description: 채널 아이디
          name: channel_id
          in: path
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                request_type:
                  type: string
                  enum:
                    - on
                    - off
                  description: 신청 타입. on 은 오픈 신청, off 는 종료 요청이다.
                  example: on
                channel_property_id:
                  type: string
                  minLength: 1
                  maxLength: 128
                  description: 채널 쪽 숙소 ID (선택). on 신청에만 허용되고 off 에 보내면 400 으로 거부된다. 같은 채널에서 다른 숙소가
                    이미 쓰는 ID 면 409 로 거부된다. 제출하면 신청 시점에 숙소 매핑에 반영된다.
                  example: CP-001
                note:
                  type: string
                  maxLength: 16000
                  description: 신청자(공급사)가 남기는 비고 (선택, 최대 16,000자). on 과 off 신청 모두 허용된다. 운영자가 확인할 전달
                    사항을 적는다.
                  example: 채널 담당자와 협의된 오픈 요청입니다.
              required:
                - request_type
      responses:
        "200":
          description: 신청 처리 결과
          content:
            application/json:
              schema:
                type: object
                properties:
                  channel_id:
                    type: number
                    description: 채널 ID
                    example: 1
                  channel_name:
                    type: string
                    description: 채널명
                    example: 온다
                  request_type:
                    type: string
                    enum:
                      - on
                      - off
                    description: 신청 타입
                    example: on
                  request_status:
                    type: string
                    enum:
                      - pending
                      - confirm
                      - reject
                    description: 신청 상태
                    example: pending
                  channel_property_id:
                    type:
                      - string
                      - "null"
                    description: 신청 시 제출한 채널 숙소 ID. 제출하지 않았으면 null 이다.
                    example: CP-001
                  note:
                    type:
                      - string
                      - "null"
                    description: 신청자(공급사) 비고. 제출하지 않았으면 null 이다. 처리자(운영자/시스템) 사유는 reason 으로 따로 내려간다.
                    example: null
                  reason:
                    type:
                      - string
                      - "null"
                    description: 처리자(운영자/시스템)가 남긴 사유. 주로 reject 처리 시 채워진다.
                    example: null
                  created_at:
                    type: string
                    description: 신청일시 (ISO 8601)
                    example: 2026-04-07T10:00:00+09:00
                  updated_at:
                    type: string
                    description: 수정일시 (ISO 8601)
                    example: 2026-04-07T10:00:00+09:00
                required:
                  - channel_id
                  - channel_name
                  - request_type
                  - request_status
                  - channel_property_id
                  - note
                  - reason
                  - created_at
                  - updated_at
        "400":
          description: Bad Request
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Invalid Parameter.
                required:
                  - message
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Unauthorized
                required:
                  - message
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Forbidden
                required:
                  - message
        "404":
          description: Not Found
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Not Found
                required:
                  - message
        "409":
          description: Conflict
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: 이미 처리 중인 신청이 있습니다.
                required:
                  - message
        "500":
          description: Internal Server Error
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Internal Server Error
                required:
                  - message
    get:
      operationId: get-property-channel-request
      tags:
        - channel-open
      security:
        - Authorization: []
      summary: 숙소별 채널 상세
      description: 현재 공급사 화이트리스트나 채널 상태와 무관하게 해당 채널의 최신 신청 상태와 신청 이력을 최신순 최대 100건 조회합니다.
      parameters:
        - schema:
            type: string
            description: 공급사 숙소 아이디
            example: VP-001
          required: true
          description: 공급사 숙소 아이디
          name: vendor_property_id
          in: path
        - schema:
            type: string
            description: 채널 아이디
            example: "2"
          required: true
          description: 채널 아이디
          name: channel_id
          in: path
      responses:
        "200":
          description: 채널 신청 상태
          content:
            application/json:
              schema:
                type: object
                properties:
                  channel_id:
                    type: number
                    description: 채널 ID
                    example: 1
                  channel_name:
                    type: string
                    description: 채널명
                    example: 온다
                  request_type:
                    type: string
                    enum:
                      - on
                      - off
                    description: 신청 타입
                    example: on
                  request_status:
                    type: string
                    enum:
                      - pending
                      - confirm
                      - reject
                    description: 신청 상태
                    example: pending
                  channel_property_id:
                    type:
                      - string
                      - "null"
                    description: 신청 시 제출한 채널 숙소 ID. 제출하지 않았으면 null 이다.
                    example: CP-001
                  note:
                    type:
                      - string
                      - "null"
                    description: 신청자(공급사) 비고. 제출하지 않았으면 null 이다. 처리자(운영자/시스템) 사유는 reason 으로 따로 내려간다.
                    example: null
                  reason:
                    type:
                      - string
                      - "null"
                    description: 처리자(운영자/시스템)가 남긴 사유. 주로 reject 처리 시 채워진다.
                    example: null
                  created_at:
                    type: string
                    description: 신청일시 (ISO 8601)
                    example: 2026-04-07T10:00:00+09:00
                  updated_at:
                    type: string
                    description: 수정일시 (ISO 8601)
                    example: 2026-04-07T10:00:00+09:00
                  histories:
                    type: array
                    items:
                      type: object
                      properties:
                        request_type:
                          type: string
                          enum:
                            - on
                            - off
                          description: 신청 타입
                          example: on
                        request_status:
                          type: string
                          enum:
                            - pending
                            - confirm
                            - reject
                          description: 처리 상태
                          example: confirm
                        channel_property_id:
                          type:
                            - string
                            - "null"
                          description: 그 신청 당시 제출한 채널 숙소 ID. 제출하지 않았으면 null 이다.
                          example: CP-001
                        note:
                          type:
                            - string
                            - "null"
                          description: 그 신청 당시 제출한 신청자(공급사) 비고. 제출하지 않았으면 null 이다.
                          example: null
                        reason:
                          type:
                            - string
                            - "null"
                          description: 처리자(운영자/시스템)가 남긴 사유
                          example: null
                        processed_at:
                          type:
                            - string
                            - "null"
                          description: 처리일시 (ISO 8601)
                          example: 2026-04-07T10:00:00+09:00
                        created_at:
                          type: string
                          description: 생성일시 (ISO 8601)
                          example: 2026-04-07T10:00:00+09:00
                      required:
                        - request_type
                        - request_status
                        - channel_property_id
                        - note
                        - reason
                        - processed_at
                        - created_at
                    description: 신청 이력. 최신순으로 최대 100건까지 담긴다.
                required:
                  - channel_id
                  - channel_name
                  - request_type
                  - request_status
                  - channel_property_id
                  - note
                  - reason
                  - created_at
                  - updated_at
                  - histories
        "400":
          description: Bad Request
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Invalid Parameter.
                required:
                  - message
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Unauthorized
                required:
                  - message
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Forbidden
                required:
                  - message
        "404":
          description: Not Found
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Not Found
                required:
                  - message
        "500":
          description: Internal Server Error
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: 에러 메시지
                    example: Internal Server Error
                required:
                  - message
  /properties/{vendor_property_id}/roomtypes/{vendor_roomtype_id}/rateplans/{vendor_rateplan_id}/refund_policy:
    get:
      operationId: webhook-get-refund-policy
      servers:
        - url: "{vendor_base_url}"
          description: 공급사가 제공하는 수신 서버
          variables:
            vendor_base_url:
              default: https://vendor.example.com
              description: 공급사 서버의 베이스 URL
      tags:
        - webhook-ari
      summary: 취소/환불 정책 조회
      description: |-
        - 이 엔드포인트는 공급사가 구현하고 ONDA가 호출합니다.
        - ONDA에서 공급사 취소/환불 정책을 조회합니다.
      parameters:
        - schema:
            type: string
            description: 공급사 숙소 아이디
            example: VP-001
          required: true
          description: 공급사 숙소 아이디
          name: vendor_property_id
          in: path
        - schema:
            type: string
            description: 공급사 객실 아이디
            example: VRT-001
          required: true
          description: 공급사 객실 아이디
          name: vendor_roomtype_id
          in: path
        - schema:
            type: string
            description: 공급사 요금제 아이디
            example: VRP-001
          required: true
          description: 공급사 요금제 아이디
          name: vendor_rateplan_id
          in: path
        - schema:
            type: string
            description: 체크인 일시
            example: 2026-01-20
          required: true
          description: 체크인 일시
          name: checkin
          in: query
        - schema:
            type: string
            description: 체크아웃 일시
            example: 2026-01-21
          required: true
          description: 체크아웃 일시
          name: checkout
          in: query
      responses:
        "200":
          description: 취소/환불 정책 조회 성공
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                    description: 에러 메시지
                    example: ""
                  checkin:
                    type: string
                    format: date-time
                    description: 체크인 일시 (ISO8601)
                    example: 2026-01-20T00:00:00+09:00
                  checkout:
                    type: string
                    format: date-time
                    description: 체크아웃 일시 (ISO8601)
                    example: 2026-01-21T00:00:00+09:00
                  refunds:
                    type: array
                    items:
                      type: object
                      properties:
                        type:
                          type: string
                          enum:
                            - refund
                          description: 환불 타입
                          example: refund
                        until:
                          type: string
                          format: date-time
                          description: 환불 가능 시한 (ISO8601, 오프셋 포함)
                          example: 2026-01-19T23:59:59+09:00
                        percent:
                          type: number
                          description: 환불 비율(%)
                          example: 100
                        amount:
                          type: number
                          description: 환불 금액
                          example: 100000
                      required:
                        - type
                        - until
                        - percent
                        - amount
                    description: 환불 정책 목록
                required:
                  - error
                  - checkin
                  - checkout
                  - refunds
        "400":
          description: Validation Error
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: string
                    enum:
                      - "1000"
                      - "2000"
                      - "3000"
                      - "4000"
                      - "4001"
                      - "4002"
                      - "4003"
                      - "4004"
                      - "4005"
                      - "4006"
                      - "4007"
                      - "9999"
                    description: 에러 코드
                    example: "3000"
                  error:
                    type: string
                    enum:
                      - An error occurred during system processing
                      - Access denied
                      - Please check your input information
                      - No rooms available for booking
                      - Requested amount differs from actual amount
                      - Minimum guest requirement not met
                      - Maximum guest capacity exceeded
                      - Reservation not found
                      - Reservation already cancelled
                      - Reservation cannot be cancelled
                      - Reservation cannot be confirmed
                      - An unknown error occurred
                    description: 에러 메시지
                    example: Please check your input information
                required:
                  - code
                  - error
        "403":
          description: Access Denied
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: string
                    enum:
                      - "1000"
                      - "2000"
                      - "3000"
                      - "4000"
                      - "4001"
                      - "4002"
                      - "4003"
                      - "4004"
                      - "4005"
                      - "4006"
                      - "4007"
                      - "9999"
                    description: 에러 코드
                    example: "3000"
                  error:
                    type: string
                    enum:
                      - An error occurred during system processing
                      - Access denied
                      - Please check your input information
                      - No rooms available for booking
                      - Requested amount differs from actual amount
                      - Minimum guest requirement not met
                      - Maximum guest capacity exceeded
                      - Reservation not found
                      - Reservation already cancelled
                      - Reservation cannot be cancelled
                      - Reservation cannot be confirmed
                      - An unknown error occurred
                    description: 에러 메시지
                    example: Please check your input information
                required:
                  - code
                  - error
        "500":
          description: System Error
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: string
                    enum:
                      - "1000"
                      - "2000"
                      - "3000"
                      - "4000"
                      - "4001"
                      - "4002"
                      - "4003"
                      - "4004"
                      - "4005"
                      - "4006"
                      - "4007"
                      - "9999"
                    description: 에러 코드
                    example: "3000"
                  error:
                    type: string
                    enum:
                      - An error occurred during system processing
                      - Access denied
                      - Please check your input information
                      - No rooms available for booking
                      - Requested amount differs from actual amount
                      - Minimum guest requirement not met
                      - Maximum guest capacity exceeded
                      - Reservation not found
                      - Reservation already cancelled
                      - Reservation cannot be cancelled
                      - Reservation cannot be confirmed
                      - An unknown error occurred
                    description: 에러 메시지
                    example: Please check your input information
                required:
                  - code
                  - error
  /bookings:
    post:
      operationId: webhook-create-booking
      servers:
        - url: "{vendor_base_url}"
          description: 공급사가 제공하는 수신 서버
          variables:
            vendor_base_url:
              default: https://vendor.example.com
              description: 공급사 서버의 베이스 URL
      tags:
        - webhook-reservation
      summary: 예약 생성
      description: |-
        - 이 엔드포인트는 공급사가 구현하고 ONDA가 호출합니다.
        - ONDA에서 공급사 예약 생성을 요청합니다.
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                channel_id:
                  type: string
                  description: 판매사 아이디
                  example: NAVER
                channel_name:
                  type: string
                  description: 판매사 이름
                  example: 네이버
                channel_booking_number:
                  type: string
                  description: 판매사 예약 번호
                  example: CH-001
                gds_booking_number:
                  type: string
                  description: ONDA Hub 예약 번호
                  example: GDS-001
                gds_sub_booking_number:
                  type: string
                  description: ONDA Hub 서브 예약 번호
                  example: GDS-001-1
                property_id:
                  type: string
                  description: 공급사 숙소 아이디
                  example: VP-001
                roomtype_id:
                  type: string
                  description: 공급사 객실 아이디
                  example: VRT-001
                rateplan_id:
                  type: string
                  description: 공급사 요금제 아이디
                  example: VRP-001
                checkin:
                  type: string
                  format: date-time
                  description: 체크인 일시 (ISO8601)
                  example: 2026-01-20T15:00:00+09:00
                checkout:
                  type: string
                  format: date-time
                  description: 체크아웃 일시 (ISO8601)
                  example: 2026-01-21T11:00:00+09:00
                currency:
                  type: string
                  description: 통화
                  example: KRW
                total_amount:
                  type: string
                  description: 총 투숙 금액
                  example: "100000"
                guest:
                  type: object
                  properties:
                    name:
                      type: string
                      description: 투숙객 이름
                      example: 홍길동
                    adults:
                      type: number
                      description: 성인 수
                      example: 2
                    children:
                      type: number
                      description: 아동 수
                      example: 0
                    infants:
                      type: number
                      description: 유아 수
                      example: 0
                    pets:
                      type: number
                      description: 반려동물 수
                      example: 0
                    cars:
                      type: number
                      description: 차량 수
                      example: 1
                  required:
                    - name
                    - adults
                    - children
                    - infants
                booker:
                  type: object
                  properties:
                    name:
                      type: string
                      description: 예약자 이름
                      example: 김예약
                    email:
                      type: string
                      description: 예약자 이메일
                      example: booker@example.com
                    phone:
                      type: string
                      description: 예약자 연락처
                      example: 010-1234-5678
                  required:
                    - name
                    - email
                    - phone
                special_comment:
                  type: string
                  description: 고객 요청 사항
                  example: 고층 배정 요청
                type:
                  type: string
                  enum:
                    - dayuse
                    - overnight
                  description: 대실/숙박 구분 (대실=dayuse, 숙박=overnight)
                  example: overnight
                payment_type:
                  type: string
                  enum:
                    - prepayment
                    - postpayment
                  description: 결제 방식 (선결제=prepayment, 후결제=postpayment). postpayment면 total_amount를
                    현장 수납한다.
                  example: prepayment
                net_price:
                  type: number
                  description: 입금 금액 (공급사 정산 예정액)
                  example: 90000
                reserved_at:
                  type: string
                  format: date-time
                  description: 예약 일시 (ISO8601, 오프셋 포함)
                  example: 2026-01-19T10:00:00+09:00
                visit_type:
                  type: string
                  enum:
                    - walk
                    - car
                  description: 방문수단 (도보=walk, 차량=car). 채널이 값을 준 예약만 실리고 미수신 시 생략
                  example: car
                secondary_channel:
                  type: string
                  description: 2차 판매 채널 (채널이 타 브랜드/OTA로 재판매한 예약의 최종 판매 브랜드). 채널이 값을 준 예약만 실리고 미수신
                    시 생략
                  example: Expedia Affiliate Network
              required:
                - channel_id
                - channel_name
                - channel_booking_number
                - gds_booking_number
                - gds_sub_booking_number
                - property_id
                - roomtype_id
                - rateplan_id
                - checkin
                - checkout
                - currency
                - total_amount
                - guest
                - booker
                - payment_type
                - net_price
                - reserved_at
      responses:
        "200":
          description: 예약 생성 요청 성공
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                    description: 에러 메시지
                    example: ""
                  reservation:
                    type: object
                    properties:
                      booking_number:
                        type: string
                        description: 공급사 예약 번호
                        example: VB-20260101-0001
                      requested_at:
                        type: string
                        format: date-time
                        description: 요청 일시 (ISO8601, 오프셋 포함)
                        example: 2026-01-01T10:00:00+09:00
                      updated_at:
                        type: string
                        format: date-time
                        description: 수정 일시 (ISO8601, 오프셋 포함)
                        example: 2026-01-01T10:01:00+09:00
                      status:
                        type: string
                        enum:
                          - pending
                        description: 예약 상태
                        example: pending
                      refunds:
                        type: array
                        items:
                          type: object
                          properties:
                            type:
                              type: string
                              enum:
                                - refund
                              description: 환불 타입
                              example: refund
                            until:
                              type: string
                              format: date-time
                              description: 환불 가능 시한 (ISO8601, 오프셋 포함)
                              example: 2026-01-19T23:59:59+09:00
                            percent:
                              type: number
                              description: 환불 비율(%)
                              example: 100
                            amount:
                              type: number
                              description: 환불 금액
                              example: 100000
                          required:
                            - type
                            - until
                            - percent
                            - amount
                        description: 환불 정책 목록
                    required:
                      - booking_number
                      - status
                required:
                  - error
                  - reservation
        "400":
          description: Validation Error
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: string
                    enum:
                      - "1000"
                      - "2000"
                      - "3000"
                      - "4000"
                      - "4001"
                      - "4002"
                      - "4003"
                      - "4004"
                      - "4005"
                      - "4006"
                      - "4007"
                      - "9999"
                    description: 에러 코드
                    example: "3000"
                  error:
                    type: string
                    enum:
                      - An error occurred during system processing
                      - Access denied
                      - Please check your input information
                      - No rooms available for booking
                      - Requested amount differs from actual amount
                      - Minimum guest requirement not met
                      - Maximum guest capacity exceeded
                      - Reservation not found
                      - Reservation already cancelled
                      - Reservation cannot be cancelled
                      - Reservation cannot be confirmed
                      - An unknown error occurred
                    description: 에러 메시지
                    example: Please check your input information
                required:
                  - code
                  - error
        "403":
          description: Access Denied
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: string
                    enum:
                      - "1000"
                      - "2000"
                      - "3000"
                      - "4000"
                      - "4001"
                      - "4002"
                      - "4003"
                      - "4004"
                      - "4005"
                      - "4006"
                      - "4007"
                      - "9999"
                    description: 에러 코드
                    example: "3000"
                  error:
                    type: string
                    enum:
                      - An error occurred during system processing
                      - Access denied
                      - Please check your input information
                      - No rooms available for booking
                      - Requested amount differs from actual amount
                      - Minimum guest requirement not met
                      - Maximum guest capacity exceeded
                      - Reservation not found
                      - Reservation already cancelled
                      - Reservation cannot be cancelled
                      - Reservation cannot be confirmed
                      - An unknown error occurred
                    description: 에러 메시지
                    example: Please check your input information
                required:
                  - code
                  - error
        "404":
          description: Reservation not found
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: string
                    enum:
                      - "1000"
                      - "2000"
                      - "3000"
                      - "4000"
                      - "4001"
                      - "4002"
                      - "4003"
                      - "4004"
                      - "4005"
                      - "4006"
                      - "4007"
                      - "9999"
                    description: 에러 코드
                    example: "3000"
                  error:
                    type: string
                    enum:
                      - An error occurred during system processing
                      - Access denied
                      - Please check your input information
                      - No rooms available for booking
                      - Requested amount differs from actual amount
                      - Minimum guest requirement not met
                      - Maximum guest capacity exceeded
                      - Reservation not found
                      - Reservation already cancelled
                      - Reservation cannot be cancelled
                      - Reservation cannot be confirmed
                      - An unknown error occurred
                    description: 에러 메시지
                    example: Please check your input information
                required:
                  - code
                  - error
        "409":
          description: Business Error
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: string
                    enum:
                      - "1000"
                      - "2000"
                      - "3000"
                      - "4000"
                      - "4001"
                      - "4002"
                      - "4003"
                      - "4004"
                      - "4005"
                      - "4006"
                      - "4007"
                      - "9999"
                    description: 에러 코드
                    example: "3000"
                  error:
                    type: string
                    enum:
                      - An error occurred during system processing
                      - Access denied
                      - Please check your input information
                      - No rooms available for booking
                      - Requested amount differs from actual amount
                      - Minimum guest requirement not met
                      - Maximum guest capacity exceeded
                      - Reservation not found
                      - Reservation already cancelled
                      - Reservation cannot be cancelled
                      - Reservation cannot be confirmed
                      - An unknown error occurred
                    description: 에러 메시지
                    example: Please check your input information
                required:
                  - code
                  - error
        "500":
          description: System Error
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: string
                    enum:
                      - "1000"
                      - "2000"
                      - "3000"
                      - "4000"
                      - "4001"
                      - "4002"
                      - "4003"
                      - "4004"
                      - "4005"
                      - "4006"
                      - "4007"
                      - "9999"
                    description: 에러 코드
                    example: "3000"
                  error:
                    type: string
                    enum:
                      - An error occurred during system processing
                      - Access denied
                      - Please check your input information
                      - No rooms available for booking
                      - Requested amount differs from actual amount
                      - Minimum guest requirement not met
                      - Maximum guest capacity exceeded
                      - Reservation not found
                      - Reservation already cancelled
                      - Reservation cannot be cancelled
                      - Reservation cannot be confirmed
                      - An unknown error occurred
                    description: 에러 메시지
                    example: Please check your input information
                required:
                  - code
                  - error
  /bookings/{vendor_booking_number}/confirm:
    put:
      operationId: webhook-confirm-booking
      servers:
        - url: "{vendor_base_url}"
          description: 공급사가 제공하는 수신 서버
          variables:
            vendor_base_url:
              default: https://vendor.example.com
              description: 공급사 서버의 베이스 URL
      tags:
        - webhook-reservation
      summary: 예약 확정
      description: |-
        - 이 엔드포인트는 공급사가 구현하고 ONDA가 호출합니다.
        - ONDA에서 공급사 예약 확정을 요청합니다.
        - 공급사에는 결제 금액(paid_amount)을 전달하지 않습니다.
        - 확정할 예약은 경로의 `vendor_booking_number`로 특정합니다. 본문의 `property_id`·`roomtype_id`는 참고용이라 전달되지 않을 수 있으니, 이 값에 의존해 예약을 찾지 마세요. `rateplan_id`는 항상 전달됩니다.
      parameters:
        - schema:
            type: string
            description: 공급사 예약 번호
            example: VB-20260101-0001
          required: true
          description: 공급사 예약 번호
          name: vendor_booking_number
          in: path
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                confirmed_at:
                  type: string
                  format: date-time
                  description: 예약 확정 일시 (ISO8601)
                  example: 2026-01-19T10:05:00+09:00
                property_id:
                  type: string
                  description: 공급사 숙소 아이디
                  example: VP-001
                roomtype_id:
                  type: string
                  description: 공급사 객실 아이디
                  example: VRT-001
                rateplan_id:
                  type: string
                  description: 공급사 요금제 아이디
                  example: VRP-001
              required:
                - confirmed_at
                - rateplan_id
      responses:
        "200":
          description: 예약 확정 요청 성공
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                    description: 에러 메시지
                    example: ""
                  reservation:
                    type: object
                    properties:
                      booking_number:
                        type: string
                        description: 공급사 예약 번호
                        example: VB-20260101-0001
                      requested_at:
                        type: string
                        format: date-time
                        description: 요청 일시 (ISO8601, 오프셋 포함)
                        example: 2026-01-01T10:00:00+09:00
                      updated_at:
                        type: string
                        format: date-time
                        description: 수정 일시 (ISO8601, 오프셋 포함)
                        example: 2026-01-01T10:01:00+09:00
                      status:
                        type: string
                        enum:
                          - confirm
                        description: 예약 상태
                        example: confirm
                    required:
                      - booking_number
                      - status
                required:
                  - error
                  - reservation
        "400":
          description: Validation Error
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: string
                    enum:
                      - "1000"
                      - "2000"
                      - "3000"
                      - "4000"
                      - "4001"
                      - "4002"
                      - "4003"
                      - "4004"
                      - "4005"
                      - "4006"
                      - "4007"
                      - "9999"
                    description: 에러 코드
                    example: "3000"
                  error:
                    type: string
                    enum:
                      - An error occurred during system processing
                      - Access denied
                      - Please check your input information
                      - No rooms available for booking
                      - Requested amount differs from actual amount
                      - Minimum guest requirement not met
                      - Maximum guest capacity exceeded
                      - Reservation not found
                      - Reservation already cancelled
                      - Reservation cannot be cancelled
                      - Reservation cannot be confirmed
                      - An unknown error occurred
                    description: 에러 메시지
                    example: Please check your input information
                required:
                  - code
                  - error
        "403":
          description: Access Denied
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: string
                    enum:
                      - "1000"
                      - "2000"
                      - "3000"
                      - "4000"
                      - "4001"
                      - "4002"
                      - "4003"
                      - "4004"
                      - "4005"
                      - "4006"
                      - "4007"
                      - "9999"
                    description: 에러 코드
                    example: "3000"
                  error:
                    type: string
                    enum:
                      - An error occurred during system processing
                      - Access denied
                      - Please check your input information
                      - No rooms available for booking
                      - Requested amount differs from actual amount
                      - Minimum guest requirement not met
                      - Maximum guest capacity exceeded
                      - Reservation not found
                      - Reservation already cancelled
                      - Reservation cannot be cancelled
                      - Reservation cannot be confirmed
                      - An unknown error occurred
                    description: 에러 메시지
                    example: Please check your input information
                required:
                  - code
                  - error
        "404":
          description: Reservation not found
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: string
                    enum:
                      - "1000"
                      - "2000"
                      - "3000"
                      - "4000"
                      - "4001"
                      - "4002"
                      - "4003"
                      - "4004"
                      - "4005"
                      - "4006"
                      - "4007"
                      - "9999"
                    description: 에러 코드
                    example: "3000"
                  error:
                    type: string
                    enum:
                      - An error occurred during system processing
                      - Access denied
                      - Please check your input information
                      - No rooms available for booking
                      - Requested amount differs from actual amount
                      - Minimum guest requirement not met
                      - Maximum guest capacity exceeded
                      - Reservation not found
                      - Reservation already cancelled
                      - Reservation cannot be cancelled
                      - Reservation cannot be confirmed
                      - An unknown error occurred
                    description: 에러 메시지
                    example: Please check your input information
                required:
                  - code
                  - error
        "409":
          description: Business Error
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: string
                    enum:
                      - "1000"
                      - "2000"
                      - "3000"
                      - "4000"
                      - "4001"
                      - "4002"
                      - "4003"
                      - "4004"
                      - "4005"
                      - "4006"
                      - "4007"
                      - "9999"
                    description: 에러 코드
                    example: "3000"
                  error:
                    type: string
                    enum:
                      - An error occurred during system processing
                      - Access denied
                      - Please check your input information
                      - No rooms available for booking
                      - Requested amount differs from actual amount
                      - Minimum guest requirement not met
                      - Maximum guest capacity exceeded
                      - Reservation not found
                      - Reservation already cancelled
                      - Reservation cannot be cancelled
                      - Reservation cannot be confirmed
                      - An unknown error occurred
                    description: 에러 메시지
                    example: Please check your input information
                required:
                  - code
                  - error
        "500":
          description: System Error
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: string
                    enum:
                      - "1000"
                      - "2000"
                      - "3000"
                      - "4000"
                      - "4001"
                      - "4002"
                      - "4003"
                      - "4004"
                      - "4005"
                      - "4006"
                      - "4007"
                      - "9999"
                    description: 에러 코드
                    example: "3000"
                  error:
                    type: string
                    enum:
                      - An error occurred during system processing
                      - Access denied
                      - Please check your input information
                      - No rooms available for booking
                      - Requested amount differs from actual amount
                      - Minimum guest requirement not met
                      - Maximum guest capacity exceeded
                      - Reservation not found
                      - Reservation already cancelled
                      - Reservation cannot be cancelled
                      - Reservation cannot be confirmed
                      - An unknown error occurred
                    description: 에러 메시지
                    example: Please check your input information
                required:
                  - code
                  - error
  /bookings/{vendor_booking_number}/cancel:
    post:
      operationId: webhook-cancel-booking
      servers:
        - url: "{vendor_base_url}"
          description: 공급사가 제공하는 수신 서버
          variables:
            vendor_base_url:
              default: https://vendor.example.com
              description: 공급사 서버의 베이스 URL
      tags:
        - webhook-reservation
      summary: 예약 취소
      description: |-
        - 이 엔드포인트는 공급사가 구현하고 ONDA가 호출합니다.
        - ONDA에서 공급사 예약 취소를 요청합니다.
        - 공급사는 취소 사유(memo)를 함께 전달받습니다.
      parameters:
        - schema:
            type: string
            description: 공급사 예약 번호
            example: VB-20260101-0001
          required: true
          description: 공급사 예약 번호
          name: vendor_booking_number
          in: path
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                canceled_at:
                  type: string
                  format: date-time
                  description: 취소 일시 (ISO8601)
                  example: 2026-01-20T14:30:00+09:00
                canceled_by:
                  type: string
                  enum:
                    - user
                    - admin
                    - channel
                    - system
                  description: 취소 주체. 미상 시 system 기본값 전송
                  example: channel
                refund:
                  type: object
                  properties:
                    amount:
                      type: number
                      description: 환불 금액
                      example: 50000
                    percent:
                      type: number
                      description: 환불 비율(%)
                      example: 50
                  required:
                    - amount
                    - percent
                  description: 환불 정보
                property_id:
                  type: string
                  description: 공급사 숙소 아이디
                  example: VP-001
                roomtype_id:
                  type: string
                  description: 공급사 객실 아이디
                  example: VRT-001
                rateplan_id:
                  type: string
                  description: 공급사 요금제 아이디
                  example: VRP-001
                memo:
                  type: string
                  description: 취소 사유(선택). 채널사 관리자 취소 등 사유가 있을 때 전달
                  example: 채널 관리자 취소
              required:
                - canceled_at
                - canceled_by
                - refund
                - property_id
                - roomtype_id
                - rateplan_id
      responses:
        "200":
          description: 예약 취소 요청 성공
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                    description: 에러 메시지
                    example: ""
                  reservation:
                    type: object
                    properties:
                      booking_number:
                        type: string
                        description: 공급사 예약 번호
                        example: VB-20260101-0001
                      requested_at:
                        type: string
                        format: date-time
                        description: 요청 일시 (ISO8601, 오프셋 포함)
                        example: 2026-01-01T10:00:00+09:00
                      updated_at:
                        type: string
                        format: date-time
                        description: 수정 일시 (ISO8601, 오프셋 포함)
                        example: 2026-01-01T10:01:00+09:00
                      status:
                        type: string
                        enum:
                          - cancel
                        description: 예약 상태
                        example: cancel
                    required:
                      - booking_number
                      - status
                required:
                  - error
                  - reservation
        "400":
          description: Validation Error
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: string
                    enum:
                      - "1000"
                      - "2000"
                      - "3000"
                      - "4000"
                      - "4001"
                      - "4002"
                      - "4003"
                      - "4004"
                      - "4005"
                      - "4006"
                      - "4007"
                      - "9999"
                    description: 에러 코드
                    example: "3000"
                  error:
                    type: string
                    enum:
                      - An error occurred during system processing
                      - Access denied
                      - Please check your input information
                      - No rooms available for booking
                      - Requested amount differs from actual amount
                      - Minimum guest requirement not met
                      - Maximum guest capacity exceeded
                      - Reservation not found
                      - Reservation already cancelled
                      - Reservation cannot be cancelled
                      - Reservation cannot be confirmed
                      - An unknown error occurred
                    description: 에러 메시지
                    example: Please check your input information
                required:
                  - code
                  - error
        "403":
          description: Access Denied
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: string
                    enum:
                      - "1000"
                      - "2000"
                      - "3000"
                      - "4000"
                      - "4001"
                      - "4002"
                      - "4003"
                      - "4004"
                      - "4005"
                      - "4006"
                      - "4007"
                      - "9999"
                    description: 에러 코드
                    example: "3000"
                  error:
                    type: string
                    enum:
                      - An error occurred during system processing
                      - Access denied
                      - Please check your input information
                      - No rooms available for booking
                      - Requested amount differs from actual amount
                      - Minimum guest requirement not met
                      - Maximum guest capacity exceeded
                      - Reservation not found
                      - Reservation already cancelled
                      - Reservation cannot be cancelled
                      - Reservation cannot be confirmed
                      - An unknown error occurred
                    description: 에러 메시지
                    example: Please check your input information
                required:
                  - code
                  - error
        "404":
          description: Reservation not found
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: string
                    enum:
                      - "1000"
                      - "2000"
                      - "3000"
                      - "4000"
                      - "4001"
                      - "4002"
                      - "4003"
                      - "4004"
                      - "4005"
                      - "4006"
                      - "4007"
                      - "9999"
                    description: 에러 코드
                    example: "3000"
                  error:
                    type: string
                    enum:
                      - An error occurred during system processing
                      - Access denied
                      - Please check your input information
                      - No rooms available for booking
                      - Requested amount differs from actual amount
                      - Minimum guest requirement not met
                      - Maximum guest capacity exceeded
                      - Reservation not found
                      - Reservation already cancelled
                      - Reservation cannot be cancelled
                      - Reservation cannot be confirmed
                      - An unknown error occurred
                    description: 에러 메시지
                    example: Please check your input information
                required:
                  - code
                  - error
        "409":
          description: Business Error
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: string
                    enum:
                      - "1000"
                      - "2000"
                      - "3000"
                      - "4000"
                      - "4001"
                      - "4002"
                      - "4003"
                      - "4004"
                      - "4005"
                      - "4006"
                      - "4007"
                      - "9999"
                    description: 에러 코드
                    example: "3000"
                  error:
                    type: string
                    enum:
                      - An error occurred during system processing
                      - Access denied
                      - Please check your input information
                      - No rooms available for booking
                      - Requested amount differs from actual amount
                      - Minimum guest requirement not met
                      - Maximum guest capacity exceeded
                      - Reservation not found
                      - Reservation already cancelled
                      - Reservation cannot be cancelled
                      - Reservation cannot be confirmed
                      - An unknown error occurred
                    description: 에러 메시지
                    example: Please check your input information
                required:
                  - code
                  - error
        "500":
          description: System Error
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: string
                    enum:
                      - "1000"
                      - "2000"
                      - "3000"
                      - "4000"
                      - "4001"
                      - "4002"
                      - "4003"
                      - "4004"
                      - "4005"
                      - "4006"
                      - "4007"
                      - "9999"
                    description: 에러 코드
                    example: "3000"
                  error:
                    type: string
                    enum:
                      - An error occurred during system processing
                      - Access denied
                      - Please check your input information
                      - No rooms available for booking
                      - Requested amount differs from actual amount
                      - Minimum guest requirement not met
                      - Maximum guest capacity exceeded
                      - Reservation not found
                      - Reservation already cancelled
                      - Reservation cannot be cancelled
                      - Reservation cannot be confirmed
                      - An unknown error occurred
                    description: 에러 메시지
                    example: Please check your input information
                required:
                  - code
                  - error
  /bookings/{vendor_booking_number}/modify:
    put:
      operationId: webhook-modify-booking
      servers:
        - url: "{vendor_base_url}"
          description: 공급사가 제공하는 수신 서버
          variables:
            vendor_base_url:
              default: https://vendor.example.com
              description: 공급사 서버의 베이스 URL
      tags:
        - webhook-reservation
      summary: 예약 변경
      description: |-
        - 이 엔드포인트는 공급사가 구현하고 ONDA가 호출합니다.
        - ONDA에서 공급사 예약 변경을 요청합니다.
      parameters:
        - schema:
            type: string
            description: 공급사 예약 번호
            example: VB-20260101-0001
          required: true
          description: 공급사 예약 번호
          name: vendor_booking_number
          in: path
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                roomtype_id:
                  type: string
                  description: 공급사 객실 아이디
                  example: VRT-001
                rateplan_id:
                  type: string
                  description: 공급사 요금제 아이디
                  example: VRP-001
                total_amount:
                  type: string
                  description: 총 투숙 금액
                  example: "100000"
                guest:
                  type: object
                  properties:
                    name:
                      type: string
                      description: 투숙객 이름
                      example: 홍길동
                    adults:
                      type: number
                      description: 성인 수
                      example: 2
                    children:
                      type: number
                      description: 아동 수
                      example: 0
                    infants:
                      type: number
                      description: 유아 수
                      example: 0
                    pets:
                      type: number
                      description: 반려동물 수
                      example: 0
                    cars:
                      type: number
                      description: 차량 수
                      example: 1
                  required:
                    - name
                    - adults
                    - children
                    - infants
                booker:
                  type: object
                  properties:
                    name:
                      type: string
                      description: 예약자 이름
                      example: 김예약
                    email:
                      type: string
                      description: 예약자 이메일
                      example: booker@example.com
                    phone:
                      type: string
                      description: 예약자 연락처
                      example: 010-1234-5678
                  required:
                    - name
                    - email
                    - phone
                special_comment:
                  type: string
                  description: 고객 요청 사항
                  example: 고층 배정 요청
                net_price:
                  type: number
                  description: 입금 금액 (공급사 정산 예정액)
                  example: 90000
                checkin:
                  type: string
                  format: date-time
                  description: 체크인 일시 (ISO8601)
                  example: 2026-01-20T15:00:00+09:00
                checkout:
                  type: string
                  format: date-time
                  description: 체크아웃 일시 (ISO8601)
                  example: 2026-01-21T11:00:00+09:00
                updated_at:
                  type: string
                  format: date-time
                  description: 수정 일시 (ISO8601)
                  example: 2026-01-19T11:00:00+09:00
                secondary_channel:
                  type: string
                  description: 2차 판매 채널 (채널이 타 브랜드/OTA로 재판매한 예약의 최종 판매 브랜드). 채널이 값을 준 예약만 실리고 미수신
                    시 생략
                  example: Expedia Affiliate Network
              required:
                - roomtype_id
                - rateplan_id
                - total_amount
                - guest
                - booker
                - net_price
                - checkin
                - checkout
                - updated_at
      responses:
        "200":
          description: 예약 변경 요청 성공
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                    description: 에러 메시지
                    example: ""
                  reservation:
                    type: object
                    properties:
                      booking_number:
                        type: string
                        description: 공급사 예약 번호
                        example: VB-20260101-0001
                      requested_at:
                        type: string
                        format: date-time
                        description: 요청 일시 (ISO8601, 오프셋 포함)
                        example: 2026-01-01T10:00:00+09:00
                      updated_at:
                        type: string
                        format: date-time
                        description: 수정 일시 (ISO8601, 오프셋 포함)
                        example: 2026-01-01T10:01:00+09:00
                    required:
                      - booking_number
                required:
                  - error
                  - reservation
        "400":
          description: Validation Error
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: string
                    enum:
                      - "1000"
                      - "2000"
                      - "3000"
                      - "4000"
                      - "4001"
                      - "4002"
                      - "4003"
                      - "4004"
                      - "4005"
                      - "4006"
                      - "4007"
                      - "9999"
                    description: 에러 코드
                    example: "3000"
                  error:
                    type: string
                    enum:
                      - An error occurred during system processing
                      - Access denied
                      - Please check your input information
                      - No rooms available for booking
                      - Requested amount differs from actual amount
                      - Minimum guest requirement not met
                      - Maximum guest capacity exceeded
                      - Reservation not found
                      - Reservation already cancelled
                      - Reservation cannot be cancelled
                      - Reservation cannot be confirmed
                      - An unknown error occurred
                    description: 에러 메시지
                    example: Please check your input information
                required:
                  - code
                  - error
        "403":
          description: Access Denied
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: string
                    enum:
                      - "1000"
                      - "2000"
                      - "3000"
                      - "4000"
                      - "4001"
                      - "4002"
                      - "4003"
                      - "4004"
                      - "4005"
                      - "4006"
                      - "4007"
                      - "9999"
                    description: 에러 코드
                    example: "3000"
                  error:
                    type: string
                    enum:
                      - An error occurred during system processing
                      - Access denied
                      - Please check your input information
                      - No rooms available for booking
                      - Requested amount differs from actual amount
                      - Minimum guest requirement not met
                      - Maximum guest capacity exceeded
                      - Reservation not found
                      - Reservation already cancelled
                      - Reservation cannot be cancelled
                      - Reservation cannot be confirmed
                      - An unknown error occurred
                    description: 에러 메시지
                    example: Please check your input information
                required:
                  - code
                  - error
        "404":
          description: Reservation not found
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: string
                    enum:
                      - "1000"
                      - "2000"
                      - "3000"
                      - "4000"
                      - "4001"
                      - "4002"
                      - "4003"
                      - "4004"
                      - "4005"
                      - "4006"
                      - "4007"
                      - "9999"
                    description: 에러 코드
                    example: "3000"
                  error:
                    type: string
                    enum:
                      - An error occurred during system processing
                      - Access denied
                      - Please check your input information
                      - No rooms available for booking
                      - Requested amount differs from actual amount
                      - Minimum guest requirement not met
                      - Maximum guest capacity exceeded
                      - Reservation not found
                      - Reservation already cancelled
                      - Reservation cannot be cancelled
                      - Reservation cannot be confirmed
                      - An unknown error occurred
                    description: 에러 메시지
                    example: Please check your input information
                required:
                  - code
                  - error
        "409":
          description: Business Error
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: string
                    enum:
                      - "1000"
                      - "2000"
                      - "3000"
                      - "4000"
                      - "4001"
                      - "4002"
                      - "4003"
                      - "4004"
                      - "4005"
                      - "4006"
                      - "4007"
                      - "9999"
                    description: 에러 코드
                    example: "3000"
                  error:
                    type: string
                    enum:
                      - An error occurred during system processing
                      - Access denied
                      - Please check your input information
                      - No rooms available for booking
                      - Requested amount differs from actual amount
                      - Minimum guest requirement not met
                      - Maximum guest capacity exceeded
                      - Reservation not found
                      - Reservation already cancelled
                      - Reservation cannot be cancelled
                      - Reservation cannot be confirmed
                      - An unknown error occurred
                    description: 에러 메시지
                    example: Please check your input information
                required:
                  - code
                  - error
        "500":
          description: System Error
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: string
                    enum:
                      - "1000"
                      - "2000"
                      - "3000"
                      - "4000"
                      - "4001"
                      - "4002"
                      - "4003"
                      - "4004"
                      - "4005"
                      - "4006"
                      - "4007"
                      - "9999"
                    description: 에러 코드
                    example: "3000"
                  error:
                    type: string
                    enum:
                      - An error occurred during system processing
                      - Access denied
                      - Please check your input information
                      - No rooms available for booking
                      - Requested amount differs from actual amount
                      - Minimum guest requirement not met
                      - Maximum guest capacity exceeded
                      - Reservation not found
                      - Reservation already cancelled
                      - Reservation cannot be cancelled
                      - Reservation cannot be confirmed
                      - An unknown error occurred
                    description: 에러 메시지
                    example: Please check your input information
                required:
                  - code
                  - error
x-tagGroups:
  - name: API
    tags:
      - content-meta
      - content-property
      - content-roomtype
      - content-rateplan-model
      - content-rateplan
      - ari
      - reservation
      - channel
      - channel-open
      - channel-setting
      - channel-mapping
  - name: Webhook
    tags:
      - webhook-ari
      - webhook-reservation
