Engage SDK Travel: инструкции по технической интеграции сторонних разработчиков

Повысьте вовлеченность пользователей в приложении, обращаясь к ним там, где они находятся. Интегрируйте Engage SDK, чтобы доставлять персонализированные рекомендации и контент с продолжением прямо пользователям на различных устройствах, таких как «Коллекции» , «Развлечения» и Play Store. Интеграция добавляет менее 50 КБ (в сжатом виде) к среднему размеру APK-файла и занимает около недели времени разработки большинства приложений. Узнайте больше на нашем бизнес-сайте .

В этом руководстве содержатся инструкции для партнеров-разработчиков по размещению контента о путешествиях и мероприятиях на контентных площадках Engage.

Детали интеграции

Терминология

Эта интеграция включает в себя следующие типы кластеров: Рекомендация , Избранное , Бронирование и Продолжить поиск .

  • Кластеры рекомендаций отображают персонализированные предложения путешествий и мероприятий от конкретного разработчика. Эти рекомендации могут быть персонализированными для пользователя или обобщенными (например, популярные товары). Используйте их для отображения рекомендаций по статьям, мероприятиям, вариантам размещения или интересным местам.

    • Кластер рекомендаций может состоять из списков ArticleEntity , EventEntity , LodgingEntity , PointOfInterestEntity или StoreEntity , но не из смеси различных типов сущностей.

    Ваши рекомендации имеют следующую структуру:

    • Кластер рекомендаций: представление пользовательского интерфейса, содержащее группу рекомендаций от одного и того же партнера-разработчика.

    • Сущность: объект, представляющий отдельный элемент в кластере. Эта интеграция предлагает несколько сущностей, которые будут отображаться с помощью кластера рекомендаций:

      • ArticleEntity : ArticleEntity представляет собой рекомендацию по текстовому контенту, связанному с путешествиями и мероприятиями. Его можно использовать для статей, публикаций в блогах, маркетингового контента, новостных заметок и т. д.

        Рисунок 1: Пользовательский интерфейс, показывающий одну ArticleEntity в кластере рекомендаций.
      • EventEntity : EventEntity представляет событие, которое произойдет в будущем. Время начала события — критически важная информация, которую необходимо донести до пользователей.

        Рисунок 2: Пользовательский интерфейс, показывающий один EventEntity в кластере рекомендаций.
      • LodgingEntity : LodgingEntity представляет собой жилье, такое как отель, апартаменты, дом для отдыха для краткосрочной и долгосрочной аренды.

        Рисунок 3: Пользовательский интерфейс, показывающий один объект LodgingEntity в кластере рекомендаций.
      • StoreEntity : StoreEntity представляет магазин, ресторан, кафе и т. д. Он выделяет контент, в котором место общественного питания или магазин являются важной частью информации, которую необходимо донести до пользователей.

        Рисунок 4: Пользовательский интерфейс, показывающий один StoreEntity в кластере рекомендаций.
      • PointOfInterestEntity : PointOfInterestEntity представляет собой объект интереса, например, заправку, место проведения мероприятия, тематический парк, музей, туристическую достопримечательность, пешеходную тропу и т. д. Он выделяет контент, местоположение которого является критически важной информацией, которую необходимо донести до пользователей. Этот объект не следует использовать для обозначения мест проживания, магазинов или ресторанов.

        Рисунок 5: Пользовательский интерфейс, показывающий одну PointOfInterestEntity в кластере рекомендаций.
  • Кластер «Резервирование» отображает контент, недавно просмотренный пользователями от нескольких партнёров-разработчиков, в единой группе пользовательского интерфейса. Каждому партнёру-разработчику будет разрешено транслировать не более 10 объектов в кластере «Резервирование».

    Содержание вашего бронирования может иметь следующую структуру:

    • RestaurantReservationEntity : RestaurantReservationEntity представляет собой бронирование столика в ресторане или кафе и помогает пользователям отслеживать предстоящие или текущие бронирования столиков в ресторане.

      Рисунок 6. Пользовательский интерфейс, показывающий один RestaurantReservationEntity в кластере Reservation.
    • EventReservationEntity : EventReservationEntity представляет собой бронирование на мероприятие и помогает пользователям отслеживать предстоящие или текущие бронирования. События могут включать, помимо прочего, следующие:

      • Спортивные мероприятия, такие как бронирование билетов на футбольный матч
      • Игровые мероприятия, такие как бронирование мест на киберспорт
      • Развлекательные мероприятия, такие как бронирование билетов в кинотеатр, на концерты, в театры, автограф-сессии
      • Бронирование поездок или посещения достопримечательностей, таких как экскурсии с гидом, билеты в музеи
      • Бронирование мест для проведения социальных мероприятий / семинаров / конференций
      • Бронирование образовательных/тренинговых сессий
      Рисунок 7. Пользовательский интерфейс, показывающий один EventReservationEntity в кластере Reservation.
    • LodgingReservationEntity : LodgingEntityReservation представляет собой бронирование жилья для путешествий и помогает пользователям отслеживать предстоящие или текущие бронирования отелей или жилья для отпуска.

      Рисунок 8. Пользовательский интерфейс, показывающий один объект LodgingReservationEntity в кластере Reservation.
    • TransportationReservationEntity : TransportationReservationEntity представляет собой бронирование для перевозки любым видом транспорта и помогает пользователям отслеживать бронирование для предстоящего или текущего рейса, парома, поезда, автобуса, заказа попутчиков или круиза.

      Рисунок 9. Пользовательский интерфейс, показывающий один объект TransportationReservationEntity в кластере Reservation.
    • VehicleRentalReservationEntity : VehicleRentalReservationEntity представляет бронирование аренды транспортного средства и помогает пользователям отслеживать предстоящие или текущие бронирования аренды транспортного средства.

      Рисунок 10. Пользовательский интерфейс, показывающий один объект VehicleRentalReservationEntity в кластере Reservation.
  • Кластер «Избранное» отображает избранные сущности от нескольких партнёров-разработчиков в одной группе пользовательского интерфейса. Будет создан один кластер «Избранное», который будет отображаться в верхней части пользовательского интерфейса и будет иметь приоритет над всеми кластерами «Рекомендации». Каждому партнёру-разработчику будет разрешено транслировать до 10 сущностей в кластере «Избранное».

    • GenericFeaturedEntity : GenericFeaturedEntity отличается от элемента «Рекомендация» тем, что элемент «Избранное» должен использоваться для одного самого популярного контента от разработчиков и должен представлять собой самый важный контент, который будет интересен и актуален для пользователей.

      Рисунок 11: Пользовательский интерфейс, отображающий FeaturedCluster со списком GenericFeaturedEntity
  • Кластер «Продолжить поиск» помогает пользователям продолжить предыдущий поиск путешествий, отображая список поисковых запросов, которые пользователь недавно искал во всех своих туристических приложениях. Кластер будет закреплён на второй позиции, после кластеров бронирования и перед кластерами рекомендуемых и рекомендуемых вариантов. Каждый партнёр-разработчик сможет транслировать до трёх объектов в кластере «Продолжить поиск».

    • PointOfInterestEntity: PointOfInterestEntity представляет собой место интереса, например заправочную станцию, место проведения мероприятия, тематический парк, музей, туристическую достопримечательность, пешеходную тропу и т. д. Он выделяет контент, который пользователь ранее искал.

Предварительная работа

Минимальный уровень API: 19

Добавьте библиотеку com.google.android.engage:engage-core в свое приложение:

dependencies {
    // Make sure you also include that repository in your project's build.gradle file.
    implementation 'com.google.android.engage:engage-core:1.5.2'
}

Краткое содержание

Проект основан на реализации привязанной службы .

На данные, которые клиент может опубликовать, налагаются следующие ограничения для разных типов кластеров:

Тип кластера Пределы кластера Минимальные пределы сущностей в кластере Максимальные пределы сущностей в кластере
Кластер(ы) рекомендаций Максимум 7 По крайней мере 1 Не более 50 ( ArticleEntity , EventEntity , LodgingEntity , StoreEntity или PointOfInterestEntity )
Кластер бронирования Максимум 1 По крайней мере 1 Не более 20 ( RestaurantReservationEntity , EventReservationEntity , LodgingReservationEntity , TransportationReservationEntity или VehicleRentalReservationEntity )
Избранный кластер Максимум 1 По крайней мере 1 Максимум 20 ( GenericFeaturedEntity )
Продолжить поиск кластера Максимум 1 По крайней мере 1 Максимум 3 ( PointOfInterestEntity )

Шаг 1: Предоставьте данные об организации

В SDK определены различные сущности для представления каждого типа товаров. Для категории «Путешествия и мероприятия» поддерживаются следующие сущности:

  1. GenericFeaturedEntity
  2. ArticleEntity
  3. EventEntity
  4. LodgingEntity
  5. StoreEntity
  6. PointOfInterestEntity
  7. RestaurantReservationEntity
  8. EventReservationEntity
  9. LodgingReservationEntity
  10. TransportationReservationEntity
  11. VehicleRentalReservationEntity

В приведенных ниже диаграммах представлены доступные атрибуты и требования для каждого типа.

GenericFeaturedEntity

Атрибут Требование Описание Формат
Действие Uri Необходимый

Глубокая ссылка на сущность в приложении поставщика.

Примечание: для атрибуции можно использовать внешние ссылки. См. раздел «Часто задаваемые вопросы».

Ури
Изображения постеров Необходимый

При наличии нескольких изображений будет показано только одно. Рекомендуемое соотношение сторон — 16:9.

Примечание: Если предоставляется бейдж, обеспечьте безопасное пространство в 24 dps сверху и снизу изображения.

Инструкции см. в разделе «Характеристики изображения» .
Заголовок Необязательный Название организации.

Свободный текст

Рекомендуемый размер текста: 50 символов.

Описание Необязательный

Один абзац текста, описывающий сущность.

Примечание: пользователю будет показано либо описание, либо список субтитров, но не оба сразу.

Свободный текст

Рекомендуемый размер текста: 180 символов.

Список субтитров Необязательный

До 3 субтитров, каждый из которых представляет собой отдельную строку текста.

Примечание: пользователю будет показано либо описание, либо список субтитров, но не оба сразу.

Свободный текст

Рекомендуемый размер текста для каждого субтитра: не более 50 символов.

Значки Необязательный

Каждый значок представляет собой либо свободный текст (максимум 15 символов), либо небольшое изображение.

Специальная обработка UX поверх изображения/видео, например, наложение значка на изображение

  • «Обновление в режиме реального времени»
  • Продолжительность чтения статьи
