Merchant Products API – Übersicht

Auf dieser Seite wird erläutert, wie Sie Ihre Produkte programmatisch hochladen und verwalten können. Mit der Merchant Products API können Sie ein Produkt in eine Datenquelle einfügen oder aktualisieren, ein Produkt aus Ihrem Konto abrufen und ein Produkt aus einer Datenquelle löschen.

Die Merchant Products API enthält die folgenden Ressourcen:

  • ProductInput steht für die Eingabeteile Ihrer Produkte.
  • Product steht für die verarbeiteten Produkte, die aus Ihren Eingabeteilen erstellt wurden.

ProductInput kann primär oder ergänzend sein, je nachdem, ob es in eine primäre Datenquelle oder eine ergänzende Datenquelle hochgeladen wird. Jeder Product wird aus einem einzigen primären ProductInput und einer beliebigen Anzahl von ergänzenden ProductInput erstellt.

Mit der Merchant Products API können Sie Online- oder Ladengeschäftskataloge erstellen. Das sind Produkte, die in mehreren Shopping-Zielen erscheinen können. Sie können die ProductInput-Ressource verwenden, sobald Sie Ihr Merchant Center-Konto erstellt, Ihre erste Datenquelle eingerichtet und die ersten Produkte über die API hochgeladen haben.

Händler können zwar Produkte über eine Datei hochladen, die PrimaryProductDataSource genannt wird, es gibt jedoch mehrere Vorteile beim Erstellen und Löschen von Produkten mit der Merchant API. Zu diesen Vorteilen gehören eine kürzere Reaktionszeit und die Möglichkeit, Produkte in Echtzeit zu aktualisieren, ohne große Dateien verwalten zu müssen. Es kann einige Stunden dauern, bis Produktänderungen, die über API-Aufrufe vorgenommen wurden, in der Shopping-Datenbank zu sehen sind.

Vorbereitung

Wenn Sie noch keine Datenquelle haben, erstellen Sie eine mit der Merchant Data Sources API oder im Merchant Center.

Wenn Sie bereits eine Datenquelle haben, die Sie entweder über die Merchant Center-Benutzeroberfläche oder über die API erstellt haben, können Sie Ihre Produkte mit der Merchant Products API hinzufügen. Wenn Sie Produkte mit der Content API for Shopping hinzufügen, lesen Sie den Leitfaden zur Migration, um zu erfahren, wie Sie mit der Merchant Products API beginnen.

Sie sind dafür verantwortlich, die Richtlinien für Shopping-Anzeigen und Produkteinträge einzuhalten. Shopping Ads behält sich das Recht vor, diese Richtlinien durchzusetzen und entsprechende Maßnahmen zu ergreifen, wenn wir Inhalte oder Verhaltensweisen finden, die gegen diese Richtlinien verstoßen.

Ressourcen

Mit der Ressource Product können Sie Produktinformationen aus der Shopping-Datenbank abrufen.

Die Ressource ProductInput steht für die Eingabedaten, die Sie für ein Produkt einreichen. Außerdem bietet es Methoden, mit denen Sie Produktinformationen einzeln oder im Batch-Modus auf einmal aktualisieren oder löschen können. Eine ProductInput-Ressource muss die folgenden Felder enthalten:

  • channel: Der Channel des Produkts.
  • offerId: Die eindeutige Kennung für das Produkt.
  • contentLanguage: Der aus zwei Buchstaben bestehende ISO 639-1-Sprachcode für das Produkt.
  • feedLabel: Das Label, mit dem Sie Ihre Produkte kategorisieren und identifizieren können. Es sind maximal 20 Zeichen zulässig. Folgende Zeichen werden unterstützt: A-Z, 0-9, Bindestrich und Unterstrich. Das Feedlabel darf keine Leerzeichen enthalten. Weitere Informationen finden Sie unter Feedlabels verwenden.

Produktdaten in Ihr Konto hochladen

Verwenden Sie die Methode accounts.productInputs.insert, um Produktdaten in Ihr Konto hochzuladen. Sie müssen die eindeutige Kennung der primären oder ergänzenden Datenquelle übergeben.

