Flux services

Créer et importer des flux de services

Lorsque vous créez et importez des flux de services, suivez ces instructions :

  • Suivez les spécifications décrites dans le flux de services pour les fichiers de données de service. Nous vous recommandons d'utiliser des noms de fichiers de données de service uniques pour chaque importation. Incluez un code temporel dans le nom du fichier, par exemple service_1633621547.json.
  • Dans le descripteur du fichier, définissez le champ name sur glam.service.v0. 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 service_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 tous les jours 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.

Définitions

ServiceFeed – Définition

message ServiceFeed {
  repeated Service data = 1;
}

Définition de service

// The definition of a service provided by a merchant.
message Service {
  // An opaque string from an aggregator partner which uniquely identifies a
  // merchant.
  // Required.
  string merchant_id = 1;

  // An opaque string of ASCII characters from an aggregator partner which
  // uniquely identifies the service.
  // Must be equal to or shorter than 100 characters.
  // Required.
  string service_id = 2;

  // The name of the service, e.g. "Men's haircut". Possibly in several locales.
  // Required.
  Text localized_service_name = 3;

  // The name of the service category, e.g. "Haircut", "Shave", "Color".
  // Possibly in several locales. The category will be used to group services
  // when presented to the consumer.
  // Note: For merchants without categories on your website, you can group all
  // services into one category and use a generic name such as "All Services"
  // or "General." Merchants who have categories you should try to replicate
  // those categories.
  // Required.
  Text localized_service_category = 4;

  // The user-visible description of the service, possibly in several locales.
  // This field is not required for every services, but is strongly
  // recommended to be filled when available.
  // Important notes:
  //   * The recommended maximum size is 2,000 characters.
  // Optional.
  Text localized_service_description = 5;

  // The price of the service.
  // Note, if a service (or merchant) doesn't provide price up front, use
  // RangeInterpretation.INTERPRETATION_NOT_DISPLAYED as PriceInterpretation.
  // Required.
  ServicePrice service_price = 6;

  // An action link related to this service. Action link should deep link to the
  // 3P page with the preselected service.
  // Note: Only the first entry will be used. Other provided action links will
  // be ignored.
  // Optional, but highly recommended if service-level deep links are supported.
  // This enables service-level entrypoints on Google if provided.
  // Note: For merchants participating in Healthcare vertical should not provide
  // service-level deep link.
  repeated ActionLink action_link = 8;

  // Duration of the service.
  // Note, if a service (or merchant) doesn't provide service duration, use
  // RangeInterpretation.INTERPRETATION_NOT_DISPLAYED as DurationInterpretation.
  // Required.
  ServiceDuration service_duration = 9;

  // Ranking hint for this service.
  // Optional.
  ServiceRankingHint ranking_hint = 10;
}

Text – Définition

// A possibly-localized text payload. Some Text fields may contain marked-up
// content.
message Text {
  // Text value in an unknown locale, which will be displayed if
  // `localized_value` for the user locale is empty or missing. The locale for
  // this value may depend on the partner or service provider, and it should not
  // be assumed to be any specific language.
  // Required.
  string value = 1;

  // Per-locale text values.
  // Optional.
  repeated LocalizedString localized_value = 2;
}

Définition de l'interprétation de la plage

// Describes how a range of values should be interpreted and displayed to the
// user.
enum RangeInterpretation {

  // When range represents an exact value (such that min value equals to max)
  // Will be interpreted as a specific value.
  //
  // Examples:
  //   $20 for a yoga class; 50 min haircut duration
  INTERPRETATION_EXACT = 1;

  // When only minimum of the range is known and displayed to consumers.
  // The maximum value will be decided based on other configurations
  // (e.g., price may go up if consumer selecting add-ons)
  //
  // Examples:
  //   $30 for dog grooming, but additional consumer choices may increase the
  //   price
  //   40 min massage, but there are also options for extending the time.
  INTERPRETATION_STARTS_AT = 2;

  // When the range is variable and both minimum and maximum values are known
  // and displayed to consumers.
  //
  // Examples:
  //   $30 - $60 for dog grooming, the exact price will depend on additional
  //   consumer choices.
  //   1 - 3 hour hair color service.
  INTERPRETATION_RANGE = 3;

  // When the range is variable and no min value is known. No information is
  // displayed to consumers ahead of time.
  //
  // Examples:
  //   A consultation for a home service
  INTERPRETATION_NOT_DISPLAYED = 4;
}

Définition du prix du service

// The price of a service.
message ServicePrice {
  // Describes how a Price should be interpreted and displayed to the user.
  RangeInterpretation price_interpretation = 1;

  // The minimum price of the service. Must be set if price_interpretation is
  // set to EXACT, STARTS_AT, or RANGE.
  // price is known.
  // Optional.
  Price min_price = 2;

  // The maximum price of the service. Must be set if price_interpretation is
  // set to RANGE.
  // Optional.
  Price max_price = 3;
}

