예약 관리

book_token 기반 예약 생성, 조회, 수정, 취소 프로세스를 안내합니다.

ONDA Platform Engineering 관리

예약 관리

ONDA Channel API의 예약 프로세스와 상태 관리를 안내합니다. 예약 생성은 반드시 검색 → 가격 확인(price-check) → book_token 발급 → 예약 생성 순서를 따릅니다.

예약 프로세스 개요

가용성 검색

GET /search/availability/{propertyId}로 객실·요금을 조회하고 price_check_token을 받습니다.

가격 확인 및 book_token 발급

GET /search/price-check?token={price_check_token}으로 실시간 가격을 재확인하고 book_token을 발급받습니다.

예약 생성

POST /bookingsbook_token과 예약자 정보를 보내 예약을 생성합니다.

예약 관리

필요시 투숙객 정보를 수정하거나 예약을 취소합니다.

book_token은 필수입니다. 청구 금액은 book_token에 서명된 서버 가격(inclusive_amount)으로 강제되며, 클라이언트가 보낸 금액 필드는 청구에 사용되지 않습니다. book_token 없이 호출하면 400 INVALID_REQUEST, 무효/만료된 토큰은 422 BOOKING_TOKEN_INVALID가 반환됩니다.

예약 생성

요청

POST /bookings의 body는 flat 구조입니다 (중첩 rooms[]/booker 객체가 아닙니다).

파라미터필수설명
book_tokenprice-check에서 발급된 단일 사용 토큰
booker_name예약자 이름
booker_email예약자 이메일
guest_first_name / guest_last_name투숙객 이름/성
guest_phone / guest_country투숙객 연락처/국가 코드
guests_adult / guests_child성인/소아 수 (성인 생략 시 book_token의 값 사용)
property_name / room_type / rate_plan표시용 이름 (선택)
special_requests특별 요청 사항
sale_amount채널의 고객 노출 판매가 (정보용 양수 정수, 청구액에 영향 없음)
channel_booking_number파트너 내부 예약 번호

숙소 ID, 체크인/체크아웃 날짜, 통화는 book_token에 서명된 값이 사용되므로 body로 보낼 필요가 없습니다.

예약 생성

응답 (201 Created)

예약 레코드는 data envelope 안에 camelCase 키로 반환됩니다. 금액 필드(totalAmount, netAmount, saleAmount)는 문자열로 직렬화됩니다.

{
  "data": {
    "id": "1f0e8400-e29b-41d4-a716-446655440000",
    "hubBookingNumber": "ONDA123456",
    "channelBookingNumber": "MY-ORDER-1234",
    "propertyId": "117417",
    "checkin": "2026-03-15",
    "checkout": "2026-03-16",
    "bookerName": "홍길동",
    "totalAmount": "154000",
    "netAmount": "154000",
    "currency": "KRW",
    "status": "confirmed",
    "cancellationPolicy": "flexible",
    "createdAt": "2026-03-01T09:00:00.000Z"
  },
  "meta": {
    "request_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
    "timestamp": "2026-03-01T09:00:00.000Z"
  }
}

운영(live) 환경에서는 예약 생성 시 입금가만큼 보증금 잔액이 홀드됩니다. 가용 잔액이 부족하면 402 INSUFFICIENT_BALANCE가 반환됩니다. Sandbox 환경에서는 실제 예약 없이 모의 응답(hubBookingNumber: "SANDBOX-...")이 반환됩니다.

하나의 예약 요청은 **1개 객실(요금제)**을 대상으로 합니다. 복수 객실이 필요하면 객실별로 price-check → 예약 생성을 반복하고, channel_booking_number로 묶어 관리하세요.

예약 상태

상태의미
pending처리 중 (Hub 확정 대기)
confirmed예약 확정
cancelling취소 처리 중
cancelled취소됨
checked_out체크아웃 완료 (정산 대상 편입)
no_show노쇼
failed예약 실패

상태 변경은 웹훅(reservation.created / reservation.modified / reservation.cancelled / reservation.no_show)으로 실시간 수신할 수 있습니다.

예약 조회

목록 조회

GET /bookings는 다음 필터와 페이지네이션을 지원합니다:

