Developer Hub
자동 생성된 번역입니다.

예약 관련 질문

‘예약 문의’ 기능을 통해 여행객에 대한 추가 정보를 손쉽게 수집할 수 있습니다.

얼리 액세스 미리보기

이 문서는 선별된 파트너만을 대상으로 하는 얼리 액세스 미리보기 프로그램의 일부입니다. 베타 프로그램은 2026년 3분기에 시작되며, 2027년에 정식 출시될 예정입니다.

베타 파트너가 되는 데 관심이 있으시면 담당 계정 관리자에게 문의해 주시기 바랍니다.

개요

예약 문의 기능을 통해 여행자 관련 추가 정보(e.g. 신장, 체중, 여행 서류 정보, 식단 제한 사항 등)를 유연하고 type-safe 방식으로 수집할 수 있습니다.

주요 장점

  • 유연성: API 버전 관리 없이 새로운 데이터 유형 추가
  • Type-safe: JSON 스키마는 올바른 구조를 보장합니다
  • 검색 가능: 카탈로그 엔드포인트를 통해 사용 가능한 유형을 조회할 수 있는 기능
  • 필터 적용: 후원할 수 있는 활동만 표시됩니다.
  • 현지화: Questions는 여러 언어를 지원합니다

문서 용어집

  • 솔루션 아키텍처
    핵심 개념, 일반 데이터 유형 모델, 활동 요구사항, 파트너 역량 및 구조화된 답변 제출.
  • API 엔드포인트
    예약 관련 질문을 제공하는 데이터 유형 카탈로그, 활동 필터링 및 가격 확인 엔드포인트입니다.
  • 조건부 질문
    부모/자식 질문의 작동 방식과 표시/숨기기 논리를 제어하는 연산자.
  • 통합 흐름
    End-to-end 는 잠재 고객 발굴부터 예약 제출에 이르는 단계별 과정을 안내합니다.
  • 데이터 유형 예시
    스키마 정의와 답변 구조를 보여주는 데이터 유형 예시입니다.
  • 현지화
    ID를 고정된 상태로 유지하면서 질문과 선택지를 여러 언어로 반환하는 방법.
  • 유효성 검사
    Client-side 및 server-side 유효성 검사 규칙과 오류 응답 형식.

솔루션 아키텍처

핵심 개념

일반 데이터 유형 모델

재사용 가능한 데이터 유형 모델은 정보의 범주를 나타내며(필요에 따라 더 추가할 수 있음), e.g. 측정값, 선택 항목, 주소 및 전화번호 등이 포함됩니다.

>> 데이터 유형 모델에 대해 자세히 알아보기

data-types 의 전체 카탈로그를 보시려면 다음 번호로 전화해 주십시오. GET /experiences/booking-questions/data-types

활동 요건

활동은 예약 질문을 통해 필요한 데이터 유형을 명시하며, 다음 사항을 지정합니다:

  • 해당 문제에 대한 고유한 문자열 ID
  • 질문 내용 (현지화됨)
  • 질문 본문 설명 (현지화됨)
  • 데이터 유형 참조
  • per-traveler 를 적용하든, 아니면 per-booking
  • 유효성 검사 제약 조건(최소/최대값, 길이 등)
  • 어떤 티켓에 적용되는지
  • 지정된 상위 질문에 대한 하위 질문을 정의합니다.
  • 선택적 조건부 논리 (다른 답변에 따라 달라지는 질문)

파트너 역량

검색/콘텐츠 엔드포인트에서 supported_booking_data_types 필터 매개변수를 사용하여 지원하는 데이터 유형을 지정합니다. 이렇게 하면 처리할 수 있는 활동만 표시되도록 필터링됩니다.

  • 를 처리하려면 유형을 동적으로 처리하려면 supported_booking_data_types=*를 전송하십시오.
  • 를 후원하시려면, 예약 관련 문의는 supported_booking_data_types=none으로 보내주십시오.

정형화된 답변 제출

