Создавайте и загружайте ленты POI.
При создании и загрузке лент объектов интереса (POI) следуйте этим инструкциям:
- Следуйте спецификациям, описанным в ленте POI, для файлов данных POI. Мы рекомендуем использовать уникальные имена файлов данных POI для каждой загрузки. Включите метку времени в имя файла, например,
POI_1633621547.json. - Ежедневно загружайте видеопоток на локальный SFTP-сервер POI с полным обновлением.
- Информацию о SFTP-сервере можно найти в разделе «Конфигурация > Каналы» на Партнерском портале.

- Статус загрузки данных можно просмотреть в разделе «Загрузка > История» на Партнерском портале.
Технические характеристики корма
Полевые требования
VssPoi
Представляет собой отдельный объект, представляющий интерес (POI), например, отель или ресторан.
| Название поля | Тип | Требование | Описание |
|---|---|---|---|
poi_id | нить | Необходимый | Обязательно. Строка, сгенерированная партнером, идентифицирующая точку интереса (POI). |
name | объект(Text) | Необходимый | Обязательно. Название объекта интереса (POI). |
telephone | нить | Контактный телефонный номер объекта интереса, включая коды страны и региона, например, +14567891234. | |
url | нить | URL общедоступного веб-сайта объекта интереса. Примечание: Этот адрес будет использоваться только для сопоставления, а не для отображения. | |
location | объект(GeoCoordinates) | Необходимый | Обязательно. Местоположение объекта интереса (POI). |
display_address | объект(Text) | Адрес, отображаемый в пользовательском интерфейсе. | |
images | массив объектов(Image) | Изображения объекта интереса. Максимальное количество изображений: 5. | |
rating | число | Средняя оценка объекта интереса. | |
num_ratings | число | Количество оценок, предоставленных пользователем для rating поля. | |
rating_scale | число | Шкала оценок, используемая для поля rating . Если максимальная оценка равна 5, то rating_scale равно 5. | |
category | перечисление(Category) | Необходимый | Обязательно. Отображает категорию объекта интереса. |
description | объект(Text) | Описание объекта интереса. | |
| один из(additional_data) | Необходимый | В этом объекте oneOf можно задать значение только для одного из полей. |
Текст
Представляет собой текст с локализацией.
| Название поля | Тип | Требование | Описание |
|---|---|---|---|
localizations | массив объектов(LocalizedString) | Локализованные строки. | |
default_locale | нить | Язык, который будет использоваться в качестве языка по умолчанию, должен присутствовать в локализациях. |
LocalizedString
Представляет собой локализованную строку.
| Название поля | Тип | Требование | Описание |
|---|---|---|---|
locale | нить | Языковая метка текста, например, "en", "en-US" или "sr-Latn". | |
text | нить | Текст на указанном языке. |
Геокоординаты
Географические данные местоположения, включая широту, долготу и адрес.
| Название поля | Тип | Требование | Описание |
|---|---|---|---|
latitude | число | [-90, +90] градусов (включительно). Обязательно, если задана долгота, в противном случае — желательно. | |
longitude | число | [-180, +180] градусов (включительно). Обязательно, если задана широта, в противном случае — желательно. | |
| один из(addresses) | Необходимый | В этом объекте oneOf можно задать значение только для одного из полей. |
Почтовый адрес
Почтовый адрес данного места.
| Название поля | Тип | Требование | Описание |
|---|---|---|---|
country | нить | Необходимый | Обязательно. Страна, используя двухбуквенный код страны ISO 3166-1, например, «США». |
locality | нить | Необходимый | Обязательно. Населенный пункт/город, например, «Маунтин-Вью». |
region | нить | Регион/штат/провинция, например, «CA». Это поле обязательно только для стран, где регион обычно является частью адреса. (необязательно) | |
postal_code | нить | Необходимый | Обязательно. Почтовый индекс, например, "94043". |
street_address | нить | Необходимый | Обязательно. Адрес, например, "1600 Amphitheatre Pkwy". |
Изображение
Представляет собой изображение объекта, представляющего интерес (POI).
| Название поля | Тип | Требование | Описание |
|---|---|---|---|
url | нить | URL изображения. Google будет индексировать медиафайлы, размещенные по этому URL. Максимальная длина: 2000. | |
alt_text | объект(Text) | Альтернативный текст для обеспечения доступности. |
HotelData
Данные из фида, специфичные для конкретного отеля.
| Название поля | Тип | Требование | Описание |
|---|---|---|---|
hotel_star_class | число | Официальное значение звездности отеля. Может использоваться в обозначении, например, "5-звездочный отель". Ожидается, что это целое число от 1 до 5. | |
brand_ids | массив строк | Список брендов, которые могут отображать этот отель. Если это поле пустое, отель может отображаться под любым из брендов, связанных с данной лентой. |
Локальные данные
Данные о кормах, специфичные для данного предприятия.
| Название поля | Тип | Требование | Описание |
|---|---|---|---|
business_hours | объект(BusinessHours) | Обычные часы работы заведения. | |
price_range | объект(PriceRange) | Ценовой диапазон услуг, предлагаемых заведением. | |
establishment_category | объект(Text) | Тип заведения. | |
brand_landing_pages | массив объектов(BrandLandingPages) | Целевые страницы бренда. |
Рабочее время
Представляет собой временные периоды, в течение которых данное заведение открыто для бизнеса. Содержит набор экземпляров [TimeRange][madden.vss_poi_feed.TimeRange]. Пример: Открыто по субботам с 09:00 до 12:00 и с 13:00 до 17:00: time_ranges { open_day: SATURDAY open_time: { hours: 9, minutes: 0 } close_day: SATURDAY close_time: { hours: 12, minutes: 0 } } time_ranges { open_day: SATURDAY open_time: { hours: 13, minutes: 0 } close_day: SATURDAY close_time: { hours: 17, minutes: 0 } } Пример: Открыто по субботам с 21:00 до 02:00 в воскресенье: time_ranges { open_day: SATURDAY open_time: { hours: 21, minutes: 0 } close_day: SUNDAY close_time: { hours: 2, minutes: 0 } }
| Название поля | Тип | Требование | Описание |
|---|---|---|---|
time_ranges | массив объектов(TimeRange) | Список часов работы данного объекта интереса. Каждый период соответствует диапазону часов работы объекта интереса в течение недели. |
TimeRange
Обозначает период времени, в течение которого объект интереса (POI) открыт, начиная с указанного дня/времени открытия и заканчивая указанным днем/временем закрытия. Время закрытия должно наступить после времени открытия, например, позже в тот же день или в последующий день.
| Название поля | Тип | Требование | Описание |
|---|---|---|---|
open_day | перечисление(DayOfWeek) | День открытых дверей в указанный временной промежуток. | |
open_time | объект(TimeOfDay) | Время открытия временного диапазона. | |
close_day | перечисление(DayOfWeek) | Самый близкий день в этом временном диапазоне. | |
close_time | объект(TimeOfDay) | Ближайший временной промежуток в пределах временного диапазона. |
Время суток
| Название поля | Тип | Требование | Описание |
|---|---|---|---|
hours | число | Часы суток в 24-часовом формате. Значение должно быть больше или равно 0 и, как правило, меньше или равно 23. API может разрешить значение "24:00:00" для таких сценариев, как время закрытия предприятия. | |
minutes | число | Минуты часа. Должно быть больше или равно 0 и меньше или равно 59. | |
seconds | число | Секунды минуты. Должно быть больше или равно 0 и, как правило, меньше или равно 59. API может допускать значение 60, если он поддерживает високосные секунды. | |
nanos | число | Доли секунд, в наносекундах. Должно быть больше или равно 0 и меньше или равно 999 999 999. |
Ценовой диапазон
Диапазон цен на услуги, предлагаемые объектом интереса.
| Название поля | Тип | Требование | Описание |
|---|---|---|---|
min_price | объект(Money) | Минимальная цена услуг, предлагаемых объектом интереса. | |
max_price | объект(Money) | Максимальная цена услуг, предлагаемых объектом интереса. |
Деньги
Представляет собой сумму денег с указанием типа валюты.
| Название поля | Тип | Требование | Описание |
|---|---|---|---|
currency_code | нить | Трехбуквенный код валюты, определенный в стандарте ISO 4217. | |
units | число | Целые единицы суммы. Например, если currencyCode — "USD" , то 1 единица — это один доллар США. | |
nanos | число | Количество нано (10^-9) единиц величины. Значение должно находиться в диапазоне от -999 999 999 до +999 999 999 включительно. Если units положительно, то nanos должно быть положительным или равным нулю. Если units равно нулю, nanos может быть положительным, равным нулю или отрицательным. Если units отрицательно, то nanos должно быть отрицательным или равным нулю. Например, $-1,75 представляется как units = -1 и nanos = -750 000 000. |
BrandLandingPages
Локализованные целевые страницы бренда для отдельной точки интереса (POI).
| Название поля | Тип | Требование | Описание |
|---|---|---|---|
brand_id | нить | Данная конфигурация относится к определенной марке. | |
localized_landing_pages | массив объектов(LocalizedLandingPage) | Локализованные целевые страницы. Значения полей url и locales должны быть уникальными на всех локализованных целевых страницах. | |
default_url | нить | URL целевой страницы по умолчанию, используемый в случае, если ни одна из локализованных целевых страниц не соответствует языку пользователя. |
Локализованная целевая страница
Локализованная целевая страница для объекта интереса (POI).
| Название поля | Тип | Требование | Описание |
|---|---|---|---|
url | нить | URL целевой страницы. Максимальная длина: 2000 символов. | |
locales | массив строк | Эта страница доступна только пользователям с указанным языковым предпочтением. Должна содержать языковые теги, такие как "en", "en-US" или "sr-Latn". |
Категория
Представляет категорию объекта интереса. Она должна совпадать с полем additional_data один из вариантов) ниже.
| Имя | Описание |
|---|---|
UNKNOWN_CATEGORY | |
HOTEL | |
LOCAL |
День недели
Обозначает день недели.
| Имя | Описание |
|---|---|
DAY_OF_WEEK_UNSPECIFIED | День недели не указан. |
MONDAY | Понедельник |
TUESDAY | Вторник |
WEDNESDAY | Среда |
THURSDAY | Четверг |
FRIDAY | Пятница |
SATURDAY | Суббота |
SUNDAY | Воскресенье |
дополнительные_данные
Обязательно. Поля, специфичные для категории. Должны совпадать с полем category указанным выше.
| Название поля | Тип | Требование | Описание |
|---|---|---|---|
hotel_data | объект(HotelData) | Взаимоисключающий с | Поля, специфичные для отеля. |
local_data | объект(LocalData) | Взаимоисключающий с | Поля, специфичные для данной местности. |
адреса
Обязательно. Адрес местоположения.
| Название поля | Тип | Требование | Описание |
|---|---|---|---|
address | объект(PostalAddress) | Почтовый адрес места нахождения. |
- Формат: Должен быть JPEG, PNG или WebP.
- Максимальный размер файла: менее 30 МБ на изображение.
- Максимальные размеры: менее 75 мегапикселей (ширина x высота < 75 000 000).
- Тип URL: Прямой путь к изображению (например, заканчивается на .jpg).
- Права доступа: Убедитесь, что хостинг-сервер разрешает доступ Googlebot или поисковым роботам и что файл robots.txt не блокирует каталоги с изображениями.
- Безопасный поиск: Изображения должны соответствовать правилам безопасного поиска Google.
Определения
Определение VssPoiFeed
// Represents a Point of Interest (POI) data feed provided by a partner. export message VssPoiFeed { // The POIs in the feed. repeated VssPoi data = 1; }
Определение VssPoi
// Represents a single Point of Interest (POI) entity e.g. a hotel or // restaurant. export message VssPoi { // Required. A string generated by the partner that identifies a POI. string poi_id = 1; // The entity name, telephone, url and location are used to support // matching partner inventory with entities already present on Google. // Required. The name of the POI. Text name = 2; // The contact telephone number of the POI including its country and // area codes, e.g. +14567891234. string telephone = 3 [(datapol.semantic_type) = ST_PHONE_NUMBER]; // The url of the POI's public website. // Note: This will be used just for matching purposes, not for display. string url = 4; // Required. The location of the POI. GeoCoordinates location = 5; // The address displayed on the UI. Text display_address = 17; // Images of the POI. // Max number of images: 5. repeated Image images = 6; // Average rating for the POI. float rating = 12; // The number of contributing ratings for the `rating` field. int64 num_ratings = 13; // The rating scale used for the `rating` field. If max rating is 5, then // rating_scale is 5. int32 rating_scale = 14; // Represents the category of the POI. // It should match the `additional_data` oneof field below. export enum Category { LOCAL = 4; } // Required. Represents the category of the POI. Category category = 9; // A description of the POI. Text description = 16; // Required. Category specific fields. // It should match the `category` field above. oneof additional_data { // Local specific fields. LocalData local_data = 15; } }
Определение текста
// Represents a text with localizations. message Text { // Represents a localized string. message LocalizedString { // The text's language tag, such as "en", "en-US" or "sr-Latn". string locale = 1; // The text in the specified locale. string text = 2; } // The localized strings. repeated LocalizedString localizations = 1; // The locale to use as the default language it must be present in the // localizations. string default_locale = 2; }
Определение геокоординат
// The Geo data of a location, including latitude, longitude, and address. message GeoCoordinates { option (datapol.msg_semantic_type) = ST_LOCATION; // [-90, +90] degrees (inclusive). // Required if longitude is set, otherwise nice to have. double latitude = 1; // [-180, +180] degrees (inclusive). // Required if latitude is set, otherwise nice to have. double longitude = 2; // Required. Address for a location. oneof addresses { // Postal address of the location. PostalAddress address = 3; } }
Определение почтового адреса
// The postal address for the location. message PostalAddress { option (datapol.msg_semantic_type) = ST_LOCATION; // Required. The country, using ISO 3166-1 alpha-2 country code, e.g. "US". string country = 1; // Required. The locality/city, e.g. "Mountain View". string locality = 2; // The region/state/province, e.g. "CA". This field is only required in // countries where region is commonly a part of the address. (optional) string region = 3; // Required. The postal code, e.g. "94043". string postal_code = 4; // Required. The street address, e.g. "1600 Amphitheatre Pkwy". string street_address = 5; }
Определение изображения
// Represents an image of the Point of Interest (POI). export message Image { // The url of the image. Google will crawl the media hosted at this URL. // Max length: 2000. string url = 1; // The alternative text to be used for accessibility. Text alt_text = 2; }
Определение локальных данных
// Establishment specific feed data. message LocalData { // The regular business hours of the establishment. BusinessHours business_hours = 1; // Price range of the services offered by the establishment. PriceRange price_range = 2; // The type of establishment. Text establishment_category = 3; // The brand landing pages. repeated BrandLandingPages brand_landing_pages = 4; }
Определение целевых страниц бренда
// The Localized brand landing pages for a single Point of Interest (POI). message BrandLandingPages { // The brand this configuration applies to. string brand_id = 1 [(datapol.semantic_type) = ST_PARTNER_ID]; // Localized landing page for the Point of Interest (POI). message LocalizedLandingPage { // The url of the landing page. // Max length: 2000. string url = 1; // Restricts this page to users with the specified language preference. // Must contain language tags, such as "en", "en-US" or "sr-Latn". repeated string locales = 3; } // The localized landing pages. // The url and locales fields values must be unique across all the localized // landing pages. repeated LocalizedLandingPage localized_landing_pages = 2; // The default landing page url to be used when none of the localized // landing pages matches the user's language. string default_url = 3; }
Образцы
Лента новостей о достопримечательностях
Имя файла: poi_1707240000.json
{ "data": [ { "poi_id": "test_restaurant_1", "name": { "localizations": [ { "locale": "en", "text": "Tasty Bites Test Restaurant" } ], "default_locale": "en" }, "telephone": "+1234567890", "url": "https://www.tastybitestest.com", "location": { "latitude": 37.422, "longitude": -122.084, "address": { "country": "US", "locality": "Mountain View", "postal_code": "94043", "street_address": "1600 Amphitheatre Pkwy" } }, "display_address": { "localizations": [ { "locale": "en", "text": "1600 Amphitheatre Pkwy, Mountain View, CA 94043" } ], "default_locale": "en" }, "images": [ { "url": "https://www.tastybitestest.com/images/interior.jpg", "alt_text": { "localizations": [ { "locale": "en", "text": "Cozy dining area of Tasty Bites" } ], "default_locale": "en" } } ], "rating": 4.7, "num_ratings": 150, "rating_scale": 5, "category": "LOCAL", "description": { "localizations": [ { "locale": "en", "text": "A mock restaurant for testing the POI feed ingestion." } ], "default_locale": "en" }, "local_data": { "establishment_category": { "localizations": [ { "locale": "en", "text": "Restaurant" } ], "default_locale": "en" }, "price_range": { "min_price": { "currency_code": "USD", "units": 15, "nanos": 0 }, "max_price": { "currency_code": "USD", "units": 45, "nanos": 0 } }, "business_hours": { "time_ranges": [ { "open_day": "MONDAY", "open_time": { "hours": 11, "minutes": 0 }, "close_day": "MONDAY", "close_time": { "hours": 21, "minutes": 0 } }, { "open_day": "TUESDAY", "open_time": { "hours": 11, "minutes": 0 }, "close_day": "TUESDAY", "close_time": { "hours": 21, "minutes": 0 } }, { "open_day": "WEDNESDAY", "open_time": { "hours": 11, "minutes": 0 }, "close_day": "WEDNESDAY", "close_time": { "hours": 21, "minutes": 0 } }, { "open_day": "THURSDAY", "open_time": { "hours": 11, "minutes": 0 }, "close_day": "THURSDAY", "close_time": { "hours": 22, "minutes": 0 } }, { "open_day": "FRIDAY", "open_time": { "hours": 11, "minutes": 0 }, "close_day": "FRIDAY", "close_time": { "hours": 23, "minutes": 0 } }, { "open_day": "SATURDAY", "open_time": { "hours": 10, "minutes": 0 }, "close_day": "SATURDAY", "close_time": { "hours": 23, "minutes": 0 } }, { "open_day": "SUNDAY", "open_time": { "hours": 10, "minutes": 0 }, "close_day": "SUNDAY", "close_time": { "hours": 20, "minutes": 0 } } ] }, "brand_landing_pages": [ { "brand_id": "tasty_bites_brand", "localized_landing_pages": [ { "url": "https://www.tastybitestest.com/en", "locales": ["en-US", "en-GB"] } ], "default_url": "https://www.tastybitestest.com" } ] } } ] }
Многоязычная лента POI
Имя файла: poi_multilingual.json
{ "data": [ { "poi_id": "test_restaurant_1", "name": { "localizations": [ { "locale": "en", "text": "Tasty Bites Test Restaurant" }, { "locale": "fr", "text": "Restaurant de test Tasty Bites" } ], "default_locale": "en" }, "telephone": "+1234567890", "url": "https://www.tastybitestest.com", "location": { "latitude": 37.422, "longitude": -122.084, "address": { "country": "US", "locality": "Mountain View", "postal_code": "94043", "street_address": "1600 Amphitheatre Pkwy" } }, "display_address": { "localizations": [ { "locale": "en", "text": "1600 Amphitheatre Pkwy, Mountain View, CA 94043" }, { "locale": "fr", "text": "1600 Amphitheatre Pkwy, Mountain View, CA 94043" } ], "default_locale": "en" }, "images": [ { "url": "https://www.tastybitestest.com/images/interior.jpg", "alt_text": { "localizations": [ { "locale": "en", "text": "Cozy dining area of Tasty Bites" }, { "locale": "fr", "text": "Espace salle à manger accueillant de Tasty Bites" } ], "default_locale": "en" } } ], "rating": 4.7, "num_ratings": 150, "rating_scale": 5, "category": "LOCAL", "description": { "localizations": [ { "locale": "en", "text": "A mock restaurant for testing the POI feed ingestion." }, { "locale": "fr", "text": "Un faux restaurant pour tester l'ingestion de flux de points d'intérêt." } ], "default_locale": "en" }, "local_data": { "establishment_category": { "localizations": [ { "locale": "en", "text": "Restaurant" }, { "locale": "fr", "text": "Restaurant" } ], "default_locale": "en" }, "price_range": { "min_price": { "currency_code": "USD", "units": 15, "nanos": 0 }, "max_price": { "currency_code": "USD", "units": 45, "nanos": 0 } }, "business_hours": { "time_ranges": [ { "open_day": "MONDAY", "open_time": { "hours": 11, "minutes": 0 }, "close_day": "MONDAY", "close_time": { "hours": 21, "minutes": 0 } }, { "open_day": "TUESDAY", "open_time": { "hours": 11, "minutes": 0 }, "close_day": "TUESDAY", "close_time": { "hours": 21, "minutes": 0 } }, { "open_day": "WEDNESDAY", "open_time": { "hours": 11, "minutes": 0 }, "close_day": "WEDNESDAY", "close_time": { "hours": 21, "minutes": 0 } }, { "open_day": "THURSDAY", "open_time": { "hours": 11, "minutes": 0 }, "close_day": "THURSDAY", "close_time": { "hours": 22, "minutes": 0 } }, { "open_day": "FRIDAY", "open_time": { "hours": 11, "minutes": 0 }, "close_day": "FRIDAY", "close_time": { "hours": 23, "minutes": 0 } }, { "open_day": "SATURDAY", "open_time": { "hours": 10, "minutes": 0 }, "close_day": "SATURDAY", "close_time": { "hours": 23, "minutes": 0 } }, { "open_day": "SUNDAY", "open_time": { "hours": 10, "minutes": 0 }, "close_day": "SUNDAY", "close_time": { "hours": 20, "minutes": 0 } } ] }, "brand_landing_pages": [ { "brand_id": "tasty_bites_brand", "localized_landing_pages": [ { "url": "https://www.tastybitestest.com/fr", "locales": ["fr-FR", "fr-CA"] }, { "url": "https://www.tastybitestest.com/en", "locales": ["en-US", "en-GB"] } ], "default_url": "https://www.tastybitestest.com" } ] } } ] }