Значок - Текст Необязательный

Название значка

Примечание: для значка требуется текст или изображение.

Свободный текст

Рекомендуемый размер текста: не более 15 символов.

Значок - Изображение Необязательный

Маленькое изображение

Специальная обработка UX, например, наложение значка на миниатюру изображения/видео.

Примечание: для значка требуется текст или изображение.

Инструкции см. в разделе «Характеристики изображения» .
Категории контента Необязательный Опишите категорию контента в сущности.

Список перечислений

Инструкции см. в разделе «Категория контента» .

DisplayTimeWindow (необязательно) — задайте временное окно для отображения содержимого на поверхности.
Начальная временная метка Необязательный

Метка времени эпохи, после которой контент должен быть отображен на поверхности.

Если не установлено, содержимое может быть отображено на поверхности.

Метка времени эпохи в миллисекундах
Конечная временная метка Необязательный

Метка времени эпохи, после которой контент больше не отображается на поверхности.

Если не установлено, содержимое может быть отображено на поверхности.

Метка времени эпохи в миллисекундах

ArticleEntity

Атрибут Требование Описание Формат
Действие Uri Необходимый

Глубокая ссылка на сущность в приложении поставщика.

Примечание: для атрибуции можно использовать внешние ссылки. См. раздел «Часто задаваемые вопросы».

Ури
Заголовок Необходимый Название организации.

Свободный текст

Рекомендуемый размер текста: максимум 50 символов.

Изображения постеров Необязательный

При наличии нескольких изображений будет показано только одно. Рекомендуемое соотношение сторон — 16:9.

Примечание: Изображение настоятельно рекомендуется. Если вы используете бейдж, оставьте свободное пространство 24 dps сверху и снизу изображения.

Инструкции см. в разделе «Характеристики изображения» .
Источник - Название Необязательный Имя автора, организации или репортера

Свободный текст

Рекомендуемый размер текста: менее 25 символов.

Источник - Изображение Необязательный Изображение источника, например автора, организации, репортера Инструкции см. в разделе «Характеристики изображения» .
Описание Необязательный

Один абзац текста, описывающий сущность.

Примечание: пользователю будет показано либо описание, либо список субтитров, но не оба сразу.

Свободный текст

Рекомендуемый размер текста: 180 символов.

Список субтитров Необязательный

До 3 субтитров, каждый из которых представляет собой отдельную строку текста.

Примечание: пользователю будет показано либо описание, либо список субтитров, но не оба сразу.

Свободный текст

Рекомендуемый размер текста для каждого субтитра: не более 50 символов.

Значки Необязательный

Каждый значок представляет собой либо свободный текст (максимум 15 символов), либо небольшое изображение.

Специальная UX-обработка поверх изображения/видео, например, наложение значка на изображение

  • «Обновление в режиме реального времени»
  • Продолжительность чтения статьи
Значок - Текст Необязательный

Название значка

Примечание: для значка требуется текст или изображение.

Свободный текст

Рекомендуемый размер текста: не более 15 символов.

Значок - Изображение Необязательный

Маленькое изображение

Специальная обработка UX, например, наложение значка на миниатюру изображения/видео.

Примечание: для значка требуется текст или изображение.

Инструкции см. в разделе «Характеристики изображения» .
Время публикации контента Необязательный Это временная метка эпохи в миллисекундах, когда контент был опубликован/обновлен в приложении. Метка времени эпохи в миллисекундах
Время последнего участия Необязательный

Метка времени в миллисекундах, когда пользователь последний раз взаимодействовал с этой сущностью.

Метка времени эпохи в миллисекундах
Процент прогресса Необязательный

Процент всего контента, потребленного пользователем на текущий момент.

Целочисленное значение от 0 до 100 включительно.
Категории контента Необязательный Опишите категорию контента в сущности.

Список перечислений

Инструкции см. в разделе «Категория контента» .

DisplayTimeWindow (необязательно) — задайте временное окно для отображения содержимого на поверхности.
Начальная временная метка Необязательный

Метка времени эпохи, после которой контент должен быть отображен на поверхности.

Если не установлено, содержимое может быть отображено на поверхности.

Метка времени эпохи в миллисекундах
Конечная временная метка Необязательный

Метка времени эпохи, после которой контент больше не отображается на поверхности.

Если не установлено, содержимое может быть отображено на поверхности.

Метка времени эпохи в миллисекундах

EventEntity

Атрибут Требование Описание Формат
Действие Uri Необходимый

Глубокая ссылка на сущность в приложении поставщика.

Примечание: для атрибуции можно использовать внешние ссылки. См. раздел «Часто задаваемые вопросы».

Ури
Заголовок Необходимый Название организации.

Нить

Рекомендуемый размер текста: максимум 50 символов.

Локализованное время начала — временная метка Необходимый

Метка времени эпохи, когда ожидается начало события.

Joda-Time Instant
Локализованное время начала — часовой пояс Необходимый

Часовой пояс, в котором ожидается начало события.

Joda-Time DateTimeZone

Инструкции см. в разделе Характеристики часовых поясов .

Режим событий Необходимый

Поле для указания того, будет ли мероприятие виртуальным, очным или и тем, и другим.

Перечисление: VIRTUAL, IN_PERSON или HYBRID
Изображения постеров Необходимый

При наличии нескольких изображений будет показано только одно. Рекомендуемое соотношение сторон — 16:9.

Примечание: Изображение настоятельно рекомендуется. Если вы используете бейдж, оставьте свободное пространство 24 dps сверху и снизу изображения.

Инструкции см. в разделе «Характеристики изображения» .
Местоположение - Страна Условно требуется

Страна, в которой происходит событие.

Примечание: это требуется для мероприятий IN_PERSON или HYBRID.

Свободный текст

Рекомендуемый размер текста: максимум ~20 символов.

Местоположение - Город Условно требуется

Город, в котором происходит событие.

Примечание: это требуется для мероприятий IN_PERSON или HYBRID.

Свободный текст

Рекомендуемый размер текста: максимум ~20 символов.

Местоположение - Отображение адреса Условно требуется

Адрес или название места проведения мероприятия, которое должно отображаться пользователю.

Примечание: это требуется для мероприятий IN_PERSON или HYBRID.

Свободный текст

Рекомендуемый размер текста: максимум ~20 символов.

Местоположение - Уличный адрес Необязательный Укажите почтовый адрес (если применимо) места проведения мероприятия.

Свободный текст

Рекомендуемый размер текста: максимум ~20 символов.

Местоположение - Штат Необязательный Штат или провинция (если применимо), в которой проводится мероприятие.

Свободный текст

Рекомендуемый размер текста: максимум ~20 символов.

Местоположение - почтовый индекс Необязательный Почтовый индекс (если применимо) места проведения мероприятия.

Свободный текст

Рекомендуемый размер текста: максимум ~20 символов.

Расположение - Район Необязательный Район (если применимо), в котором проводится мероприятие.

Свободный текст

Рекомендуемый размер текста: максимум ~20 символов.

Время окончания Необязательный

Метка времени эпохи, когда ожидается окончание события.

Примечание: данные будут представлены в миллисекундах.

Метка времени эпохи в миллисекундах
Описание Необязательный

Один абзац текста, описывающий сущность.

Примечание: пользователю будет показано либо описание, либо список субтитров, но не оба сразу.

Свободный текст

Рекомендуемый размер текста: 180 символов.

Список субтитров Необязательный

До 3 субтитров, каждый из которых представляет собой отдельную строку текста.

Примечание: пользователю будет показано либо описание, либо список субтитров, но не оба сразу.

Свободный текст

Рекомендуемый размер текста для каждого субтитра: не более 50 символов.

Значки Необязательный

Каждый значок представляет собой либо свободный текст (максимум 15 символов), либо небольшое изображение.

Значок - Текст Необязательный

Название значка

Примечание: для значка требуется текст или изображение.

Свободный текст

Рекомендуемый размер текста: не более 15 символов.

Значок - Изображение Необязательный

Маленькое изображение

Специальная обработка UX, например, наложение значка на миниатюру изображения/видео.

Примечание: для значка требуется текст или изображение.

Инструкции см. в разделе «Характеристики изображения» .
Цена - Текущая цена Условно требуется

Текущая цена билета/пропуска на мероприятие.

Обязательно должно быть указано, если указана зачеркнутая цена.

Свободный текст
Цена - ЗачеркнутаяЦена Необязательный Первоначальная цена билета/пропуска на мероприятие. Свободный текст
Вызов цены Необязательный Указание цены с указанием акции, события, скидки для участников (если таковая имеется).

Свободный текст

Рекомендуемый размер текста: менее 45 символов (слишком длинный текст может содержать многоточия)

Категории контента Необязательный Опишите категорию контента в сущности.

Список допустимых перечислений

  • TYPE_MOVIES_AND_TV_SHOWS (Пример - Кинотеатр)
  • TYPE_DIGITAL_GAMES (Пример - Киберспорт)
  • TYPE_MUSIC (Пример - Концерт)
  • TYPE_TRAVEL_AND_LOCAL (Пример — тур, фестиваль)
  • ТИП_ЗДОРОВЬЕ_И_ФИТНЕС (Пример — Занятия йогой)
  • ТИП_ОБРАЗОВАНИЯ (Пример - Класс)
  • TYPE_SPORTS (Пример — Футбольный матч)
  • ТИП_ЗНАКОМСТВА (Пример - встреча)

Инструкции см. в разделе «Категория контента» .

DisplayTimeWindow (необязательно) — задайте временное окно для отображения содержимого на поверхности.
Начальная временная метка Необязательный

Метка времени эпохи, после которой контент должен быть отображен на поверхности.

Если не установлено, содержимое может быть отображено на поверхности.

Метка времени эпохи в миллисекундах
Конечная временная метка Необязательный

Метка времени эпохи, после которой контент больше не отображается на поверхности.

Если не установлено, содержимое может быть отображено на поверхности.

Метка времени эпохи в миллисекундах

LodgingEntity

Атрибут Требование Описание Формат
Действие Uri Необходимый

Глубокая ссылка на сущность в приложении поставщика.

Примечание: для атрибуции можно использовать внешние ссылки. См. раздел «Часто задаваемые вопросы».

Ури
Заголовок Необходимый Название организации.

Нить

Рекомендуемый размер текста: максимум 50 символов.

Изображения постеров Необходимый

При наличии нескольких изображений будет показано только одно. Рекомендуемое соотношение сторон — 16:9.

Примечание: Если предоставляется бейдж, обеспечьте безопасное пространство в 24 dps сверху и снизу изображения.