답변이 적절하게 중첩되어 있습니다:

  • Per-traveler 답변: — 각 여행자 객체의 booking_question_answers 배열에 있습니다.
  • Per-booking 답변: — 예약 단위의 booking_question_answers 배열에서 확인할 수 있습니다.

API 엔드포인트

데이터 유형 카탈로그 가져오기

종점: GET /experiences/booking-questions/data-types

쿼리 매개변수: ?date_updated_start

>> 사용 방법은 ‘통합 흐름: 1단계’를 참조하세요

목적: 사용 가능한 모든 데이터 유형 모델에 대한 기술 참조 카탈로그를 반환합니다.

요청 예:

GET /experiences/booking-questions/data-types

응답 예:

[
    {
      "date_added": "2026-07-14T11:30:08.104575+02:00",
      "date_updated": "2026-07-14T11:30:08.104575+02:00",
      "description": "Used for collecting any measurement with a numeric value and unit. Common examples include height (in/cm/foot/meter), weight (lb/kg/stone), shoe size (us_men/us_women/eu/uk/cm), helmet size (in/cm), waist size (in/cm), and chest size (in/cm). The allowed_units field specifies which units are valid for this measurement.",
      "name": "Measurement",
      "schema_definition": {
        "properties": {
          "unit": {
            "description": "Unit of measurement - must be one of the allowed_options specified for the question",
            "type": "string"
          },
          "value": {
            "description": "Numeric value as string to preserve precision",
            "pattern": "^[0-9]+(\\.[0-9]+)?$",
            "type": "string"
          }
        },
        "required": [
          "value",
          "unit"
        ],
        "type": "object"
      },
      "type": "measurement"
    },
]

활동 필터링

쿼리 매개변수: supported_booking_data_types

적용 대상: /experiences/activities/content/experiences/activities/availability엔드포인트

목적: 지정된 데이터 유형을 사용하는 필수 질문이 포함된 활동만 결과에 포함되도록 필터링합니다.

예시:

GET /experiences/activities/content
  ?activity_id=123&activity_id=456
  &language=en-US
  &supported_booking_data_types=measurement
  &supported_booking_data_types=selection
  &supported_booking_data_types=text
  • 모든 유형을 처리하고 모든 활동을 표시하려면 supported_booking_data_types=*를 사용하세요. 그러면 귀하는 ‘가격 확인 및 예약’ 단계에서 모든 유형의 문의를 처리할 책임이 있습니다.
  • 예약과 관련 없는 문의 사항은 supported_booking_data_types=none을 이용해 주십시오. 이렇게 하면 예약 관련 질문이 없는 활동만 반환됩니다.

가격 확인 (예약 관련 질문 포함)

종점: GET /experiences/activities/{activity_id}/price-check

목적: 해당 활동에 대한 가격을 확인하고, 예약 관련 문의 사항(있는 경우)을 반환합니다.

요청 예:

GET /experiences/activities/12345/price-check?token=abc123&tickets=...

응답 예:

{
  "status": "available",
  "offer_pricing": {
    "total": {
      "value": "150.00",
      "currency": "USD"
    }
  },
  "booking_questions": [
    {
      "id": "height_1",
      "type": "measurement",
      "question": "What is your height?",
      "description": "Required for safety equipment fitting",
      "applies_to": "per_traveler",
      "ticket_ids": ["12346","12345"]
      "allowed_options": [
        { "id": "in", "label": "in" },
        { "id": "cm", "label": "cm" }
      ]
    },
    {
      "id": "weight_1",
      "type": "measurement",
      "question": "What is your weight?",
      "description": "Required for zipline weight limits",
      "applies_to": "per_traveler",
      "ticket_ids": ["12346","12345"]
      "allowed_options": [
        { "id": "lb", "label": "lb" },
        { "id": "kg", "label": "kg" }
      ]
    }
  ],
  "links": {
    "create": {
      "method": "POST",
      "href": "/itineraries/activity"
    }
  }
}

참고: 이전 검색/콘텐츠 호출에서 supported_booking_data_types를 사용하여 활동을 필터링한 경우, 반환된 모든 질문은 귀하가 지원하는 데이터 유형을 사용합니다.