Price – Définition

// The price of a service or a fee.
message Price {
  // The price in micro-units of the currency.
  // For example: 1.95 USD is 1950000 in micro-units.
  // If your price contains fractions of the smallest currency unit, then it
  // will be rounded using nearest even rounding (e.g. 2.5 cents rounded
  // to 2 cents, 3.5 cents rounded to 4 cents, 0.5 cents rounded to 0 cents,
  // 2.51 cents rounded to 3 cents).
  // Required.
  int64 price_micros = 1;

  // The currency of the price that is defined in ISO 4217.
  // Required.
  string currency_code = 2;

  // An optional and opaque string that identifies the pricing option that is
  // associated with the extended price.
  // Optional.
  string pricing_option_tag = 3;
}
// An action URL for a service.
message ActionLink {

  // The entry point URL for this action link.
  // Required.
  string url = 1;
}

Définition de la durée du service

message ServiceDuration {
  // Describes how a service duration should be interpreted and displayed to
  // the user.
  // Note, if a service (or merchant) doesn't provide service duration, use
  // 'INTERPRETATION_NOT_DISPLAYED' as DurationInterpretation.
  // Required.
  RangeInterpretation duration_interpretation = 1;

  // The minimum duration (in seconds) that the service may take. Must be set
  // if duration_interpretation is set to EXACT, STARTS_AT, or RANGE.
  // Required.
  int64 min_duration_sec = 2;

  // The maximum duration (in seconds) that the service may take. Must be set
  // if duration_interpretation is set to RANGE.
  // Optional.
  int64 max_duration_sec = 3;
}

Définition des indications de classement des services

// Ranking hints for a service.
message ServiceRankingHint {
  // Arbitrary partner or merchant assigned rank for this service.
  //
  // Services with a lower score will be displayed more prominently (e.g.
  // displayed higher in lists).
  //
  // Ranking hints affect both the ordering of services within a service
  // category, and the ordering of the categories themselves. The ranking hint
  // for a category is assumed to be the minimum ranking hint of any item in the
  // category. Note that other factors may also influence the final ranking,
  // such as price, user history, etc.
  //
  // The recommended approach is to define a total ordering on all the services,
  // by assigning each one a unique integer ranking hint and ensuring that
  // ranking hint values don’t overlap between categories. For example, if we
  // want the preferred ordering of categories and services to be:
  // Category 1: A, B, C
  // Category 2: D, E, F
  // Then the simplest ranking hint scheme to indicate this would be:
  // A=1, B=2, C=3, D=4, E=5, F=6.
  //
  // Optional. Must be non-negative if set.
  float score = 1 [features.field_presence = EXPLICIT];
}

Définition de LocalizedString

// Instance of a string in one locale.
message LocalizedString {
  // IETF BCP 47 language code, such as "en", "mas", "zh-Hant", "de-CH-1901".
  // See http://www.w3.org/International/articles/language-tags/.
  // Required.
  string locale = 1;

  // Message in the locale above (UTF-8).
  // Required.
  string value = 2;
}

Exemples de flux de services

Flux de services

{
  "data": [
    {
      "merchant_id": "appointments-merchant-1",
      "service_id": "service-1",
      "localized_service_name": {
          "value": "Service Type 1",
          "localized_value":[
            {
              "locale": "en",
              "value": "Service Type 1"
            },
            {
              "locale": "es",
              "value": "Servicio Tipo 1"
            }
          ]
      },
      "localized_service_category": {
          "value": "Haircut",
          "localized_value": [
            {
              "locale": "en",
              "value": "Haircut"
            },
            {
              "locale": "es",
              "value": "Cortes de pelo"
            }
          ]
      },
      "localized_service_description": {
          "value": "Lorem ipsum dolor sit amet",
          "localized_value":[
            {
              "locale": "en",
              "value": "Lorem ipsum dolor sit amet"
            },
            {
              "locale": "es",
              "value": "el cliente esta muy contento"
            }
          ]
      },
      "service_price": {
          "price_interpretation": "INTERPRETATION_EXACT",
          "min_price": {
              "price_micros": 40000000,
              "currency_code": "USD"
          }
      },
      "action_link": [
        {
          "url": "https://www.rwgpartnerwebsite.com/appointment/service-1/in-person-1"
        }
      ],
      "service_duration": {
          "duration_interpretation": "INTERPRETATION_EXACT",
          "min_duration_sec": 360
      },
      "ranking_hint": {
          "score": 1
      }
    }
  ]
 }

Fichier de descripteur

{
  "generation_timestamp": 1663347730,
  "name": "glam.service.v0",
  "data_file": [
    "glam.service.v0_1663347730_0001.json",
    "glam.service.v0_1663347730_0002.json"
  ]
}