Инструкции см. в разделе «Характеристики изображения» .
Местоположение - Страна Необходимый Страна, в которой происходит проживание.

Свободный текст

Рекомендуемый размер текста: максимум ~20 символов.

Местоположение - Город Необходимый Город, в котором происходит размещение.

Свободный текст

Рекомендуемый размер текста: максимум ~20 символов.

Местоположение - Отображение адреса Необходимый Адрес, который будет отображаться пользователю. В большинстве случаев мы рекомендуем указывать название города и, по возможности, штат или страну. Указывайте улицу или район только в том случае, если пользователь находится рядом с этим местом, знаком с ним или город указан в названии кластера. Если вы указываете улицу, укажите краткий адрес, используя сокращения, где это возможно (например, «St» вместо «Street», «Ave» вместо «Avenue»).

Свободный текст

Рекомендуемый размер текста: максимум ~20 символов.

Местоположение - Уличный адрес Необязательный Укажите почтовый адрес (если применимо) места проживания.

Свободный текст

Рекомендуемый размер текста: максимум ~20 символов.

Местоположение - Штат Необязательный Штат или провинция (если применимо), в которой расположено жилье.

Свободный текст

Рекомендуемый размер текста: максимум ~20 символов.

Местоположение - почтовый индекс Необязательный Почтовый индекс (если применимо) места проживания.

Свободный текст

Рекомендуемый размер текста: максимум ~20 символов.

Расположение - Район Необязательный Район (если применимо), где находится жилье.

Свободный текст

Рекомендуемый размер текста: максимум ~20 символов.

Значки Необязательный

Каждый значок представляет собой либо свободный текст (максимум 15 символов), либо небольшое изображение.

Значок - Текст Необязательный

Название значка

Примечание: для значка требуется текст или изображение.

Свободный текст

Рекомендуемый размер текста: не более 15 символов.

Значок - Изображение Необязательный

Маленькое изображение

Специальная обработка UX, например, наложение значка на миниатюру изображения/видео.

Примечание: для значка требуется текст или изображение.

Инструкции см. в разделе «Характеристики изображения» .
Описание Необязательный

Один абзац текста, описывающий сущность.

Примечание: пользователю будет показано либо описание, либо список субтитров, но не оба сразу.

Свободный текст

Рекомендуемый размер текста: 180 символов.

Список субтитров Необязательный

До 3 субтитров, каждый из которых представляет собой отдельную строку текста.

Примечание: пользователю будет показано либо описание, либо список субтитров, но не оба сразу.

Свободный текст

Рекомендуемый размер текста для каждого субтитра: не более 50 символов.

AvailabilityTimeWindow — локализованное время начала — временная метка Необязательный Метка времени эпохи, когда ожидается открытие/доступность жилья. Joda-Time Instant
AvailabilityTimeWindow — локализованное время начала — часовой пояс Необязательный Часовой пояс, в котором ожидается открытие/доступность жилья.

Joda-Time DateTimeZone

Инструкции см. в разделе Характеристики часовых поясов .

AvailabilityTimeWindow — локализованное время окончания — временная метка Необязательный Метка времени эпохи, до которой ожидается, что жилье будет открыто/доступно. Joda-Time Instant
AvailabilityTimeWindow — локализованное время окончания — часовой пояс Необязательный Часовой пояс, в котором ожидается открытие/доступность жилья.

Joda-Time DateTimeZone

Инструкции см. в разделе Характеристики часовых поясов .

Рейтинг - Максимальное значение Необязательный

Максимальное значение шкалы оценок.

Обязательно, если указано текущее значение рейтинга.

Число >= 0,0
Рейтинг - Текущее значение Необязательный

Текущее значение шкалы оценки.

Обязательно должно быть указано, если также указано максимальное значение рейтинга.

Число >= 0,0
Рейтинг - Количество Необязательный

Количество оценок объекта размещения.

Примечание: укажите это поле, если ваше приложение хочет управлять отображением этого значения для пользователей. Укажите краткую строку, которая будет отображаться для пользователя. Например, если значение равно 1 000 000, рассмотрите возможность использования сокращений, таких как 1M, чтобы оно не обрезалось на экранах с меньшим разрешением.

Нить
Рейтинг - Количество Необязательный

Количество оценок объекта размещения.

Примечание: укажите это поле, если вы не хотите самостоятельно обрабатывать логику отображения сокращений. Если указаны и Count, и Count Value, мы будем использовать Count для отображения пользователям.

Длинный
Цена - Текущая цена Условно требуется

Текущая цена проживания.

Обязательно должно быть указано, если указана зачеркнутая цена.

Свободный текст
Цена - ЗачеркнутаяЦена Необязательный Первоначальная цена размещения, которая будет зачеркнута в пользовательском интерфейсе. Свободный текст
Вызов цены Необязательный Указание цены с указанием акции, события, скидки для участников (если таковая имеется).

Свободный текст

Рекомендуемый размер текста: менее 45 символов (слишком длинный текст может содержать многоточия)

DisplayTimeWindow (необязательно) — задайте временное окно для отображения содержимого на поверхности.
Начальная временная метка Необязательный

Метка времени эпохи, после которой контент должен быть отображен на поверхности.

Если не установлено, содержимое может быть отображено на поверхности.

Метка времени эпохи в миллисекундах
Конечная временная метка Необязательный

Метка времени эпохи, после которой контент больше не отображается на поверхности.

Если не установлено, содержимое может быть отображено на поверхности.

Метка времени эпохи в миллисекундах

StoreEntity

Объект StoreEntity представляет собой отдельный магазин, который партнеры-разработчики хотят опубликовать, например популярное место общественного питания или закусочная, имеющее отношение к путешествиям.

Атрибут Требование Описание Формат
Изображения постеров Необходимый Необходимо предоставить хотя бы одно изображение. Инструкции см. в разделе «Характеристики изображения» .
Действие Uri Необходимый

Глубокая ссылка на сущность в приложении поставщика.

Примечание: для атрибуции можно использовать внешние ссылки. См. раздел «Часто задаваемые вопросы».

Ури
Заголовок Необязательный Название магазина.

Свободный текст

Рекомендуемый размер текста: менее 45 символов (слишком длинный текст может содержать многоточия)

Расположение Необязательный Местоположение магазина.

Свободный текст

Рекомендуемый размер текста: менее 45 символов (слишком длинный текст может содержать многоточия)

Вызывать Необязательный Расскажите об акции, мероприятии или обновлении магазина, если таковое имеется.

Свободный текст

Рекомендуемый размер текста: менее 45 символов (слишком длинный текст может содержать многоточия)

Выноска мелким шрифтом Необязательный Текст выноски, набранный мелким шрифтом.

Свободный текст

Рекомендуемый размер текста: менее 45 символов (слишком длинный текст может содержать многоточия)

Описание Необязательный Описание магазина.

Свободный текст

Рекомендуемый размер текста: менее 90 символов (слишком длинный текст может содержать многоточия)

Категория Необязательный

Категория магазина, в контексте заведений общественного питания, это может быть кухня типа «французская», «новая американская», «рамен», «изысканная кухня».

Свободный текст

Рекомендуемый размер текста: менее 45 символов (слишком длинный текст может содержать многоточия)

Рейтинг - Максимальное значение Необязательный

Максимальное значение шкалы оценок.

Обязательно, если указано текущее значение рейтинга.

Число >= 0,0
Рейтинг - Текущее значение Необязательный

Текущее значение шкалы оценки.

Обязательно должно быть указано, если также указано максимальное значение рейтинга.

Число >= 0,0
Рейтинг - Количество Необязательный

Количество оценок объекта размещения.

Примечание: укажите это поле, если ваше приложение хочет управлять отображением этого значения для пользователей. Укажите краткую строку, которая будет отображаться для пользователя. Например, если значение равно 1 000 000, рассмотрите возможность использования сокращений, таких как 1M, чтобы оно не обрезалось на экранах с меньшим разрешением.

Нить
Рейтинг - Количество Необязательный

Количество оценок объекта размещения.

Примечание: укажите это поле, если вы не хотите самостоятельно обрабатывать логику отображения сокращений. Если указаны и Count, и Count Value, мы будем использовать Count для отображения пользователям.

Длинный
DisplayTimeWindow (необязательно) — задайте временное окно для отображения содержимого на поверхности.
Начальная временная метка Необязательный

Метка времени эпохи, после которой контент должен быть отображен на поверхности.

Если не установлено, содержимое может быть отображено на поверхности.

Метка времени эпохи в миллисекундах
Конечная временная метка Необязательный

Метка времени эпохи, после которой контент больше не отображается на поверхности.

Если не установлено, содержимое может быть отображено на поверхности.

Метка времени эпохи в миллисекундах

PointOfInterestEntity

Атрибут Требование Описание Формат
Действие Uri Необходимый

Глубокая ссылка на сущность в приложении поставщика.

Примечание: для атрибуции можно использовать внешние ссылки. См. раздел «Часто задаваемые вопросы».

Ури
Заголовок Необходимый Название организации.

Нить

Рекомендуемый размер текста: максимум 50 символов.

Изображения постеров Условно требуется

При наличии нескольких изображений будет показано только одно. Рекомендуемое соотношение сторон — 16:9.

Примечание: Изображение обязательно, если объект входит в кластер рекомендаций. Если предоставляется значок, обеспечьте свободное пространство в 24 точки сверху и снизу изображения.

Инструкции см. в разделе «Характеристики изображения» .
Время последнего участия Условно требуется

Метка времени эпохи, когда пользователь последний раз взаимодействовал с этой сущностью.

Примечание: это поле обязательно для заполнения, если объект является частью кластера продолжения поиска.

Joda-Time Instant
Местоположение - Страна Условно требуется

Страна, в которой происходит событие.

Примечание: это поле обязательно для заполнения, если объект является частью кластера рекомендаций.

Свободный текст

Рекомендуемый размер текста: максимум ~20 символов.

Местоположение - Город Условно требуется

Город, в котором происходит событие.

Примечание: это поле обязательно для заполнения, если объект является частью кластера рекомендаций.

Свободный текст

Рекомендуемый размер текста: максимум ~20 символов.

Местоположение - Отображение адреса Условно требуется

Адрес, который будет отображаться пользователю. Укажите краткий адрес, используя сокращения, где это возможно (например, «St» вместо «Street», «Ave» вместо «Avenue»). Эта строка может быть сокращена в зависимости от устройства пользователя и его настроек. Для чёткой идентификации укажите название города.

Примечание: это поле обязательно для заполнения, если объект является частью кластера рекомендаций.

