עדכוני מלאי מצטבר בגרסה 2

בקטע הזה נסביר איך לשלוח ל-Google עדכונים תלויי-זמן של ישויות המלאי. באמצעות Incremental Update API אפשר לדחוף עדכונים ולמחוק ישויות במלאי של Sandbox או בסביבת הייצור כמעט בזמן אמת.

הפונקציונליות הזו מיועדת בעיקר לעדכונים שאי אפשר לחזות מראש, כמו חסימות חירום. ככלל, כל שינוי שנשלח דרך Incremental Update API צריך להתבצע תוך שעה לכל היותר. אם לא צריך לשקף את השינוי מיד, אפשר להשתמש במקום זאת בהטמעת נתונים בכמות גדולה. העדכונים המצטברים מעובדים בתוך חמש דקות לכל היותר.

דרישות מוקדמות

לפני שמטמיעים עדכונים מצטברים, יש למסור את הפריטים הבאים:

  1. נוצר חשבון שירות עם תפקיד עריכה בפרויקט הפעולות. למידע נוסף: יצירה והגדרה של פרויקט.
  2. פידים של נתונים בסביבת ייצור או ארגז חול מתארחים ומוטמעים. למידע נוסף, ראו הטמעת נתונים של אצווה.
  3. (אופציונלי, אבל מומלץ) מתקינים את ספריית הלקוח של Google בשפה הרצויה כדי לאפשר שימוש ב-OAuth 2.0 בקריאה ל-API. דוגמאות הקוד המפורטות בהמשך משתמשות בספריות אלו. אחרת, תצטרכו לטפל בהמרות של אסימונים באופן ידני, כפי שמתואר במאמר שימוש ב-OAuth 2.0 לגישה ל-Google APIs.

נקודות קצה

בבקשות שבהמשך, צריך להחליף את הפרטים הבאים:

  • PROJECT_ID: מזהה הפרויקט ב-Google Cloud שמשויך לפרויקט שיצרתם בקטע Create and set up a project (יצירה והגדרה של פרויקט).
  • TYPE: סוג הישות (מאפיין @type) של האובייקט בפיד הנתונים שרוצים לעדכן.
  • ENTITY_ID (מחיקה של נקודת הקצה בלבד): מזהה הישות למחיקה. חשוב לוודא ש-URL מקודד את מזהה הישות.
  • DELETE_TIME (מחיקה של נקודת הקצה בלבד): שדה אופציונלי לציון הזמן שבו הישות נמחקה במערכות שלכם (ברירת המחדל היא מועד קבלת הבקשה). ערך הזמן אינו יכול להיות בעתיד. כששולחים ישות באמצעות קריאה מצטברת, ניהול גרסאות של ישויות משתמש גם בשדה delete_time במקרה של מחיקת קריאה. הפורמט של הערך הזה צריך להיות yyyy-mm-ddTHH:mm:ssZ

עדכון של נקודת הקצה

כדי לשנות ישות, צריך לשלוח בקשת HTTP POST לנקודת הקצה הבאה, ולכלול מטען ייעודי (payload) של עדכונים ותוספות. אפשר לעדכן עד 1,000 ישויות בקריאה אחת ל-API.

https://actions.googleapis.com/v2/apps/PROJECT_ID/entities:batchPush

לדוגמה, אם רוצים לעדכן ישויות בפרויקט שהמזהה שלו הוא 'delivery-provider-id', נקודת הקצה תהיה כך:

https://actions.googleapis.com/v2/apps/delivery-provider-id/entities:batchpush

מחיקת נקודת הקצה

כדי למחוק ישות במלאי, צריך לשלוח בקשת HTTP DELETE לנקודת הקצה הבאה.

https://actions.googleapis.com/v2/apps/PROJECT_ID/entities/TYPE/ENTITY_ID?entity.vertical=FOODORDERING&delete_time=DELETE_TIME

לדוגמה, כדי למחוק ישות "תפריט" עם המזהה "menuSection_122" מהפרויקט "delivery-provider-id", צריך לבצע קריאה ל-API מסוג HTTP DELETE אל:

https://actions.googleapis.com/v2/apps/delivery-provider-id/entities/MenuSection/menuSection_122?entity.vertical=FOODORDERING

סביבת Sandbox

כדי להשתמש ב-Inremental Update API במלאי שטחי הפרסום ב-Sandbox, צריך לפעול לפי ההנחיות בקטע Endpoints (נקודות קצה) שלמעלה, אבל לשלוח בקשות אל /v2/sandbox/apps/ במקום אל /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

מתבצע עדכון ישויות

כל בקשת POST צריכה לכלול את הפרמטרים של הבקשה יחד עם המטען הייעודי (payload) של JSON שמכיל נתונים מובְנים של כל סוג ישות שרשום בסכימת המלאי.

עדכון המטען הייעודי