Im folgenden Beispiel wird gezeigt, wie Sie mit der Methode accounts.productInputs.insert einen Produkteintrag in Ihr Händlerkonto hochladen. In der Anfrage werden der Versandpreis und die Region sowie benutzerdefinierte Attribute wie das Herstellungsdatum und die Größe festgelegt.

POST https://merchantapi.googleapis.com/products/v1beta/accounts/{ACCOUNT_ID}/productInputs:insert?dataSource={DATASOURCE}

{
  "name": "{PRODUCT_TITLE}",
  "versionNumber": {VERSION_NUMBER},
  "contentLanguage": "{CONTENT_LANGUAGE}",
  "feedLabel": "{FEED_LABEL}",
  "offerId": "{OFFER_ID}",
  "channel": "ONLINE",
  "attributes": {
    "availability": "in stock",
    "imageLink": "{IMAGE_LINK}",
    "link": "{PRODUCT_LINK}",
    "brand": "{BRAND_NAME}",
    "price": {
      "currencyCode": "{CURRENCY_CODE}",
      "amountMicros": {PRICE}
    },
    "color": "red",
    "productWeight": {
      "value": 320,
      "unit": "g"
    },
    "adult": false,
    "shipping": [
      {
        "country": "GB",
        "price": {
          "amountMicros": {SHIPPING_COST},
          "currencyCode": "{CURRENCY_CODE_SHIPPING}"
        },
        "postalCode": "{SHIPPING_POSTALCODE}",
        "service": "",
        "region": "{SHIPPING_REGION}",
        "maxHandlingTime": "{MAX_HANDLING_TIME}",
        "minHandlingTime": "{MIN_HANDLING_TIME}",
        "maxTransitTime": "{MAX_TRANSIT_TIME}",
        "minTransitTime": "{MIN_TRANSIT_TIME}"
      }
    ],
    "gender": "Female"
  },
  "customAttributes": [
    {
      "name": "size",
      "value": "Large"
    },
    {
      "name": "Date of Manufacturing",
      "value": "2024-05-05"
    }
  ]
}

Ersetzen Sie Folgendes:

  • {ACCOUNT_ID}: Die eindeutige Kennung Ihres Merchant Center-Kontos.
  • {DATASOURCE}: Die eindeutige Kennung der Datenquelle. Er sollte das Format accounts/{ACCOUNT_ID}/dataSources/{DATASOURCE_ID} haben.
  • {PRODUCT_TITLE}: Der Name des Produkts.
  • {VERSION_NUMBER}: Die Versionsnummer des Produkts. Optional.
  • {CONTENT_LANGUAGE}: Der aus zwei Buchstaben bestehende ISO 639-1-Sprachcode für das Produkt. Erforderlich.
  • {FEED_LABEL}: Das Label, mit dem Sie Ihre Produkte kategorisieren und identifizieren können. Es sind maximal 20 Zeichen zulässig. Folgende Zeichen werden unterstützt: A-Z, 0-9, Bindestrich und Unterstrich. Das Feedlabel darf keine Leerzeichen enthalten.
  • {OFFER_ID}: Die eindeutige Kennung des Produkts. Erforderlich.
  • {IMAGE_LINK}: Der Link zum Bild des Produkts auf Ihrer Website. Optional.
  • {PRODUCT_LINK}: Der Link zum Produkt auf Ihrer Website. Optional.
  • {CURRENCY_CODE}: Die Währung des Preises mit dreistelligen Akronymen gemäß ISO 4217. Optional.
  • {PRICE}: Der Preis des Produkts als Zahl in Mikros. Optional.
  • {SHIPPING_COST}: Der feste Versandpreis als Zahl. Optional.
  • {SHIPPING_POSTALCODE}: Der Postleitzahlenbereich, für den der Versandpreis gilt. Optional.
  • {MAX_HANDLING_TIME}: Die maximale Bearbeitungszeit in Arbeitstagen zwischen dem Eingang der Bestellung und dem Versand. Optional.
  • {MIN_HANDLING_TIME}: Die minimale Bearbeitungszeit in Arbeitstagen zwischen dem Eingang der Bestellung und dem Versand. Der Wert „0“ bedeutet, dass die Bestellung am selben Tag geliefert wird, an dem sie eingegangen ist. Optional.
  • {MAX_TRANSIT_TIME}: Die maximale Laufzeit in Arbeitstagen zwischen dem Versand und der Zustellung der Bestellung. Optional.
  • {MIN_TRANSIT_TIME}: Die minimale Lieferdauer in Arbeitstagen zwischen dem Versand und der Zustellung der Bestellung. Der Wert 0 bedeutet, dass die Bestellung am selben Tag geliefert wird, an dem sie versendet wird. Optional.