Свободный текст

Рекомендуемый размер текста: максимум ~35 символов.

Местоположение - Уличный адрес Необязательный Укажите почтовый адрес (если применимо) интересующего вас объекта.

Свободный текст

Рекомендуемый размер текста: максимум ~20 символов.

Местоположение - Штат Необязательный Штат или провинция (если применимо), в которой расположен объект интереса.

Свободный текст

Рекомендуемый размер текста: максимум ~20 символов.

Местоположение - почтовый индекс Необязательный Почтовый индекс (если применимо) интересующего вас места.

Свободный текст

Рекомендуемый размер текста: максимум ~20 символов.

Расположение - Район Необязательный Окрестности (если применимо) интересующего вас объекта.

Свободный текст

Рекомендуемый размер текста: максимум ~20 символов.

AvailabilityTimeWindow — локализованное время начала — временная метка Необязательный Метка времени эпохи, когда ожидается открытие/доступность интересующей точки. Joda-Time Instant
AvailabilityTimeWindow — локализованное время начала — часовой пояс Необязательный Часовой пояс, в котором ожидается открытие/доступность интересующего объекта.

Joda-Time DateTimeZone

Инструкции см. в разделе Характеристики часовых поясов .

AvailabilityTimeWindow — локализованное время окончания — временная метка Необязательный Метка времени эпохи, до которой ожидается, что объект интереса будет открыт/доступен. Joda-Time Instant
AvailabilityTimeWindow — локализованное время окончания — часовой пояс Необязательный Часовой пояс, в котором ожидается открытие/доступность интересующего объекта.

Joda-Time DateTimeZone

Инструкции см. в разделе Характеристики часовых поясов .

Значки Необязательный

Каждый значок представляет собой либо свободный текст (максимум 15 символов), либо небольшое изображение.

Значок - Текст Необязательный

Название значка

Примечание: для значка требуется текст или изображение.

Свободный текст

Рекомендуемый размер текста: не более 15 символов.

Значок - Изображение Необязательный

Маленькое изображение

Специальная обработка UX, например, наложение значка на миниатюру изображения/видео.

Примечание: для значка требуется текст или изображение.

Инструкции см. в разделе «Характеристики изображения» .
Описание Необязательный

Один абзац текста, описывающий сущность.

Примечание: пользователю будет показано либо описание, либо список субтитров, но не оба сразу.

Свободный текст

Рекомендуемый размер текста: 180 символов.

Список субтитров Необязательный

До 3 субтитров, каждый из которых представляет собой отдельную строку текста.

Примечание: пользователю будет показано либо описание, либо список субтитров, но не оба сразу.

Свободный текст

Рекомендуемый размер текста для каждого субтитра: не более 50 символов.

Рейтинг - Максимальное значение Необязательный

Максимальное значение шкалы оценок.

Обязательно, если указано текущее значение рейтинга.

Число >= 0,0
Рейтинг - Текущее значение Необязательный

Текущее значение шкалы оценки.

Обязательно должно быть указано, если также указано максимальное значение рейтинга.

Число >= 0,0
Рейтинг - Количество Необязательный

Количество оценок объекта интереса.

Примечание: укажите это поле, если ваше приложение хочет управлять отображением этого значения для пользователей. Укажите краткую строку, которая будет отображаться для пользователя. Например, если значение равно 1 000 000, рассмотрите возможность использования сокращений, таких как 1M, чтобы оно не обрезалось на экранах с меньшим разрешением.

Нить
Рейтинг - Количество Необязательный

Количество оценок объекта интереса.

Примечание: укажите это поле, если вы не хотите самостоятельно обрабатывать логику отображения сокращений. Если указаны и Count, и Count Value, мы будем использовать Count для отображения пользователям.

Длинный
Цена - Текущая цена Условно требуется

Текущая цена билетов/пропусков для посещения интересующего объекта.

Обязательно должно быть указано, если указана зачеркнутая цена.

Свободный текст
Цена - ЗачеркнутаяЦена Необязательный Первоначальная цена билетов/входного билета на посещение достопримечательности. Свободный текст
Вызов цены Необязательный Указание цены с указанием акции, события, скидки для участников (если таковая имеется).

Свободный текст

Рекомендуемый размер текста: менее 45 символов (слишком длинный текст может содержать многоточия)

Категории контента Необязательный Опишите категорию контента в сущности.

Список допустимых перечислений

  • ТИП_ПУТЕШЕСТВИЯ_И_МЕСТНОСТИ
  • TYPE_MOVIES_AND_TV_SHOWS (Пример - театр)
  • TYPE_MEDICAL (Пример - больница)
  • ТИП_ОБРАЗОВАНИЯ (Пример - школа)
  • TYPE_SPORTS (Пример - стадион)

Инструкции см. в разделе «Категория контента» .

DisplayTimeWindow (необязательно) — задайте временное окно для отображения содержимого на поверхности.
Начальная временная метка Необязательный

Метка времени эпохи, после которой контент должен быть отображен на поверхности.

Если не установлено, содержимое может быть отображено на поверхности.

Метка времени эпохи в миллисекундах
Конечная временная метка Необязательный

Метка времени эпохи, после которой контент больше не отображается на поверхности.

Если не установлено, содержимое может быть отображено на поверхности.

Метка времени эпохи в миллисекундах

RestaurantReservationEntity

Атрибут Требование Описание Формат
Действие Uri Необходимый

Глубокая ссылка на сущность в приложении поставщика.

Примечание: для атрибуции можно использовать внешние ссылки. См. раздел «Часто задаваемые вопросы».

Ури
Заголовок Необходимый Название организации.

Нить

Рекомендуемый размер текста: максимум 50 символов.

Локализованное время начала бронирования — временная метка Необходимый Метка времени эпохи, когда ожидается начало резервирования. Joda-Time Instant
Локализованное время начала бронирования — часовой пояс Необходимый Часовой пояс, в котором ожидается начало бронирования.

Joda-Time DateTimeZone

Инструкции см. в разделе Характеристики часовых поясов .

Местоположение - Страна Необходимый Страна, в которой находится ресторан.

Свободный текст

Рекомендуемый размер текста: максимум ~20 символов.

Местоположение - Город Необходимый Город, в котором находится ресторан.

Свободный текст

Рекомендуемый размер текста: максимум ~20 символов.

Местоположение - Отображение адреса Необходимый Адрес ресторана, который будет отображаться пользователю.

Свободный текст

Рекомендуемый размер текста: максимум ~20 символов.

Местоположение - Уличный адрес Необязательный Укажите почтовый адрес ресторана (если применимо).

Свободный текст

Рекомендуемый размер текста: максимум ~20 символов.

Местоположение - Штат Необязательный Штат или провинция (если применимо), в которой расположен ресторан.

Свободный текст

Рекомендуемый размер текста: максимум ~20 символов.

Местоположение - почтовый индекс Необязательный Почтовый индекс ресторана (если применимо).

Свободный текст

Рекомендуемый размер текста: максимум ~20 символов.

Расположение - Район Необязательный Район расположения ресторана (если применимо).

Свободный текст

Рекомендуемый размер текста: максимум ~20 символов.

Изображения постеров Необязательный При наличии нескольких изображений будет показано только одно. Рекомендуемое соотношение сторон — 16:9. Инструкции см. в разделе «Характеристики изображения» .
Описание Необязательный

Один абзац текста, описывающий сущность.

Примечание: пользователю будет показано либо описание, либо список субтитров, но не оба сразу.

Свободный текст

Рекомендуемый размер текста: 180 символов.

Список субтитров Необязательный

До 3 субтитров, каждый из которых представляет собой отдельную строку текста.

Примечание: пользователю будет показано либо описание, либо список субтитров, но не оба сразу.

Свободный текст

Рекомендуемый размер текста для каждого субтитра: не более 50 символов.

Размер стола Необязательный Количество человек в группе бронирования Целое число > 0
DisplayTimeWindow (необязательно) — задайте временное окно для отображения содержимого на поверхности.
Начальная временная метка Необязательный

Метка времени эпохи, после которой контент должен быть отображен на поверхности.

Если не установлено, содержимое может быть отображено на поверхности.

Метка времени эпохи в миллисекундах
Конечная временная метка Необязательный

Метка времени эпохи, после которой контент больше не отображается на поверхности.

Если не установлено, содержимое может быть отображено на поверхности.

Метка времени эпохи в миллисекундах

EventReservationEntity

Атрибут Требование Описание Формат
Действие Uri Необходимый

Глубокая ссылка на сущность в приложении поставщика.

Примечание: для атрибуции можно использовать внешние ссылки. См. раздел «Часто задаваемые вопросы».

Ури
Заголовок Необходимый Название организации.

Нить

Рекомендуемый размер текста: максимум 50 символов.

Локализованное время начала — временная метка Необходимый

Метка времени эпохи, когда ожидается начало события.

Joda-Time Instant
Локализованное время начала — часовой пояс Необходимый

Часовой пояс, в котором ожидается начало события.

Joda-Time DateTimeZone

See Timezone Specifications for guidance.

Event mode Необходимый

A field to indicate whether the event will be virtual, in-person or both.

Enum: VIRTUAL, IN_PERSON, or HYBRID
Location - Country Условно требуется

The country in which the event is happening.

Note: This is required for events which are IN_PERSON or HYBRID

Свободный текст

Recommended text size: max ~20 chars

Location - City Условно требуется

The city in which the event is happening.

Note: This is required for events which are IN_PERSON or HYBRID

Свободный текст

Recommended text size: max ~20 chars

Location - Display Address Условно требуется

The address or venue name where the event will take place that should be displayed to the user.

Note: This is required for events which are IN_PERSON or HYBRID

Свободный текст

Recommended text size: max ~20 chars

Location - Street Address Необязательный The street address (if applicable) of the location at which event is being hosted.

Свободный текст

Recommended text size: max ~20 chars

Location - State Необязательный The state or province (if applicable) in which the event is being hosted.

Свободный текст

Recommended text size: max ~20 chars

Location - Zip code Необязательный The zip code (if applicable) of the location in which the event is being hosted.

Свободный текст

Recommended text size: max ~20 chars

Location - Neighborhood Необязательный The neighborhood (if applicable) in which the event is being hosted.

Свободный текст

Recommended text size: max ~20 chars

Poster images Необязательный

We will show only 1 image when multiple images are provided. Recommended aspect ratio is 16:9

Note: Image is highly recommended. If a badge is provided, ensure safe space of 24 dps at both the top and bottom of the image

See Image Specifications for guidance.
Localized End time - Timestamp Необязательный

