יצירה והעלאה של פידים של נקודות עניין
כשיוצרים ומעלים פידים של נקודות עניין, צריך לפעול לפי ההוראות הבאות:
- פועלים לפי המפרט שמתואר בפיד של נקודות עניין לקובצי נתונים של נקודות עניין. מומלץ להשתמש בשמות קבצים ייחודיים לכל העלאה של נתוני נקודות עניין. מוסיפים חותמת זמן לשם הקובץ, לדוגמה
POI_1633621547.json. - מעלים פידים לשרת ה-SFTP של נקודות העניין המקומיות מדי יום כרענון מלא.
- פרטי שרת ה-SFTP מופיעים בקטע Configuration > Feeds (הגדרה > פידים) ב-Partner Portal.
- לפני שמעלים את פיד נקודות העניין, מאמתים אותו באמצעות הכלי לאימות פיד נקודות העניין.
- אפשר לראות את סטטוס הטמעת הנתונים של הפיד בקטע Ingestion > History (הטמעת נתונים > היסטוריה) בפורטל לשותפים.
הנחיות לאריזת קבצים
כדי להבטיח שההטמעה תתבצע בהצלחה, חשוב להקפיד על דרישות האריזה הבאות:
- ארכיון JSON יחיד ומצטבר (חובה): משלבים את כל רשומות הישויות בקובץ JSON אחד. מומלץ לדחוס אותו לארכיון GZIP אחד ולהעלות אותו.
- אזהרה לגבי דפוסים לא רצויים: אל תשתמשו בקובץ אחד לכל ישות או בכמה קבצים שמופרדים לפי מדינה באותו ארכיון. הגישה הזו לא נתמכת ותגרום לכשלים בחילוץ.
תמיכה בכמה שפות
בפיד של נקודות העניין אפשר לספק תוכן מותאם לשוק המקומי בשדות ספציפיים. השדות הבאים הם מסוג Text ותומכים בלוקליזציה:
namedescriptiondisplay_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 | מחרוזת | חובה | חובה. מחרוזת שנוצרה על ידי השותף ומזהה נקודת עניין. |
name | object(Text) | חובה | חובה. שם נקודת העניין. |
telephone | מחרוזת | מספר הטלפון של נקודת העניין, כולל קידומת המדינה ואזור החיוג, למשל +14567891234. | |
url | מחרוזת | כתובת ה-URL של האתר הציבורי של נקודת העניין. הערה: השם הזה ישמש רק למטרות התאמה, ולא יוצג. | |
location | object(GeoCoordinates) | חובה | חובה. המיקום של נקודת העניין. |
display_address | object(Text) | הכתובת שמוצגת בממשק המשתמש. | |
images | מערך של אובייקטים(Image) | תמונות של נקודת העניין. מספר התמונות המקסימלי: 5. | |
rating | number | הדירוג הממוצע של נקודת העניין. | |
num_ratings | number | מספר הדירוגים שמשפיעים על השדה rating. | |
rating_scale | number | סולם הדירוג שמשמש בשדה rating. אם הדירוג המקסימלי הוא 5, אז הערך של rating_scale הוא 5. | |
category | enum(Category) | חובה | חובה. מייצג את הקטגוריה של נקודת העניין. |
description | object(Text) | תיאור של נקודת העניין. | |
| oneOf(additional_data) | חובה | אפשר להגדיר רק אחד מהשדות ב-oneOf הזה. |
טקסט
מייצג טקסט עם לוקליזציות.
| שם השדה | סוג | דרישה | תיאור |
|---|---|---|---|
localizations | מערך של אובייקטים(LocalizedString) | המחרוזות המותאמות לשוק המקומי. | |
default_locale | מחרוזת | הלוקאל שבו משתמשים כשפת ברירת המחדל. הוא חייב להיות קיים בלוקליזציות. |
LocalizedString
מייצג מחרוזת מקומית.
| שם השדה | סוג | דרישה | תיאור |
|---|---|---|---|
locale | מחרוזת | תג השפה של הטקסט, כמו "en", "en-US" או "sr-Latn". | |
text | מחרוזת | הטקסט בלוקאל שצוין. |
GeoCoordinates
הנתונים הגיאוגרפיים של מיקום, כולל קו רוחב, קו אורך וכתובת.
| שם השדה | סוג | דרישה | תיאור |
|---|---|---|---|
latitude | number | [-90, +90] מעלות (כולל). חובה אם קו האורך מוגדר, אחרת מומלץ. | |
longitude | number | [-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_text | object(Text) | הטקסט החלופי שמשמש לנגישות. |
HotelData
נתוני פיד ספציפיים למלון.
| שם השדה | סוג | דרישה | תיאור |
|---|---|---|---|
hotel_star_class | number | דירוג הכוכבים הרשמי של המלון. אפשר להשתמש בהם בתווית כמו "מלון 5 כוכבים". הערך הזה צריך להיות מספר שלם בין 0 ל-5. אם אין דירוג או שהוא לא צוין, צריך להשתמש בדירוג 0. אם הערך הוא 0, לא יוצג למשתמשים דירוג כוכבים בממשק המשתמש. | |
brand_ids | מערך של מחרוזות | המותגים שיכולים להציג את המלון הזה. אם השדה הזה ריק, המלון יכול להופיע בכל אחד מהמותגים שמשויכים לפיד. |
LocalData
נתוני פיד ספציפיים למוסד.
| שם השדה | סוג | דרישה | תיאור |
|---|---|---|---|
business_hours | object(BusinessHours) | שעות הפעילות הרגילות של העסק. | |
price_range | object(PriceRange) | טווח המחירים של השירותים שהעסק מציע. | |
establishment_category | object(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_day | enum(DayOfWeek) | היום הפתוח של טווח התאריכים. | |
open_time | object(TimeOfDay) | שעת הפתיחה של טווח התאריכים. | |
close_day | enum(DayOfWeek) | היום האחרון בטווח התאריכים. | |
close_time | object(TimeOfDay) | שעת הסגירה של טווח התאריכים. |
TimeOfDay
| שם השדה | סוג | דרישה | תיאור |
|---|---|---|---|
hours | number | שעות ביום בפורמט של 24 שעות. הערך חייב להיות גדול מ-0 או שווה לו, ובדרך כלל קטן מ-23 או שווה לו. ב-API אפשר לאפשר את הערך "24:00:00" בתרחישים כמו שעת סגירת העסק. | |
minutes | number | דקות בשעה. הערך חייב להיות גדול מ-0 או שווה לו, וקטן מ-59 או שווה לו. | |
seconds | number | שניות בדקה. הערך חייב להיות גדול מ-0 או שווה לו, ובדרך כלל קטן מ-59 או שווה לו. ב-API מסוים יכול להיות שהערך 60 יהיה מותר אם הוא מאפשר דקות מעוברות. | |
nanos | number | שברירי שניות, בננו-שניות. הערך חייב להיות גדול מ-0 או שווה לו, וקטן מ-999,999,999 או שווה לו. |
PriceRange
טווח המחירים של השירותים שמוצעים בנקודת העניין.
| שם השדה | סוג | דרישה | תיאור |
|---|---|---|---|
min_price | object(Money) | המחיר המינימלי של השירותים שמוצעים בנקודת העניין. | |
max_price | object(Money) | המחיר המקסימלי של השירותים שמוצעים בנקודת העניין. |
כסף
מייצג סכום כסף עם סוג המטבע שלו.
| שם השדה | סוג | דרישה | תיאור |
|---|---|---|---|
currency_code | מחרוזת | קוד המטבע בן שלוש האותיות, כפי שמוגדר בתקן ISO 4217. | |
units | number | מספר היחידות השלמות של הסכום.
לדוגמה: אם הערך של currencyCode הוא "USD", המשמעות היא ש-1 יחידה = 1 דולר ארה"ב. | |
nanos | number | מספר יחידות הננו (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_data | object(HotelData) | לא יכול להתקיים יחד עם | שדות ספציפיים למלון. |
local_data | object(LocalData) | לא יכול להתקיים יחד עם | שדות ספציפיים למדינה. |
כתובות
חובה. כתובת של מיקום.
| שם השדה | סוג | דרישה | תיאור |
|---|---|---|---|
address | object(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" } ] } } ] }