In diesem Abschnitt wird beschrieben, wie Sie zeitkritische Aktualisierungen Ihrer Feeds an Google. Mit der Inkrementelle Updates API können Sie Entitäten in Ihrem Feeds nahezu in Echtzeit.
Diese Funktion ist hauptsächlich für Updates gedacht, die Sie nicht vorhersehen können, z. B. bei Notrufen. In der Regel gilt, dass jede Änderung, die über das Die Inkrementelle Updates API sollte eine Änderung sein, die in maximal einer Woche. Muss Ihre Änderung nicht sofort übernommen werden, können Sie stattdessen eine Batch-Aktualisierung. Inkrementelle Aktualisierungen werden in maximal fünf Minuten.
Einrichtung
So implementieren Sie inkrementelle Updates:
- Folgen Sie der Anleitung unter Projekt erstellen und einrichten, um Projekt erstellen.
- Folgen Sie der Anleitung unter Dienstkonto einrichten. um ein Dienstkonto zu erstellen. Sie müssen ein „Inhaber“ sein der um einen Bearbeiter hinzuzufügen, Rolle für das Dienstkonto
- Optional, aber empfohlen: Google-Clientbibliothek installieren in der Sprache Ihrer Wahl, um die Verwendung von OAuth 2.0 beim Aufrufen der der API erstellen. Diese Bibliotheken werden in den unten aufgeführten Codebeispielen verwendet. Andernfalls müssen Tokenaustausch manuell durchführen, wie unter OAuth 2.0 für den Zugriff auf Google APIs verwenden beschrieben.
Endpunkt
Um Google über ein Update zu informieren, stellen Sie eine HTTP-POST-Anfrage an den inkrementellen Updates API mit einer Nutzlast von Updates und Ergänzungen. Das verwendete Inventarschema bestimmt, an welchen Endpunkt Ihre Anfrage gesendet wird:
v2-Inventar
https://actions.googleapis.com/v2/apps/PROJECT_ID/entities/TYPE/ENTITY_ID:push
v1-Inventar
https://actions.googleapis.com/v2/apps/PROJECT_ID/entities/ENTITY_ID:push
Um eine Entität zu entfernen, stellen Sie eine HTTP DELETE-Anfrage an den folgenden Endpunkt, der welches Inventarschema Sie verwenden:
v2-Inventar
https://actions.googleapis.com/v2/apps/PROJECT_ID/entities/TYPE/ENTITY_ID?entity.vertical=FOODORDERING&delete_time=DELETE_TIME
v1-Inventar
https://actions.googleapis.com/v2/apps/PROJECT_ID/entities/ENTITY_ID?entity.vertical=FOODORDERING&delete_time=DELETE_TIME
Ersetzen Sie in den obigen Anfragen Folgendes:
- PROJECT_ID: Google Cloud-Projekt-ID, die mit dem Projekt verknüpft ist, das Sie die unter Projekt erstellen und einrichten erstellt wurden.
- TYPE (nur Inventarschema Version 2): Der Entitätstyp (Attribut
@type
) des Objekts in Ihrem Datenfeed, das Sie aktualisieren möchten. - ENTITY_ID: ID der in der Nutzlast enthaltenen Entität. Achten Sie darauf, Die Entitäts-ID muss URL-codiert werden.
- DELETE_TIME (nur Endpunkt löschen): Optionales Feld zur Kennzeichnung des
Zeitpunkt, zu dem die Entität in Ihren Systemen gelöscht wurde (standardmäßig die Anfrage
empfangen). Der Zeitwert darf nicht in der Zukunft liegen. Beim Senden einer Entität
durch einen inkrementellen Aufruf, Entitätsversionsverwaltung
verwendet im Falle eines Löschaufrufs auch das Feld
delete_time
. Formatieren Wert alsyyyy-mm-ddTHH:mm:ssZ
Angenommen, Sie haben ein Projekt mit der ID „delivery-provider-id“. mit das Inventarschema der Version 2. Sie möchten Änderungen am Restaurant vornehmen, Typ des Restaurantunternehmens von „MenuSection“ und die Entitäts-ID „menuSection_122“. Der Endpunkt für Aktualisierungen Ihrer Daten wäre der folgende:
https://actions.googleapis.com/v2/apps/delivery-provider-id/entities/MenuSection/menuSection_122:push
Um dieselbe Entität zu entfernen, verwenden Sie folgenden HTTP DELETE API-Aufruf:
https://actions.googleapis.com/v2/apps/delivery-provider-id/entities/MenuSection/menuSection_122?entity.vertical=FOODORDERING
Sandbox-Anfragen
Folgen Sie bei Sandbox-Anfragen der Anleitung unter Endpunkt oben, aber
Anfragen an /v2/sandbox/apps/
statt an /v2/apps/
stellen Beispiel:
Die Sandbox-Löschanfrage für das V2-Inventarschema ist so aufgebaut:
https://actions.googleapis.com/v2/sandbox/apps/PROJECT_ID/entities/TYPE/ENTITY_ID?entity.vertical=FOODORDERING&delete_time=DELETE_TIME
Aktualisierungen und Ergänzungen
Ihre täglichen Batch-Feeds sollten auch Änderungen enthalten, die über dieses der API erstellen. Andernfalls überschreiben die Batch-Updates Ihre inkrementellen Änderungen.
Nutzlast
Jede POST-Anfrage muss die Anfrageparameter zusammen mit dem JSON-Code enthalten. Nutzlast, die die strukturierten Daten eines beliebigen Entitätstyps enthält, der in den Inventarschema.
Die JSON-Datei sollte wie im Batch-Feed aussehen, mit den folgenden Zeichen: folgenden Unterschieden:
- Der Nutzlasttext darf nicht größer als 5 MB sein. Ähnlich wie im Batch -Feeds, empfehlen wir, Leerzeichen zu entfernen, damit mehr Daten unterzubringen sind.
- Der Umschlag lautet:
{ "entity": { "data":"ENTITY_DATA", "vertical":"FOODORDERING" }, "update_time":"UPDATE_TIMESTAMP" }
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,
Google erhält die Anfrage. Wenn Sie eine Entität über eine
-Anfrage verwendet, verwendet die Entitätsversionsverwaltung auch die
update_time
im Fall einer Anfrage zum Hinzufügen/Aktualisieren.
Entität aktualisieren
Beispiel 1: Restaurant aktualisieren
Angenommen, Sie müssen die Telefonnummer eines Restaurants dringend aktualisieren. Ihr update enthält die JSON-Datei für das gesamte Restaurant.
Stellen Sie sich einen Batch-Feed vor, 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/apps/provider-project/entities/Restaurant/restaurant12345:push Host: actions.googleapis.com Content-Type: application/ld+json { "entity": { "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: Preis für Artikel auf einer Speisekarte aktualisieren
Angenommen, Sie müssen den Preis eines Artikels auf der Speisekarte ändern. Wie in Beispiel 1 wird Ihr Update muss die JSON-Datei für die gesamte übergeordnete Entität (das Menü) enthalten und die -Feed verwendet das V1-Inventarschema.
Stellen Sie sich einen Batch-Feed vor, der so aussieht:
{ "@type": "MenuItemOffer", "@id": "menuitemoffer6680262", "sku": "offer-cola", "menuItemId": "menuitem896532", "price": 3.00, "priceCurrency": "USD" }
Dann würde Ihr inkrementelles Update per POST wie folgt aussehen:
POST v2/apps/provider-project/entities/MenuItemOffer/menuitemoffer6680262:push Host: actions.googleapis.com Content-Type: application/ld+json { "entity": { "data": { "@type": "MenuItemOffer", "@id": "menuitemoffer6680262", "sku": "offer-cola", "menuItemId": "menuitem896532", "price": 1.00, "priceCurrency": "USD" }, "vertical": "FOODORDERING" } }
Entität hinzufügen
Verwenden Sie keine Inventaraktualisierungen, um Entitäten hinzuzufügen. Verwenden Sie stattdessen Batch-Feeds wie für das v2-Inventarschema beschrieben.
Entität entfernen
Um Entitäten der obersten Ebene zu entfernen, verwenden Sie einen leicht modifizierten endpoint, und verwenden Sie in der Anfrage HTTP DELETE anstelle von HTTP POST.
Verwenden Sie HTTP DELETE nicht, um eine Unterentität innerhalb einer übergeordneten Entität zu entfernen, z. B. ein Menüelement innerhalb eines Menüs. Behandeln Sie das Entfernen von Unterentitäten als Aktualisierung auf eine übergeordnete Entität, bei der die Unterentität aus der relevante Liste oder einen relevanten Parameter enthält.
Beispiel 1: Entität der obersten Ebene löschen
Angenommen, Sie möchten ein Restaurant aus einem Feed löschen, in dem das Inventarschema von V1. Sie müssen auch die zugehörigen Dienste und Speisekarten löschen.
Beispielendpunkt für eine Menüentität mit ID "https://www.provider.com/restaurant/menu/nr":
DELETE v2/apps/delivery-provider-id/entities/https%3A%2F%2Fwww.provider.com%2Frestaurant%2Fmenu%2Fnr?entity.vertical=FOODORDERING
Host: actions.googleapis.com
Beispielendpunkt für eine Restaurantentität mit ID "https://www.provider.com/restaurant/nr":
DELETE v2/apps/delivery-provider-id/entities/https%3A%2F%2Fwww.provider.com%2Frestaurant%2Fnr?entity.vertical=FOODORDERING
Host: actions.googleapis.com
Ein Beispielendpunkt für eine Dienstentität mit ID "https://www.provider.com/restaurant/service/nr":
DELETE v2/apps/delivery-provider-id/entities/https%3A%2F%2Fwww.provider.com%2Frestaurant%2Fservice%2Fnr?entity.vertical=FOODORDERING
Host: actions.googleapis.com
}
Beispiel 2: Unterentitäten entfernen
Wenn Sie eine Unterentität innerhalb einer übergeordneten Entität entfernen möchten, senden Sie die oberste Ebene Entität, wobei die Unterentität aus dem entsprechenden Feld entfernt wurde. Die folgenden Im Beispiel wird davon ausgegangen, dass im Feed das Inventarschema V1 verwendet wird.
Wenn Sie z. B. ein Einzugsgebiet entfernen möchten, geben Sie das entsprechende Einzugsgebiet an.
wurde aus der areaServed
-Liste entfernt.
POST v2/apps/delivery-provider-id/entities/https%3A%2F%2Fwww.provider.com%2Frestaurant%2Fservice%2Fnr:push
Host: actions.googleapis.com
Content-Type: application/ld+json
{
"entity": {
// Note: "data" is not serialized as a string in our example for readability.
"data": {
"@type": "Service",
"provider": {
"@type": "Restaurant",
"@id": "https://www.provider.com/restaurant/nr"
},
"areaServed": [
{
"@type": "GeoCircle",
"geoMidpoint": {
"@type": "GeoCoordinates",
"latitude": "42.362757",
"longitude": "-71.087109"
},
"geoRadius": "10000"
}
// area2 is removed.
]
...
},
"vertical": "FOODORDERING"
}
}
API-Antwortcodes
Ein erfolgreicher Aufruf bedeutet nicht, dass der Feed gültig oder korrekt ist, sondern nur, dass der API-Aufruf wurde ausgeführt. Erfolgreiche Aufrufe erhalten den HTTP-Antwortcode 200 sowie mit leerem Antworttext:
{}
Bei Fehlern ist der HTTP-Antwortcode nicht 200 und der Antworttext ist nicht zeigt an, was schiefgelaufen ist.
Wenn der Nutzer beispielsweise die Branche in den Umschlag ein,
FAKE_VERTICAL
, 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
Unten sehen Sie einige Beispiele, wie die Inkrementelle Updates API auf verschiedenen Sprachen. In diesen Beispielen werden die Google Auth Libraries verwendet. Es wird davon ausgegangen, dass ein Feed mit das Inventarschema von V1. 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 = '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 update or add an entity */ async function updateEntity(entityId, 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/${encodeURIComponent(entityId)}:push`, body: { entity: { data: JSON.stringify(entity), vertical: 'FOODORDERING', } }, json: true }, (err, res, body) => { if (err) { return console.log(err); } console.log(`Response: ${JSON.stringify(res)}`) }) } updateEntity(ENTITY_ID, 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 = 'restaurant/http://www.provider.com/somerestaurant' ENDPOINT = 'https://actions.googleapis.com/v2/apps/%s/entities/%s:push' % ( PROJECT_ID, urllib.quote(ENTITY_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() # Populating the entity with wrapper entity = {} entity['data'] = data #entity JSON-LD serialized as string entity['vertical'] = 'FOODORDERING' request = {} request['entity'] = entity response = authed_session.post(ENDPOINT, json=request) print(response.text) #if successful, will be '{}'
Java
In diesem Code wird die Google-Authentifizierungsbibliothek für Java verwendet.
private static final String PROJECT_ID = "your-project-id"; private static final String ENTITY_ID = "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 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 entity) { String authToken = getAuthToken(); String endpoint = String.format( "https://actions.googleapis.com/v2/apps/%s/entities/%s:push", PROJECT_ID, URLEncoder.encode(entityId, "UTF-8")); JSONObject data = new JSONObject(); data.put("data", entity.toString()); data.put("vertical", "FOODORDERING"); JSONObject jsonBody = new JSONObject(); jsonBody.put("entity", data); // Execute POST request executePostRequest(endpoint, authToken, jsonBody); }
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
In diesem Code wird die Google-Authentifizierungsbibliothek für Java verwendet.
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 | Entität der obersten Ebene | Beschreibung und Effekte |
---|---|---|
Dienst deaktivieren | DisabledService |
Sie müssen einen Dienst aus unvorhergesehenen Gründen deaktivieren. Inkrementelle Updates:Senden Sie die Entität Vollständige Feeds:Aktualisieren Sie die Entität über die vollständigen Feeds.
|
Bestimmter Artikel ist nicht auf Lager | Menu |
Inkrementelle Updates: Senden Sie die kapselende Menu .
Entität mit offer.inventoryLevel auf 0 für die angegebene
MenuItem und alle anderen Daten unverändert. |
Preisänderung für Artikel auf der Speisekarte | Menu |
Inkrementelle Updates: Senden Sie die kapselende Menu .
Entität mit offer.price auf den aktualisierten Preis für das angegebene
MenuItem und alle anderen Daten unverändert. |
Neues übergeordnetes Element hinzufügen Gilt nur für Entitätstypen |
Menu , Restaurant , Service |
Beispiel: Sie möchten einem Restaurant eine neue Speisekarte hinzufügen. Inkrementelle Updates:Senden Sie den neuen Menüeintrag zusammen mit dem Restaurant.
mit dem Feld |
Entität der obersten Ebene endgültig löschen Gilt nur für Entitätstypen |
Menu , Restaurant , Service |
Inkrementelle Updates:Senden Sie eine explizites Löschen. Vollständige Feeds:Entfernen Sie die Entität vor dem beim nächsten Abruf durch Google an. Andernfalls wird die Entität wieder hinzugefügt. |
Neues Liefergebiet in einer bestimmten Service hinzufügen |
Service |
Inkrementelle Feeds:Senden Sie die betreffende Service -Entität mit allen zugehörigen
mit neuem Liefergebiet, wie Sie es normalerweise bei den vollständigen Feeds tun würden.
angegeben im areaServed von Service . |
Voraussichtliche Lieferzeit aktualisieren in Service |
Service |
Inkrementelle Feeds:Senden Sie Service wie in
die Feeds, außer der hoursAvailable.deliveryHours , die aktualisiert wurde
entsprechend anpassen. |
Lieferpreise in Service aktualisieren |
Service |
Inkrementelle Feeds:Vollständige Service senden mit
offers.priceSpecification.price aktualisiert. |
Öffnungszeiten für Lieferung oder Essen zum Mitnehmen in Service aktualisieren |
Service |
Inkrementelle Feeds:Senden Sie Service wie in
die Feeds, außer der hoursAvailable , die aktualisiert wurde
entsprechend anpassen. |
Service (Mindestbestellwert ändern) |
Service |
Inkrementelle Feeds:Vollständige Service senden mit
Service.offers.priceSpecification.eligibleTransactionVolume
aktualisiert |
MenuItem endgültig löschen |
Menu |
Inkrementelle Feeds: Senden Sie die Menu wie im
-Feeds entfernt. Diese MenuItem wurden aus dem
hasMenuItems -Liste. |
SLO für die Verarbeitungszeit für Batchjobs und inkrementelle Updates
Eine Entität, die über eine Batch- oder inkrementelle Aktualisierung hinzugefügt wurde, wird verarbeitet in 1–2 Tage. Eine Entität, die durch einen Batch aktualisiert oder gelöscht wurde, wird in 2 verarbeitet Stunden, während eine durch schrittweise Aktualisierung aktualisierte Entität in 5 Minuten. Eine veraltete Entität wird nach sieben Tagen gelöscht.
Sie können Google Folgendes senden:
- Mehrere Batchjobs 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