Обновления в режиме реального времени (RTU) в первую очередь предназначены для непредвиденных изменений, таких как аварийные закрытия или периодически изменяющиеся метаданные (например, предполагаемое время прибытия). Если изменения не требуют немедленного отражения, можно использовать пакетную обработку. Обновления в режиме реального времени обрабатываются не более чем за пять минут.
Настройка платформы Google Cloud
- Создайте проект GCP. Проект GCP необходим для доступа к API RTU.
- Доступ к редактору гранта : food-support@google.com
- Сообщите своему контактному лицу в Google номер проекта GCP. Для корректной работы обновлений в режиме реального времени ваш проект GCP должен быть связан с вашей учетной записью в Центре действий.
- Включить API бронирования карт:
- В GCP перейдите в раздел API и сервисы > Библиотека .
- Найдите в поиске «Google Maps Booking API».

- Найдите экземпляр песочницы («Google Maps Booking API (Dev)») и нажмите «Включить».
- Найдите экземпляр Production («Google Maps Booking API») и нажмите «Включить».

- Создайте учетную запись службы с ролью редактора для вашего проекта GCP. Дополнительные сведения см. в разделе «Настройка учетной записи службы» .
- Убедитесь, что вы загружаете пакетные потоки данных в среду, в которой работаете над обновлениями в режиме реального времени.
- Для аутентификации через API мы рекомендуем установить библиотеку Google Client на выбранном вами языке. Используйте «https://www.googleapis.com/auth/mapsbooking» в качестве области действия OAuth. Приведенные ниже примеры кода используют эти библиотеки. В противном случае вам потребуется обрабатывать обмен токенами вручную, как описано в разделе «Использование OAuth 2.0 для доступа к API Google» .
Настройка учетной записи службы
Для выполнения аутентифицированных HTTPS-запросов к API Google, например, к API обновлений в реальном времени, вам потребуется учетная запись службы .
Для настройки служебной учетной записи выполните следующие действия:
- Получите доступ к консоли Google Cloud Platform.
- В Центре действий к вашей учетной записи также привязан проект Google Cloud. Выберите этот проект, если он еще не выбран.
- В левом меню нажмите «Служебные учетные записи» .
- Нажмите «Создать учетную запись службы» .
- Введите имя для учетной записи службы и нажмите «Создать» .
- Для выбора роли выберите Проект > Редактор .
- Нажмите «Продолжить» .
- Необязательно: добавьте пользователей, предоставив им доступ к учетной записи службы, и нажмите «Готово» .
- Нажмите «Подробнее» > «Создать ключ для только что созданной учетной записи службы».
- Выберите формат JSON и нажмите «Создать» .
- После того, как будет сгенерирована новая пара открытого/закрытого ключей, загрузите её на свой компьютер.
Работа с API
API обновлений в реальном времени поддерживает два типа операций: обновление и удаление. Добавление новых объектов через API обновлений в реальном времени не поддерживается. Обновления в реальном времени можно объединять в пакеты, если вы включаете несколько обновлений в один запрос API. В одном вызове API можно объединить до 1000 обновлений. Мы рекомендуем использовать подход, основанный на триггерах, для отправки обновлений через RTU (т.е. при изменении данных в вашей системе запускать обновление в реальном времени в Google), а не подход, основанный на частоте (т.е. каждые X минут сканировать вашу систему на наличие изменений), если это возможно.
API для обновления данных в реальном времени работает как в тестовой, так и в производственной среде. Тестовая среда используется для проверки запросов API, а производственная — для обновления контента, видимого пользователям системы Ordering End-to-End.
- Песочница -
partnerdev-mapsbooking.googleapis.com - Производство -
mapsbooking.googleapis.com
Конечные точки
API для обновления данных в режиме реального времени предоставляет две конечные точки для обработки входящих запросов на обновление инвентаризации:
- ОБНОВЛЕНИЕ -
/v1alpha/inventory/partners/PARTNER_ID/feeds/google.food_service/record:batchPush - УДАЛИТЬ -
/v1alpha/inventory/partners/PARTNER_ID/feeds/google.food_service/record:batchDelete
Параметр PARTNER_ID можно найти в Центре действий на странице «Учетные записи и пользователи» , как показано на скриншоте ниже.

