POI フィードを作成してアップロードする
POI フィードを作成してアップロードする際は、次の手順に沿ってください。
- POI データファイルについては、POI フィードに記載されている仕様に沿って対応します。アップロードごとに一意の POI データファイル名を使用することをおすすめします。ファイル名にタイムスタンプを含めます(例:
POI_1633621547.json)。 - ローカルの POI SFTP サーバーにフィードを毎日アップロードして、完全な更新を行います。
- SFTP サーバーの詳細は、パートナー ポータルの [Configuration > Feeds] セクションで確認できます。
- パートナー ポータルの [取り込み] > [履歴] セクションで、フィードの取り込みステータスを確認します。
フィードの詳細
フィールドの要件
VssPoi
ホテルやレストランなど、単一のスポット(POI)エンティティを表します。
| フィールド名 | タイプ | 要件 | 説明 |
|---|---|---|---|
poi_id | 文字列 | 必須 | 必須。POI を識別するためにパートナーが生成した文字列。 |
name | object(Text) | 必須 | 必須。POI の名前。 |
telephone | 文字列 | 国番号と市外局番を含む、POI の連絡先電話番号(例: +14567891234)。 | |
url | 文字列 | POI の公開ウェブサイトの URL。注: これは表示ではなく、照合のみに使用されます。 | |
location | object(GeoCoordinates) | 必須 | 必須。POI の位置情報。 |
display_address | object(Text) | UI に表示されるアドレス。 | |
images | オブジェクトの配列(Image) | スポットの画像。 画像の最大数: 5。 | |
rating | 数値 | POI の平均評価。 | |
num_ratings | 数値 | rating フィールドの評価に貢献した件数。 | |
rating_scale | 数値 | rating フィールドに使用される段階別評価。最大評価が 5 の場合、rating_scale は 5 です。 | |
category | enum(Category) | 必須 | 必須。スポットのカテゴリを表します。 |
description | object(Text) | POI の説明。 | |
| oneOf(additional_data) | 必須 | この oneOf のフィールドは 1 つだけ設定できます。 |
テキスト
ローカライズされたテキストを表します。
| フィールド名 | タイプ | 要件 | 説明 |
|---|---|---|---|
localizations | オブジェクトの配列(LocalizedString) | ローカライズされた文字列。 | |
default_locale | 文字列 | デフォルトの言語として使用するロケールは、ローカライズに存在する必要があります。 |
LocalizedString
ローカライズされた文字列を表します。
| フィールド名 | タイプ | 要件 | 説明 |
|---|---|---|---|
locale | 文字列 | テキストの言語タグ(「en」、「en-US」、「sr-Latn」など)。 | |
text | 文字列 | 指定された言語 / 地域のテキスト。 |
GeoCoordinates
ビジネス拠点の地理データ(緯度、経度、住所など)。
| フィールド名 | タイプ | 要件 | 説明 |
|---|---|---|---|
latitude | 数値 | [-90, +90] 度(両端を含む)。経度が設定されている場合は必須。それ以外の場合は任意。 | |
longitude | 数値 | [-180, +180] 度(両端を含む)。緯度が設定されている場合は必須。それ以外の場合は推奨。 | |
| oneOf(addresses) | 必須 | この oneOf のフィールドは 1 つだけ設定できます。 |
PostalAddress
場所の住所。
| フィールド名 | タイプ | 要件 | 説明 |
|---|---|---|---|
country | 文字列 | 必須 | 必須。国(ISO 3166-1 alpha-2 国コードを使用。例: 「US」)。 |
locality | 文字列 | 必須 | 必須。地域区分/市区町村(例: 横須賀市)。 |
region | 文字列 | 地域 / 都道府県(例: 神奈川県)。このフィールドは、県が住所の一部である国でのみ必須です。(省略可) | |
postal_code | 文字列 | 必須 | 必須。郵便番号(例: 94043)。 |
street_address | 文字列 | 必須 | 必須。番地(例: 大町 3-5)。 |
画像
スポット(POI)の画像を表します。
| フィールド名 | タイプ | 要件 | 説明 |
|---|---|---|---|
url | 文字列 | 画像の URL。この URL でホストされているメディアが、Google によりクロールされます。 最大長: 2,000。 | |
alt_text | object(Text) | ユーザー補助に使用する代替テキスト。 |
HotelData
ホテル固有のフィードデータ。
| フィールド名 | タイプ | 要件 | 説明 |
|---|---|---|---|
hotel_star_class | 数値 | ホテルの公式なホテル クラスの星の値。「5 つ星ホテル」などのラベルで使用できます。この値は 1 ~ 5 の整数であることが想定されています。 | |
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] インスタンスのコレクションを保持します。例: 土曜日の午前 9 時~午後 12 時と午後 1 時~午後 5 時: 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 } } 例: 土曜日の午後 9 時~日曜日の午前 2 時: time_ranges { open_day: SATURDAY open_time: { hours: 21, minutes: 0 } close_day: SUNDAY close_time: { hours: 2, minutes: 0 } }
| フィールド名 | タイプ | 要件 | 説明 |
|---|---|---|---|
time_ranges | オブジェクトの配列(TimeRange) | このスポットが営業している時間のコレクションです。各期間は、1 週間のうち POI が営業している時間帯を表します。 |
TimeRange
指定した営業開始日時から始まり、指定した営業終了日時で終わる、POI が営業している期間を表します。営業終了時間は、営業開始時間の後、たとえば同日の後の時間か翌日に設定する必要があります。
| フィールド名 | タイプ | 要件 | 説明 |
|---|---|---|---|
open_day | enum(DayOfWeek) | 期間の開始日。 | |
open_time | object(TimeOfDay) | 期間の開始時間。 | |
close_day | enum(DayOfWeek) | 期間の終了日。 | |
close_time | object(TimeOfDay) | 時間帯の終了時間。 |
TimeOfDay
| フィールド名 | タイプ | 要件 | 説明 |
|---|---|---|---|
hours | 数値 | 1 日の時間(24 時間形式)。0 以上にする必要があります。通常は 23 以下にする必要があります。API ではビジネスの終了時間などのシナリオにおいて、値 "24:00:00" を許可することもできます。 | |
minutes | 数値 | 1 時間の分。0 以上 59 以下にする必要があります。 | |
seconds | 数値 | 1 分の秒数。0 以上にする必要があります。通常は 59 以下にする必要があります。API がうるう秒を許可する場合、値 60 が許可されます。 | |
nanos | 数値 | 秒の小数部分(ナノ秒単位)。0 以上 999,999,999 以下にする必要があります。 |
PriceRange
POI が提供するサービスの価格帯。
| フィールド名 | タイプ | 要件 | 説明 |
|---|---|---|---|
min_price | object(Money) | POI が提供するサービスの最低価格。 | |
max_price | object(Money) | POI が提供するサービスの最高価格。 |
金額
金額をその通貨タイプで表します。
| フィールド名 | タイプ | 要件 | 説明 |
|---|---|---|---|
currency_code | 文字列 | ISO 4217 で定義されている 3 文字の通貨コード。 | |
units | 数値 | 金額の整数部分。たとえば、currencyCode が "USD" の場合、1 単位は 1 米ドルです。 | |
nanos | 数値 | 金額のナノ単位(10 のマイナス 9 乗)の数。値は -999,999,999 以上 +999,999,999 以下でなければなりません。units が正の場合、nanos は正またはゼロでなければなりません。units がゼロの場合、nanos には正数、0、または負数を指定できます。units が負の場合、nanos は負数または 0 を指定します。たとえば、$-1.75 は units = -1、nanos = -750,000,000 と表されます。 |
BrandLandingPages
単一のスポット(POI)のローカライズされたブランド ランディング ページ。
| フィールド名 | タイプ | 要件 | 説明 |
|---|---|---|---|
brand_id | 文字列 | この構成が適用されるブランド。 | |
localized_landing_pages | オブジェクトの配列(LocalizedLandingPage) | ローカライズされたランディング ページ。url フィールドと locales フィールドの値は、すべてのローカライズされたランディング ページで一意である必要があります。 | |
default_url | 文字列 | ローカライズされたランディング ページのいずれもユーザーの言語と一致しない場合に使用されるデフォルトのランディング ページ URL。 |
LocalizedLandingPage
スポット(POI)のローカライズされたランディング ページ。
| フィールド名 | タイプ | 要件 | 説明 |
|---|---|---|---|
url | 文字列 | ランディング ページの URL。最大長: 2,000。 | |
locales | 文字列の配列 | このページを指定した言語設定のユーザーに制限します。「en」、「en-US」、「sr-Latn」などの言語タグを含める必要があります。 |
カテゴリ
POI のカテゴリを表します。これは、次の additional_data oneof フィールドと一致する必要があります。
| 名前 | 説明 |
|---|---|
UNKNOWN_CATEGORY | |
HOTEL | |
LOCAL |
DayOfWeek
曜日を表します。
| 名前 | 説明 |
|---|---|
DAY_OF_WEEK_UNSPECIFIED | 曜日は指定されていません。 |
MONDAY | 月曜日 |
TUESDAY | 火曜日 |
WEDNESDAY | Wednesday |
THURSDAY | 木曜日 |
FRIDAY | 金曜日 |
SATURDAY | 土曜日 |
SUNDAY | 日曜日 |
additional_data
必須。カテゴリ固有のフィールド。これは、上記の category フィールドと一致する必要があります。
| フィールド名 | タイプ | 要件 | 説明 |
|---|---|---|---|
hotel_data | object(HotelData) |
| ホテル固有のフィールド。 |
local_data | object(LocalData) |
| 地域固有のフィールド。 |
addresses
必須。ビジネスの住所。
| フィールド名 | タイプ | 要件 | 説明 |
|---|---|---|---|
address | object(PostalAddress) | ビジネス拠点の郵便住所。 |
- 形式: JPEG、PNG、WebP のいずれかである必要があります。
- 最大ファイルサイズ: 画像 1 枚あたり 30 MB 未満。
- 最大サイズ: 合計 75 メガピクセル未満(幅 × 高さ < 75,000,000)。
- URL の種類: 画像アセットへの直接パス(例: .jpg で終わる)。
- 権限: ホスティング サーバーで Googlebot またはクローラへのアクセスが許可されており、画像ディレクトリをブロックする robots.txt がないことを確認します。
定義
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; } }
Text の定義
// 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; // The brand landing pages. repeated BrandLandingPages brand_landing_pages = 4; }
BrandLandingPages の定義
// The Localized brand landing pages for a single Point of Interest (POI). message BrandLandingPages { // 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". repeated string locales = 3; } // 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; // 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" }, { "brand_id": "delicious_eats_brand", "localized_landing_pages": [ { "url": "https://www.deliciouseats.com/en", "locales": ["en-US", "en-GB"] } ], "default_url": "https://www.deliciouseats.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" }, { "brand_id": "delicious_eats_brand", "localized_landing_pages": [ { "url": "https://www.deliciouseats.com/fr", "locales": ["fr-FR", "fr-CA"] }, { "url": "https://www.deliciouseats.com/en", "locales": ["en-US", "en-GB"] } ], "default_url": "https://www.deliciouseats.com" } ] } } ] }