この Merchant API とのやり取りのアプローチでは、リクエストの作成とレスポンスの処理の低レベルの詳細をカプセル化する事前構築済みのライブラリを使用します。これにより、API とのやり取りがより便利になり、多くの場合、言語に固有の方法でやり取りできるようになります。これらは、認証、リクエストとレスポンスのシリアル化/デシリアル化、その他のボイラープレート コードを処理します。
ステップ 1. 認証を設定してコードサンプルを構成する
手順については、Merchant API の認証の設定と構成例をご覧ください。
ステップ 2. クライアント ライブラリとコードサンプルをダウンロードしてインストールする
クライアント ライブラリのダウンロードとインストール、GitHub のコードサンプルの使用方法については、Google Merchant API の Python サンプルをご覧ください。
ステップ 3. デベロッパーとして登録
Merchant API を使用するには、デベロッパーの連絡先情報を登録する必要があります。
登録により、次の処理が行われます。
- ユーザーに API developerロールを割り当てて、Merchant Center アカウントの技術担当者を作成します。これにより、Google は、デベロッパーが使用している API と機能に関する重要な更新情報(サービスの発表や新機能に関する情報など)を送信できます。これらの情報は、デベロッパー以外の方にはあまり関心がない可能性があります。
- 複数回登録しなくても、複数の販売者アカウントを操作できます。登録すると、Merchant API の認証に使用される Google Cloud プロジェクト ID が、技術担当者(API developer)を含む Merchant Center アカウントに関連付けられます。これにより、登録済みの Google Cloud プロジェクトで認証が行われている限り、管理しているすべての販売者アカウントの重要な更新情報を取得できます。
登録する際は、登録で説明されている前提条件と制限事項を確認してください。
クライアント ライブラリを使用してプロジェクトを登録する方法の例については、Python を使用してデベロッパーのメールアドレスを指定して Google Cloud プロジェクトを登録するサンプルをご覧ください。
Python
# -*- coding: utf-8 -*-
# Copyright 2025 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""This example registers a GCP project with a developer email."""
from examples.authentication import configuration
from examples.authentication import generate_user_credentials
from google.shopping.merchant_accounts_v1 import DeveloperRegistrationServiceClient
from google.shopping.merchant_accounts_v1 import RegisterGcpRequest
def register_gcp(account_id: str, developer_email: str) -> None:
  """Registers the GCP project used to call the Merchant API with a developer email.
  Args:
    account_id: The ID of your Merchant Center account.
    developer_email: The email address of the developer to register.
  """
  # Get OAuth credentials.
  credentials = generate_user_credentials.main()
  # Create a client to the Developer Registration Service.
  client = DeveloperRegistrationServiceClient(credentials=credentials)
  # The name has the format: accounts/{account}/developerRegistration
  name = f"accounts/{account_id}/developerRegistration"
  # Create the request to register the GCP project.
  request = RegisterGcpRequest(
      name=name,
      developer_email=developer_email,
  )
  # Make the API call and handle potential errors.
  try:
    print("Sending RegisterGcp request:")
    response = client.register_gcp(request=request)
    print("Registered GCP project successfully:")
    print(response)
  except RuntimeError as e:
    print(f"An error occurred: {e}")
if __name__ == "__main__":
  # Your Merchant Center account ID.
  # This can be found in the Merchant Center UI.
  _account_id = configuration.Configuration().read_merchant_info()
  # The developer email to associate with the GCP project.
  _developer_email = "YOUR_EMAIL_HERE"
  register_gcp(_account_id, _developer_email)