The epoch timestamp when the event is expected to end.

Joda-Time Instant
Localized End time - Timezone Необязательный

The timezone in which the event is expected to end.

Joda-Time DateTimeZone

See Timezone Specifications for guidance.

Service Provider - Name Необязательный

The name of the service provider.

Note: Either text or image is required for the service provider.

Free text. For example, name of the event organizer/tour
Service Provider - Image Необязательный

The logo/image of the service provider.

Note: Either text or image is required for the service provider.

See Image Specifications for guidance.
Описание Необязательный

A single paragraph of text to describe the entity.

Note: Either description or subtitle list will be displayed to the user, not both.

Свободный текст

Recommended text size: 180 chars

Subtitle list Необязательный

Up to 3 subtitles, with each subtitle a single line of text.

Note: Either description or subtitle list will be displayed to the user, not both.

Свободный текст

Recommended text size for each subtitle: max 50 chars

Значки Необязательный

Each badge is either free text (max 15 chars) or small image.

Badge - Text Необязательный

Title for the badge

Note: Either text or image is required for the badge

Свободный текст

Recommended text size: max 15 chars

Badge - Image Необязательный

Small image

Special UX treatment, for example as badge overlay on the image/video thumbnail.

Note: Either text or image is required for the badge

See Image Specifications for guidance.
Идентификатор бронирования Необязательный The reservation ID for the event reservation. Свободный текст
Price - CurrentPrice Условно требуется

The current price of the ticket/pass for the event.

Must be provided if strikethrough price is provided.

Свободный текст
Price - StrikethroughPrice Необязательный The original price of the ticket/pass for the event. Свободный текст
Price Callout Необязательный Price callout to feature a promo, event, member discount, if available.

Свободный текст

Recommended text size: under 45 chars (Text that is too long may show ellipses)

Rating - Max value Необязательный

The maximum value of the rating scale.

Must be provided if current value of rating is also provided.

Number >= 0.0
Rating - Current value Необязательный

The current value of the rating scale.

Must be provided if maximum value of rating is also provided.

Number >= 0.0
Rating - Count Необязательный

The count of the ratings for the event.

Note: Provide this field if your app wants to control how this is displayed to the users. Provide the concise string that can be displayed to the user. For example, if the count is 1,000,000, consider using abbreviations like 1M, so that it won't be truncated on smaller display sizes.

Нить
Rating - Count Value Необязательный

The count of the ratings for the event.

Note: Provide this field if you don't want to handle the display abbreviation logic yourself. If both Count and Count Value are present, we will use the Count to display to users

Длинный
Content Categories Необязательный Describe the category of the content in the entity.

List of Eligible Enums

  • TYPE_MOVIES_AND_TV_SHOWS (Example - Cinema)
  • TYPE_DIGITAL_GAMES (Example - eSports)
  • TYPE_MUSIC (Example - Concert)
  • TYPE_TRAVEL_AND_LOCAL (Example - Tour, festival)
  • TYPE_HEALTH_AND_FITENESS (Example - Yoga class)
  • TYPE_EDUCATION (Example - Class)
  • TYPE_SPORTS (Example - Football game)
  • TYPE_DATING (Example - meetup)

See the Content Category section for guidance.

DisplayTimeWindow (Optional) - Set a time window for a content to be shown on the surface
Start Timestamp Необязательный

The epoch timestamp after which the content should be shown on the surface.

If not set, content is eligible to be shown on the surface.

Epoch timestamp in milliseconds
End Timestamp Необязательный

The epoch timestamp after which the content is no longer shown on the surface.

If not set, content is eligible to be shown on the surface.

Epoch timestamp in milliseconds

LodgingReservationEntity

Атрибут Требование Описание Формат
Action Uri Необходимый

Deep Link to the entity in the provider app.

Note: You can use deep links for attribution. Refer to this FAQ

Ури
Заголовок Необходимый Title of the entity.

Free text. For example, "Your Stay from Dec 12th"

Recommended text size: Max 50 chars

Localized Check-in Time - Timestamp Необходимый The epoch timestamp that represents the check in time for the reservation. Joda-Time Instant
Localized Check-in Time - Timezone Необходимый The timezone in which the check in time exists for the reservation.

Joda-Time DateTimeZone

See Timezone Specifications for guidance.

Localized Check-out Time - Timestamp Необходимый The epoch timestamp that represents the check out time for the reservation. Joda-Time Instant
Localized Check-out Time - Timezone Необходимый The timezone in which the check out time exists for the reservation.

Joda-Time DateTimeZone

See Timezone Specifications for guidance.

Location - Country Необходимый The country in which the lodging is located.

Свободный текст

Recommended text size: max ~20 chars

Location - City Необходимый The city in which the lodging is located.

Свободный текст

Recommended text size: max ~20 chars

Location - Display Address Необходимый The address that will be displayed to the user. Provide a succinct address, using abbreviations where possible (for example, "St" for "Street", "Ave" for "Avenue"). This string may be truncated depending on the user's device and settings. Include the city name for clear identification.

Свободный текст

Recommended text size: max ~35 chars

Location - Street Address Необязательный The street address (if applicable) of the lodging.

Свободный текст

Recommended text size: max ~20 chars

Location - State Необязательный The state or province (if applicable) in which the lodging is located.

Свободный текст

Recommended text size: max ~20 chars

Location - Zip code Необязательный The zip code (if applicable) of the lodging.

Свободный текст

Recommended text size: max ~20 chars

Location - Neighborhood Необязательный The neighborhood (if applicable) of the lodging.

Свободный текст

Recommended text size: max ~20 chars

Poster images Необязательный

We will show only 1 image when multiple images are provided. Recommended aspect ratio is 16:9

Note: If a badge is provided, ensure safe space of 24 dps at both the top and bottom of the image

See Image Specifications for guidance.
Описание Необязательный

A single paragraph of text to describe the entity.

Note: Either description or subtitle list will be displayed to the user, not both.

Свободный текст

Recommended text size: 180 chars

Subtitle list Необязательный

Up to 3 subtitles, with each subtitle a single line of text.

Note: Either description or subtitle list will be displayed to the user, not both.

Свободный текст

Recommended text size for each subtitle: max 50 chars

Идентификатор бронирования Необязательный The reservation ID for the lodging reservation. Свободный текст
Rating - Max value Необязательный

The maximum value of the rating scale.

Must be provided if current value of rating is also provided.

Number >= 0.0
Rating - Current value Необязательный

The current value of the rating scale.

Must be provided if maximum value of rating is also provided.

Number >= 0.0
Rating - Count Необязательный

The count of the ratings for the lodging.

Note: Provide this field if your app wants to control how this is displayed to the users. Provide the concise string that can be displayed to the user. For example, if the count is 1,000,000, consider using abbreviations like 1M, so that it won't be truncated on smaller display sizes.

Нить
Rating - Count Value Необязательный

The count of the ratings for the lodging.

Note: Provide this field if you don't want to handle the display abbreviation logic yourself. If both Count and Count Value are present, we will use the Count to display to users

Длинный
Price - CurrentPrice Условно требуется

The current price of the lodging.

Must be provided if strikethrough price is provided.

Свободный текст
Price - StrikethroughPrice Необязательный The original price of the lodging, which is be struck-through in the UI. Свободный текст
Price Callout Необязательный Price callout to feature a promo, event, member discount, if available.

Свободный текст

Recommended text size: under 45 chars (Text that is too long may show ellipses)

DisplayTimeWindow (Optional) - Set a time window for a content to be shown on the surface
Start Timestamp Необязательный

The epoch timestamp after which the content should be shown on the surface.

If not set, content is eligible to be shown on the surface.

Epoch timestamp in milliseconds
End Timestamp Необязательный

The epoch timestamp after which the content is no longer shown on the surface.

If not set, content is eligible to be shown on the surface.

Epoch timestamp in milliseconds

TransportationReservationEntity

Атрибут Требование Описание Формат
Action Uri Необходимый

Deep Link to the entity in the provider app.

Note: You can use deep links for attribution. Refer to this FAQ

Ури
Заголовок Необходимый Title of the entity.

Free text. For example, "SFO to SAN"

Recommended text size: Max 50 chars

Тип транспорта Необходимый The mode/type of transportation for the reservation. Enum: FLIGHT, TRAIN, BUS, or FERRY
Localized Departure Time - Timestamp Необходимый The epoch timestamp that represents the departure time. Joda-Time Instant
Localized Departure Time - Timezone Необходимый The timezone of the departure time.

Joda-Time DateTimeZone

See Timezone Specifications for guidance.

Localized Arrival Time - Timestamp Необходимый The epoch timestamp that represents the arrival time. Joda-Time Instant
Localized Arrival Time - Timezone Необходимый The timezone of the arrival time.

Joda-Time DateTimeZone

See Timezone Specifications for guidance.

Transportation Number Необходимый The flight number, bus number, train number, or ferry/cruise number. Свободный текст
Localized Boarding Time - Timestamp Необходимый The epoch timestamp that represents the boarding time for the reservation (if applicable) Joda-Time Instant
Localized Boarding Time - Timezone Необходимый The timezone of the boarding time for the reservation (if applicable)

Joda-Time DateTimeZone

See Timezone Specifications for guidance.

Departure Location - Country Необязательный The country of departure.

Свободный текст

Recommended text size: max ~20 chars

Departure Location - City Необязательный The city of departure.

Свободный текст

Recommended text size: max ~20 chars

Departure Location - Display Address Необязательный The location of departure that will be displayed to the user.

Свободный текст

Recommended text size: max ~20 chars

Departure Location - Street Address Необязательный The street address (if applicable) of the departure location.

Свободный текст

Recommended text size: max ~20 chars

Departure Location - State Необязательный The state or province (if applicable) of the departure location.

Свободный текст

Recommended text size: max ~20 chars

Departure Location - Zip code Необязательный The zip code (if applicable) of the departure location.

Свободный текст

Recommended text size: max ~20 chars

Departure Location - Neighborhood Необязательный The neighborhood (if applicable) of the departure location.

Свободный текст

Recommended text size: max ~20 chars

Arrival Location - Country Необязательный The country of arrival.

Свободный текст

Recommended text size: max ~20 chars

Arrival Location - City Необязательный The city of arrival.

Свободный текст

Recommended text size: max ~20 chars

Arrival Location - Display Address Необязательный The location of arrival that will be displayed to the user.

Свободный текст

Recommended text size: max ~20 chars

Arrival Location - Street Address Необязательный The street address (if applicable) of the arrival location.

Свободный текст

Recommended text size: max ~20 chars

