Merchant API v1beta was discontinued and shut down on February 28, 2026. For steps to transition to the latest stable version, seeMigrate from v1beta to v1.
List your products data and product issuesStay organized with collectionsSave and categorize content based on your preferences.
After you've added products to your Merchant Center account, you can
retrieve their final, processed state, including their current status and any
data quality issues. This lets you to monitor your product inventory, diagnose
problems, and verify your products are eligible to appear on Google.
This guide explains how to list your products and their associated issues using
theProductsandReportssub-APIs.
Prerequisites
You must have products in your Merchant Center account. To learn how to add
products, see theAdd and manage productsguide.
Special considerations
Processing delay:There is a delay, typically a few minutes, between
when you aproductInputis inserted or updated and when the changes are
reflected in the final processedproductas returned by the product's
retrieval methods.
Products with no destinations:Products that do not have any intended
destinations are automatically removed after approximately one week. A
product does not have any intended destinations if thedestinationStatuseslist within itsproductStatusfield is empty. You should regularly check
this status to avoid unintended product deletions.
List all processed products
To get a list of all your final, processed products, use theproducts.listmethod. This method returns theProductresource, which represents the product
as it appears in Merchant Center after all rules and data source merges have
been applied.
The response is paginated. Use thepageSizeparameter to specify the number of
products to return on each page and thepageTokenfrom the response to
retrieve subsequent pages.
GET https://merchantapi.googleapis.com/products/v1/accounts/{ACCOUNT_ID}/products?pageSize=2
A successful call returns a paginated list ofProductresources.
{"products":[{"name":"accounts/{ACCOUNT_ID}/products/en~US~SKU12345","offerId":"SKU12345","contentLanguage":"en","feedLabel":"US","dataSource":"accounts/{ACCOUNT_ID}/dataSources/12345","productAttributes":{"title":"Classic Cotton T-Shirt","price":{"amountMicros":"15990000","currencyCode":"USD"}},"productStatus":{"destinationStatuses":[{"reportingContext":"SHOPPING_ADS","approvedCountries":["US"]}]}},{"name":"accounts/{ACCOUNT_ID}/products/en~US~SKU67890","offerId":"SKU67890","contentLanguage":"en","feedLabel":"US","dataSource":"accounts/{ACCOUNT_ID}/dataSources/{DATASOURCE_ID}","productAttributes":{"title":"Modern Linen Trousers","price":{"amountMicros":"49990000","currencyCode":"USD"},"gtins":["123456789012"]},"productStatus":{"destinationStatuses":[{"reportingContext":"SHOPPING_ADS","disapprovedCountries":["US"]}],"itemLevelIssues":[{"code":"invalid_gtin","severity":"DISAPPROVED","resolution":"merchant_action","attribute":"gtins","reportingContext":"SHOPPING_ADS","description":"Invalid GTIN","detail":"The value provided for the gtin attribute is not a valid GTIN.","documentation":"https://support.google.com/merchants/answer/6324461","applicableCountries":["US"]}]}}],"nextPageToken":"CiAKGjZhY2NvdW50cy8xMjM0NS9wcm9kdWN0cy9vbmxpbmV"}
The following code samples show how to list all products.
fromexamples.authenticationimportconfigurationfromexamples.authenticationimportgenerate_user_credentialsfromgoogle.shoppingimportmerchant_products_v1_ACCOUNT=configuration.Configuration().read_merchant_info()_PARENT=f"accounts/{_ACCOUNT}"deflist_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)forproductinresponse:print(product)print("List request successful!")exceptRuntimeErrorase:print("List request failed")print(e)if__name__=="__main__":list_products()
Aggregated product statuses: UseaggregateProductStatuses.listto get a high-level overview of your product data health, including a
summary of your products by status and the most common issue types. SeeView product statistics and
issuesfor more information.
Render account and product issues for UI: Userenderaccountissueandrenderproductissueto get a detailed, human-readable description and documentation link for a
specific issue. Use this method to generate UI showing product and account
issues to the end user. SeeDisplay issues and solutions to
businessesfor more
information.
List account issues: Useaccountissues.listto check for problems that affect your entire Merchant Center account,
such as policy violations.
Check the status of a product using theproductStatus
To check the status of a product, examine theproductStatusfield within theProductresource returned byproducts.listorproducts.get. This field
contains the aggregated status information for the product across all its
destinations. It also contains issues related to inventories (local and
regional) attached to given product.
TheproductStatusfield includes:
destinationStatuses: An array indicating the approval status of the
product for each destination (likeSHOPPING_ADS). It lists the countries
where the product is approved, pending, or disapproved.
itemLevelIssues: An array containing any data validation or policy
issues found for the product. Each issue includes a description, severity,
the affected attribute, and documentation to help you resolve it.
Here is an example of aproductStatusfor a product that is disapproved for
Shopping ads in the US due to an invalid GTIN:
{"productStatus":{"destinationStatuses":[{"reportingContext":"SHOPPING_ADS","disapprovedCountries":["US"]}],"itemLevelIssues":[{"code":"invalid_gtin","severity":"DISAPPROVED","resolution":"merchant_action","attribute":"gtins","reportingContext":"SHOPPING_ADS","description":"Invalid GTIN","detail":"The value provided for the gtin attribute is not a valid GTIN.","documentation":"https://support.google.com/merchants/answer/6324461","applicableCountries":["US"]}]}}
Filter products
You can filter products efficiently by using thereports.searchmethod from the Reports sub-API instead of listing all products and
filtering them on your side.
For example, to retrieve a list of only your disapproved products, you can build
areports.searchquery on theProductViewtable to select products where theaggregated_reporting_context_statusisNOT_ELIGIBLE_OR_DISAPPROVED. You can also filter by other attributes, for
exampleavailabilityorlanguage_code. For more information on creating the
filtering capabilities, see theFilter productsguide section.
POST https://merchantapi.googleapis.com/reports/v1/accounts/{ACCOUNT_ID}/reports:search
{"query":"SELECT offer_id, id, title FROM product_view WHERE aggregated_reporting_context_status = 'NOT_ELIGIBLE_OR_DISAPPROVED'"}
The following code samples show how to filter for disapproved products.
fromexamples.authenticationimportconfigurationfromexamples.authenticationimportgenerate_user_credentialsfromgoogle.shopping.merchant_products_v1importGetProductRequestfromgoogle.shopping.merchant_products_v1importProductsServiceClientfromgoogle.shopping.merchant_reports_v1importReportServiceClientfromgoogle.shopping.merchant_reports_v1importSearchRequest# Read the merchant account ID from the configuration file.# This is a global variable used by the functions below._ACCOUNT_ID=configuration.Configuration().read_merchant_info()defget_product(credentials,product_name:str):"""Gets the product details for a given product name.Args:credentials: The OAuth2 credentials.product_name: The full resource name of the product, e.g.,"accounts/{account}/products/{product}"."""# Create a Products API client.products_service_client=ProductsServiceClient(credentials=credentials)# Prepare the GetProduct request.# The name has the format: accounts/{account}/products/{productId}request=GetProductRequest(name=product_name)# Call the API and print the response or any errors.try:response=products_service_client.get_product(request=request)print(response)exceptRuntimeErrorase:print(f"Failed to get product{product_name}:")print(e)deffilter_disapproved_products():"""Filters disapproved products and prints their details."""# Get OAuth2 credentials.credentials=generate_user_credentials.main()# Create a Report API client.report_service_client=ReportServiceClient(credentials=credentials)# Construct the parent resource name for the account.# The parent has the format: accounts/{accountId}parent=f"accounts/{_ACCOUNT_ID}"# Define the query to select disapproved products.# This query retrieves product information for all disapproved products.# aggregated_reporting_context_status can be one of the following values:# NOT_ELIGIBLE_OR_DISAPPROVED, ELIGIBLE, PENDING, ELIGIBLE_LIMITED,# AGGREGATED_REPORTING_CONTEXT_STATUS_UNSPECIFIEDquery=("SELECT offer_id, id, title, price ""FROM product_view ""WHERE aggregated_reporting_context_status =""'NOT_ELIGIBLE_OR_DISAPPROVED'")# Create the search report request.request=SearchRequest(parent=parent,query=query)print("Sending search report request for Product View.")try:# Call the Reports.search API method.response=report_service_client.search(request=request)print("Received search reports response: ")# Iterate over all report rows.# The client library automatically handles pagination.forrowinresponse:print("Printing data from Product View:")print(row)# Construct the full product resource name using the product_view.id# (which is the REST ID like "en~GB~123") from the report.# The product_view.id from the report is the {product_id} part.product_name=(f"accounts/{_ACCOUNT_ID}/products/{row.product_view.id}")# OPTIONAL, get full product details by calling the GetProduct method.print("Getting full product details by calling GetProduct method:")get_product(credentials,product_name)exceptRuntimeErrorase:print(e)if__name__=="__main__":filter_disapproved_products()
/***DemonstrateshowtofilterdisapprovedproductsusingtheMerchantAPIReportsservice.*/functionfilterDisapprovedProducts(){//IMPORTANT://EnabletheMerchantAPIReportssub-APIAdvancedServiceandcallit//"MerchantApiReports"//EnabletheMerchantAPIProductssub-APIAdvancedServiceandcallit//"MerchantApiProducts"//ReplacethiswithyourMerchantCenterID.constaccountId='<INSERT_MERCHANT_CENTER_ID>';//Constructtheparentnameconstparent='accounts/'+accountId;try{console.log('Sending search Report request');//SetpageSizetothemaximumvalue(default:1000)constpageSize=1000;letpageToken;//ThequerybelowisanexampleofaqueryfortheproductViewthatgetsproductinformations//foralldisapprovedproducts.constquery='SELECT offer_id,'+'id,'+'price,'+'title'+' FROM product_view'+' WHERE aggregated_reporting_context_status = "NOT_ELIGIBLE_OR_DISAPPROVED"';//CalltheReports.searchAPImethod.UsethepageTokentoiteratethrough//allpagesofresults.do{constresponse=MerchantApiReports.Accounts.Reports.search({query,pageSize,pageToken},parent);for(constreportRowofresponse.results){console.log('Printing data from Product View:');console.log(reportRow);//OPTIONALLY,youcangetthefullproductdetailsbycallingtheGetProductmethod.constproductName=parent+'/products/'+reportRow.getProductView().getId();constproduct=MerchantApiProducts.Accounts.Products.get(productName);console.log(product);}pageToken=response.nextPageToken;}while(pageToken);//Exitswhenthereisnonextpagetoken.}catch(e){console.log('ERROR!');console.log('Error message:'+e.message);}}
[[["Easy to understand","easyToUnderstand","thumb-up"],["Solved my problem","solvedMyProblem","thumb-up"],["Other","otherUp","thumb-up"]],[["Missing the information I need","missingTheInformationINeed","thumb-down"],["Too complicated / too many steps","tooComplicatedTooManySteps","thumb-down"],["Out of date","outOfDate","thumb-down"],["Samples / code issue","samplesCodeIssue","thumb-down"],["Other","otherDown","thumb-down"]],["Last updated 2026-06-09 UTC."],[],[]]