Wenn die Anfrage erfolgreich ausgeführt wurde, wird die folgende Antwort angezeigt:

{
  "name": "{PRODUCT_NAME}",
  "product": "{PRODUCT_ID}",
  "channel": "ONLINE",
  "offerId": "{OFFER_ID}",
  "contentLanguage": "{CONTENT_LANGUAGE}",
  "feedLabel": "{FEED_LABEL}",
  "versionNumber": "{VERSION_NUMBER}",
  "attributes": {
    "link": "{PRODUCT_LINK}",
    "imageLink": "{IMAGE_LINK}",
    "adult": false,
    "availability": "in stock",
    "brand": "{BRAND_NAME}",
    "color": "red",
    "gender": "Female",
    "price": {
      "amountMicros": "{PRICE}",
      "currencyCode": "{CURRENCY_CODE}"
    },
    "shipping": [
      {
        "price": {
          "amountMicros": "{SHIPPING_COST}",
          "currencyCode": "{CURRENCY_CODE}"
        },
        "country": "{SHIPPING_COUNTRY}",
        "region": "{SHIPPING_REGION}",
        "postalCode": "{SHIPPING_POSTALCODE}",
        "minHandlingTime": "{MIN_HANDLING_TIME}",
        "maxHandlingTime": "{MAX_HANDLING_TIME}",
        "minTransitTime": "{MIN_TRANSIT_TIME}",
        "maxTransitTime": "{MAX_TRANSIT_TIME}"
      }
    ],
    "productWeight": {
      "value": 320,
      "unit": "g"
    }
  },
  "customAttributes": [
    {
      "name": "Size",
      "value": "Large"
    },
    {
      "name": "Date of Manufacturing",
      "value": "2024-05-05"
    }
  ]
}

Sie können die Methode google.shopping.merchant.accounts.v1beta.InsertProductInputSample verwenden, um Ihrem Merchant Center-Konto ein Produkt hinzuzufügen, wie im folgenden Beispiel gezeigt.

Java

import com.google.api.gax.core.FixedCredentialsProvider;
import com.google.auth.oauth2.GoogleCredentials;
import com.google.shopping.merchant.products.v1beta.Attributes;
import com.google.shopping.merchant.products.v1beta.InsertProductInputRequest;
import com.google.shopping.merchant.products.v1beta.ProductInput;
import com.google.shopping.merchant.products.v1beta.ProductInputsServiceClient;
import com.google.shopping.merchant.products.v1beta.ProductInputsServiceSettings;
import com.google.shopping.merchant.products.v1beta.Shipping;
import com.google.shopping.type.Channel.ChannelEnum;
import com.google.shopping.type.Price;
import shopping.merchant.samples.utils.Authenticator;
import shopping.merchant.samples.utils.Config;

/** This class demonstrates how to insert a product input */
public class InsertProductInputSample {

  private static String getParent(String accountId) {
    return String.format("accounts/%s", accountId);
  }

