עדכון נקודות עניין (POI)

יצירה והעלאה של פידים של נקודות עניין

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

  • פועלים לפי המפרט שמתואר בפיד של נקודות עניין לקובצי נתונים של נקודות עניין. מומלץ להשתמש בשמות קבצים ייחודיים לכל העלאה של נתוני נקודות עניין. מוסיפים חותמת זמן לשם הקובץ, לדוגמה POI_1633621547.json.
  • מעלים פידים לשרת ה-SFTP של נקודות העניין המקומיות מדי יום כרענון מלא.
  • פרטי שרת ה-SFTP מופיעים בקטע Configuration > Feeds (הגדרה > פידים) ב-Partner Portal.

בחירת שרתי פידים

הנחיות לאריזת קבצים

כדי להבטיח שההטמעה תתבצע בהצלחה, חשוב להקפיד על דרישות האריזה הבאות:

  • ארכיון JSON יחיד ומצטבר (חובה): משלבים את כל רשומות הישויות בקובץ JSON אחד. מומלץ לדחוס אותו לארכיון GZIP אחד ולהעלות אותו.
  • אזהרה לגבי דפוסים לא רצויים: אל תשתמשו בקובץ אחד לכל ישות או בכמה קבצים שמופרדים לפי מדינה באותו ארכיון. הגישה הזו לא נתמכת ותגרום לכשלים בחילוץ.

תמיכה בכמה שפות

בפיד של נקודות העניין אפשר לספק תוכן מותאם לשוק המקומי בשדות ספציפיים. השדות הבאים הם מסוג Text ותומכים בלוקליזציה:

  • name
  • description
  • display_address

כדי לספק תוכן בכמה שפות, צריך לציין default_locale בשדה ולספק את המחרוזות המותאמות לשוק המקומי ברשימה localizations. צריך לספק את כל הלוקליזציות של ישות ברשומה אחת של נקודת עניין. אל תפצלו ישות אחת בין קובצי JSON של כמה שפות.

דוגמה:

"name": {
  "localizations": [
    {
      "locale": "en",
      "text": "Tasty Bites Test Restaurant"
    },
    {
      "locale": "es",
      "text": "Restaurante de prueba Tasty Bites"
    }
  ],
  "default_locale": "en"
}

הנחיות לגבי תמונות

  • פורמט: JPEG,‏ PNG או WebP.
  • גודל הקובץ המקסימלי: פחות מ-30MB לכל תמונה.
  • מידות מקסימליות: פחות מ-75 מגה-פיקסל בסך הכול (רוחב x גובה < 75,000,000).
  • סוג כתובת ה-URL: נתיב ישיר לנכס התמונות (למשל, מסתיים ב-‎.jpg).
  • הרשאות: ודאו שהשרת המארח מאפשר גישה ל-Googlebot או לסורקים, ושאין קובץ robots.txt שחוסם את ספריות התמונות.
  • חיפוש בטוח: התמונות צריכות לעמוד בדרישות של המדיניות של Google בנושא חיפוש בטוח.

מפרט הפיד

דרישות לגבי השדות

VssPoi

מייצג ישות אחת של נקודת עניין (POI), למשל מלון או מסעדה.

שם השדהסוגדרישהתיאור
poi_idמחרוזת

חובה

חובה. מחרוזת שנוצרה על ידי השותף ומזהה נקודת עניין.
nameobject
(Text)

חובה

חובה. שם נקודת העניין.
telephoneמחרוזת

מספר הטלפון של נקודת העניין, כולל קידומת המדינה ו‏אזור החיוג, למשל ‎+14567891234.
urlמחרוזת

כתובת ה-URL של האתר הציבורי של נקודת העניין. הערה: השם הזה ישמש רק למטרות התאמה, ולא יוצג.
locationobject
(GeoCoordinates)

חובה

חובה. המיקום של נקודת העניין.
display_addressobject
(Text)

