As RTUs são destinadas principalmente a atualizações que não podem ser previstas, como fechamentos de emergência ou metadados que mudam periodicamente (como ETAs). Se a mudança não precisar ser refletida imediatamente, use a ingestão de feeds em lote. As atualizações em tempo real são processadas em no máximo cinco minutos.
Configuração do Google Cloud Platform
- Configure um projeto do GCP. É necessário ter um projeto do GCP para acessar a API RTU.
- Conceder acesso de editor food-support@google.com
- Informe ao seu ponto de contato do Google o número do projeto do GCP.Ele precisa estar associado à sua conta da Central de ações para que as atualizações em tempo real funcionem.
- Ative a API Maps Booking:
- No GCP, acesse APIs e serviços > Biblioteca.
- Pesquise "API Google Maps Booking".
- Encontre a instância do Sandbox ("API Google Maps Booking (Dev)") e clique em Ativar.
- Encontre a instância de produção ("API Google Maps Booking") e clique em Ativar.
- Crie uma conta de serviço com uma função de editor no seu projeto do GCP. Para mais detalhes, consulte Configuração da conta de serviço.
- Faça upload de feeds em lote para o ambiente em que você está trabalhando com atualizações em tempo real.
- Para autenticação de API, recomendamos instalar a biblioteca de cliente do Google na linguagem de sua escolha. Use "https://www.googleapis.com/auth/mapsbooking" como o escopo do OAuth. Os exemplos de código incluídos abaixo usam essas bibliotecas. Caso contrário, você precisará processar as trocas de tokens manualmente, conforme descrito em Como usar o OAuth 2.0 para acessar as APIs do Google.
Configuração da conta de serviço
Você precisa de uma conta de serviço para fazer solicitações HTTPS autenticadas para APIs do Google, como a API de atualizações em tempo real.
Para configurar uma conta de serviço, faça o seguinte:
- Acesse o console do Google Cloud Platform.
- Sua conta na Central de ações também tem um projeto do Google Cloud associado a ela. Selecione esse projeto, caso ele ainda não esteja selecionado.
- Clique em Contas de serviço no menu à esquerda.
- Clique em Criar conta de serviço.
- Digite um nome para a conta de serviço e clique em Criar.
- Em Selecionar um papel, escolha Projeto > Editor.
- Clique em Continuar.
- Opcional: adicione usuários para conceder acesso à conta de serviço e clique em Concluído.
- Clique em Mais > Criar chave para a conta de serviço que você acabou de criar.
- Selecione JSON como o formato e clique em Criar.
- Depois que o novo par de chaves pública/privada for gerado, faça o download dele para sua máquina.
Como trabalhar com a API
A API Real-time updates oferece suporte a dois tipos de operações: Update e Delete. Não é possível adicionar novas entidades usando a API de atualização em tempo real. As atualizações em tempo real podem ser agrupadas em lotes se você incluir várias atualizações em uma única solicitação de API. É possível agrupar até 1.000 atualizações em uma única chamada de API. Recomendamos usar uma abordagem baseada em gatilhos para enviar atualizações via RTU (ou seja, quando houver uma mudança de dados no seu sistema, acione uma atualização em tempo real para o Google) em vez de uma abordagem baseada em frequência (ou seja, a cada X minutos, verifique se há mudanças no seu sistema), se possível.
A API de atualizações em tempo real opera em ambientes de sandbox e produção. O ambiente sandbox é usado para testar as solicitações de API, e o ambiente de produção para atualizar o conteúdo visível aos usuários do Pedidos de ponta a ponta.
- Sandbox -
partnerdev-mapsbooking.googleapis.com - Produção:
mapsbooking.googleapis.com
Endpoints
A API Real-time Updates expõe dois endpoints para processar as solicitações de atualizações de inventário recebidas:
- ATUALIZAÇÃO:
/v1alpha/inventory/partners/PARTNER_ID/feeds/google.food_service/record:batchPush - DELETE -
/v1alpha/inventory/partners/PARTNER_ID/feeds/google.food_service/record:batchDelete
O parâmetro PARTNER_ID pode ser encontrado na Central de ações, na página Conta e usuários, conforme mostrado na captura de tela abaixo.
Tomando 10000001 como o valor de PARTNER_ID, como exemplo da captura de tela acima, os URLs completos para enviar solicitações de API em sandbox e produção serão semelhantes aos exemplos abaixo.
Atualização do sandbox
https://partnerdev-mapsbooking.googleapis.com/v1alpha/inventory/partners/10000001/feeds/google.food_service/record:batchPush
Exclusão de sandbox
https://partnerdev-mapsbooking.googleapis.com/v1alpha/inventory/partners/10000001/feeds/google.food_service/record:batchDelete
Atualização de produção
https://mapsbooking.googleapis.com/v1alpha/inventory/partners/10000001/feeds/google.food_service/record:batchPush
Exclusão de produção
https://mapsbooking.googleapis.com/v1alpha/inventory/partners/10000001/feeds/google.food_service/record:batchDelete
Como atualizar entidades
Para atualizar entidades no seu inventário, use o endpoint update em uma solicitação HTTP POST. Cada solicitação POST precisa incluir o parâmetro 10000001 e um payload JSON com a entidade que você quer atualizar.
Observação:verifique se seus feeds de dados diários também contêm as mudanças enviadas pela API de atualizações em tempo real. Caso contrário, seus dados podem estar desatualizados.
Atualizar o payload da solicitação
O corpo da solicitação é um objeto JSON com uma lista de registros. Cada registro corresponde a uma entidade que está sendo atualizada. Ele consiste no campo proto_record e no generation_timestamp, que indica o horário da atualização da entidade:
{
"records": [
{
"proto_record":"ServiceData PROTO",
"generation_timestamp":"UPDATE_TIMESTAMP"
}
]
}ServiceData PROTO: a tradução proto ou JSON da entidade ServiceData que você está atualizando.UPDATE_TIMESTAMP: inclua o carimbo de data/hora de quando a entidade foi gerada nos seus sistemas de back-end. Se esse campo não for incluído, ele será definido como o momento em que o Google receber a solicitação. Ao atualizar uma entidade com uma solicitaçãobatchPush, o campogeneration_timestampé usado para o controle de versões da entidade. Consulte o formato esperado dos valores de tempo no esquema de inventário relacional.
- O corpo do payload não pode exceder 5 MB.
- Remova espaços em branco para reduzir o tamanho.
- Pode haver até 1.000 atualizações em uma solicitação
batchPush.
Exemplos
Atualizar um ETA
Suponha que você precise atualizar com urgência a ETA de um serviço de entrega de 30 a 60 minutos para 60 a 90 minutos. A atualização precisa conter o JSON de toda a entidade de serviço.
Considere uma entidade de serviço que tenha a seguinte aparência:
{ "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" } }
Sua atualização em tempo real por HTTP POST é a seguinte (os corpos das solicitações são formatados para facilitar a leitura):
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" }] }
Atualizar várias entidades
Para atualizar várias entidades de restaurante em uma única chamada de API, inclua vários registros no campo proto_record do corpo da solicitação.
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" }] }
Excluir entidades
Para excluir entidades do seu inventário, use o endpoint DELETE em uma solicitação HTTP POST. Cada solicitação POST precisa incluir o parâmetro PARTNER_ID e o payload JSON com o identificador da entidade que você quer excluir.
Observação:verifique se os feeds de dados diários também contêm as mudanças enviadas pela API de atualização em tempo real. Caso contrário, a ingestão diária em lote vai substituir as mudanças em tempo real.
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" }] }
Adicionar entidades
Não use atualizações em tempo real para adicionar novas entidades, porque isso pode resultar em inconsistências de dados. Em vez disso, use feeds em lote.
Códigos de validação e resposta da API
Há dois tipos de validações realizadas nas chamadas de API de atualização em tempo real:
- No nível da solicitação: essas validações verificam se o payload segue o esquema e se cada
proto_recordcontém os camposidetype. Essas verificações são síncronas, e os resultados são retornados no corpo da resposta da API. Um código de resposta 200 e um corpo JSON vazio{}significam que essas validações foram aprovadas e as entidades nessa solicitação foram enfileiradas para processamento. Um código de resposta diferente de 200 significa que uma ou mais dessas validações falharam e toda a solicitação foi rejeitada (incluindo todas as entidades no payload). Por exemplo, se umproto_recordnão tiver um@type, a seguinte resposta de erro será retornada:
{ "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." } ] }
- Nível da entidade: cada entidade (proto_record) no payload é validada em relação ao esquema. Os problemas encontrados nessa fase de validação não são informados na resposta da API. Elas são informadas apenas no painel Relatórios de RTU da Central de ações.
Observação:um código de resposta 200 não significa que todas as entidades foram ingeridas com sucesso.
Cotas da API
As atualizações da API em tempo real têm,em média, uma cota de 1.500 solicitações a cada 60 segundos ou 25 solicitações por segundo. Quando uma cota é excedida, o Google responde com a seguinte mensagem de erro:
{
"error": {
"code": 429,
"message": "Insufficient tokens for quota ...",
"status": "RESOURCE_EXHAUSTED",
"details": [...]
}
}Para resolver esse problema, repita a chamada em intervalos exponencialmente maiores até que ela seja bem-sucedida. Se você esgotar a cota regularmente, inclua mais entidades em uma solicitação de API. É possível incluir até mil entidades em uma chamada de API.
Atualizações em tempo real sobre os tempos de processamento
Uma entidade atualizada por uma atualização em tempo real é processada em cinco minutos.