파라미터설명
status예약 상태 필터 (confirmed, cancelled, pending)
checkin_from / checkin_to체크인 날짜 범위 (YYYY-MM-DD)
created_from / created_to예약 생성일 범위 (YYYY-MM-DD)
affiliate_reference_id파트너 예약 번호(channel_booking_number) 필터
page / per_page페이지네이션 (기본 1 / 20, 최대 100)
curl -X GET "https://api.tport.dev/channel/v1/bookings?status=confirmed&checkin_from=2026-03-01&checkin_to=2026-03-31" \
  -H "Authorization: Bearer {access_token}"

상세 조회

curl -X GET "https://api.tport.dev/channel/v1/bookings/{id}" \
  -H "Authorization: Bearer {access_token}"

존재하지 않는 ID는 404 BOOKING_NOT_FOUND, 다른 앱의 예약은 403 FORBIDDEN이 반환됩니다.

예약 수정

PATCH /bookings/{id}로 투숙객 정보만 수정할 수 있습니다:

  • guest_first_name, guest_last_name, guest_phone, guest_country, special_requests

날짜·객실·인원 변경은 지원하지 않습니다. 변경이 필요하면 기존 예약을 취소하고 새로 예약하세요. 수정 불가 상태면 409 BOOKING_NOT_MODIFIABLE, 변경 내용이 없으면 400 NO_CHANGES가 반환됩니다.

취소 및 환불 정책

취소 정책 유형

정책 유형무료 취소 기한기한 경과 후 위약금
flexible체크인 24시간 전0% (전액 환불)
moderate체크인 48시간 전50%
strict체크인 7일 전100%
non_refundable취소 불가100% (항상)

기한 이전 취소는 모든 정책에서 전액 환불됩니다 (non_refundable 제외). 기한 계산은 체크인일 15:00 (KST) 기준입니다.

취소 전 수수료 확인

실제 취소 없이 현재 시점의 취소 수수료를 미리 확인할 수 있습니다:

curl -X GET "https://api.tport.dev/channel/v1/bookings/{id}/cancellation-fee" \
  -H "Authorization: Bearer {access_token}"
{
  "data": {
    "policy": "moderate",
    "deadline_passed": false,
    "refund_percent": 100,
    "refund_amount": "154000",
    "cancellation_fee": "0",
    "currency": "KRW"
  }
}

취소 정책과 무료 취소 기한은 GET /bookings/{id}/cancellation-policy로 조회합니다.

취소 실행

curl -X PUT "https://api.tport.dev/channel/v1/bookings/{id}/cancel" \
  -H "Authorization: Bearer {access_token}"
에러 코드상태원인
BOOKING_ALREADY_CANCELLED409이미 취소된 예약
BOOKING_NOT_CANCELLABLE409현재 상태에서 취소 불가
BOOKING_NOT_FOUND404예약 없음

non_refundable (환불 불가) 정책은 어떠한 경우에도 환불이 불가능합니다. 예약 생성 시 고객에게 명확히 안내하세요.

예약 확인서 (바우처)

GET /bookings/{id}/voucher아직 제공되지 않습니다 (501 NOT_IMPLEMENTED 반환). 바우처 생성 기능은 추후 제공될 예정이며, 그 전까지는 예약 상세 조회 응답(hubBookingNumber 등)으로 자체 확인서를 구성하세요.

일반적인 에러 시나리오

book_token 만료/무효 (422 BOOKING_TOKEN_INVALID)

원인: 토큰 만료, 위·변조, 또는 이미 사용된 토큰

해결: price-check를 다시 호출하여 새 book_token을 발급받아 재시도

가격 변동

원인: 검색 시점과 예약 시점 사이 가격 변경

해결: price-check 응답의 statusprice_changed면 새 가격(pricing)을 고객에게 확인받은 뒤, 함께 발급된 새 book_token으로 예약 (에러가 아니라 200 응답의 상태 필드입니다)

재고 소진

원인: price-check 시점에 해당 요금제가 매진됨

해결: price-check 응답의 statussold_out이면 다른 객실/날짜를 제안

잔액 부족 (402 INSUFFICIENT_BALANCE)

원인: 운영 환경에서 가용 잔액이 예약 입금가보다 적음

해결: 대시보드에서 보증금을 충전한 후 재시도

자세한 에러 코드는 에러 처리 가이드를 참고하세요.

다음 단계