הכתובת שמוצגת בממשק המשתמש.
imagesמערך של אובייקטים
(Image)

תמונות של נקודת העניין. מספר התמונות המקסימלי: 5.
ratingnumber

הדירוג הממוצע של נקודת העניין.
num_ratingsnumber

מספר הדירוגים שמשפיעים על השדה rating.
rating_scalenumber

סולם הדירוג שמשמש בשדה rating. אם הדירוג המקסימלי הוא 5, אז הערך של rating_scale הוא 5.
categoryenum
(Category)

חובה

חובה. מייצג את הקטגוריה של נקודת העניין.
descriptionobject
(Text)

תיאור של נקודת העניין.
oneOf
(additional_data)

חובה

אפשר להגדיר רק אחד מהשדות ב-oneOf הזה.

טקסט

מייצג טקסט עם לוקליזציות.

שם השדהסוגדרישהתיאור
localizationsמערך של אובייקטים
(LocalizedString)

המחרוזות המותאמות לשוק המקומי.
default_localeמחרוזת

הלוקאל שבו משתמשים כשפת ברירת המחדל. הוא חייב להיות קיים בלוקליזציות.

LocalizedString

מייצג מחרוזת מקומית.

שם השדהסוגדרישהתיאור
localeמחרוזת

תג השפה של הטקסט, כמו "en",‏ "en-US" או "sr-Latn".
textמחרוזת

הטקסט בלוקאל שצוין.

GeoCoordinates

הנתונים הגיאוגרפיים של מיקום, כולל קו רוחב, קו אורך וכתובת.

שם השדהסוגדרישהתיאור
latitudenumber

‫[-90, +90] מעלות (כולל). חובה אם קו האורך מוגדר, אחרת מומלץ.
longitudenumber

‫[-180, +180] מעלות (כולל). חובה אם מוגדר קו רוחב, אחרת מומלץ להוסיף.
oneOf
(addresses)

חובה

אפשר להגדיר רק אחד מהשדות ב-oneOf הזה.

PostalAddress

הכתובת של המיקום.

שם השדהסוגדרישהתיאור
countryמחרוזת

חובה

חובה. המדינה, לפי קוד המדינה ISO 3166-1 alpha-2, למשל "US".
localityמחרוזת

חובה

חובה. הרשות המוניציפלית/העיר, למשל "תל אביב".
regionמחרוזת

האזור/המדינה/המחוז, למשל "CA". השדה הזה נדרש רק במדינות שבהן האזור הוא בדרך כלל חלק מהכתובת. (אופציונלי)
postal_codeמחרוזת

חובה

חובה. המיקוד, למשל "94043".
street_addressמחרוזת

חובה

חובה. הכתובת, למשל "1600 Amphitheatre Pkwy".

תמונה

תמונה של נקודת העניין (POI).

שם השדהסוגדרישהתיאור
urlמחרוזת

כתובת ה-URL של התמונה. ‫Google תסרוק את המדיה שמתארחת בכתובת ה-URL הזו. אורך מקסימלי: 2,000.
alt_textobject
(Text)

הטקסט החלופי שמשמש לנגישות.

HotelData

נתוני פיד ספציפיים למלון.

שם השדהסוגדרישהתיאור
hotel_star_classnumber

דירוג הכוכבים הרשמי של המלון. אפשר להשתמש בהם בתווית כמו "מלון 5 כוכבים". הערך הזה צריך להיות מספר שלם בין 0 ל-5. אם אין דירוג או שהוא לא צוין, צריך להשתמש בדירוג 0. אם הערך הוא 0, לא יוצג למשתמשים דירוג כוכבים בממשק המשתמש.
brand_idsמערך של מחרוזות

המותגים שיכולים להציג את המלון הזה. אם השדה הזה ריק, המלון יכול להופיע בכל אחד מהמותגים שמשויכים לפיד.

LocalData

נתוני פיד ספציפיים למוסד.

שם השדהסוגדרישהתיאור
business_hoursobject
(BusinessHours)