  public static void insertProductInput(Config config, String dataSource) throws Exception {

    // Obtains OAuth token based on the user's configuration.
    GoogleCredentials credential = new Authenticator().authenticate();

    // Creates service settings using the credentials retrieved above.
    ProductInputsServiceSettings productInputsServiceSettings =
        ProductInputsServiceSettings.newBuilder()
            .setCredentialsProvider(FixedCredentialsProvider.create(credential))
            .build();

    // Creates parent to identify where to insert the product.
    String parent = getParent(config.getAccountId().toString());

    // Calls the API and catches and prints any network failures/errors.
    try (ProductInputsServiceClient productInputsServiceClient =
        ProductInputsServiceClient.create(productInputsServiceSettings)) {

      // Price to be used for shipping ($33.45).
      Price price = Price.newBuilder().setAmountMicros(33_450_000).setCurrencyCode("USD").build();

      Shipping shipping =
          Shipping.newBuilder()
              .setPrice(price)
              .setCountry("GB")
              .setService("1st class post")
              .build();

      Shipping shipping2 =
          Shipping.newBuilder()
              .setPrice(price)
              .setCountry("FR")
              .setService("1st class post")
              .build();

      Attributes attributes =
          Attributes.newBuilder()
              .setTitle("A Tale of Two Cities")
              .setDescription("A classic novel about the French Revolution")
              .setLink("https://exampleWebsite.com/tale-of-two-cities.html")
              .setImageLink("https://exampleWebsite.com/tale-of-two-cities.jpg")
              .setAvailability("in stock")
              .setCondition("new")
              .setGoogleProductCategory("Media > Books")
              .addGtin("9780007350896")
              .addShipping(shipping)
              .addShipping(shipping2)
              .build();

      // The datasource can be either a primary or supplemental datasource.
      InsertProductInputRequest request =
          InsertProductInputRequest.newBuilder()
              .setParent(parent)
              // You can only insert products into datasource types of Input "API" and "FILE", and
              // of Type "Primary" or "Supplemental."
              // This field takes the `name` field of the datasource.
              .setDataSource(dataSource)
              // If this product is already owned by another datasource, when re-inserting, the
              // new datasource will take ownership of the product.
              .setProductInput(
                  ProductInput.newBuilder()
                      .setChannel(ChannelEnum.ONLINE)
                      .setContentLanguage("en")
                      .setFeedLabel("label")
                      .setOfferId("sku123")
                      .setAttributes(attributes)
                      .build())
              .build();

      System.out.println("Sending insert ProductInput request");
      ProductInput response = productInputsServiceClient.insertProductInput(request);
      System.out.println("Inserted ProductInput Name below");
      // The last part of the product name will be the product ID assigned to a product by Google.
      // Product ID has the format `channel~contentLanguage~feedLabel~offerId`
      System.out.println(response.getName());
      System.out.println("Inserted Product Name below");
      System.out.println(response.getProduct());
    } catch (Exception e) {
      System.out.println(e);
    }
  }

  public static void main(String[] args) throws Exception {
    Config config = Config.load();
    // Identifies the data source that will own the product input.
    String dataSource = "accounts/" + config.getAccountId() + "/dataSources/{INSERT_DATASOURCE_ID}";

    insertProductInput(config, dataSource);
  }
}

Ein verarbeitetes Produkt aus Ihrem Konto abrufen

Wenn Sie ein verarbeitetes Produkt aus Ihrem Konto abrufen möchten, verwenden Sie die Methode accounts.products.get. Es kann einige Minuten dauern, bis das verarbeitete Produkt nach dem Einfügen angezeigt wird.

GET https://merchantapi.googleapis.com/products/v1beta/accounts/{ACCOUNT_ID}/products/{PRODUCT_NAME}

Ersetzen Sie {PRODUCT_NAME} durch den Namen der Produkt-Eingaberessource, die Sie abrufen möchten. Beispiel: online~en~US~sku123.

Sie können den Ressourcennamen des verarbeiteten Produkts aus dem Feld Product in der Antwort von accounts.productInputs.insert abrufen.

Wenn Sie ein einzelnes Produkt für ein bestimmtes Merchant Center-Konto abrufen möchten, können Sie die Methode google.shopping.merchant.accounts.v1beta.GetProductRequest verwenden, wie im folgenden Beispiel gezeigt.

Java

import com.google.api.gax.core.FixedCredentialsProvider;
import com.google.auth.oauth2.GoogleCredentials;
import com.google.shopping.merchant.products.v1beta.GetProductRequest;
import com.google.shopping.merchant.products.v1beta.Product;
import com.google.shopping.merchant.products.v1beta.ProductsServiceClient;
import com.google.shopping.merchant.products.v1beta.ProductsServiceSettings;
import shopping.merchant.samples.utils.Authenticator;
import shopping.merchant.samples.utils.Config;

