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-onlyProduct
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 theProduct
resource within theproductStatus
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 onProductInput
resource instead of processedProduct
resource.Choose your data source for cleaner data management: All
productInputs
write operations now require adataSource
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 theid
field. The format isaccounts/{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. |