スポット(POI)フィード

POI フィードを作成してアップロードする

POI フィードを作成してアップロードする際は、次の手順に沿ってください。

  • POI データファイルについては、POI フィードに記載されている仕様に沿って対応します。アップロードごとに一意の POI データファイル名を使用することをおすすめします。ファイル名にタイムスタンプを含めます(例: POI_1633621547.json)。
  • ローカルの POI SFTP サーバーにフィードを毎日アップロードして、完全な更新を行います。
  • SFTP サーバーの詳細は、パートナー ポータルの [Configuration > Feeds] セクションで確認できます。

フィードサーバーの選択

  • パートナー ポータルの [取り込み] > [履歴] セクションで、フィードの取り込みステータスを確認します。

フィードの詳細

フィールドの要件

VssPoi

ホテルやレストランなど、単一のスポット(POI)エンティティを表します。

フィールド名タイプ要件説明
poi_id文字列

必須

必須。POI を識別するためにパートナーが生成した文字列。
nameobject
(Text)

必須

必須。POI の名前。
telephone文字列

国番号と市外局番を含む、POI の連絡先電話番号(例: +14567891234)。
url文字列

POI の公開ウェブサイトの URL。注: これは表示ではなく、照合のみに使用されます。
locationobject
(GeoCoordinates)

必須

必須。POI の位置情報。
display_addressobject
(Text)

UI に表示されるアドレス。
imagesオブジェクトの配列
(Image)

スポットの画像。 画像の最大数: 5。
rating数値

POI の平均評価。
num_ratings数値

rating フィールドの評価に貢献した件数。
rating_scale数値

rating フィールドに使用される段階別評価。最大評価が 5 の場合、rating_scale は 5 です。
categoryenum
(Category)

必須

必須。スポットのカテゴリを表します。
descriptionobject
(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_textobject
(Text)

ユーザー補助に使用する代替テキスト。

HotelData

ホテル固有のフィードデータ。

フィールド名タイプ要件説明
hotel_star_class数値

ホテルの公式なホテル クラスの星の値。「5 つ星ホテル」などのラベルで使用できます。この値は 1 ~ 5 の整数であることが想定されています。
brand_ids文字列の配列

このホテルを表示できるブランド。 このフィールドが空の場合、ホテルはフィードに関連付けられているブランドのいずれかに表示されます。

LocalData

施設固有のフィードデータ。

フィールド名タイプ要件説明
business_hoursobject
(BusinessHours)

施設の通常の営業時間。
price_rangeobject
(PriceRange)

施設が提供するサービスの価格帯。
establishment_categoryobject
(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_dayenum
(DayOfWeek)

期間の開始日。
open_timeobject
(TimeOfDay)

期間の開始時間。
close_dayenum
(DayOfWeek)

期間の終了日。
close_timeobject
(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_priceobject
(Money)

POI が提供するサービスの最低価格。
max_priceobject
(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火曜日
WEDNESDAYWednesday
THURSDAY木曜日
FRIDAY金曜日
SATURDAY土曜日
SUNDAY日曜日

additional_data

必須。カテゴリ固有のフィールド。これは、上記の category フィールドと一致する必要があります。

フィールド名タイプ要件説明
hotel_dataobject
(HotelData)

local_data とは相互に排他的です

ホテル固有のフィールド。
local_dataobject
(LocalData)

hotel_data とは相互に排他的です

地域固有のフィールド。

addresses

必須。ビジネスの住所。

フィールド名タイプ要件説明
addressobject
(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"
          }
        ]
      }
    }
  ]
}