/** This class demonstrates how to get a single product for a given Merchant Center account */
public class GetProductSample {

  public static void getProduct(Config config, String product) throws Exception {

    // Obtains OAuth token based on the user's configuration.
    GoogleCredentials credential = new Authenticator().authenticate();

    // Creates service settings using the credentials retrieved above.
    ProductsServiceSettings productsServiceSettings =
        ProductsServiceSettings.newBuilder()
            .setCredentialsProvider(FixedCredentialsProvider.create(credential))
            .build();

    // Calls the API and catches and prints any network failures/errors.
    try (ProductsServiceClient productsServiceClient =
        ProductsServiceClient.create(productsServiceSettings)) {

      // The name has the format: accounts/{account}/products/{productId}
      GetProductRequest request = GetProductRequest.newBuilder().setName(product).build();

      System.out.println("Sending get product request:");
      Product response = productsServiceClient.getProduct(request);

      System.out.println("Retrieved Product below");
      System.out.println(response);
    } catch (Exception e) {
      System.out.println(e);
    }
  }

  public static void main(String[] args) throws Exception {
    Config config = Config.load();
    // The name of the `product`, returned after a `Product.insert` request. We recommend
    // having stored this value in your database to use for all future requests.
    String product = "accounts/{datasource}/products/{productId}";

    getProduct(config, product);
  }
}

Produkteingabe aus Ihrem Konto löschen

Wenn Sie eine Produkteingabe aus Ihrem Konto löschen möchten, verwenden Sie die Methode accounts.productInputs.delete. Wenn Sie ein Produkt mithilfe der Merchant Products API löschen möchten, müssen Sie die eindeutige Kennung der primären oder sekundären Datenquelle angeben, zu der das Produkt gehört.

In der folgenden Anfrage wird gezeigt, wie Sie mit der Methode accounts.productInputs.delete einen Produkteintrag löschen:

DELETE https://merchantapi.googleapis.com/products/v1beta/accounts/{ACCOUNT_ID}/productInputs/{PRODUCT_NAME}?dataSource=accounts/{ACCOUNT_ID}/dataSources/{DATASOURCE_ID}

Ersetzen Sie {PRODUCT_NAME} durch den Namen der Produkt-Eingaberessource, die Sie löschen möchten. Beispiel: online~en~US~sku123.

Wenn Sie ein Produkt für ein bestimmtes Merchant Center-Konto löschen möchten, können Sie die Methode google.shopping.merchant.accounts.v1beta.DeleteProductInputRequest verwenden, wie im folgenden Beispiel gezeigt.

Java

import com.google.api.gax.core.FixedCredentialsProvider;
import com.google.auth.oauth2.GoogleCredentials;
import com.google.shopping.merchant.products.v1beta.DeleteProductInputRequest;
import com.google.shopping.merchant.products.v1beta.ProductInputName;
import com.google.shopping.merchant.products.v1beta.ProductInputsServiceClient;
import com.google.shopping.merchant.products.v1beta.ProductInputsServiceSettings;
import shopping.merchant.samples.utils.Authenticator;
import shopping.merchant.samples.utils.Config;

/** This class demonstrates how to delete a product for a given Merchant Center account */
public class DeleteProductInputSample {

  public static void deleteProductInput(Config config, String productId, String dataSource)
      throws Exception {

    // Obtains OAuth token based on the user's configuration.
    GoogleCredentials credential = new Authenticator().authenticate();

    // Creates service settings using the credentials retrieved above.
    ProductInputsServiceSettings productInputsServiceSettings =
        ProductInputsServiceSettings.newBuilder()
            .setCredentialsProvider(FixedCredentialsProvider.create(credential))
            .build();

    // Creates product name to identify product.
    String name =
        ProductInputName.newBuilder()
            .setAccount(config.getAccountId().toString())
            .setProductinput(productId)
            .build()
            .toString();

    // Calls the API and catches and prints any network failures/errors.
    try (ProductInputsServiceClient productInputsServiceClient =
        ProductInputsServiceClient.create(productInputsServiceSettings)) {
      DeleteProductInputRequest request =
          DeleteProductInputRequest.newBuilder().setName(name).setDataSource(dataSource).build();

      System.out.println("Sending deleteProductInput request");
      productInputsServiceClient.deleteProductInput(request); // no response returned on success
      System.out.println(
          "Delete successful, note that it may take a few minutes for the delete to update in"
              + " the system. If you make a products.get or products.list request before a few"
              + " minutes have passed, the old product data may be returned.");
    } catch (Exception e) {
      System.out.println(e);
    }
  }