קובץ ה-JSON אמור להיראות כמו בפיד האצווה, עם ההבדלים הבאים:

  • גוף המטען הייעודי לא יכול להיות גדול מ-5MB. בדומה לפידים באצווה, מומלץ להסיר רווחים לבנים כדי להתאים יותר נתונים.
  • המעטפה הבאה:
{
  "requests": [
    {
      "entity": {
        "data":"ENTITY_DATA",
        "name": "apps/project_id>/entities/type/entity_id"
      },
      "update_time":"UPDATE_TIMESTAMP"
    },
  ],
  "vertical": "FOODORDERING"
}

במטען הייעודי (payload) שלמעלה, מחליפים את הפריטים הבאים:

  • ENTITY_DATA: ישות בפורמט JSON מסודרת כמחרוזת. צריך להעביר את הישות JSON-LD כמחרוזת בשדה data.
  • UPDATE_TIMESTAMP (אופציונלי): חותמת זמן של מועד העדכון של הישות במערכות שלכם. ערך הזמן אינו יכול להיות בעתיד. חותמת הזמן של ברירת המחדל היא התאריך שבו Google מקבלת את הבקשה. כששולחים ישות באמצעות בקשה מצטברת, ניהול הגרסאות של הישות משתמש גם בשדה update_time במקרה של בקשת הוספה/עדכון.

דוגמאות

דוגמה 1: עדכון מסעדה

נניח שאתם צריכים לעדכן בדחיפות מספר טלפון של מסעדה. העדכון מכיל קובץ JSON לכל המסעדה.

נניח שיש לכם פיד אצווה שנראה כך:

{
  "@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
}

כך העדכון המצטבר באמצעות HTTP POST:

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"
}

דוגמה 2: עדכון של כמה מסעדות

כדי לעדכן שתי ישויות של מסעדות בקריאה אחת ל-API, בקשת ה-HTTP POST תהיה:

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"
}

דוגמה 3: עדכון מחיר של פריט בתפריט

נניח שצריך לשנות את המחיר של פריט בתפריט. כמו בדוגמה 1, העדכון חייב להכיל את ה-JSON של כל הישות ברמה העליונה (התפריט), ובפיד נעשה שימוש בסכימת המלאי v1.

נניח שיש לכם פיד אצווה שנראה כך:

{
  "@type": "MenuItemOffer",
  "@id": "menuitemoffer6680262",
  "sku": "offer-cola",
  "menuItemId": "menuitem896532",
  "price": 3.00,
  "priceCurrency": "USD"
}

לאחר מכן, העדכון המצטבר דרך POST יהיה:

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"
}

הוספת ישות

כדי להוסיף ישויות, אין להשתמש בעדכוני מלאי. במקום זאת, צריך להשתמש בתהליך של פידים באצווה, כפי שמתואר בסכימת המלאי לגרסה 2.

הסרת ישות

כדי להסיר ישויות ברמה העליונה, צריך להשתמש בנקודת קצה שעברה שינוי קל ולהשתמש ב-HTTP DELETE במקום ב-HTTP POST בבקשה.

מחיקת ישות ברמה העליונה

חשבו על מצב שבו תרצו למחוק מסעדה בפיד. צריך גם למחוק את השירותים והתפריטים שלו.

דוגמה לנקודת קצה לישות בתפריט עם המזהה 'provider/מסעדה/תפריט/nr':

DELETE v2/apps/delivery-provider-id/entities/menu/provider%2Frestaurant%2Fmenu%2Fnr?entity.vertical=FOODORDERING
Host: actions.googleapis.com

נקודת קצה לדוגמה לישות של מסעדה עם המזהה "https://www.provider.com/restaurant/nr":

DELETE v2/apps/delivery-provider-id/entities/restaurant/provider%2Frestaurant%2Fnr?entity.vertical=FOODORDERING
Host: actions.googleapis.com

דוגמה של נקודת קצה לישות שירות עם המזהה "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
}

הסרת ישויות משנה

אסור להשתמש ב-HTTP DELETE כדי להסיר ישות משנה בתוך ישות ברמה העליונה, כמו למשל פריט בתפריט בתוך תפריט. במקום זאת, יש להתייחס להסרה של ישויות משנה כעדכון לישות ברמה העליונה שבה ישות המשנה הוסרה מהרשימה הרלוונטית או מסוג reverseReference.

קודי תגובה של API

קריאה מוצלחת לא מעידה על כך שהפיד תקין או נכון, אלא רק על כך שבוצעה הקריאה ל-API. קריאות מוצלחות מקבלות קוד תגובת HTTP 200, עם גוף תגובה ריק:

{}

במקרה של כשלים, קוד התגובה של ה-HTTP לא יהיה 200, וגוף התגובה מציין מה השתבש.

לדוגמה, אם המשתמש הגדיר את הערך 'vertical' במעטפה כ-FAKE_VERTICAL, תתקבל ההודעה הבאה:

{
  "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\""
          }
        ]
      }
    ]
  }
}

דוגמת קוד