שעות הפעילות הרגילות של העסק.
price_rangeobject
(PriceRange)

טווח המחירים של השירותים שהעסק מציע.
establishment_categoryobject
(Text)

סוג המוסד.
brand_landing_pagesמערך של אובייקטים
(BrandLandingPages)

חובה

חובה. דפי הנחיתה של המותג. צריך לציין לפחות אחד מהם.

BusinessHours

מייצג את פרקי הזמן שבהם המיקום הזה פתוח לעסקים. מכיל אוסף של מופעי [TimeRange][madden.vss_poi_feed.TimeRange]. דוגמה: פתוח בימי שבת בין השעות 09:00-12:00 ו-13:00-17:00: time_ranges { open_day: SATURDAY open_time: { hours: 9, minutes: 0 } close_day: SATURDAY close_time: { hours: 12, minutes: 0 } } time_rages { open_day: SATURDAY open_time: { hours: 13, minutes: 0 } close_day: SATURDAY close_time: { hours: 17, minutes: 0 } } דוגמה: פתוח בימי שבת משעה 21:00 עד יום ראשון בשעה 02:00: time_ranges { open_day: SATURDAY open_time: { hours: 21, minutes: 0 } close_day: SUNDAY close_time: { hours: 2, minutes: 0 } }

שם השדהסוגדרישהתיאור
time_rangesמערך של אובייקטים
(TimeRange)

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

TimeRange

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

שם השדהסוגדרישהתיאור
open_dayenum
(DayOfWeek)

היום הפתוח של טווח התאריכים.
open_timeobject
(TimeOfDay)

שעת הפתיחה של טווח התאריכים.
close_dayenum
(DayOfWeek)

היום האחרון בטווח התאריכים.
close_timeobject
(TimeOfDay)

שעת הסגירה של טווח התאריכים.

TimeOfDay

שם השדהסוגדרישהתיאור
hoursnumber

שעות ביום בפורמט של 24 שעות. הערך חייב להיות גדול מ-0 או שווה לו, ובדרך כלל קטן מ-23 או שווה לו. ב-API אפשר לאפשר את הערך "24:00:00" בתרחישים כמו שעת סגירת העסק.
minutesnumber

דקות בשעה. הערך חייב להיות גדול מ-0 או שווה לו, וקטן מ-59 או שווה לו.
secondsnumber

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

שברירי שניות, בננו-שניות. הערך חייב להיות גדול מ-0 או שווה לו, וקטן מ-999,999,999 או שווה לו.

PriceRange

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

שם השדהסוגדרישהתיאור
min_priceobject
(Money)

המחיר המינימלי של השירותים שמוצעים בנקודת העניין.
max_priceobject
(Money)

המחיר המקסימלי של השירותים שמוצעים בנקודת העניין.

כסף

מייצג סכום כסף עם סוג המטבע שלו.

שם השדהסוגדרישהתיאור
currency_codeמחרוזת

קוד המטבע בן שלוש האותיות, כפי שמוגדר בתקן ISO 4217.
unitsnumber

מספר היחידות השלמות של הסכום. לדוגמה: אם הערך של currencyCode הוא "USD", המשמעות היא ש-1 יחידה = 1 דולר ארה"ב.
nanosnumber

מספר יחידות הננו (10‎^-9) של הסכום. הערך חייב להיות בין ‎-999,999,999 ל- ‎+999,999,999, כולל. אם הערך של units הוא חיובי, הערך של nanos חייב להיות חיובי או אפס. אם הערך של units הוא אפס, הערך של nanos יכול להיות חיובי, אפס או שלילי. אם הערך של units הוא שלילי, הערך של nanos חייב להיות שלילי או אפס. לדוגמה, עלות של ‎-1.75$ מיוצגת על ידי units=-1 וגם nanos=-750,000,000.

BrandLandingPages

דפי הנחיתה של המותג המותאמים למיקום גיאוגרפי עבור נקודת עניין (POI) אחת.

