Migrate products

Merchant API introduces a more robust and intuitive way to manage your product data. The main change is the separation of product data into two distinct resources: ProductInput for submitting your data and Product for viewing the final, processed version including product status and issues. This new structure provides a more predictable and transparent experience.

This guide walks you through the key differences to help you migrate your integration from the Content API for Shopping. For a detailed guide on using the new features, see Manage your products.

Key differences

Here are the most significant changes to how you manage products in Merchant API compared to Content API for Shopping:

  • Dedicated resources for input and processed data: Merchant API splits product management into two resources. You can use the ProductInput resource to insert, update, and delete your product data. You can use the read-only Product resource to view the final product after Google processes your inputs, applies rules, and combines data from supplemental sources.

  • Integrated product status: The productstatuses service is removed. Product validation issues and destination statuses are now directly included in the Product resource within the productStatus field, simplifying data retrieval.

  • Predictable product updates: The new productInputs.patch method modifies a specific product input directly. This is a significant improvement over the Content API for Shopping, where updates could be unexpectedly overwritten by other feed uploads. In Merchant API, an update remains until that specific product input is updated again or deleted. Product updates are applied on ProductInput resource instead of processed Product resource.

  • Choose your data source for cleaner data management: All productInputs write operations now require a dataSource query parameter, making it explicit which data source you are modifying. This is especially useful if you have multiple sources providing data.

  • New resource identifiers: Products are now identified by a RESTful resource name instead of the id field. The format is accounts/{account}/products/{product}.

  • No custom batches: The custombatch method is no longer available. You can use asynchronous requests or HTTP batching to send multiple requests in a single HTTP call.

  • Data sources for any feed label and language: Merchant API makes it possible to create data source without specifying feed label and language and therefore allows inserting product with any feed label and language.

Requests

This section compares the request formats for Content API for Shopping and Merchant API.

Request description Content API for Shopping Merchant API
Get a product GET https://shoppingcontent.googleapis.com/content/v2.1/{merchantId}/products/{productId} GET https://merchantapi.googleapis.com/products/v1/accounts/{account}/products/{product}
List products GET https://shoppingcontent.googleapis.com/content/v2.1/{merchantId}/products GET https://merchantapi.googleapis.com/products/v1/accounts/{account}/products
Insert a product POST https://shoppingcontent.googleapis.com/content/v2.1/{merchantId}/products POST https://merchantapi.googleapis.com/products/v1/accounts/{account}/productInputs:insert
Update a product PATCH https://shoppingcontent.googleapis.com/content/v2.1/{merchantId}/products/{productId} PATCH https://merchantapi.googleapis.com/products/v1/accounts/{account}/productInputs/{productinput}
Delete a product DELETE https://shoppingcontent.googleapis.com/content/v2.1/{merchantId}/products/{productId} DELETE https://merchantapi.googleapis.com/products/v1/accounts/{account}/productInputs/{productinput}
Get product status GET https://shoppingcontent.googleapis.com/content/v2.1/{merchantId}/productstatuses/{productId} GET https://merchantapi.googleapis.com/products/v1/accounts/{account}/products/{product}
List product statuses GET https://shoppingcontent.googleapis.com/content/v2.1/{merchantId}/productstatuses GET https://merchantapi.googleapis.com/products/v1/accounts/{account}/products
Batch multiple requests POST https://shoppingcontent.googleapis.com/content/v2.1/products/custombatch Asynchronous requests, HTTP batching

Identifiers

The format for product identifiers has changed in Merchant API to a standard REST resource name.

Identifier description Content API for Shopping Merchant API
Product ID A string composed of segments separated by a colon (:).
Format: channel:contentLanguage:targetCountry:offerId or channel:contentLanguage:feedLabel:offerId.
Example: online:en:US:sku123
A REST resource name string.
Format: accounts/{account}/products/{product} where {product} is contentLanguage~feedLabel~offerId.
Example: accounts/12345/products/en~US~sku123

Methods

This table shows the Content API for Shopping methods and their equivalents in Merchant API.

Content API for Shopping method Merchant API method Availability & notes
products.get products.get Retrieves the final, processed product.
products.list products.list Lists final, processed products.
products.insert productInputs.insert Inserts a product input. Requires a dataSource.
products.update productInputs.update The behavior is significantly different. It updates a specific product input and is persistent.
products.delete productInputs.delete Deletes a specific product input. Requires a dataSource.
products.custombatch Not available Use asynchronous requests or HTTP batching.
productstatuses.get products.get The productstatuses service is removed. Status information is now part of the Product resource.
productstatuses.list products.list The productstatuses service is removed. Status information is now part of the Product resource.
productstatuses.custombatch Not available Use [asynchronous

requests](/merchant/api/samples/insert-product-input-async) or HTTP batching. |

Detailed field changes

This table highlights important fields that have been changed, added, or removed in the Merchant API.

Content API for Shopping Merchant API Description
id name The primary identifier for a product is now the REST resource name.
Top-level product data specification attributes (e.g., title, price, link) productAttributes object Product attributes like title, price, and link are no longer top-level fields. They are now grouped within the productAttributes object in both the Product and ProductInput resources. This provides a cleaner and more organized resource structure.
targetCountry feedLabel The resource name now uses feedLabel instead of targetCountry to align with Merchant Center functionality.
feedId dataSource (query parameter) A dataSource name is now a required query parameter for all productInputs write methods (insert, update, delete).
channel Not available. Use legacy_local for local only products. The channel field is no longer present in Merchant API. Products with LOCAL channel in Content API for Shopping should instead set legacy_local field to true.
Not available versionNumber A new optional field on ProductInput that can be used to prevent out-of-order insertions into primary data sources.
string type fields with defined set of values enum type fields with defined set of values Fields within product attributes with defined set of values (for example excluded_destinations, availability) are now enum type.