  public static void main(String[] args) throws Exception {
    Config config = Config.load();
    // An ID assigned to a product by Google. In the format
    // channel~contentLanguage~feedLabel~offerId
    String productId = "online~en~label~sku123";

    // The name of the dataSource from which to delete the product. If it is a primary feed, this
    // will delete the product completely. If it's a supplemental feed, it will only delete the
    // product information from that feed, but the product will still be available from the primary
    // feed.
    String dataSource = "accounts/{account}/dataSources/{dataSource}";

    deleteProductInput(config, productId, dataSource);
  }
}

Produkte aus Ihrem Konto auflisten

Verwenden Sie die Methode accounts.products.list, um die verarbeiteten Produkte in Ihrem Konto aufzulisten, wie in der folgenden Anfrage gezeigt.

GET https://merchantapi.googleapis.com/products/v1beta/accounts/{ACCOUNT_ID}/products

Wenn Sie ein Produkt für ein bestimmtes Merchant Center-Konto auflisten möchten, können Sie die Methode google.shopping.merchant.accounts.v1beta.ListProductsRequest verwenden, wie im folgenden Beispiel gezeigt.

Java

import com.google.api.gax.core.FixedCredentialsProvider;
import com.google.auth.oauth2.GoogleCredentials;
import com.google.shopping.merchant.products.v1beta.ListProductsRequest;
import com.google.shopping.merchant.products.v1beta.Product;
import com.google.shopping.merchant.products.v1beta.ProductsServiceClient;
import com.google.shopping.merchant.products.v1beta.ProductsServiceClient.ListProductsPagedResponse;
import com.google.shopping.merchant.products.v1beta.ProductsServiceSettings;
import shopping.merchant.samples.utils.Authenticator;
import shopping.merchant.samples.utils.Config;

/** This class demonstrates how to list all the products for a given merchant center account */
public class ListProductsSample {

  private static String getParent(String accountId) {
    return String.format("accounts/%s", accountId);
  }

  public static void listProducts(Config config) throws Exception {

    // Obtains OAuth token based on the user's configuration.
    GoogleCredentials credential = new Authenticator().authenticate();

    // Creates service settings using the credentials retrieved above.
    ProductsServiceSettings productsServiceSettings =
        ProductsServiceSettings.newBuilder()
            .setCredentialsProvider(FixedCredentialsProvider.create(credential))
            .build();

    // Creates parent to identify the account from which to list all products.
    String parent = getParent(config.getAccountId().toString());

    // Calls the API and catches and prints any network failures/errors.
    try (ProductsServiceClient productsServiceClient =
        ProductsServiceClient.create(productsServiceSettings)) {

      // The parent has the format: accounts/{account}
      // Page size is set to the maximum value. If you are returned more
      // responses than your page size, this code will automatically
      // re-call the service with the `pageToken` until all responses
      // are returned.
      ListProductsRequest request =
          ListProductsRequest.newBuilder().setParent(parent).setPageSize(250).build();

      System.out.println("Sending list products request:");
      ListProductsPagedResponse response = productsServiceClient.listProducts(request);

      int count = 0;

      // Iterates over all rows in all pages and prints the datasource in each row.
      // Automatically uses the `nextPageToken` if returned to fetch all pages of data.
      for (Product product : response.iterateAll()) {

        System.out.println(product); // The product includes the `productStatus` field
        // That shows approval and disapproval information.

        count++;
      }
      System.out.print("The following count of products were returned: ");
      System.out.println(count);
    } catch (Exception e) {
      System.out.println("An error has occured: ");
      System.out.println(e);
    }
  }

  public static void main(String[] args) throws Exception {
    Config config = Config.load();
    listProducts(config);
  }
}