שם השדהסוגדרישהתיאור
brand_idמחרוזת

חובה

חובה. המותג שההגדרה הזו חלה עליו.
localized_landing_pagesמערך של אובייקטים
(LocalizedLandingPage)

דפי הנחיתה המותאמים לשוק המקומי. הערכים בשדות url ו-locales חייבים להיות ייחודיים בכל דפי הנחיתה המותאמים לשוק המקומי.
default_urlמחרוזת

חובה

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

LocalizedLandingPage

דף נחיתה מקומי של נקודת העניין (POI).

שם השדהסוגדרישהתיאור
urlמחרוזת

כתובת ה-URL של דף הנחיתה. אורך מקסימלי: 2,000.
localesמערך של מחרוזות

הגבלת הדף הזה למשתמשים עם העדפת השפה שצוינה. הוא חייב להכיל תגי שפה, כמו "en",‏ "en-US" או "sr-Latn".

קטגוריה

מייצג את הקטגוריה של נקודת העניין. הוא צריך להתאים לשדה additional_data oneof שבהמשך.

שםתיאור
UNKNOWN_CATEGORY
HOTEL
LOCAL

DayOfWeek

מייצג יום בשבוע.

שםתיאור
DAY_OF_WEEK_UNSPECIFIEDהיום בשבוע לא צוין.
MONDAYשני
TUESDAYשלישי
WEDNESDAYרביעי
THURSDAYחמישי
FRIDAYשישי
SATURDAYשבת
SUNDAYראשון

additional_data

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

שם השדהסוגדרישהתיאור
hotel_dataobject
(HotelData)

לא יכול להתקיים יחד עם local_data

שדות ספציפיים למלון.
local_dataobject
(LocalData)

לא יכול להתקיים יחד עם hotel_data

שדות ספציפיים למדינה.

כתובות

חובה. כתובת של מיקום.

שם השדהסוגדרישהתיאור
addressobject
(PostalAddress)

הכתובת הפיזית של המיקום.

הגדרות

הגדרת VssPoiFeed

// Represents a Point of Interest (POI) data feed provided by a partner.
export message VssPoiFeed {
  // The POIs in the feed.
  repeated VssPoi data = 1;
}

הגדרת VssPoi

// Represents a single Point of Interest (POI) entity e.g. a hotel or
// restaurant.
export message VssPoi {
  // Required. A string generated by the partner that identifies a POI.
  string poi_id = 1;

  // The entity name, telephone, url and location are used to support
  // matching partner inventory with entities already present on Google.

  // Required. The name of the POI.
  Text name = 2;

  // The contact telephone number of the POI including its country and
  // area codes, e.g. +14567891234.
  string telephone = 3 [(datapol.semantic_type) = ST_PHONE_NUMBER];

  // The url of the POI's public website.
  // Note: This will be used just for matching purposes, not for display.
  string url = 4;

  // Required. The location of the POI.
  GeoCoordinates location = 5;

  // The address displayed on the UI.
  Text display_address = 17;

  // Images of the POI.
  // Max number of images: 5.
  repeated Image images = 6;

  // Average rating for the POI.
  float rating = 12;

  // The number of contributing ratings for the `rating` field.
  int64 num_ratings = 13;

  // The rating scale used for the `rating` field. If max rating is 5, then
  // rating_scale is 5.
  int32 rating_scale = 14;

  // Represents the category of the POI.
  // It should match the `additional_data` oneof field below.
  export enum Category {


    LOCAL = 4;
  }

  // Required. Represents the category of the POI.
  Category category = 9;

  // A description of the POI.
  Text description = 16;

  // Required. Category specific fields.
  // It should match the `category` field above.
  oneof additional_data {


    // Local specific fields.
    LocalData local_data = 15;
  }

}

הגדרת הטקסט