Взяв за пример значение PARTNER_ID, равное 10000001, как показано на скриншоте выше, полные URL-адреса для отправки API-запросов в тестовой и рабочей средах будут выглядеть следующим образом, как в примерах ниже.
Обновление песочницы
https://partnerdev-mapsbooking.googleapis.com/v1alpha/inventory/partners/10000001/feeds/google.food_service/record:batchPush
Песочница УДАЛИТЬ
https://partnerdev-mapsbooking.googleapis.com/v1alpha/inventory/partners/10000001/feeds/google.food_service/record:batchDelete
Обновление производства
https://mapsbooking.googleapis.com/v1alpha/inventory/partners/10000001/feeds/google.food_service/record:batchPush
Удалить производство
https://mapsbooking.googleapis.com/v1alpha/inventory/partners/10000001/feeds/google.food_service/record:batchDelete
Обновление сущностей
Для обновления объектов в вашем инвентаре используйте конечную точку обновления в HTTP POST-запросе. Каждый POST-запрос должен включать параметр 10000001 вместе с JSON-данными, содержащими объект, который вы хотите обновить.
Примечание: Убедитесь, что ваши ежедневные потоки данных также содержат все изменения, внесенные через API обновлений в реальном времени. В противном случае ваши данные могут быть устаревшими или неактуальными.
Обновить полезную нагрузку запроса
Тело запроса представляет собой JSON-объект со списком записей. Каждая запись соответствует обновляемой сущности. Оно состоит из поля proto_record и поля generation_timestamp , указывающего время обновления сущности:
{
"records": [
{
"proto_record":"ServiceData PROTO",
"generation_timestamp":"UPDATE_TIMESTAMP"
}
]
}-
ServiceData PROTO: Протокол или JSON-преобразование сущности ServiceData , которую вы обновляете. -
UPDATE_TIMESTAMP: Убедитесь, что вы указали метку времени создания сущности в ваших бэкэнд-системах. Если это поле не указано, будет установлено время получения запроса Google. При обновлении сущности с помощьюbatchPushзапроса batchPush полеgeneration_timestampиспользуется для версионирования сущности. См. ожидаемый формат значений времени в схеме реляционного инвентаря.
- Размер содержимого полезной нагрузки не должен превышать 5 МБ.
- Удалите пробелы, чтобы уменьшить размер.
- В одном пакетном запросе
batchPushможет содержаться до 1000 обновлений.
Примеры
Обновите предполагаемое время прибытия.
Предположим, вам срочно нужно обновить расчетное время прибытия службы доставки с 30-60 минут до 60-90 минут. Ваше обновление должно содержать JSON-данные для всего объекта Service.
Рассмотрим сервисную сущность, которая выглядит следующим образом:
{ "service": { "service_id": "service/entity002", "service_type": "DELIVERY", "parent_entity_id": "entity002", "lead_time": { "min_lead_time_duration": "600s", "max_lead_time_duration": "1800s" }, "action_link_id": "delivery_link/entity002" } }
Ваши обновления в реальном времени, отправляемые по протоколу HTTP POST, выглядят следующим образом (тела запросов отформатированы для удобства чтения):
POST v1alpha/inventory/partners/PARTNER_ID/feeds/google.food_service/record:batchPush Host: mapsbooking.googleapis.com Content-Type: application/json { "records": [{ "proto_record": { "@type": "type.googleapis.com/food.ordering.service.v1.ServiceData", "service" : { "service_id" : "23456/delivery", "service_type" : "DELIVERY", "parent_entity_id" : "23456", "disabled" : "false", "action_link_id": "delivery_link/entity002", "lead_time" : { "min_lead_time_duration" : { "seconds": "3600" }, "max_lead_time_duration" : { "seconds": "5400" } } } }, "generation_timestamp": "2023-09-13T17:11:10.750Z" }] }
Обновление нескольких объектов
Для обновления нескольких объектов ресторана за один вызов API необходимо включить несколько записей в поле proto_record тела запроса.
POST v1alpha/inventory/partners/PARTNER_ID/feeds/google.food_service/record:batchPush Host: mapsbooking.googleapis.com Content-Type: application/json { "records": [{ "proto_record": { "@type": "type.googleapis.com/food.ordering.service.v1.ServiceData", "service" : { "service_id" : "23456/delivery", "service_type" : "DELIVERY", "parent_entity_id" : "23456", "disabled" : "false", "action_link_id": "delivery_link/entity002", "lead_time" : { "min_lead_time_duration" : { "seconds": "1800" }, "max_lead_time_duration" : { "seconds": "3600" } } } }, "generation_timestamp": "2023-09-13T17:11:10.750Z" }, { "proto_record": { "@type": "type.googleapis.com/food.ordering.service.v1.ServiceData", "fee" : { "fee_id" : "12345/delivery_fee", "fee_type" : "DELIVERY", "fixed_amount" : { "currency_code" : "USD", "units" : "10", "nanos" : "0" }, "service_ids": ["service/entity002"] } }, "generation_timestamp" : "2023-09-13T17:11:10.750Z" }] }
Удалить сущности
Для удаления объектов из вашего инвентаря используйте конечную точку DELETE в HTTP POST-запросе. Каждый POST-запрос должен включать параметр PARTNER_ID вместе с JSON-данными, содержащими идентификатор объекта, который вы хотите удалить.
Примечание: Убедитесь, что ваши ежедневные потоки данных также содержат все изменения, отправленные через API обновления в реальном времени. В противном случае ежедневная пакетная загрузка перезапишет ваши изменения в реальном времени.
POST v1alpha/inventory/partners/PARTNER_ID/feeds/google.food_service/record:batchDelete Host: mapsbooking.googleapis.com Content-Type: application/json { "records": [{ "proto_record": { "@type": "type.googleapis.com/food.ordering.service.v1.ServiceData", "service" : { "service_id" : "23456/delivery" } }, "delete_time": "2023-09-13T17:11:10.750Z" }, { "proto_record": { "@type": "type.googleapis.com/food.ordering.service.v1.ServiceData", "fee" : { "fee_id" : "12345/delivery_fee" } }, "delete_time" : "2023-09-13T17:11:10.750Z" }] }
Добавление сущностей
Не используйте обновления в реальном времени для добавления новых сущностей, так как это может привести к несоответствиям данных. Вместо этого используйте пакетную передачу данных.
Коды проверки и ответа API
При выполнении вызовов API для обновления в реальном времени выполняются два типа проверок:
- Проверка на уровне запроса — эти проверки подтверждают, что полезная нагрузка соответствует схеме и каждая
proto_recordсодержит поляidиtype. Эти проверки синхронны, и результаты возвращаются в теле ответа API. Код ответа 200 и пустое тело JSON{}означают, что проверки пройдены успешно, и сущности в этом запросе поставлены в очередь на обработку. Код ответа, отличный от 200, означает, что одна или несколько проверок не пройдены, и весь запрос отклоняется (включая все сущности в полезной нагрузке). Например, еслиproto_recordотсутствует@type, возвращается следующая ошибка:
{ "error": { "code": 400, "message": "Record:{...}", "status": "INVALID_ARGUMENT", "details": [ { "@type": "type.googleapis.com/google.rpc.DebugInfo", "detail": "[ORIGINAL ERROR] generic::invalid_argument: Failed to parse one or more rtu records. Record:... The entity type could not be extracted from the entity value." } ] }
- На уровне сущностей : каждая сущность (proto_record) в полезной нагрузке проверяется на соответствие схеме. Проблемы, обнаруженные на этом этапе проверки, не отображаются в ответе API. Они отображаются только на панели отчетов RTU в Центре действий.
Примечание: код ответа 200 не означает, что все сущности были успешно загружены.
квоты API
Для обновления API в режиме реального времени установлен лимит в 1500 запросов каждые 60 секунд, или в среднем 25 запросов в секунду. При превышении лимита Google выдает следующее сообщение об ошибке:
{
"error": {
"code": 429,
"message": "Insufficient tokens for quota ...",
"status": "RESOURCE_EXHAUSTED",
"details": [...]
}
}Для решения этой проблемы повторяйте вызов с экспоненциально большими интервалами, пока он не будет успешным. Если вы регулярно исчерпываете квоту, рассмотрите возможность включения большего количества сущностей в один API-запрос. Вы можете включить до 1000 сущностей в один API-вызов.
Время обработки, обновления в реальном времени.
Обновление объекта в режиме реального времени обрабатывается за 5 минут.