Arrival Location - State Необязательный The state or province (if applicable) of the arrival location.

Свободный текст

Recommended text size: max ~20 chars

Arrival Location - Zip code Необязательный The zip code (if applicable) of the arrival location.

Свободный текст

Recommended text size: max ~20 chars

Arrival Location - Neighborhood Необязательный The neighborhood (if applicable) of the arrival location.

Свободный текст

Recommended text size: max ~20 chars

Service Provider - Name Необязательный

The name of the service provider.

Note: Either text or image is required for the service provider.

Free text. For example, Airline name
Service Provider - Image Необязательный

The logo/image of the service provider.

Note: Either text or image is required for the service provider.

See Image Specifications for guidance.
Poster images Необязательный

We will show only 1 image when multiple images are provided. Recommended aspect ratio is 16:9

See Image Specifications for guidance.
Описание Необязательный

A single paragraph of text to describe the entity.

Note: Either description or subtitle list will be displayed to the user, not both.

Свободный текст

Recommended text size: 180 chars

Subtitle list Необязательный

Up to 3 subtitles, with each subtitle a single line of text.

Note: Either description or subtitle list will be displayed to the user, not both.

Свободный текст

Recommended text size for each subtitle: max 50 chars

Идентификатор бронирования Необязательный The reservation ID for the transportation reservation. Свободный текст
Price - CurrentPrice Условно требуется

The current price of the reservation.

Must be provided if strikethrough price is provided.

Свободный текст
Price - StrikethroughPrice Необязательный The original price of the reservation, which is be struck-through in the UI. Свободный текст
Price Callout Необязательный Price callout to feature a promo, event, member discount, if available.

Свободный текст

Recommended text size: under 45 chars (Text that is too long may show ellipses)

DisplayTimeWindow (Optional) - Set a time window for a content to be shown on the surface
Start Timestamp Необязательный

The epoch timestamp after which the content should be shown on the surface.

If not set, content is eligible to be shown on the surface.

Epoch timestamp in milliseconds
End Timestamp Необязательный

The epoch timestamp after which the content is no longer shown on the surface.

If not set, content is eligible to be shown on the surface.

Epoch timestamp in milliseconds

VehicleRentalReservationEntity

Атрибут Требование Описание Формат
Action Uri Необходимый

Deep Link to the entity in the provider app.

Note: You can use deep links for attribution. Refer to this FAQ

Ури
Заголовок Необходимый Title of the entity.

Free text. For example, "Avis Union Square SF"

Recommended text size: Max 50 chars

Localized Pickup Time - Timestamp Необходимый The epoch timestamp that represents the pick up time for the reservation. Joda-Time Instant
Localized Pickup Time - Timezone Необходимый The timezone of the pick up time for the reservation.

Joda-Time DateTimeZone

See Timezone Specifications for guidance.

Localized Return Time - Timestamp Необязательный The epoch timestamp that represents the check out time for the reservation. Joda-Time Instant
Localized Return Time - Timezone Необязательный The timezone of the check out time for the reservation.

Joda-Time DateTimeZone

See Timezone Specifications for guidance.

Pickup Address - Country Необязательный The country of the pickup location.

Свободный текст

Recommended text size: max ~20 chars

Pickup Address - City Необязательный The city of the pickup location.

Свободный текст

Recommended text size: max ~20 chars

Pickup Address - Display Address Необязательный The pickup location that will be displayed to the user.

Свободный текст

Recommended text size: max ~20 chars

Pickup Address - Street Address Необязательный The street address (if applicable) of the pickup location.

Свободный текст

Recommended text size: max ~20 chars

Pickup Address - State Необязательный The state or province (if applicable) of the pickup location.

Свободный текст

Recommended text size: max ~20 chars

Pickup Address - Zip code Необязательный The zip code (if applicable) of the pickup location.

Свободный текст

Recommended text size: max ~20 chars

Pickup Address - Neighborhood Необязательный The neighborhood (if applicable) of the pickup location.

Свободный текст

Recommended text size: max ~20 chars

Return Address - Country Необязательный The country of return location.

Свободный текст

Recommended text size: max ~20 chars

Return Address - City Необязательный The city of return location.

Свободный текст

Recommended text size: max ~20 chars

Return Address - Display Address Необязательный The return location that will be displayed to the user.

Свободный текст

Recommended text size: max ~20 chars

Return Address - Street Address Необязательный The street address (if applicable) of the return location.

Свободный текст

Recommended text size: max ~20 chars

Return Address - State Необязательный The state or province (if applicable) of the return location.

Свободный текст

Recommended text size: max ~20 chars

Return Address - Zip code Необязательный The zip code (if applicable) of the return location.

Свободный текст

Recommended text size: max ~20 chars

Return Address - Neighborhood Необязательный The neighborhood (if applicable) of the return location.

Свободный текст

Recommended text size: max ~20 chars

Service Provider - Name Необязательный

The name of the service provider.

Note: Either text or image is required for the service provider.

Free text. For example, "Avis Car Rental"
Service Provider - Image Необязательный

The logo/image of the service provider.

Note: Either text or image is required for the service provider.

See Image Specifications for guidance.
Poster images Необязательный

We will show only 1 image when multiple images are provided. Recommended aspect ratio is 16:9

See Image Specifications for guidance.
Описание Необязательный

A single paragraph of text to describe the entity.

Note: Either description or subtitle list will be displayed to the user, not both.

Свободный текст

Recommended text size: 180 chars

Subtitle list Необязательный

Up to 3 subtitles, with each subtitle a single line of text.

Note: Either description or subtitle list will be displayed to the user, not both.

Свободный текст

Recommended text size for each subtitle: max 50 chars

Подтверждение идентификатора Необязательный The confirmation ID for the vehicle rental reservation. Свободный текст
Price - CurrentPrice Условно требуется

The current price of the reservation.

Must be provided if strikethrough price is provided.

Свободный текст
Price - StrikethroughPrice Необязательный The original price of the reservation, which is be struck-through in the UI. Свободный текст
Price Callout Необязательный Price callout to feature a promo, event, member discount, if available.

Свободный текст

Recommended text size: under 45 chars (Text that is too long may show ellipses)

DisplayTimeWindow (Optional) - Set a time window for a content to be shown on the surface
Start Timestamp Необязательный

The epoch timestamp after which the content should be shown on the surface.

If not set, content is eligible to be shown on the surface.

Epoch timestamp in milliseconds
End Timestamp Необязательный

The epoch timestamp after which the content is no longer shown on the surface.

If not set, content is eligible to be shown on the surface.

Epoch timestamp in milliseconds

Image specifications

Required specifications for image assets are listed in this table:

Соотношение сторон Minimum pixels Recommended pixels

Square (1x1)

Предпочтительный

300x300 1200x1200
Landscape (1.91x1) 600x314 1200x628
Portrait (4x5) 480x600 960x1200

The images are required to be hosted on public CDNs so that Google can access them.

Форматы файлов

PNG, JPG, static GIF, WebP

Maximum file size

5120 KB

Дополнительные рекомендации

  • Image safe area: Put your important content in the center 80% of the image.
  • Use a transparent background so that the image can be properly displayed in Dark and Light theme settings.

Timezone specifications

Prefer ID (for example, "America/Los_Angeles") over offset (for example, "-07:00").

Sample usage: DateTimeZone.forID("America/Los_Angeles")

Категория контента

The content category allows apps to publish content belonging to multiple categories. This maps the content with some of the predefined categories namely:

  • TYPE_EDUCATION
  • TYPE_SPORTS
  • TYPE_MOVIES_AND_TV_SHOWS
  • TYPE_BOOKS
  • TYPE_AUDIOBOOKS
  • TYPE_MUSIC
  • TYPE_DIGITAL_GAMES
  • TYPE_TRAVEL_AND_LOCAL
  • TYPE_HOME_AND_AUTO
  • TYPE_BUSINESS
  • TYPE_NEWS
  • TYPE_FOOD_AND_DRINK
  • TYPE_SHOPPING
  • TYPE_HEALTH_AND_FITENESS
  • TYPE_MEDICAL
  • TYPE_PARENTING
  • TYPE_DATING

The images are required to be hosted on public CDNs so that Google can access them.

Guidelines to use the content categories

  1. Some entities like ArticleEntity and GenericFeaturedEntity are eligible to use any of the content categories. For other entities like EventEntity , EventReservationEntity , PointOfInterestEntity , only a subset of these categories are eligible. Check the list of categories eligible for an entity type before populating the list.
  2. Use the specific entity type for some content categories over a combination of the Generic entities and the ContentCategory:

    • TYPE_MOVIES_AND_TV_SHOWS - Check out the entities from Watch integration guide before using the generic entities.
    • TYPE_BOOKS - Check out the EbookEntity before using the generic entities.
    • TYPE_AUDIOBOOKS - Check out AudiobookEntity before using the generic entities.
    • TYPE_SHOPPING - Check out ShoppingEntity before using the generic entities.
    • TYPE_FOOD_AND_DRINK - Check out entities from Food Integration guide before using the generic entities.
  3. The ContentCategory field is optional and should be left blank if the content doesn't belong to any of the categories mentioned earlier.

  4. In case multiple content categories are provided, provide them in the order of relevance to the content with the most relevant content category placed first in the list.

Step 2: Provide Cluster data

It is recommended to have the content publish job executed in the background (for example, using WorkManager ) and scheduled on a regular basis or on an event basis (for example, every time the user opens the app or when the user just added something to their cart).

AppEngageTravelClient is responsible for publishing clusters.

There are following APIs to publish clusters in the client:

  • isServiceAvailable
  • publishRecommendationClusters
  • publishFeaturedCluster
  • publishReservationCluster
  • publishContinueSearchCluster
  • publishUserAccountManagementRequest
  • updatePublishStatus
  • deleteRecommendationsClusters
  • deleteFeaturedCluster
  • deleteReservationCluster
  • deleteContinueSearchCluster
  • deleteUserManagementCluster
  • deleteClusters

isServiceAvailable

This API is used to check if the service is available for integration and whether the content can be presented on the device.

Котлин

client.isServiceAvailable.addOnCompleteListener { task ->
    if (task.isSuccessful) {
        // Handle IPC call success
        if(task.result) {
          // Service is available on the device, proceed with content publish
          // calls.
        } else {
          // Service is not available, no further action is needed.
        }
    } else {
      // The IPC call itself fails, proceed with error handling logic here,
      // such as retry.
    }
}

Ява