ステップ 4. デベロッパーの連絡先と権限を管理する
登録する際は、以下の点にご注意ください。
- メールアドレスが Merchant Center アカウントのユーザーに属している場合、そのユーザーに API_DEVELOPERロールが付与されます。
- メールアドレスが既存のユーザーに属していない場合は、そのアドレスに招待状が送信されます。招待を受けたユーザーは、API_DEVELOPERロールを持つ新しいユーザーとして追加されることを承認する必要があります。
初回登録後、複数のデベロッパーを追加して、追加のアクセス権を付与することをおすすめします。
ステップ 4a. 追加の権限を付与する
重要な通知を受け取るには API_DEVELOPER ロールが必要ですが、Merchant Center 内での権限は最小限です。このユーザーが他の API 呼び出しを行ったり、Merchant Center UI で設定を管理したりできるようにするには、STANDARD や ADMIN などの追加のロールを付与する必要があります。詳細については、アクセスタイプをご覧ください。
accounts.users.patch メソッドを使用して、ユーザーのアクセス権を更新できます。
サンプルコードは、ユーザーを更新して ADMIN ロールと API_DEVELOPER ロールの両方を付与する方法を示しています。これにより、アカウントを完全に管理できるようになり、API 関連の連絡も届くようになります。
Python
# -*- coding: utf-8 -*-
# Copyright 2024 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""A module to update a user."""
from examples.authentication import configuration
from examples.authentication import generate_user_credentials
from google.protobuf import field_mask_pb2
from google.shopping.merchant_accounts_v1 import AccessRight
from google.shopping.merchant_accounts_v1 import UpdateUserRequest
from google.shopping.merchant_accounts_v1 import User
from google.shopping.merchant_accounts_v1 import UserServiceClient
FieldMask = field_mask_pb2.FieldMask
_ACCOUNT = configuration.Configuration().read_merchant_info()
def update_user(user_email, user_access_right):
  """Updates a user to make it an admin of the MC account."""
  credentials = generate_user_credentials.main()
  client = UserServiceClient(credentials=credentials)
  # Create user name string
  name = "accounts/" + _ACCOUNT + "/users/" + user_email
  user = User(name=name, access_rights=[user_access_right])
  field_mask = FieldMask(paths=["access_rights"])
  try:
    request = UpdateUserRequest(user=user, update_mask=field_mask)
    print("Sending Update User request")
    response = client.update_user(request=request)
    print("Updated User Name below")
    print(response.name)
  except RuntimeError as e:
    print(e)
if __name__ == "__main__":
  # Modify this email to update the right user
  email = "USER_MAIL_ACCOUNT"
  access_right = AccessRight.ADMIN
  update_user(email, access_right)
ステップ 4b. バックアップ デベロッパーを追加する
メインのデベロッパーの連絡先が組織を離れた場合に API へのアクセスが中断されないようにするには、少なくとも 1 人のバックアップ デベロッパーを追加する必要があります。
accounts.users.create メソッドを使用してユーザーを追加するか、accounts.users.patch メソッドを使用して既存のユーザーを更新できます。このユーザーに ADMIN ロールと API_DEVELOPER ロールの両方を付与することをおすすめします。
ステップ 5. メインの商品データソースを作成する
商品を挿入するには、メインの商品データソースが必要です。データソースを作成するサンプルコードについては、複数の言語をサポートするメインの商品データソースを Python で作成するサンプルをご覧ください。
Python
# -*- coding: utf-8 -*-
# Copyright 2024 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""This class demonstrates how to create a Primary product datasource all `feedLabel` and `contentLanguage` combinations.
This works only for API primary feeds.
"""
from examples.authentication import configuration
from examples.authentication import generate_user_credentials
from google.shopping.merchant_datasources_v1 import CreateDataSourceRequest
from google.shopping.merchant_datasources_v1 import DataSource
from google.shopping.merchant_datasources_v1 import DataSourcesServiceClient
from google.shopping.merchant_datasources_v1 import PrimaryProductDataSource
_ACCOUNT = configuration.Configuration().read_merchant_info()
_PARENT = f"accounts/{_ACCOUNT}"
def create_primary_product_data_source_multiple_languages():
  """Creates a `DataSource` resource."""
  # Gets OAuth Credentials.
  credentials = generate_user_credentials.main()
  # Creates a client.
  client = DataSourcesServiceClient(credentials=credentials)
  # Creates a PrimaryProductDataSource.
  primary_datasource = PrimaryProductDataSource()
  primary_datasource.countries = ["GB"]
  # Creates a DataSource and populates its attributes.
  data_source = DataSource()
  data_source.display_name = "Example Multiple Languages Primary DataSource"
  data_source.primary_product_data_source = primary_datasource
  # Creates the request.
  request = CreateDataSourceRequest(parent=_PARENT, data_source=data_source)
  # Makes the request and catches and prints any error messages.
  try:
    response = client.create_data_source(request=request)
    print(f"DataSource successfully created: {response}")
  except RuntimeError as e:
    print("DataSource creation failed")
    print(e)
if __name__ == "__main__":
  create_primary_product_data_source_multiple_languages()
このデータソースは Merchant Center の UI で確認できます。詳細については、[データソース] タブを見つける方法をご覧ください。
ステップ 6. 商品を挿入する
データソースを作成したら、商品を追加してみます。クライアント ライブラリを使用してこれを行う方法を示すサンプルコードについては、Python で商品入力のサンプルを挿入するをご覧ください。
Python
# -*- coding: utf-8 -*-
# Copyright 2024 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""A module to insert a Product Input."""
from examples.authentication import configuration
from examples.authentication import generate_user_credentials
from google.shopping import merchant_products_v1
from google.shopping.merchant_products_v1 import Availability
from google.shopping.merchant_products_v1 import Condition
from google.shopping.type import Price
_ACCOUNT = configuration.Configuration().read_merchant_info()
_PARENT = f"accounts/{_ACCOUNT}"
# You can only insert products into datasource types of Input "API" and
# "FILE", and of Type "Primary" or "Supplemental."
_DATA_SOURCE = "[INSERT_DATA_SOURCE_HERE]"
_DATA_SOURCE_NAME = f"accounts/{_ACCOUNT}/dataSources/{_DATA_SOURCE}"
def create_product_input():
  """Creates a `ProductInput` resource."""
  # Creates a shipping setting
  price = Price()
  price.amount_micros = 33_450_000
  price.currency_code = "GBP"
  shipping_option_1 = merchant_products_v1.Shipping()
  shipping_option_1.price = price
  shipping_option_1.country = "GB"
  shipping_option_1.service = "1st class post"
  price2 = Price()
  price2.amount_micros = 33_450_000
  price2.currency_code = "EUR"
  shipping_option_2 = merchant_products_v1.Shipping()
  shipping_option_2.price = price2
  shipping_option_2.country = "FR"
  shipping_option_2.service = "2nd class post"
  # Sets product attributes. Make sure to replace these values with your own.
  attributes = merchant_products_v1.ProductAttributes()
  attributes.title = "A Tale of Two Cities"
  attributes.description = "A classic novel about the French Revolution"
  attributes.link = "https://exampleWebsite.com/tale-of-two-cities.html"
  attributes.image_link = "https://exampleWebsite.com/tale-of-two-cities.jpg"
  attributes.price = price
  attributes.availability = Availability.IN_STOCK
  attributes.condition = Condition.NEW
  attributes.google_product_category = "Media > Books"
  attributes.gtins = ["9780007350896"]
  attributes.shipping = [shipping_option_1, shipping_option_2]
  return merchant_products_v1.ProductInput(
      content_language="en",
      feed_label="GB",
      offer_id="sku123",
      product_attributes=attributes,
  )
