Обзор API торговых продуктов

На этой странице объясняется, как вы можете загружать свои продукты и управлять ими программно. Используя API торговых продуктов, вы можете вставлять или обновлять продукт в источнике данных, получать продукт из своей учетной записи и удалять продукт из источника данных.

API торговых продуктов содержит два ресурса.

  • productInputs представляет входные части ваших продуктов.
  • products представляют собой обработанные продукты, созданные из входных частей.

productInputs может быть первичным и дополнительным, в зависимости от того, загружается ли он в основной или дополнительный источник данных . Каждый product будет создан из одного основного productInput и любого количества дополнительных productInputs .

Вы можете использовать API Merchant Products для создания каталогов интернет-магазинов или локальных магазинов. Это продукты, которые могут появляться в нескольких местах покупок . Вы можете использовать ресурс productInputs после того, как создадите свою учетную запись Merchant Center, настроите свой первый источник данных и будете готовы загрузить первоначальный набор продуктов через API.

Хотя продавцы имеют возможность загружать продукты с помощью файла PrimaryProductDataSource , создание и удаление продуктов с помощью Merchant API дает несколько преимуществ. Эти преимущества включают более быстрое время отклика и возможность обновлять продукты в режиме реального времени без необходимости управлять большими файлами. Прежде чем изменения продукта, внесенные вызовами API, отобразятся в базе данных Покупок, может пройти до нескольких часов.

Предварительные условия

Если у вас нет источника данных, создайте его с помощью API источников данных Merchant или Merchant Center.

Если у вас уже есть источник данных, который вы создали с помощью пользовательского интерфейса Merchant Center или API, вы можете использовать API Merchant Products API для добавления своих продуктов. Если вы используете Content API for Shopping для добавления продуктов, обратитесь к руководству по миграции, чтобы понять, как начать работу с API Merchant Products API.

Вы несете ответственность за соблюдение правил в отношении товарной рекламы и размещения бесплатных объявлений . Товарная реклама оставляет за собой право обеспечивать соблюдение этих политик и реагировать соответствующим образом, если мы обнаружим контент или поведение, нарушающее эти политики.

Ресурсы

Ресурс products позволяет получать информацию о продуктах из базы данных покупок .

Ресурс productInput представляет входные данные, которые вы отправляете для продукта. Он также предоставляет методы, позволяющие обновлять или удалять информацию о продукте по одному или сразу по нескольким в пакетном режиме . Ресурс productInput должен иметь следующие поля:

  • channel : канал продукта.
  • offerId : уникальный идентификатор продукта.
  • contentLanguage : двухбуквенный код языка ISO 639-1 для продукта.
  • feedLabel : метка, которая позволяет классифицировать и идентифицировать ваши продукты. Максимально допустимое количество символов — 20. Поддерживаемые символы — AZ , 0-9 , дефис и подчеркивание. Ярлык фида не должен содержать пробелов. Дополнительную информацию см. в разделе Использование ярлыков фидов .

Загрузите информацию о продукте в свой аккаунт

Чтобы загрузить данные о продукте в свою учетную запись, используйте метод accounts.productInputs.insert . Необходимо передать уникальный идентификатор основного или дополнительного источника данных .

В следующем образце запроса показано, как вы можете использовать метод accounts.productInputs.insert для загрузки входных данных о продукте в свой торговый аккаунт. В запросе задаются цена доставки и регион, а также пользовательские атрибуты, такие как дата изготовления и размер.

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"
    }
  ]
}