client.isServiceAvailable().addOnCompleteListener(task - > {
    if (task.isSuccessful()) {
        // Handle success
        if(task.getResult()) {
          // Service is available on the device, proceed with content publish
          // calls.
        } else {
          // Service is not available, no further action is needed.
        }
    } else {
      // The IPC call itself fails, proceed with error handling logic here,
      // such as retry.
    }
});

publishRecommendationClusters

This API is used to publish a list of RecommendationCluster objects.

Котлин

client.publishRecommendationClusters(
      PublishRecommendationClustersRequest.Builder()
        .addRecommendationCluster(
          RecommendationCluster.Builder()
            .addEntity(entity1)
            .addEntity(entity2)
            .setTitle("Top Picks For You")
            .build()
        )
        .build()
    )

Ява

client.publishRecommendationClusters(
            new PublishRecommendationClustersRequest.Builder()
                .addRecommendationCluster(
                    new RecommendationCluster.Builder()
                        .addEntity(entity1)
                        .addEntity(entity2)
                        .setTitle("Top Picks For You")
                        .build())
                .build());

When the service receives the request, the following actions take place within one transaction:

  • Existing RecommendationCluster data from the developer partner is removed.
  • Data from the request is parsed and stored in the updated Recommendation Cluster.

In case of an error, the entire request is rejected and the existing state is maintained.

publishFeaturedCluster

This API is used to publish a list of FeaturedCluster objects.

Котлин

client.publishFeaturedCluster(
    PublishFeaturedClusterRequest.Builder()
      .setFeaturedCluster(
        FeaturedCluster.Builder()
          .addEntity(entity1)
          .addEntity(entity2)
          .build())
      .build())

Ява

client.publishFeaturedCluster(
            new PublishFeaturedClustersRequest.Builder()
                .addFeaturedCluster(
                    new FeaturedCluster.Builder()
                        .addEntity(entity1)
                        .addEntity(entity2)
                        .build())
                .build());

When the service receives the request, the following actions take place within one transaction:

  • Existing FeaturedCluster data from the developer partner is removed.
  • Data from the request is parsed and stored in the updated Featured Cluster.

In case of an error, the entire request is rejected and the existing state is maintained.

publishReservationCluster

This API is used to publish a ReservationCluster object.

Котлин

client.publishReservationCluster(
    PublishReservationClusterRequest.Builder()
      .setReservationCluster(
        ReservationCluster.Builder()
          .addLodgingReservationEntity(lodgingReservationEntity)
          .addVehicleRentalReservationEntity(vehicleRentalReservationEntity)
          .addTransportationReservationEntity(transportationReservationEntity)
          .addEventReservationEntity(eventReservationEntity)
          .addRestaurantReservationEntity(restaurantReservationEntity)
          .build())
      .build())

Ява

client.publishReservationCluster(
            new PublishReservationClusterRequest.Builder()
                .setReservationCluster(
                    new ReservationCluster.Builder()
                        .addLodgingReservationEntity(lodgingReservationEntity)
                        .addVehicleRentalReservationEntity(vehicleRentalReservationEntity)
                        .addTransportationReservationEntity(transportationReservationEntity)
                        .addEventReservationEntity(eventReservationEntity)
                        .addRestaurantReservationEntity(restaurantReservationEntity)
                        .build())
                .build());

When the service receives the request, the following actions take place within one transaction:

  • Existing ReservationCluster data from the developer partner is removed.
  • Data from the request is parsed and stored in the updated Reservation Cluster.

In case of an error, the entire request is rejected and the existing state is maintained.

publishContinueSearchCluster

This API is used to publish a list of ContinueSearchCluster objects.

Котлин

client.publishContinueSearchCluster(
    PublishContinueSearchClusterRequest.Builder()
      .setContinueSearchCluster(
        ContinueSearchCluster.Builder()
          .addPointOfInterestEntity(entity1)
          .addPointOfInterestEntity(entity2)
          .build())
      .build())

Ява

client.publishContinueSearchCluster(
            new PublishContinueSearchClusterRequest.Builder()
                .setContinueSearchCluster(
                    new ContinueSearchCluster.Builder()
                        .addPointOfInterestEntity(entity1)
                        .addPointOfInterestEntity(entity2)
                        .build())
                .build());

When the service receives the request, the following actions take place within one transaction:

  • Existing ContinueSearchCluster data from the developer partner is removed.
  • Data from the request is parsed and stored in the updated Continue Search Cluster.

In case of an error, the entire request is rejected and the existing state is maintained.

publishUserAccountManagementRequest

This API is used to publish a Sign In card . The signin action directs users to the app's sign in page so that the app can publish content (or provide more personalized content)

The following metadata is part of the Sign In Card -

Атрибут Требование Описание
Action Uri Необходимый Deeplink to Action (ie navigates to app sign in page)
Изображение Optional - If not provided, Title must be provided

Image Shown on the Card

16x9 aspect ratio images with a resolution of 1264x712

Заголовок Optional - If not provided, Image must be provided Title on the Card
Action Text Необязательный Text Shown on the CTA (ie Sign in)
Подзаголовок Необязательный Optional Subtitle on the Card

Котлин

var SIGN_IN_CARD_ENTITY =
      SignInCardEntity.Builder()
          .addPosterImage(
              Image.Builder()
                  .setImageUri(Uri.parse("http://www.x.com/image.png"))
                  .setImageHeightInPixel(500)
                  .setImageWidthInPixel(500)
                  .build())
          .setActionText("Sign In")
          .setActionUri(Uri.parse("http://xx.com/signin"))
          .build()

client.publishUserAccountManagementRequest(
            PublishUserAccountManagementRequest.Builder()
                .setSignInCardEntity(SIGN_IN_CARD_ENTITY)
                .build());

Ява

SignInCardEntity SIGN_IN_CARD_ENTITY =
      new SignInCardEntity.Builder()
          .addPosterImage(
              new Image.Builder()
                  .setImageUri(Uri.parse("http://www.x.com/image.png"))
                  .setImageHeightInPixel(500)
                  .setImageWidthInPixel(500)
                  .build())
          .setActionText("Sign In")
          .setActionUri(Uri.parse("http://xx.com/signin"))
          .build();

client.publishUserAccountManagementRequest(
            new PublishUserAccountManagementRequest.Builder()
                .setSignInCardEntity(SIGN_IN_CARD_ENTITY)
                .build());

When the service receives the request, the following actions take place within one transaction:

  • Existing UserAccountManagementCluster data from the developer partner is removed.
  • Data from the request is parsed and stored in the updated UserAccountManagementCluster Cluster.

In case of an error, the entire request is rejected and the existing state is maintained.

updatePublishStatus

If for any internal business reason, none of the clusters is published, we strongly recommend updating the publish status using the updatePublishStatus API. This is important because :

  • Providing the status in all scenarios, even when the content is published (STATUS == PUBLISHED), is critical to populate dashboards that use this explicit status to convey the health and other metrics of your integration.
  • If no content is published but the integration status isn't broken (STATUS == NOT_PUBLISHED), Google can avoid triggering alerts in the app health dashboards. It confirms that content is not published due to an expected situation from the provider's standpoint.
  • It helps developers provide insights into when the data is published versus not.
  • Google may use the status codes to nudge the user to do certain actions in the app so they can see the app content or overcome it.

The list of eligible publish status codes are :

// Content is published
AppEngagePublishStatusCode.PUBLISHED,

// Content is not published as user is not signed in
AppEngagePublishStatusCode.NOT_PUBLISHED_REQUIRES_SIGN_IN,

// Content is not published as user is not subscribed
AppEngagePublishStatusCode.NOT_PUBLISHED_REQUIRES_SUBSCRIPTION,

// Content is not published as user location is ineligible
AppEngagePublishStatusCode.NOT_PUBLISHED_INELIGIBLE_LOCATION,

// Content is not published as there is no eligible content
AppEngagePublishStatusCode.NOT_PUBLISHED_NO_ELIGIBLE_CONTENT,

// Content is not published as the feature is disabled by the client
// Available in v1.3.1
AppEngagePublishStatusCode.NOT_PUBLISHED_FEATURE_DISABLED_BY_CLIENT,

// Content is not published as the feature due to a client error
// Available in v1.3.1
AppEngagePublishStatusCode.NOT_PUBLISHED_CLIENT_ERROR,

// Content is not published as the feature due to a service error
// Available in v1.3.1
AppEngagePublishStatusCode.NOT_PUBLISHED_SERVICE_ERROR,

// Content is not published due to some other reason
// Reach out to engage-developers@ before using this enum.
AppEngagePublishStatusCode.NOT_PUBLISHED_OTHER

If the content is not published due to a user not logged in, Google would recommend publishing the Sign In Card. If for any reason providers are not able to publish the Sign In Card then we recommend calling the updatePublishStatus API with the status code NOT_PUBLISHED_REQUIRES_SIGN_IN

Котлин

client.updatePublishStatus(
   PublishStatusRequest.Builder()
     .setStatusCode(AppEngagePublishStatusCode.NOT_PUBLISHED_REQUIRES_SIGN_IN)
     .build())

Ява

client.updatePublishStatus(
    new PublishStatusRequest.Builder()
        .setStatusCode(AppEngagePublishStatusCode.NOT_PUBLISHED_REQUIRES_SIGN_IN)
        .build());

deleteRecommendationClusters

This API is used to delete the content of Recommendation Clusters.

Котлин

client.deleteRecommendationClusters()

Ява

client.deleteRecommendationClusters();

When the service receives the request, it removes the existing data from the Recommendation Clusters. In case of an error, the entire request is rejected and the existing state is maintained.

deleteFeaturedCluster

This API is used to delete the content of Featured Cluster.

Котлин

client.deleteFeaturedCluster()

Ява

client.deleteFeaturedCluster();

When the service receives the request, it removes the existing data from the Featured Cluster. In case of an error, the entire request is rejected and the existing state is maintained.

deleteReservationCluster

This API is used to delete the content of Reservation Cluster.

Котлин

client.deleteReservationCluster()

Ява

client.deleteReservationCluster();

When the service receives the request, it removes the existing data from the Reservation Cluster. In case of an error, the entire request is rejected and the existing state is maintained.

deleteUserManagementCluster

This API is used to delete the content of UserAccountManagement Cluster.

Котлин

client.deleteUserManagementCluster()

Ява

client.deleteUserManagementCluster();

When the service receives the request, it removes the existing data from the UserAccountManagement Cluster. In case of an error, the entire request is rejected and the existing state is maintained.

deleteContinueSearchCluster

This API is used to delete the content of Continue Search Cluster.

Котлин

client.deleteContinueSearchCluster()

Ява