def insert_product_input():
  """Inserts the specified `ProductInput` resource."""
  # Gets OAuth Credentials.
  credentials = generate_user_credentials.main()
  # Creates a client.
  client = merchant_products_v1.ProductInputsServiceClient(
      credentials=credentials
  )
  # Creates the request.
  request = merchant_products_v1.InsertProductInputRequest(
      parent=_PARENT,
      # If this product is already owned by another datasource, when
      # re-inserting, the new datasource will take ownership of the product.
      product_input=create_product_input(),
      data_source=_DATA_SOURCE_NAME,
  )
  # Makes the request and catches and prints any error messages.
  try:
    response = client.insert_product_input(request=request)
    # The last part of the product name will be the product ID assigned to a
    # product by Google. Product ID has the format
    # `contentLanguage~feedLabel~offerId`
    print(f"Input successful: {response}")
  except RuntimeError as e:
    print("Input failed")
    print(e)
    # After the product is inserted, the product ID will be returned in the
    # response. We recommend that you check the Merchant Center to ensure that
    # the product is approved and visible to users before using the product ID
    # in any downstream processes.
if __name__ == "__main__":
  insert_product_input()
ステップ 7. 商品をリスティングする
データソース内の商品を一覧表示するサンプルコードについては、Python を使用して商品を一覧表示するサンプルをご覧ください。
Python
# -*- coding: utf-8 -*-
# Copyright 2024 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""A module to list Products."""
from examples.authentication import configuration
from examples.authentication import generate_user_credentials
from google.shopping import merchant_products_v1
_ACCOUNT = configuration.Configuration().read_merchant_info()
_PARENT = f"accounts/{_ACCOUNT}"
def list_products():
  """Lists the `Product` resources for a given account."""
  # Gets OAuth Credentials.
  credentials = generate_user_credentials.main()
  # Creates a client.
  client = merchant_products_v1.ProductsServiceClient(
      credentials=credentials
  )
  # Creates the request. Set the page size to the maximum value.
  request = merchant_products_v1.ListProductsRequest(
      parent=_PARENT, page_size=1000
  )
  # Makes the request and catches and prints any error messages.
  try:
    response = client.list_products(request=request)
    for product in response:
      print(product)
    print("List request successful!")
  except RuntimeError as e:
    print("List request failed")
    print(e)
if __name__ == "__main__":
  list_products()