Замените следующее:

  • {ACCOUNT_ID} : уникальный идентификатор вашего аккаунта Merchant Center.
  • {DATASOURCE} : уникальный идентификатор источника данных. Он должен быть в accounts/ {ACCOUNT_ID} /dataSources/ {DATASOURCE_ID} .
  • {PRODUCT_TITLE} : название продукта.
  • {VERSION_NUMBER} : номер версии продукта. Необязательный.
  • {CONTENT_LANGUAGE} : двухбуквенный код языка продукта по стандарту ISO 639-1 . Необходимый.
  • {FEED_LABEL} : ярлык, позволяющий классифицировать и идентифицировать ваши продукты. Максимально допустимое количество символов — 20. Поддерживаемые символы — AZ , 0-9 , дефис и подчеркивание. Ярлык фида не должен содержать пробелов.
  • {OFFER_ID} : уникальный идентификатор продукта. Необходимый.
  • {IMAGE_LINK} : ссылка на изображение продукта на вашем веб-сайте. Необязательный.
  • {PRODUCT_LINK} : ссылка на продукт на вашем веб-сайте. Необязательный.
  • {CURRENCY_CODE} : валюта цены с использованием трехбуквенных сокращений в соответствии со стандартом ISO 4217 . Необязательный.
  • {PRICE} : цена продукта, представленная числом в микронах. Необязательный.
  • {SHIPPING_COST} : фиксированная цена доставки, представленная в виде числа. Необязательный.
  • {SHIPPING_POSTALCODE} : диапазон почтовых индексов, к которому применяется стоимость доставки. Необязательный.
  • {MAX_HANDLING_TIME} : максимальное время обработки в рабочих днях между получением заказа и его отправкой. Необязательный.
  • {MIN_HANDLING_TIME} : минимальное время обработки в рабочих днях между получением заказа и его отправкой. Значение 0 означает, что заказ доставляется в тот же день, когда он был получен. Необязательный.
  • {MAX_TRANSIT_TIME} : максимальное время доставки в рабочих днях между отправкой заказа и доставкой. Необязательный.
  • {MIN_TRANSIT_TIME} : минимальное время доставки в рабочих днях между отправкой заказа и доставкой. Значение 0 означает, что заказ доставляется в тот же день, когда он был отправлен. Необязательный.

Если запрос выполнен успешно, вы увидите следующий ответ:

{
  "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"
    }
  ]
}

Чтобы добавить продукт в свой аккаунт Merchant Center, вы можете использовать метод google.shopping.merchant.accounts.v1beta.InsertProductInputSample , как показано в следующем примере.

Ява

  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")
              .setGtin(0, "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);
    }
  }

Получите обработанный продукт из своей учетной записи

Чтобы получить обработанный продукт из вашей учетной записи, используйте метод accounts.products.get . После вставки обработанный продукт может появиться через несколько минут.

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

Замените {PRODUCT_NAME} на имя входного ресурса продукта, который вы хотите удалить. Например, online~en~US~sku123 .

Вы можете получить имя ресурса обработанного продукта из поля product в ответе accounts.productInputs.insert .

Чтобы получить один продукт для определенного аккаунта Merchant Center, вы можете использовать метод google.shopping.merchant.accounts.v1beta.GetProductRequest , как показано в следующем примере.

Ява

  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);
    }
  }

Удалить информацию о продукте из своей учетной записи

Чтобы удалить ввод продукта из вашей учетной записи, используйте метод accounts.productInputs.delete . Для удаления продукта с помощью API продуктов Merchant необходимо передать уникальный идентификатор основного или дополнительного источника данных, которому принадлежит продукт.

Следующий запрос показывает, как можно использовать метод accounts.productInputs.delete для удаления ввода продукта:

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

Замените {PRODUCT_NAME} на имя входного ресурса продукта, который вы хотите удалить. Например, online~en~US~sku123 .

Чтобы удалить продукт для определенного аккаунта Merchant Center, вы можете использовать метод google.shopping.merchant.accounts.v1beta.DeleteProductInputRequest , как показано в следующем примере.

Ява

  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);
    }
  }

Перечислите продукты из вашего аккаунта

Чтобы перечислить обработанные продукты в вашей учетной записи, используйте метод accounts.products.list , как показано в следующем запросе.

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

Чтобы разместить продукт для определенного аккаунта Merchant Center, вы можете использовать метод google.shopping.merchant.accounts.v1beta.ListProductsRequest , как показано в следующем примере.

Ява

  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}
      ListProductsRequest request = ListProductsRequest.newBuilder().setParent(parent).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);
    }
  }