client.deleteContinueSearchCluster();

When the service receives the request, it removes the existing data from the Continue Search Cluster. In case of an error, the entire request is rejected, and the existing state is maintained.

deleteClusters

This API is used to delete the content of a given cluster type.

Котлин

client.deleteClusters(
    DeleteClustersRequest.Builder()
      .addClusterType(ClusterType.TYPE_RESERVATION)
      .addClusterType(ClusterType.TYPE_FEATURED)
      .addClusterType(ClusterType.TYPE_RECOMMENDATION)
      .addClusterType(ClusterType.TYPE_CONTINUE_SEARCH)
      .build())

Ява

client.deleteClusters(
            new DeleteClustersRequest.Builder()
                .addClusterType(ClusterType.TYPE_RESERVATION)
                .addClusterType(ClusterType.TYPE_FEATURED)
                .addClusterType(ClusterType.TYPE_RECOMMENDATION)
                .addClusterType(ClusterType.TYPE_CONTINUE_SEARCH)
                .build());

When the service receives the request, it removes the existing data from all clusters matching the specified cluster types. Clients can choose to pass one or many cluster types. In case of an error, the entire request is rejected and the existing state is maintained.

Обработка ошибок

It is highly recommended to listen to the task result from the publish APIs such that a follow-up action can be taken to recover and resubmit an successful task.

Котлин

client.publishRecommendationClusters(
        PublishRecommendationClustersRequest.Builder()
          .addRecommendationCluster(..)
          .build())
      .addOnCompleteListener { task ->
        if (task.isSuccessful) {
          // do something
        } else {
          val exception = task.exception
          if (exception is AppEngageException) {
            @AppEngageErrorCode val errorCode = exception.errorCode
            if (errorCode == AppEngageErrorCode.SERVICE_NOT_FOUND) {
              // do something
            }
          }
        }
      }

Ява

client.publishRecommendationClusters(
              new PublishRecommendationClustersRequest.Builder()
                  .addRecommendationCluster(...)
                  .build())
          .addOnCompleteListener(
              task -> {
                if (task.isSuccessful()) {
                  // do something
                } else {
                  Exception exception = task.getException();
                  if (exception instanceof AppEngageException) {
                    @AppEngageErrorCode
                    int errorCode = ((AppEngageException) exception).getErrorCode();
                    if (errorCode == AppEngageErrorCode.SERVICE_NOT_FOUND) {
                      // do something
                    }
                  }
                }
              });

The error is returned as an AppEngageException with the cause included as an error code.

Код ошибки Error name Примечание
1 SERVICE_NOT_FOUND The service is not available on the given device.
2 SERVICE_NOT_AVAILABLE The service is available on the given device, but it is not available at the time of the call (for example, it is explicitly disabled).
3 SERVICE_CALL_EXECUTION_FAILURE The task execution failed due to threading issues. In this case, it can be retried.
4 SERVICE_CALL_PERMISSION_DENIED The caller is not allowed to make the service call.
5 SERVICE_CALL_INVALID_ARGUMENT The request contains invalid data (for example, more than the allowed number of clusters).
6 SERVICE_CALL_INTERNAL There is an error on the service side.
7 SERVICE_CALL_RESOURCE_EXHAUSTED The service call is made too frequently.

Step 3: Handle broadcast intents

In addition to making publish content API calls through a job, it is also required to set up a BroadcastReceiver to receive the request for a content publish.

The goal of broadcast intents is mainly for app reactivation and forcing data sync. Broadcast intents are not designed to be sent very frequently. It is only triggered when the Engage Service determines the content might be stale (for example, a week old). That way, there is more confidence that the user can have a fresh content experience, even if the application has not been executed for a long period of time.

The BroadcastReceiver must be set up in the following two ways:

  • Dynamically register an instance of the BroadcastReceiver class using Context.registerReceiver() . This enables communication from applications that are still live in memory.

Котлин

class AppEngageBroadcastReceiver : BroadcastReceiver(){
  // Trigger recommendation cluster publish when PUBLISH_RECOMMENDATION broadcast
  // is received
  // Trigger featured cluster publish when PUBLISH_FEATURED broadcast is received
  // Trigger continue search cluster publish when PUBLISH_CONTINUE_SEARCH
  // broadcast is received
  // Trigger reservation cluster publish when PUBLISH_RESERVATION broadcast is
  // received
}

fun registerBroadcastReceivers(context: Context){
  var  context = context
  context = context.applicationContext

// Register Recommendation Cluster Publish Intent
  context.registerReceiver(AppEngageBroadcastReceiver(),
                           IntentFilter(com.google.android.engage.service.Intents.ACTION_PUBLISH_RECOMMENDATION),
                           com.google.android.engage.service.BroadcastReceiverPermissions.BROADCAST_REQUEST_DATA_PUBLISH_PERMISSION,
                           /*scheduler=*/null)

// Register Featured Cluster Publish Intent
  context.registerReceiver(AppEngageBroadcastReceiver(),
                           IntentFilter(com.google.android.engage.service.Intents.ACTION_PUBLISH_FEATURED),
                           com.google.android.engage.service.BroadcastReceiverPermissions.BROADCAST_REQUEST_DATA_PUBLISH_PERMISSION,
                           /*scheduler=*/null)

// Register Continue Search Cluster Publish Intent
  context.registerReceiver(AppEngageBroadcastReceiver(),
                           IntentFilter(com.google.android.engage.travel.service.Intents.ACTION_PUBLISH_CONTINUE_SEARCH),
                           com.google.android.engage.service.BroadcastReceiverPermissions.BROADCAST_REQUEST_DATA_PUBLISH_PERMISSION,
                           /*scheduler=*/null)

// Register Reservation Cluster Publish Intent
  context.registerReceiver(AppEngageBroadcastReceiver(),
                           IntentFilter(com.google.android.engage.travel.service.Intents.ACTION_PUBLISH_RESERVATION),
                           com.google.android.engage.service.BroadcastReceiverPermissions.BROADCAST_REQUEST_DATA_PUBLISH_PERMISSION,
                           /*scheduler=*/null)
}

Ява

class AppEngageBroadcastReceiver extends BroadcastReceiver {
// Trigger recommendation cluster publish when PUBLISH_RECOMMENDATION broadcast
// is received

// Trigger featured cluster publish when PUBLISH_FEATURED broadcast is received

// Trigger continue search cluster publish when PUBLISH_CONTINUE_SEARCH
// broadcast is received

// Trigger reservation cluster publish when PUBLISH_RESERVATION broadcast is
// received
}

public static void registerBroadcastReceivers(Context context) {

context = context.getApplicationContext();

// Register Recommendation Cluster Publish Intent
context.registerReceiver(new AppEngageBroadcastReceiver(),
                         new IntentFilter(com.google.android.engage.service.Intents.ACTION_PUBLISH_RECOMMENDATION),
                         com.google.android.engage.service.BroadcastReceiverPermissions.BROADCAST_REQUEST_DATA_PUBLISH_PERMISSION,
                         /*scheduler=*/null);

// Register Featured Cluster Publish Intent
context.registerReceiver(new AppEngageBroadcastReceiver(),
                         new IntentFilter(com.google.android.engage.service.Intents.ACTION_PUBLISH_FEATURED),
                         com.google.android.engage.service.BroadcastReceiverPermissions.BROADCAST_REQUEST_DATA_PUBLISH_PERMISSION,
                         /*scheduler=*/null);

// Register Continue Search Cluster Publish Intent
context.registerReceiver(new AppEngageBroadcastReceiver(),
                         new IntentFilter(com.google.android.engage.travel.service.Intents.ACTION_PUBLISH_CONTINUE_SEARCH),
                         com.google.android.engage.service.BroadcastReceiverPermissions.BROADCAST_REQUEST_DATA_PUBLISH_PERMISSION,
                         /*scheduler=*/null);

// Register Reservation Cluster Publish Intent
context.registerReceiver(new AppEngageBroadcastReceiver(),
                         new IntentFilter(com.google.android.engage.travel.service.Intents.ACTION_PUBLISH_RESERVATION),
                         com.google.android.engage.service.BroadcastReceiverPermissions.BROADCAST_REQUEST_DATA_PUBLISH_PERMISSION,
                         /*scheduler=*/null);

}
  • Statically declare an implementation with the <receiver> tag in your AndroidManifest.xml file. This allows the application to receive broadcast intents when it is not running, and also allows the application to publish the content.

<application>
   <receiver
      android:name=".AppEngageBroadcastReceiver"
      android:permission="com.google.android.engage.REQUEST_ENGAGE_DATA"
      android:exported="true"
      android:enabled="true">
      <intent-filter>
         <action android:name="com.google.android.engage.action.PUBLISH_RECOMMENDATION" />
      </intent-filter>
      <intent-filter>
         <action android:name="com.google.android.engage.action.PUBLISH_FEATURED" />
      </intent-filter>
      <intent-filter>
         <action android:name="com.google.android.engage.action.travel.PUBLISH_CONTINUE_SEARCH" />
      </intent-filter>
      <intent-filter>
         <action android:name="com.google.android.engage.action.travel.PUBLISH_RESERVATION" />
      </intent-filter>
   </receiver>
</application>

The following intents is sent by the service:

  • com.google.android.engage.action.PUBLISH_RECOMMENDATION It is recommended to start a publishRecommendationClusters call when receiving this intent.
  • com.google.android.engage.action.PUBLISH_FEATURED It is recommended to start a publishFeaturedCluster call when receiving this intent.
  • com.google.android.engage.action.travel.PUBLISH_CONTINUE_SEARCH It is recommended to start a publishContinueSearchCluster call when receiving this intent.
  • com.google.android.engage.action.travel.PUBLISH_RESERVATION It is recommended to start a publishReservationCluster call when receiving this intent.

Integration workflow

For a step-by-step guide on verifying your integration after it is complete, see Engage developer integration workflow .

Часто задаваемые вопросы

See Engage SDK Frequently Asked Questions for FAQs.

Контакт

Contact engage-developers@google.com if there are any questions during the integration process.

Следующие шаги

After completing this integration, your next steps are as follows:

  • Send an email to engage-developers@google.com and attach your integrated APK that is ready for testing by Google.
  • Google performs a verification and reviews internally to make sure the integration works as expected. If changes are needed, Google contacts you with any necessary details.
  • When testing is complete and no changes are needed, Google contacts you to notify you that you can start publishing the updated and integrated APK to the Play Store.
  • After Google has confirmed that your updated APK has been published to the Play Store, your Recommendation , Featured , Reservation , and Continue Search clusters may be published and visible to users.