조건문 질문

질문은 이전 질문에 대한 답변에 따라 조건부로 달라질 수 있습니다. 이는 사용자의 선택에 따라 다양한 정보를 수집하는 데 유용합니다.

작동 방식

  • 상위 질문 — 그 답변에 따라 이후 내용이 결정되는 질문(일반적으로 ‘ selection ’ 유형).
  • 자식 쿼리 — 부모를 참조하는 ‘ conditional ’ 필드가 포함된 쿼리.
  • 양방향 관계 — 부모 노드는 children배열에 자식 노드들을 나열하며, 자식 노드들은 완전한 조건부 논리를 통해 부모 노드를 참조합니다.

예시: 연락 방법 선택

부모님의 질문:

{
  "id": "contact_method_1",
  "type": "selection",
  "question": "How would you prefer to be contacted?",
  "applies_to": "per_traveler",
  "ticket_ids": ["12346","12345"]
  "children": ["contact_phone_1", "contact_whatsapp_1", "contact_email_1"],
  "allow_multiple": false,
  "allowed_options": [
    { "id": "phone", "label": "Phone Call" },
    { "id": "whatsapp", "label": "WhatsApp" },
    { "id": "email", "label": "Email" },
    { "id": "no_contact", "label": "No Contact" }
  ]
}

조건부 하위 질문:

[
  {
    "id": "contact_phone_1",
    "type": "phone",
    "question": "What is your phone number?",
    "applies_to": "per_traveler",
    "conditional": {
      "parent_question_id": "contact_method_1",
      "show_when": {
        "operator": "equals",
        "field": "selected",
        "values": ["phone"]
      }
    }
  },
  {
    "id": "contact_whatsapp_1",
    "type": "text",
    "question": "What is your WhatsApp username?",
    "applies_to": "per_traveler",
    "conditional": {
      "parent_question_id": "contact_method_1",
      "show_when": {
        "operator": "equals",
        "field": "selected",
        "values": ["whatsapp"]
      }
    }
  },
  {
    "id": "contact_email_1",
    "type": "email",
    "question": "What is your email address?",
    "applies_to": "per_traveler",
    "conditional": {
      "parent_question_id": "contact_method_1",
      "show_when": {
        "operator": "equals",
        "field": "selected",
        "values": ["email"]
      }
    }
  }
]

조건 연산자

운영자의미
contains해당 필드에 지정된 값 중 하나가 포함되어 있습니다
equals해당 필드가 지정된 값 중 하나와 정확히 일치합니다.
not_contains해당 필드에는 지정된 값이 하나도 포함되어 있지 않습니다.
not_equals해당 필드가 지정된 값 중 어느 것과도 일치하지 않습니다.

통합 흐름

1단계: 탐색 단계

지원 가능한 데이터 유형을 확인하려면 데이터 유형 카탈로그를 호출하십시오:

GET /experiences/booking-questions/data-types?date_updated_start=2026-02-01

date_updated_start가 지정된 경우, 지정된 날짜에 추가되었거나 그 이후에 추가된 데이터 유형만 반환됩니다.

2단계: 필터 적용하여 검색하기

호환되는 질문이 있는 활동만 표시하도록 필터링하려면:

GET /experiences/activities/content
  ?activity_id=123&activity_id=456&activity_id=789
  &language=en-US
  &supported_booking_data_types=measurement
  &supported_booking_data_types=selection
  &supported_booking_data_types=text

이렇게 하면 필수 질문에 지정된 데이터 유형이 사용된 활동만 결과에 포함되도록 필터링됩니다.

3단계: 가격 확인

가격 확인 과정에서 응답에 예약 관련 질문이 포함되어 있습니다:

GET /experiences/activities/12345/price-check?token=abc123&tickets=...

응답에는 (있는 경우) booking_questions배열이 포함됩니다. 모든 질문은 사용자가 설정한 필터의 데이터 유형을 사용합니다.

4단계: 답변 수집하기

