予約の空き状況フィードを作成してアップロードする
予約の空き状況フィードを作成してアップロードする際は、次の手順に沿って操作してください。
- 予約の空き状況データファイルについては、予約の空き状況フィードに記載されている仕様に沿って対応してください。アップロードごとに一意の予約可能データ ファイル名を使用することをおすすめします。ファイル名にタイムスタンプを含めます(例:
appointment availability_1633621547.json)。 - ファイルセット記述子で、
nameフィールドをappointment.availabilityに設定します。記述子ファイルの例については、JSON のサンプルを参照してください。アップロードごとに一意の記述子ファイル名を使用することをおすすめします。ファイル名にタイムスタンプを含めます(例:appointment availability_1633621547.filesetdesc.json)。記述子ファイルは汎用 SFTP サーバーにアップロードする必要があります。 - 汎用 SFTP サーバーに 30 分ごとにフィードをアップロードし、完全な更新を行います。
- SFTP サーバーの詳細は、パートナー ポータルの [Configuration > Feeds] セクションで確認できます。
- フィードの取り込みステータスは、パートナー ポータルの [Feeds(フィード)> History(履歴)] セクションで確認できます。
増分フィードのアップロード
予約の空き情報では増分フィードもサポートされているため、パートナーはフィード アップロードを使用して、空き情報に加えられた変更のみをアップロードできます。
増分フィードをアップロードするには、フィードの少なくとも 1 つの在庫状況スロット内で is_incremental: true を設定します。一部のフィードで is_incremental が true に設定され、一部のフィードで false に設定されている場合、システムはすべてのフィードを増分として扱います。
増分更新では、次のオペレーションが提供されます。
- 変更なし
- 変更がないエンティティの可用性 ID は含めないでください。
- Update Availability(アップデートの提供状況)
- 単一の空き時間を更新するには、変更が必要な特定の空き時間エントリ(同じ
availability_id)をアップロードし、選択したフィールドのいずれかを変更します。 - 空き情報を削除する
- 在庫状況エントリが利用できなくなった場合や削除する必要がある場合は、
spots_availableを 0 に設定してその在庫状況(同じavailability_id)をアップロードすると、システムによって自動的に削除されます。また、販売者 / エンティティのすべてのデータを削除するには、すべての空き枠のspots_availableを 0 に設定します。これにより、販売者 / エンティティ自体が Availability から削除されます。 - 対応可能時間を追加する
- 新しい空き枠については、新しい空き枠エントリとその一意の新しい
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; }
外部 proto 参照:
ゴルフの空き情報フィードのサンプル
予約の空き状況フィード
{ "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" ] }