약속 가능 시간 피드 만들기 및 업로드하기
상담 가능 시간 피드를 만들고 업로드할 때는 다음 안내를 따르세요.
- 예약 가능 시간 데이터 파일의 경우 예약 가능 시간 피드에 설명된 사양을 따릅니다. 업로드마다 고유한 상담 가능 시간 데이터 파일 이름을 사용하는 것이 좋습니다.
파일 이름에 타임스탬프를 포함합니다(예:
appointment availability_1633621547.json). - 파일 세트 설명자에서
name필드를appointment.availability로 설정합니다. 설명자 파일의 예시는 JSON 샘플을 참고하세요. 업로드마다 고유한 설명자 파일 이름을 사용하는 것이 좋습니다. 파일 이름에 타임스탬프를 포함합니다(예:appointment availability_1633621547.filesetdesc.json). 설명자 파일을 일반 SFTP 서버에 업로드해야 합니다. - 30분마다 일반 SFTP 서버에 피드를 전체 새로고침으로 업로드합니다.
- SFTP 서버 세부정보는 파트너 포털의 구성 > 피드 섹션에서 확인할 수 있습니다.
- 파트너 포털의 피드 > 기록 섹션에서 피드 처리 상태를 확인합니다.
증분 피드 업로드
약속 이용 가능 여부는 증분 피드도 지원하므로 파트너는 피드 업로드를 사용하여 이용 가능 여부에 적용된 변경사항만 업로드할 수 있습니다.
증분 피드를 업로드하려면 피드의 가용성 슬롯 하나 이상 내에서 is_incremental: true를 설정하세요. 일부 피드의 is_incremental가 true로 설정되어 있고 일부 피드의 is_incremental가 false로 설정되어 있으면 시스템에서 모든 피드를 증분으로 취급합니다.
증분 업데이트는 다음 작업을 제공합니다.
- 변경사항 없음
- 변경사항이 없는 항목의 경우 가용성 ID를 포함하지 마세요.
- 이용 가능 여부 업데이트
- 하나의 예약 가능 시간을 업데이트하려면 수정이 필요한 특정 예약 가능 시간 항목 (동일한
availability_id)을 업로드하고 선택한 필드를 변경합니다. - 참석 여부 삭제
- 재고 항목이 더 이상 제공되지 않거나 삭제해야 하는 경우
spots_available이 0으로 설정된 재고 (동일한availability_id)를 업로드하면 시스템에서 자동으로 삭제합니다. 또한 판매자 / 엔티티의 모든 데이터를 삭제하려면 모든 예약 가능 시간 슬롯의spots_available을 0으로 설정하세요. 그러면 예약 가능 시간에서 판매자 / 엔티티 자체가 삭제됩니다. - 상담 가능 여부 추가
- 새 참석 가능 시간 슬롯의 경우 피드 업로드에 고유한 새
availability_id이 포함된 새 참석 가능 시간 항목을 포함합니다. 시스템은 일반 피드에 포함된 것과 동일하게 처리합니다.
정의
AppointmentAvailabilityFeed 정의
message AppointmentAvailabilityFeed { repeated AppointmentAvailability data = 1; }
AppointmentAvailability 정의
// This represents the availability data for a bookable service provided by a // merchant. // For example, it can be a haircut/nail manicure service for a beauty salon or // a massage service for a spa. // The availability feed should be a list of this message. message AppointmentAvailability { // An opaque string generated by the partner that identifies a service time // slot. Must be unique across all entities and service time slots. // Strongly recommended to only include URL-safe characters. // Required. string availability_id = 1; // An opaque string generated by the partner that identifies an Entity. // Must be unique across all entities. // Strongly recommended to only include URL-safe characters. // Required. string entity_id = 2; // An opaque string of ASCII characters from an aggregator partner which // uniquely identifies the Service (haircut, nail manicure, massage). // Strongly recommended to only include URL-safe characters. // Required. string service_id = 3; // The name of the service provider. For example, the name of the // hairdresser or the spa staff member. // Optional. string provider = 12; // Timestamp of when this availability slot starts in UTC. // Given in seconds since the unix epoch. // For example, 1735714800 seconds for 1 Jan 2025, 07:00:00 (UTC). // Required. int64 start_time_sec = 4; // The minimum number of minutes in advance before the start time that this // availability slot can be booked. // For example, if the start time is 10:00 AM and the min_advance_minutes is // 60, then the latest time this slot can be booked is 9:00 AM on the day of // the appointment. // If not set, it is assumed to be 0, meaning the slot can be booked at any // time before the start time. // Optional. int32 min_advance_minutes = 13; // Number of total spots and available spots of this booking availability. // Required. int32 spots_total = 5; // Required. int32 spots_available = 6; // The minimum number of spots that should be booked for this availability. // For example, a user has to book at least 2 spots for a time slot sometimes. // If set, spots_minimum_book should be less or equal to spots_available. // Optional. int32 spots_minimum_book = 7; // Link of this booking availability. Users will be redirected to partner // website to continue booking after clicking this link. // Required. string booking_link = 8; // Base price per person. // Required. google.type.Money base_price = 9; // Fee per person. // Required. google.type.Money fee_price = 10; // Whether the feed is incremental or not. // By default it is false, meaning the Availability feed will override the // previous data for the same entity_id. // If this is set to be true, the Availability feed will be proceeded as // incremental updates for the same entity_id. // 1) If it is a new availability_id, the entry is added. // 2) If it is an existing availability_id and the spots_available is 0, // the entry is removed. // 3) If it is an existing availability_id and the spots_available is not // 0, the entry is updated. bool is_incremental = 11; }
외부 프로토 참조:
골프 이용 가능 여부 피드 샘플
예약 가능 일시 피드
{ "data": [ { "availability_id": "availability_id_1", "entity_id": "entity_id_1", "service_id": "service_id_1", "start_time_sec": 1728257400, "spots_total": 4, "spots_available": 4, "spots_minimum_book": 2, "booking_link": "https://www.googleappointments.com/a_link_direct_to_booking_page", "base_price": { "currency_code": "USD", "units": 80, "nanos": 0 }, "fee_price": { "currency_code": "USD", "units": 1, "nanos": 750000000 } }, { "availability_id": "availability_id_2", "entity_id": "entity_id_2", "service_id": "service_id_2", "start_time_sec": 1728259200, "spots_total": 4, "spots_available": 4, "spots_minimum_book": 2, "booking_link": "https://googlegolfappointments.com/a_link_direct_to_booking_page", "base_price": { "currency_code": "USD", "units": 80, "nanos": 0 }, "fee_price" : { "currency_code": "USD", "units": 2, "nanos": 850000000 } } ] }
설명자 파일
{ "generation_timestamp": 1663347730, "name": "appointment.availability", "data_file": [ "appointment_availability_1663347730.json" ] }