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

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

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

הגדרה

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

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

נקודת קצה

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

מלאי של גרסה 2

https://actions.googleapis.com/v2/apps/PROJECT_ID/entities/TYPE/ENTITY_ID:push

מלאי של גרסה 1

https://actions.googleapis.com/v2/apps/PROJECT_ID/entities/ENTITY_ID:push

כדי להסיר ישות, צריך להגיש בקשת HTTP DELETE בנקודת הקצה הבאה, שתואמת לסכימת המלאי שבה אתם משתמשים:

מלאי של גרסה 2

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

מלאי של גרסה 1

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

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

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

לדוגמה, יש לכם פרויקט עם המזהה "delivery-provider-id" שמשתמש בסכימת המלאי של גרסה 2. אתם רוצים לבצע שינויים במסעדה באמצעות סוג הישות של המסעדה: "MenuSection" ומזהה ישות של "menusection_122". נקודת הקצה לעדכונים בנתונים שלך תהיה:

https://actions.googleapis.com/v2/apps/delivery-provider-id/entities/MenuSection/menuSection_122:push

כדי להסיר את אותה ישות, יש לבצע את הקריאה הבאה ל-HTTP DELETE API:

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

בקשות גישה ל-Sandbox

לבקשות לארגז חול, יש לפעול לפי ההנחיות המפורטות בקטע נקודת קצה שלמעלה, אבל לשלוח בקשות אל /v2/sandbox/apps/ במקום אל /v2/apps/. לדוגמה, בקשה למחיקת ארגז חול של ארגז חול של v2 מוגדרת כך:

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

עדכונים ותוספות

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

מטען ייעודי (payload)

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

קובץ ה-JSON אמור להופיע באותו אופן שבו הוא יופיע בפיד המקובץ, יחד עם ההבדלים הבאים:

  • גוף המטען לא יכול להיות גדול מ-5 MB. בדומה לפידים של אצווה, מומלץ להסיר רווחים לבנים כדי להתאים יותר נתונים.
  • הכתובת תופיע במעטפה:
{
  "entity": {
    "data":"ENTITY_DATA",
    "vertical":"FOODORDERING"
  },
  "update_time":"UPDATE_TIMESTAMP"
}

במטען הייעודי (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/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"
  }
}

דוגמה 2: עדכון מחירי תפריט

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

כדאי להשתמש בפיד אצווה שנראה כך:

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

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

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

הוספת ישות

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

הסרת ישות

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

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

דוגמה 1: מחיקת ישות ברמה העליונה

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

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

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

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

דוגמה 2: הסרת ישויות משנה

כדי להסיר ישות משנה מישות ברמה העליונה, שולחים את הישות ברמה העליונה כשישות המשנה הוסרה מהשדה המתאים. בדוגמה הבאה ההנחה היא שהפיד משתמש בסכימת המלאי v1.

לדוגמה, כדי להסיר אזור שירות, צריך לעדכן את השירות עם אזור השירות שהוסר מהרשימה areaServed.

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

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

{}

במקרה של כשלים, קוד התגובה של ה-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\""
          }
        ]
      }
    ]
  }
}

דוגמת קוד

הנה כמה דוגמאות לשימוש ב-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 = '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

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

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

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);
}

הסרת ישויות

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 ל-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:

תרחיש ישות ברמה העליונה תיאור ואפקטים
השבתת שירות DisabledService

עליכם להשבית שירות מסיבה בלתי צפויה.

עדכונים מצטברים: שלחו את הישות המדוברת ב-Service עם @type ל-DisabledService, אבל נכסים אחרים יישארו ללא שינוי.

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

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

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

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

Menu, Restaurant Service

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

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

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

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

Menu, Restaurant Service

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

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

הוספת אזור משלוח חדש אל Service ספציפי Service פידים מצטברים: שולחים את הישות Service הרלוונטית בכל השדות שלה, כרגיל, בתוך הפידים המלאים עם אזור משלוח חדש שצוין ב-areaServed מתוך Service.
עדכון זמן ההגעה המשוער בService Service פידים מצטברים: יש לשלוח את Service כמו כל הפידים, אלא אם hoursAvailable.deliveryHours יעודכנו.
עדכון מחירי משלוח בService Service פידים מצטברים: שליחת פיד Service מלא עם offers.priceSpecification.price עדכונים.
עדכון שעות האספקה או איסוף עצמי בService Service פידים מצטברים: יש לשלוח את Service כמו כל הפידים, אלא אם hoursAvailable יעודכנו.
Service (שינוי סכום ההזמנה המינימלי) Service פידים מצטברים: שליחה מלאה של Service עם Service.offers.priceSpecification.eligibleTransactionVolume עודכנה
מחיקה של MenuItem לתמיד Menu פידים מצטברים: יש לשלוח את הערך Menu זהה לזה שבפידים, אבל MenuItem זה מוסר מהרשימה hasMenuItems.

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

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

תוכלו לשלוח אל Google את הפרטים הבאים:

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