// Represents a text with localizations.
message Text {
  // Represents a localized string.
  message LocalizedString {
    // The text's language tag, such as "en", "en-US" or "sr-Latn".
    string locale = 1;

    // The text in the specified locale.
    string text = 2;
  }

  // The localized strings.
  repeated LocalizedString localizations = 1;

  // The locale to use as the default language it must be present in the
  // localizations.
  string default_locale = 2;
}

הגדרה של GeoCoordinates

// The Geo data of a location, including latitude, longitude, and address.
message GeoCoordinates {
  option (datapol.msg_semantic_type) = ST_LOCATION;

  // [-90, +90] degrees (inclusive).
  // Required if longitude is set, otherwise nice to have.
  double latitude = 1;

  // [-180, +180] degrees (inclusive).
  // Required if latitude is set, otherwise nice to have.
  double longitude = 2;

  // Required. Address for a location.
  oneof addresses {
    // Postal address of the location.
    PostalAddress address = 3;

  }
}

הגדרת PostalAddress

// The postal address for the location.
message PostalAddress {
  option (datapol.msg_semantic_type) = ST_LOCATION;

  // Required. The country, using ISO 3166-1 alpha-2 country code, e.g. "US".
  string country = 1;

  // Required. The locality/city, e.g. "Mountain View".
  string locality = 2;

  // The region/state/province, e.g. "CA". This field is only required in
  // countries where region is commonly a part of the address. (optional)
  string region = 3;

  // Required. The postal code, e.g. "94043".
  string postal_code = 4;

  // Required. The street address, e.g. "1600 Amphitheatre Pkwy".
  string street_address = 5;
}

הגדרת התמונה

// Represents an image of the Point of Interest (POI).
export message Image {
  // The url of the image. Google will crawl the media hosted at this URL.
  // Max length: 2000.
  string url = 1;

  // The alternative text to be used for accessibility.
  Text alt_text = 2;
}

הגדרת LocalData

// Establishment specific feed data.
message LocalData {
  // The regular business hours of the establishment.
  BusinessHours business_hours = 1;

  // Price range of the services offered by the establishment.
  PriceRange price_range = 2;

  // The type of establishment.
  Text establishment_category = 3;

  // Required. The brand landing pages. At least one must be provided.
  repeated BrandLandingPages brand_landing_pages = 4;
}

הגדרת BrandLandingPages

// The Localized brand landing pages for a single Point of Interest (POI).
message BrandLandingPages {
  // Required. The brand this configuration applies to.
  string brand_id = 1 [(datapol.semantic_type) = ST_PARTNER_ID];

  // Localized landing page for the Point of Interest (POI).
  message LocalizedLandingPage {

    // The url of the landing page.
    // Max length: 2000.
    string url = 1;

    // Restricts this page to users with the specified language preference.
    // Must contain language tags, such as "en", "en-US" or "sr-Latn".
    // Empty list means this page is not restricted by language.
    repeated string locales = 3;

    // Restricts this page to users from the specified countries.
    // Must contain ISO 3166-1 alpha-2 country codes, e.g. "US".
    // Empty list means this page is not restricted by country.
    // If `is_default_for_country` is true, this field must not be empty.
    repeated string countries = 4;

    // Whether this page should be used as the default fallback for users in
    // `countries` when no entry for that country matches the user's
    // language preference.
    bool is_default_for_country = 5;
  }

  // The localized landing pages.
  // The url and locales fields values must be unique across all the localized
  // landing pages.
  repeated LocalizedLandingPage localized_landing_pages = 2;

  // Required. The default landing page url to be used when none of the
  // localized landing pages matches the user's language.
  string default_url = 3;
}

דוגמאות

פיד של נקודות עניין

שם הקובץ: poi_1707240000.json

