Flux de disponibilité des rendez-vous

Créer et importer des flux de disponibilités pour les rendez-vous

Lorsque vous créez et importez des flux de disponibilités pour des rendez-vous, suivez ces instructions :

  • Suivez les spécifications décrites dans le flux de disponibilité des rendez-vous pour les fichiers de données de disponibilité des rendez-vous. Nous vous recommandons d'utiliser des noms de fichiers de données de disponibilité des rendez-vous uniques pour chaque import. Incluez un code temporel dans le nom du fichier, par exemple appointment availability_1633621547.json.
  • Dans le descripteur du fichier, définissez le champ name sur appointment.availability. Pour obtenir un exemple de fichier descripteur, consultez l'exemple JSON. Nous vous recommandons d'utiliser des noms de fichiers de description uniques pour chaque importation. Incluez un code temporel dans le nom du fichier, par exemple appointment availability_1633621547.filesetdesc.json. Le fichier descripteur doit être importé sur le serveur SFTP générique.
  • Importez les flux sur le serveur SFTP générique toutes les 30 minutes en tant qu'actualisations complètes.
  • Vous trouverez les informations sur le serveur SFTP dans la section Configuration > Flux du portail des partenaires.
  • Sélectionner des serveurs de flux

    Sélectionner des serveurs de flux dans le portail des partenaires
  • Consultez l'état de l'ingestion des flux dans la section Flux > Historique du portail des partenaires.

Importer des flux partiels

La disponibilité des rendez-vous est également compatible avec les flux incrémentaux, ce qui permet aux partenaires de n'importer que les modifications apportées à leur disponibilité à l'aide de l'importation de flux.

Pour importer un flux partiel, définissez is_incremental: true dans au moins l'un des créneaux de disponibilité de votre flux. Si certains flux ont la valeur is_incremental définie sur true et d'autres sur false, le système les traite tous comme incrémentaux.

Les mises à jour incrémentielles proposent les opérations suivantes :

Aucun changement
N'incluez pas l'ID de disponibilité pour les entités qui n'ont pas changé.
Disponibilité de la mise à jour
 Pour mettre à jour une seule disponibilité, importez l'entrée de disponibilité spécifique (le même availability_id) nécessitant une modification, en modifiant l'un des champs sélectionnés.
Supprimer une disponibilité
Si une entrée de disponibilité n'est plus disponible ou doit être supprimée, importez cette disponibilité (le même availability_id) avec spots_available défini sur 0. Le système la supprimera automatiquement. De plus, pour supprimer toutes les données d'un marchand ou d'une entité, définissez la valeur spots_available de tous ses créneaux de disponibilité sur 0. Le marchand ou l'entité sera alors supprimé de la disponibilité.
Ajouter des disponibilités
 Pour les nouveaux créneaux de disponibilité, incluez la nouvelle entrée de disponibilité avec son nouveau availability_id unique dans l'importation du flux. Le système le traite comme s'il était inclus dans un flux standard.

Définitions

AppointmentAvailabilityFeed – Définition

message AppointmentAvailabilityFeed {
  repeated AppointmentAvailability data = 1;
}

Définition de 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;
}

Références externes aux fichiers .proto :

Exemples de flux de disponibilité pour le golf

Flux de disponibilité des rendez-vous

{
  "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
      }
    }
  ]
}

Fichier de descripteur

{
  "generation_timestamp": 1663347730,
  "name": "appointment.availability",
  "data_file": [
    "appointment_availability_1663347730.json"
  ]
}