In diesem Abschnitt wird beschrieben, wie Sie zeitkritische Aktualisierungen Ihrer Inventarentitäten an Google senden können. Mit der Inkrementellen Update API können Sie Aktualisierungen übertragen und Entitäten nahezu in Echtzeit in Ihrem Sandbox- oder Produktionsinventar löschen.
Diese Funktion ist hauptsächlich für Updates vorgesehen, die nicht vorhersehbar sind, z. B. Notfallschließungen. In der Regel sollte jede Änderung, die über die Partial Update API gesendet wird, eine Änderung sein, die innerhalb von maximal einer Stunde übernommen werden darf. Wenn Ihre Änderung nicht sofort wirksam werden muss, können Sie stattdessen die Batchaufnahme verwenden. Inkrementelle Updates werden in höchstens fünf Minuten verarbeitet.
Voraussetzungen
Folgende Elemente sind erforderlich, bevor Sie inkrementelle Updates implementieren:
- Es wird ein Dienstkonto mit der Bearbeiterrolle für Ihr Actions-Projekt erstellt. Weitere Informationen finden Sie unter Projekt erstellen und einrichten.
- Produktions- oder Sandbox-Datenfeeds werden gehostet und aufgenommen. Weitere Informationen finden Sie unter Batchaufnahme.
- Optional, aber empfohlen: Installieren Sie die Google-Clientbibliothek in der Sprache Ihrer Wahl, um die Verwendung von OAuth 2.0 beim Aufrufen der API zu vereinfachen. Diese Bibliotheken werden in den unten aufgeführten Codebeispielen verwendet. Andernfalls müssen Sie den Tokenaustausch manuell ausführen, wie unter OAuth 2.0 für den Zugriff auf Google APIs verwenden beschrieben.
Endpunkte
Ersetzen Sie in den folgenden Anfragen Folgendes:
- PROJECT_ID: Google Cloud-Projekt-ID, die mit dem Projekt verknüpft ist, das Sie unter Projekt erstellen und einrichten erstellt haben.
- TYPE: Der Entitätstyp (
@type
-Property) des Objekts in Ihrem Datenfeed, das Sie aktualisieren möchten. - ENTITY_ID (nur Endpunkt löschen): ID der Entität, die gelöscht werden soll. Ihre Entitäts-ID muss URL-codiert sein.
- DELETE_TIME (nur Endpunkt löschen): Optionales Feld, das den Zeitpunkt angibt, zu dem die Entität auf Ihren Systemen gelöscht wurde. Der Standardwert ist der Zeitpunkt, zu dem die Anfrage eingeht. Der Zeitwert darf nicht in der Zukunft liegen. Beim Senden einer Entität über einen inkrementellen Aufruf verwendet die Entitätsversionsverwaltung auch bei einem Löschaufruf das Feld
delete_time
. Formatieren Sie diesen Wert alsyyyy-mm-ddTHH:mm:ssZ
.
Endpunkt aktualisieren
Stellen Sie zum Ändern einer Entität eine HTTP-POST-Anfrage an den folgenden Endpunkt und fügen Sie eine Nutzlast von Aktualisierungen und Ergänzungen hinzu. Sie können in einem einzigen API-Aufruf bis zu 1.000 Entitäten aktualisieren.
https://actions.googleapis.com/v2/apps/PROJECT_ID/entities:batchPush
Wenn Sie beispielsweise Entitäten in einem Projekt mit der ID „delivery-provider-id“ aktualisieren möchten, lautet der Endpunkt so:
https://actions.googleapis.com/v2/apps/delivery-provider-id/entities:batchpush
Endpunkt löschen
Um eine Entität in Ihrem Inventar zu löschen, stellen Sie eine HTTP DELETE-Anfrage an den folgenden Endpunkt.
https://actions.googleapis.com/v2/apps/PROJECT_ID/entities/TYPE/ENTITY_ID?entity.vertical=FOODORDERING&delete_time=DELETE_TIME
Wenn Sie beispielsweise die Entität „MenuSection“ mit der ID „menuSection_122“ aus dem Projekt „delivery-provider-id“ löschen möchten, führen Sie einen HTTP DELETE API-Aufruf an:
https://actions.googleapis.com/v2/apps/delivery-provider-id/entities/MenuSection/menuSection_122?entity.vertical=FOODORDERING
Sandbox-Umgebung
Folgen Sie der Anleitung unter Endpunkte oben, um die Inkrementelle Update API in Ihrem Sandbox-Inventar zu verwenden. Stellen Sie jedoch Anfragen an /v2/sandbox/apps/
statt an /v2/apps/
.
https://actions.googleapis.com/v2/sandbox/apps/PROJECT_ID/entities:batchPush
https://actions.googleapis.com/v2/sandbox/apps/PROJECT_ID/entities/TYPE/ENTITY_ID?entity.vertical=FOODORDERING&delete_time=DELETE_TIME
Entitäten aktualisieren
Jede POST-Anfrage muss die Anfrageparameter zusammen mit der JSON-Nutzlast enthalten, die die strukturierten Daten jedes im Inventarschema aufgeführten Entitätstyps enthält.
Nutzlast aktualisieren
Die JSON-Datei sollte bis auf die folgenden Unterschiede genauso aussehen wie im Batchfeed:
- Der Nutzlasttext darf nicht größer als 5 MB sein. Ähnlich wie bei Batchfeeds empfehlen wir Ihnen, Leerzeichen zu entfernen, um mehr Daten anzupassen.
- Der Umschlag sieht so aus:
{ "requests": [ { "entity": { "data":"ENTITY_DATA", "name": "apps/project_id>/entities/type/entity_id" }, "update_time":"UPDATE_TIMESTAMP" }, ], "vertical": "FOODORDERING" }
Ersetzen Sie in der obigen Nutzlast Folgendes:
- ENTITY_DATA: Entität im JSON-Format, serialisiert als String. Die JSON-LD-Entität muss als String im Feld
data
übergeben werden. - UPDATE_TIMESTAMP (optional): Zeitstempel für die Aktualisierung der Entität in Ihren Systemen. Der Zeitwert darf nicht in der Zukunft liegen. Der Standardzeitstempel ist der Zeitpunkt,
an dem Google die Anfrage empfängt. Beim Senden einer Entität über eine inkrementelle Anfrage verwendet die Entitätsversionsverwaltung auch das Feld
update_time
für eine Anfrage zum Hinzufügen oder Aktualisieren.
Beispiele
Beispiel 1: Ein Restaurant aktualisieren
Angenommen, Sie müssen die Telefonnummer eines Restaurants dringend aktualisieren. Dein Update enthält den JSON-Code für das gesamte Restaurant.
Betrachten Sie einen Batch-Feed, der so aussieht:
{ "@type": "Restaurant", "@id": "restaurant12345", "name": "Some Restaurant", "url": "https://www.provider.com/somerestaurant", "telephone": "+16501234567", "streetAddress": "345 Spear St", "addressLocality": "San Francisco", "addressRegion": "CA", "postalCode": "94105", "addressCountry": "US", "latitude": 37.472842, "longitude": -122.217144 }
Dann würde Ihr inkrementelles Update per HTTP POST so aussehen:
POST v2/sandbox/apps/provider-project/entities:batchPush Host: actions.googleapis.com Content-Type: application/ld+json { "requests": [ { "entity": { "name": "apps/provider-project/entities/restaurant/restaurant12345", "data": { "@type": "Restaurant", "@id": "restaurant12345", "name": "Some Restaurant", "url": "https://www.provider.com/somerestaurant", "telephone": "+16501235555", "streetAddress": "345 Spear St", "addressLocality": "San Francisco", "addressRegion": "CA", "postalCode": "94105", "addressCountry": "US", "latitude": 37.472842, "longitude": -122.217144 } } } "vertical": "FOODORDERING" }
Beispiel 2: Mehrere Restaurants aktualisieren
Um zwei Restaurantentitäten in einem einzigen API-Aufruf zu aktualisieren, würde die HTTP-POST-Anfrage wie folgt aussehen:
POST v2/sandbox/apps/provider-project/entities:batchPush Host: actions.googleapis.com Content-Type: application/ld+json { "requests": [ { "entity": { "name": "apps/provider-project/entities/restaurant/restaurant12345", "data": { "@type": "Restaurant", "@id": "restaurant12345", "name": "Some Restaurant", "url": "https://www.provider.com/somerestaurant", "telephone": "+16501235555", "streetAddress": "345 Spear St", "addressLocality": "San Francisco", "addressRegion": "CA", "postalCode": "94105", "addressCountry": "US", "latitude": 37.472842, "longitude": -122.217144 } } }, { "entity": { "name": "apps/provider-project/entities/restaurant/restaurant123", "data": { "@type": "Restaurant", "@id": "restaurant123", "name": "Some Other Restaurant", "url": "https://www.provider.com/somerestaurant", "telephone": "+16501231235", "streetAddress": "385 Spear St", "addressLocality": "San Mateo", "addressRegion": "CA", "postalCode": "94115", "addressCountry": "US" } } } ] "vertical": "FOODORDERING" }
Beispiel 3: Preis eines Artikels auf der Speisekarte aktualisieren
Angenommen, Sie müssen den Preis eines Artikels auf der Speisekarte ändern. Wie in Beispiel 1 muss die Aktualisierung den JSON-Code für die gesamte übergeordnete Entität (das Menü) enthalten und der Feed verwendet das V1-Inventarschema.
Betrachten Sie einen Batch-Feed, der so aussieht:
{ "@type": "MenuItemOffer", "@id": "menuitemoffer6680262", "sku": "offer-cola", "menuItemId": "menuitem896532", "price": 3.00, "priceCurrency": "USD" }
Dann würde Ihr inkrementelles Update über POST wie folgt aussehen:
POST v2/sandbox/apps/provider-project/entities:batchPush Host: actions.googleapis.com Content-Type: application/ld+json { "requests": [ { "entity": { "name": "apps/provider-project/entities/menuitemoffer/menuitemoffer6680262", "data": { "@type": "MenuItemOffer", "@id": "menuitemoffer6680262", "sku": "offer-cola", "menuItemId": "menuitem896532", "price": 1.00, "priceCurrency": "USD" }, "vertical": "FOODORDERING" } } ] "vertical": "FOODORDERING" }
Entität hinzufügen
Vermeiden Sie zum Hinzufügen von Entitäten die Verwendung von Inventaraktualisierungen. Wenden Sie stattdessen die Batch-Feeds an, wie unter V2-Inventarschema beschrieben.
Element entfernen
Um Entitäten der obersten Ebene zu entfernen, verwenden Sie einen leicht modifizierten Endpunkt und verwenden in der Anfrage HTTP DELETE anstelle von HTTP POST.
Entität auf oberster Ebene löschen
Angenommen, Sie möchten ein Restaurant in einem Feed löschen. Sie müssen auch die zugehörigen Dienste und Menüs löschen.
Beispiel für einen Endpunkt für eine Menüentität mit der ID „provider/restaurant/menu/nr“:
DELETE v2/apps/delivery-provider-id/entities/menu/provider%2Frestaurant%2Fmenu%2Fnr?entity.vertical=FOODORDERING
Host: actions.googleapis.com
Beispiel für einen Endpunkt für eine Restaurantentität mit der ID "https://www.provider.com/restaurant/nr":
DELETE v2/apps/delivery-provider-id/entities/restaurant/provider%2Frestaurant%2Fnr?entity.vertical=FOODORDERING
Host: actions.googleapis.com
Beispiel für einen Endpunkt für eine Dienstentität mit der ID "https://www.provider.com/restaurant/service/nr":
DELETE v2/apps/delivery-provider-id/entities/service/provider%2Frestaurant%2Fservice%2Fnr?entity.vertical=FOODORDERING
Host: actions.googleapis.com
}
Unterentitäten entfernen
Verwenden Sie HTTP DELETE nicht, um eine Unterentität innerhalb einer übergeordneten Entität zu entfernen, z. B. einen Menüpunkt in einem Menü. Betrachten Sie stattdessen das Entfernen von Unterentitäten als Aktualisierung einer übergeordneten Entität, in der die Unterentität aus der entsprechenden Liste oder aus reverseReference entfernt wird.
API-Antwortcodes
Ein erfolgreicher Aufruf bedeutet nicht, dass der Feed gültig oder korrekt ist, sondern nur, dass der API-Aufruf erfolgt ist. Erfolgreiche Aufrufe erhalten den HTTP-Antwortcode 200 mit einem leeren Antworttext:
{}
Bei Fehlern ist der HTTP-Antwortcode nicht 200 und der Antworttext gibt an, was schiefgelaufen ist.
Wenn der Nutzer beispielsweise den Wert "vertical" im Umschlag auf FAKE_VERTICAL
gesetzt hat, erhalten Sie die folgende Nachricht:
{
"error": {
"code": 400,
"message": "Invalid value at 'entity.vertical' (TYPE_ENUM), \"FAKE_VERTICAL\"",
"status": "INVALID_ARGUMENT",
"details": [
{
"@type": "type.googleapis.com/google.rpc.BadRequest",
"fieldViolations": [
{
"field": "entity.vertical",
"description": "Invalid value at 'entity.vertical' (TYPE_ENUM), \"FAKE_VERTICAL\""
}
]
}
]
}
}
Codebeispiel
Im Folgenden finden Sie einige Beispiele für die Verwendung der Inkrementellen Update API in verschiedenen Sprachen. In diesen Beispielen werden die Google-Authentifizierungsbibliotheken verwendet und es wird davon ausgegangen, dass es sich um einen Feed mit V1-Inventarschema handelt. Alternative Lösungen finden Sie unter OAuth 2.0 für Server-zu-Server-Anwendungen verwenden.
Entitäten aktualisieren
Node.js
In diesem Code wird die Google-Authentifizierungsbibliothek für Node.js verwendet.
const {auth} = require('google-auth-library') const request = require('request'); // The service account client secret file downloaded from the Google Cloud Console const serviceAccountJson = require('./service-account.json') // entity.json is a file that contains the entity data in json format const entity = require('./entity.json') const ENTITY_ID = 'your/entity/id' const PROJECT_ID = 'type/your-project-id' /** * Get the authorization token using a service account. */ async function getAuthToken() { let client = auth.fromJSON(serviceAccountJson) client.scopes = ['https://www.googleapis.com/auth/assistant'] const tokens = await client.authorize() return tokens.access_token; } /** * Send an incremental update to update or add an entity */ async function updateEntity(entity) { const token = await getAuthToken() request.post({ headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${token}` }, url: `https://actions.googleapis.com/v2/apps/${PROJECT_ID}/entities:batchPush`, body: { requests: [ { entity: { data: JSON.stringify(entity) name: `apps/${PROJECT_ID}/entities/${ENTITY_ID}` } } ], vertical: 'FOODORDERING' }, json: true }, (err, res, body) => { if (err) { return console.log(err); } console.log(`Response: ${JSON.stringify(res)}`) }) } updateEntity(entity)
Python
In diesem Code wird die Google-Authentifizierungsbibliothek für Python verwendet.
from google.oauth2 import service_account from google.auth.transport.requests import AuthorizedSession import json import urllib PROJECT_ID = 'your-project-id' ENTITY_ID = 'type/your/entity/id' ENDPOINT = 'https://actions.googleapis.com/v2/apps/%s/entities:batchPush' % ( PROJECT_ID) # service-account.json is the service account client secret file downloaded from the # Google Cloud Console credentials = service_account.Credentials.from_service_account_file( 'service-account.json') scoped_credentials = credentials.with_scopes( ['https://www.googleapis.com/auth/assistant']) authed_session = AuthorizedSession(scoped_credentials) # Retrieving the entity update_file = open("entity.json") #JSON file containing entity data in json format. data = update_file.read() entity = {} entity['data'] = data #entity JSON-LD serialized as string entity['name'] = 'apps/%s/entities/%s' % (PROJECT_ID, urllib.quote(ENTITY_ID, '') ) # Populating the request request = {} request['entity'] = entity requestArray = [request] # Populating the payload payload = {} payload['requests'] = requestArray payload['vertical'] = 'FOODORDERING' response = authed_session.post(ENDPOINT, json=payload) print(response.text) #if successful, will be '{}'
Java
Dieser Code verwendet die Google-Authentifizierungsbibliothek für Java.
private static final String PROJECT_ID = "your-project-id"; private static final String ENTITY_ID = "type/your-entity-id"; /** * Get the authorization token using a service account. */ private static String getAuthToken() { InputStream serviceAccountFile = Example.class.getClassLoader().getResourceAsStream("service-account.json"); ServiceAccountCredentials.Builder credentialsSimpleBuilder = ServiceAccountCredentials.fromStream(serviceAccountFile).toBuilder(); credentialsSimpleBuilder.setScopes(ImmutableList.of("https://www.googleapis.com/auth/assistant")); AccessToken accessToken = credentialsSimpleBuilder.build().refreshAccessToken(); return accessToken.getTokenValue(); } /** * Send an incremental update to update or add an entity. * @param entityId The id of the entity to update. * @param entity the json of the entity to be updated. */ public void updateEntity(String entityId, JSONObject data) { String authToken = getAuthToken(); String endpoint = String.format("https://actions.googleapis.com/v2/apps/%s/entities/:batchPush", PROJECT_ID); JSONObject entity = new JSONObject(); entity.put("data", data.toString()); entity.put("name", String.format("apps/%s/entities/%s", PROJECT_ID, URLEncoder.encode(ENTITY_ID, "UTF-8"))); JSONObject request = new JSONObject(); request.put("entity", entity); JSONArray requestArray = new JSONArray(); requestArray.put(request); JSONObject payload = new JSONObject(); payload.put("requests", requestArray); payload.put("vertical", FOODORDERING); // Execute POST request executePostRequest(endpoint, authToken, payload); }
Elemente entfernen
Node.js
In diesem Code wird die Google-Authentifizierungsbibliothek für Node.js verwendet.
const {auth} = require('google-auth-library') const request = require('request'); // The service account client secret file downloaded from the Google Cloud Console const serviceAccountJson = require('./service-account.json') // entity.json is a file that contains the entity data in json format const entity = require('./entity.json') const ENTITY_ID = 'restaurant/http://www.provider.com/somerestaurant' const PROJECT_ID = 'your-project-id' /** * Get the authorization token using a service account. */ async function getAuthToken() { let client = auth.fromJSON(serviceAccountJson) client.scopes = ['https://www.googleapis.com/auth/assistant'] const tokens = await client.authorize() return tokens.access_token; } /** * Send an incremental update to delete an entity */ async function deleteEntity(entityId) { const token = await getAuthToken() request.delete({ headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${token}` }, url: `https://actions.googleapis.com/v2/apps/${PROJECT_ID}/entities/${encodeURIComponent(entityId)}?entity.vertical=FOODORDERING`, body: {}, json: true }, (err, res, body) => { if (err) { return console.log(err); } console.log(`Response: ${JSON.stringify(res)}`) }) } deleteEntity(ENTITY_ID)
Python
In diesem Code wird die Google-Authentifizierungsbibliothek für Python verwendet.
from google.oauth2 import service_account from google.auth.transport.requests import AuthorizedSession import json import urllib # Service config PROJECT_ID = 'your-project-id' ENTITY_ID = 'restaurant/http://www.provider.com/somerestaurant' DELETE_TIME = '2018-04-07T14:30:00-07:00' ENDPOINT = 'https://actions.googleapis.com/v2/apps/%s/entities/%s?entity.vertical=FOODORDERING&delete_time=%s' % ( PROJECT_ID, urllib.quote(ENTITY_ID, ''), urllib.quote(DELETE_TIME, '')) # service-account.json is the service account client secret file downloaded from the # Google Cloud Console credentials = service_account.Credentials.from_service_account_file( 'service-account.json') scoped_credentials = credentials.with_scopes( ['https://www.googleapis.com/auth/assistant']) authed_session = AuthorizedSession(scoped_credentials) response = authed_session.delete(ENDPOINT) print(response.text) #if successful, will be '{}'
Java
Dieser Code verwendet die Google-Authentifizierungsbibliothek für Java.
private static final String PROJECT_ID = "your-project-id"; private static final String ENTITY_ID = "restaurant/http://www.provider.com/somerestaurant"; /** * Get the authorization token using a service account. */ private static String getAuthToken() { InputStream serviceAccountFile = Example.class.getClassLoader().getResourceAsStream("service-account.json"); ServiceAccountCredentials.Builder credentialsSimpleBuilder = ServiceAccountCredentials.fromStream(serviceAccountFile).toBuilder(); credentialsSimpleBuilder.setScopes(ImmutableList.of("https://www.googleapis.com/auth/assistant")); AccessToken accessToken = credentialsSimpleBuilder.build().refreshAccessToken(); return accessToken.getTokenValue(); } /** * Send an incremental update to delete an entity. * @param entityId The id of the entity to delete. */ public void deleteEntity(String entityId) { String authToken = getAuthToken(); String endpoint = String.format( "https://actions.googleapis.com/v2/apps/%s/entities/%s?entity.vertical=FOODORDERING", PROJECT_ID, URLEncoder.encode(entityId, "UTF-8")); // Execute DELETE request System.out.println(executeDeleteRequest(endpoint, authToken)); }
Anwendungsfälle
Die folgenden Anwendungsfälle sind Beispiele für inkrementelle Aktualisierungen, vollständige Feedaktualisierungen und den Inhalt auf übergeordneter Ebene im API-Aufruf:
Szenario | Zu aktualisierende Entität | Beschreibung und Effekte |
---|---|---|
Dienst deaktivieren | Service |
Sie müssen einen Dienst aus unvorhergesehenen Gründen deaktivieren. Inkrementelle Aktualisierungen: Aktualisieren Sie die betreffende Entität Vollständige Feeds:Aktualisieren Sie die Entität aus den vollständigen Feeds so, dass |
Ein bestimmter Artikel ist nicht auf Lager | MenuItemOffer |
Inkrementelle Aktualisierungen: Sende die kapselnde MenuItemOffer -Entität, wobei inventoryLevel für die angegebene MenuItem auf 0 gesetzt ist und alle anderen Daten unverändert bleiben. |
Preisänderung auf Speisekarte | MenuItemOffer |
Inkrementelle Aktualisierungen: Sende die kapselnde MenuItemOffer -Entität, wobei price auf den aktualisierten Preis für die angegebene MenuItem festgelegt ist und alle anderen Daten unverändert bleiben. |
Neues Element der obersten Ebene hinzufügen Gilt nur für Entitäten der Typen |
Menu , Restaurant , Service |
Beispielsweise müssen Sie einem Restaurant eine neue Speisekarte hinzufügen. Vollständige Feeds:Fügen Sie die Entität Ihren Datenfeeds hinzu und warten Sie auf die Batchaufnahme. |
Element der obersten Ebene endgültig löschen Gilt nur für Entitäten der Typen |
Menu , Restaurant , Service |
Inkrementelle Updates:Senden Sie einen expliziten Löschvorgang. Vollständige Feeds:Die Entität muss vor dem nächsten Abruf durch Google aus den vollständigen Feeds entfernt werden. Andernfalls wird die Entität wieder hinzugefügt. |
Neues Liefergebiet in einem bestimmten Service hinzufügen |
ServiceArea |
Inkrementelle Feeds:Senden Sie die betreffende ServiceArea -Entität mit allen Feldern intakt, wie Sie es auch normalerweise in den vollständigen Feeds tun würden, und geben Sie dabei einen neuen Lieferbereich in polygon , geoRadius oder postalCode an. |
Voraussichtliche Lieferzeit in Service aktualisieren |
ServiceHours |
Inkrementelle Feeds:Senden Sie ServiceHours wie in den Feeds, außer dass leadTimeMin entsprechend aktualisiert wird. |
Lieferpreise in Service aktualisieren |
Fee |
Inkrementelle Feeds:Senden Sie eine vollständige Zustellung Fee , wobei price aktualisiert wird. |
Liefer- oder Abholzeiten in Service aktualisieren |
ServiceHours |
Inkrementelle Feeds:Senden Sie ServiceHours genauso wie in den Feeds, außer dass die Properties opens und closes entsprechend aktualisiert werden. |
Service (Mindestbestellbetrag ändern) |
Fee |
Inkrementelle Feeds:Vollständige Fee senden, wobei minPrice aktualisiert wird |
MenuItem endgültig löschen |
Menu |
Inkrementelle Feeds:Senden Sie MenuItem wie in den Feeds, aber mit leerem parentMenuSectionId .
|
SLO für die Verarbeitungszeit für Batchjobs und inkrementelle Updates
Eine Entität, die über einen Batch aktualisiert oder gelöscht wird, wird im Best-Effort-Modus innerhalb von 2 Stunden verarbeitet, während eine Entität, die durch ein inkrementelles Update aktualisiert wird, in 5 Minuten verarbeitet wird. Eine veraltete Entität wird nach 7 Tagen gelöscht.
Sie können Google folgende Informationen senden:
- Mehrere Batch-Aufträge pro Tag, um Ihr Inventar auf dem neuesten Stand zu halten ODER
- Ein Batchjob pro Tag und inkrementelle APIs, um Ihr Inventar auf dem neuesten Stand zu halten.