בהמשך מפורטות כמה דוגמאות לשימוש ב-Incrmental Update API בשפות שונות. בדוגמאות האלה נעשה שימוש בספריות האימות של Google, ומתבססים על פיד באמצעות סכימת המלאי v1. לפתרונות חלופיים, קראו את המאמר שימוש ב-OAuth 2.0 לאפליקציות שרת-אל-שרת.

מתבצע עדכון ישויות

Node.js

הקוד הזה משתמש בספריית האימות של Google עבור Node.js.

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

הקוד הזה משתמש בספריית Google auth ל-Python.

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

הקוד הזה משתמש בספריית האימות של Google עבור 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);
}

הסרת ישויות

Node.js

הקוד הזה משתמש בספריית האימות של Google עבור Node.js.

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

הקוד הזה משתמש בספריית Google auth ל-Python.

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

הקוד הזה משתמש בספריית האימות של Google עבור 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));
}

תרחישים לדוגמה

התרחישים הבאים הם דוגמאות לעדכונים מצטברים, לעדכוני פיד מלאים ולתוכן ברמה גבוהה בקריאה ל-API:

תרחיש הישות שיש לעדכן תיאור ואפקטים
השבתה של שירות Service

צריך להשבית שירות מסיבה בלתי צפויה.

עדכונים מצטברים: יש לעדכן את הישות Service הרלוונטית על ידי הגדרת הנכס isDisabled שלה כ-true, אבל להשאיר את שאר הנכסים ללא שינוי.

פידים מלאים: לפני האחזור הבא של Google, חשוב לעדכן את הישות מהפידים המלאים כך שהערך של isDisabled יוגדר ל-true. אחרת, הישות תופעל מחדש.

פריט מסוים חסר במלאי MenuItemOffer עדכונים מצטברים: צריך לשלוח את הישות MenuItemOffer של האנקפסולציה עם inventoryLevel שמוגדר ל-0 עבור MenuItem הנתון, וכל שאר הנתונים ללא שינוי.
שינוי במחיר של פריט בתפריט MenuItemOffer עדכונים מצטברים: יש לשלוח את הישות המסכמת MenuItemOffer כאשר price מוגדר למחיר המעודכן עבור MenuItem הנתון, וכל שאר הנתונים ללא שינוי.

הוספת ישות חדשה ברמה העליונה

רלוונטי רק לישויות מהסוגים Menu, Restaurant ו-Service.

Menu,‏ Restaurant,‏ Service

למשל, אם צריך להוסיף תפריט חדש למסעדה.

פידים מלאים: מוסיפים את הישות בפידים של הנתונים וממתינים להטמעת נתונים בכמות גדולה.

מחיקת ישות ברמה העליונה באופן סופי

רלוונטי רק לישויות מהסוגים Menu, Restaurant ו-Service.

Menu,‏ Restaurant,‏ Service

עדכונים מצטברים: שליחת מחיקה בוטה.

פידים מלאים: חשוב להסיר את הישות מהפידים המלאים לפני האחזור הבא של Google, אחרת הישות תתווסף מחדש.

הוספת אזור משלוחים חדש בשביל Service ספציפי ServiceArea פידים מצטברים: צריך לשלוח את הישות ServiceArea הרלוונטית כשכל השדות שלה שלמים, כמו שהייתם עושים בדרך כלל בפידים המלאים, ולציין אזור משלוח חדש בתוך polygon, geoRadius או postalCode.
עדכון זמן ההגעה המשוער בService ServiceHours פידים מצטברים: שולחים את הערך ServiceHours כמו בפידים, אלא שהleadTimeMin שלו מתעדכן בהתאם.
עדכון מחירי משלוחים בService Fee פידים מצטברים: שליחת עדכון מלא של Fee עם price עדכון.
עדכון שעות האספקה או האיסוף בService ServiceHours פידים מצטברים: שולחים את ה-ServiceHours כמו בפידים, אלא שהמאפיינים opens ו-closes שלו יתעדכנו בהתאם.
Service (שינוי סכום ההזמנה המינימלי) Fee פידים מצטברים: שליחת Fee מלאים עם minPrice מעודכנים
מחיקה סופית של MenuItem Menu פידים מצטברים: יש לשלוח את הערך MenuItem כמו בפידים, אבל עם parentMenuSectionId ריק.

יעד למדידת רמת השירות (SLO) בזמן העיבוד של משימות באצווה ועדכונים מצטברים

ישות שתעדכן או תימחק באמצעות קבוצה תעובד תוך שעתיים במצב 'המאמץ הטוב ביותר', ואילו ישות שתעודכן באמצעות עדכון מצטבר תעובד בתוך 5 דקות. ישות לא עדכנית תימחק תוך 7 ימים.

אפשר לשלוח ל-Google אחת מהאפשרויות הבאות:

  • כמה משימות באצווה ביום כדי לשמור על מלאי עדכני, או
  • משימה אחת באצווה אחת ליום וממשקי API מצטברים לעדכון המלאי שלך.