{
  "data": [
    {
      "poi_id": "test_restaurant_1",
      "name": {
        "localizations": [
          {
            "locale": "en",
            "text": "Tasty Bites Test Restaurant"
          }
        ],
        "default_locale": "en"
      },
      "telephone": "+1234567890",
      "url": "https://www.tastybitestest.com",
      "location": {
        "latitude": 37.422,
        "longitude": -122.084,
        "address": {
          "country": "US",
          "locality": "Mountain View",
          "postal_code": "94043",
          "street_address": "1600 Amphitheatre Pkwy"
        }
      },
      "display_address": {
        "localizations": [
          {
            "locale": "en",
            "text": "1600 Amphitheatre Pkwy, Mountain View, CA 94043"
          }
        ],
        "default_locale": "en"
      },
      "images": [
        {
          "url": "https://www.tastybitestest.com/images/interior.jpg",
          "alt_text": {
            "localizations": [
              {
                "locale": "en",
                "text": "Cozy dining area of Tasty Bites"
              }
            ],
            "default_locale": "en"
          }
        }
      ],
      "rating": 4.7,
      "num_ratings": 150,
      "rating_scale": 5,
      "category": "LOCAL",
      "description": {
        "localizations": [
          {
            "locale": "en",
            "text": "A mock restaurant for testing the POI feed ingestion."
          }
        ],
        "default_locale": "en"
      },
      "local_data": {
        "establishment_category": {
           "localizations": [
             {
               "locale": "en",
               "text": "Restaurant"
             }
           ],
           "default_locale": "en"
        },
        "price_range": {
          "min_price": {
            "currency_code": "USD",
            "units": 15,
            "nanos": 0
          },
          "max_price": {
            "currency_code": "USD",
            "units": 45,
            "nanos": 0
          }
        },
        "business_hours": {
          "time_ranges": [
            {
              "open_day": "MONDAY",
              "open_time": { "hours": 11, "minutes": 0 },
              "close_day": "MONDAY",
              "close_time": { "hours": 21, "minutes": 0 }
            },
            {
              "open_day": "TUESDAY",
              "open_time": { "hours": 11, "minutes": 0 },
              "close_day": "TUESDAY",
              "close_time": { "hours": 21, "minutes": 0 }
            },
            {
              "open_day": "WEDNESDAY",
              "open_time": { "hours": 11, "minutes": 0 },
              "close_day": "WEDNESDAY",
              "close_time": { "hours": 21, "minutes": 0 }
            },
            {
              "open_day": "THURSDAY",
              "open_time": { "hours": 11, "minutes": 0 },
              "close_day": "THURSDAY",
              "close_time": { "hours": 22, "minutes": 0 }
            },
            {
              "open_day": "FRIDAY",
              "open_time": { "hours": 11, "minutes": 0 },
              "close_day": "FRIDAY",
              "close_time": { "hours": 23, "minutes": 0 }
            },
            {
              "open_day": "SATURDAY",
              "open_time": { "hours": 10, "minutes": 0 },
              "close_day": "SATURDAY",
              "close_time": { "hours": 23, "minutes": 0 }
            },
            {
              "open_day": "SUNDAY",
              "open_time": { "hours": 10, "minutes": 0 },
              "close_day": "SUNDAY",
              "close_time": { "hours": 20, "minutes": 0 }
            }
          ]
        },
        "brand_landing_pages": [
          {
            "brand_id": "tasty_bites_brand",
            "localized_landing_pages": [
              {
                "url": "https://www.tastybitestest.com/en",
                "locales": ["en-US", "en-GB"]
              }
            ],
            "default_url": "https://www.tastybitestest.com"
          }
        ]
      }
    }
  ]
}

פיד של נקודות עניין בכמה שפות

שם הקובץ: poi_multilingual.json