답변을 수집할 UI를 구축하세요:

  • 각 데이터 유형에 맞는 입력을 렌더링합니다.
  • 데이터 유형 카탈로그의 스키마를 사용하여 client-side 의 유효성을 확인하십시오.
  • per-traveler 관련 질문의 경우, 여행자별로 답변을 수집하세요.
  • per-booking 관련 질문은 한 번에 모아주세요
  • 조건부 질문 처리 (상위 질문에 대한 답변에 따라 표시/숨기기)

5단계: 예약 제출

예약 요청과 함께 답변을 제출해 주세요:

POST /itineraries/activity
{
  "primary_traveler": [
    {
      "given_name": "John",
      "family_name": "Doe",
      "booking_question_answers": [
        {
          "question_id": "height_1",
          "answer": {
            "value": "72",
            "unit": "in"
          }
        },
        {
          "question_id": "weight_1",
          "answer": {
            "value": "180",
            "unit": "lb"
          }
        }
      ]
    }
  ],
  "booking_question_answers": [
    {
      "question_id": "emergency_contact_1",
      "answer": {
        "value": "Jane Doe, +1-555-1234"
      }
    }
  ]
}

데이터 유형 예시

크기 (치수)

스키마 정의:

{
  "type": "object",
  "required": ["value", "unit"],
  "properties": {
    "value": {
      "type": "string",
      "pattern": "^[0-9]+(\\.[0-9]+)?$"
    },
    "unit": {
      "type": "string"
    }
  }
}

답변 예시:

{
  "value": "72",
  "unit": "in"
}

현지화

질문 항목은 ‘Price Check’의 ‘ language ’ 매개변수를 통해 여러 언어를 지원합니다.

영어 예시:

GET /experiences/activities/12345/price-check?token=...&language=en-US
{
  "id": "dietary_1",
  "type": "selection",
  "question": "Dietary preferences (optional)",
  "description": "Please share any dietary restrictions or allergies."
  "applies_to": "per_traveler",
  "allow_multiple": false
  "ticket_ids": ["12345", "12346"]
  "options": [
    { "id": "vegetarian", "label": "Vegetarian" },
    { "id": "vegan", "label": "Vegan" }
  ]
}

스페인어 예시:

.에 대해서도 같은 질문입니다 language=es-ES.

GET /experiences/activities/12345/price-check?token=...&language=es-ES
{
  "id": "dietary_1",
  "type": "selection",
  "question": "Preferencias alimentarias (opcional)",
  "description": "Por favor, indica las restricciones alimentarias o alergias. "
  "applies_to": "per_traveler",
  "allow_multiple": false
  "ticket_ids": ["12345", "12346"]
  "options": [
    { "id": "vegetarian", "label": "Vegetariano" },
    { "id": "vegan", "label": "Vegano" }
  ]
}

참고: 의 문제 ID와 선택지 ID는 일관된 답안 제출을 위해 모든 언어에서 동일하게 유지됩니다.

승인

Client-side 검증

파트너사는 데이터 유형 카탈로그에 있는 스키마를 사용하여 client-side 의 답변을 검증함으로써 구조가 올바른지 확인해야 합니다.

Server-side 검증

예약 엔드포인트는 다음 사항을 검증합니다:

  • 필수 질문에는 모두 답변이 있습니다
  • 응답 구조가 데이터 유형 스키마와 일치합니다.
  • 값이 유효성 검사 제약 조건을 충족합니다.
  • 조건부 질문에 적절하게 답변합니다.
  • Per-traveler 여행자마다 질문이 제공됩니다
  • Per-booking 문제는 한 번만 제공됩니다

오류 응답

{
  "type": "validation_failed",
  "message": "One or more booking question answers are invalid",
  "errors": [
    {
      "type": "missing_required_answer",
      "message": "Required question 'height_1' not answered for traveler 1",
      "fields": [
        {
          "path": "$.travelers[0].booking_question_answers",
          "value": null
        }
      ]
    }
  ]
}
이 페이지가 도움이 되었나요?
이 콘텐츠를 어떻게 개선하면 좋을까요?
더 나은 Developer Hub를 만드는 데 도움을 주셔서 감사합니다!