{
  "data": [
    {
      "poi_id": "test_restaurant_1",
      "name": {
        "localizations": [
          {
            "locale": "en",
            "text": "Tasty Bites Test Restaurant"
          },
          {
            "locale": "fr",
            "text": "Restaurant de test Tasty Bites"
          }
        ],
        "default_locale": "en"
      },
      "telephone": "+1234567890",
      "url": "https://www.tastybitestest.com",
      "location": {
        "latitude": 37.422,
        "longitude": -122.084,
        "address": {
          "country": "US",
          "locality": "Mountain View",
          "postal_code": "94043",
          "street_address": "1600 Amphitheatre Pkwy"
        }
      },
      "display_address": {
        "localizations": [
          {
            "locale": "en",
            "text": "1600 Amphitheatre Pkwy, Mountain View, CA 94043"
          },
          {
            "locale": "fr",
            "text": "1600 Amphitheatre Pkwy, Mountain View, CA 94043"
          }
        ],
        "default_locale": "en"
      },
      "images": [
        {
          "url": "https://www.tastybitestest.com/images/interior.jpg",
          "alt_text": {
            "localizations": [
              {
                "locale": "en",
                "text": "Cozy dining area of Tasty Bites"
              },
              {
                "locale": "fr",
                "text": "Espace salle à manger accueillant de Tasty Bites"
              }
            ],
            "default_locale": "en"
          }
        }
      ],
      "rating": 4.7,
      "num_ratings": 150,
      "rating_scale": 5,
      "category": "LOCAL",
      "description": {
        "localizations": [
          {
            "locale": "en",
            "text": "A mock restaurant for testing the POI feed ingestion."
          },
          {
            "locale": "fr",
            "text": "Un faux restaurant pour tester l'ingestion de flux de points d'intérêt."
          }
        ],
        "default_locale": "en"
      },
      "local_data": {
        "establishment_category": {
           "localizations": [
             {
               "locale": "en",
               "text": "Restaurant"
             },
             {
               "locale": "fr",
               "text": "Restaurant"
             }
           ],
           "default_locale": "en"
        },
        "price_range": {
          "min_price": {
            "currency_code": "USD",
            "units": 15,
            "nanos": 0
          },
          "max_price": {
            "currency_code": "USD",
            "units": 45,
            "nanos": 0
          }
        },
        "business_hours": {
          "time_ranges": [
            {
              "open_day": "MONDAY",
              "open_time": { "hours": 11, "minutes": 0 },
              "close_day": "MONDAY",
              "close_time": { "hours": 21, "minutes": 0 }
            },
            {
              "open_day": "TUESDAY",
              "open_time": { "hours": 11, "minutes": 0 },
              "close_day": "TUESDAY",
              "close_time": { "hours": 21, "minutes": 0 }
            },
            {
              "open_day": "WEDNESDAY",
              "open_time": { "hours": 11, "minutes": 0 },
              "close_day": "WEDNESDAY",
              "close_time": { "hours": 21, "minutes": 0 }
            },
            {
              "open_day": "THURSDAY",
              "open_time": { "hours": 11, "minutes": 0 },
              "close_day": "THURSDAY",
              "close_time": { "hours": 22, "minutes": 0 }
            },
            {
              "open_day": "FRIDAY",
              "open_time": { "hours": 11, "minutes": 0 },
              "close_day": "FRIDAY",
              "close_time": { "hours": 23, "minutes": 0 }
            },
            {
              "open_day": "SATURDAY",
              "open_time": { "hours": 10, "minutes": 0 },
              "close_day": "SATURDAY",
              "close_time": { "hours": 23, "minutes": 0 }
            },
            {
              "open_day": "SUNDAY",
              "open_time": { "hours": 10, "minutes": 0 },
              "close_day": "SUNDAY",
              "close_time": { "hours": 20, "minutes": 0 }
            }
          ]
        },
        "brand_landing_pages": [
          {
            "brand_id": "tasty_bites_brand",
            "localized_landing_pages": [
              {
                "url": "https://www.tastybitestest.com/fr",
                "locales": ["fr-FR", "fr-CA"]
              },
              {
                "url": "https://www.tastybitestest.com/en",
                "locales": ["en-US", "en-GB"]
              }
            ],
            "default_url": "https://www.tastybitestest.com"
          }
        ]
      }
    }
  ]
}