/resources/shopping_product.proto

--- v22/resources/shopping_product.proto    2026-01-23 15:31:38.000000000 +0000
+++ v23/resources/shopping_product.proto    2026-01-22 20:49:25.000000000 +0000
@@ -1,307 +1,311 @@
 // Copyright 2026 Google LLC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
 // You may obtain a copy of the License at
 //
 //     http://www.apache.org/licenses/LICENSE-2.0
 //
 // Unless required by applicable law or agreed to in writing, software
 // distributed under the License is distributed on an "AS IS" BASIS,
 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 // See the License for the specific language governing permissions and
 // limitations under the License.

 syntax = "proto3";

-package google.ads.googleads.v22.resources;
+package google.ads.googleads.v23.resources;

-import "google/ads/googleads/v22/enums/product_availability.proto";
-import "google/ads/googleads/v22/enums/product_channel.proto";
-import "google/ads/googleads/v22/enums/product_channel_exclusivity.proto";
-import "google/ads/googleads/v22/enums/product_condition.proto";
-import "google/ads/googleads/v22/enums/product_issue_severity.proto";
-import "google/ads/googleads/v22/enums/product_status.proto";
+import "google/ads/googleads/v23/enums/product_availability.proto";
+import "google/ads/googleads/v23/enums/product_channel.proto";
+import "google/ads/googleads/v23/enums/product_channel_exclusivity.proto";
+import "google/ads/googleads/v23/enums/product_condition.proto";
+import "google/ads/googleads/v23/enums/product_issue_severity.proto";
+import "google/ads/googleads/v23/enums/product_status.proto";
 import "google/api/field_behavior.proto";
 import "google/api/resource.proto";

-option csharp_namespace = "Google.Ads.GoogleAds.V22.Resources";
-option go_package = "google.golang.org/genproto/googleapis/ads/googleads/v22/resources;resources";
+option csharp_namespace = "Google.Ads.GoogleAds.V23.Resources";
+option go_package = "google.golang.org/genproto/googleapis/ads/googleads/v23/resources;resources";
 option java_multiple_files = true;
 option java_outer_classname = "ShoppingProductProto";
-option java_package = "com.google.ads.googleads.v22.resources";
+option java_package = "com.google.ads.googleads.v23.resources";
 option objc_class_prefix = "GAA";
-option php_namespace = "Google\\Ads\\GoogleAds\\V22\\Resources";
-option ruby_package = "Google::Ads::GoogleAds::V22::Resources";
+option php_namespace = "Google\\Ads\\GoogleAds\\V23\\Resources";
+option ruby_package = "Google::Ads::GoogleAds::V23::Resources";

 // Proto file describing the ShoppingProduct resource.

 // A shopping product from Google Merchant Center that can be advertised by
 // campaigns.
 //
 // The resource returns currently existing products from Google Merchant Center
 // accounts linked with the customer. A campaign includes a product by
 // specifying its merchant id (or, if available, the Multi Client Account id of
 // the merchant) in the `ShoppingSetting`, and can limit the inclusion to
 // products having a specified feed label. Standard Shopping campaigns can also
 // limit the inclusion through a `campaign_criterion.listing_scope`.
 //
 // Queries to this resource specify a scope:
 // Account:
 //   - Filters on campaigns or ad groups are not specified.
 //   - All products from the linked Google Merchant Center accounts are
 //     returned.
 //   - Metrics and some fields (see the per-field documentation) are aggregated
 //     across all Shopping and Performance Max campaigns that include a product.
 // Campaign:
 //   - An equality filter on `campaign` is specified. Supported campaign types
 //     are Shopping, Performance Max, Demand Gen, Video.
 //   - Only products that are included by the specified campaign are returned.
 //   - Metrics and some fields (see the per-field documentation) are restricted
 //     to the specified campaign.
 //   - Only the following metrics are supported for Demand Gen and Video
 //     campaigns: impressions, clicks, ctr.
 // Ad group:
 //   - An equality filter on `ad group` and `campaign` is specified. Supported
 //     campaign types are Shopping, Demand Gen, Video.
 //   - Only products that are included by the specified campaign are returned.
 //   - Metrics and some fields (see the per-field documentation) are restricted
 //     to the specified ad group.
 //   - Only the following metrics are supported for Demand Gen and Video
 //     campaigns: impressions, clicks, ctr.
 // Note that segmentation by date segments is not permitted and will return
 // UNSUPPORTED_DATE_SEGMENTATION error. On the other hand, filtering on date
 // segments is allowed.
 message ShoppingProduct {
   option (google.api.resource) = {
     type: "googleads.googleapis.com/ShoppingProduct"
     pattern: "customers/{customer_id}/shoppingProducts/{merchant_center_id}~{channel}~{language_code}~{feed_label}~{item_id}"
     plural: "shoppingProducts"
     singular: "shoppingProduct"
   };

   // An issue affecting whether a product can show in ads.
   message ProductIssue {
     // Output only. The error code that identifies the issue.
     string error_code = 1 [(google.api.field_behavior) = OUTPUT_ONLY];

     // Output only. The severity of the issue in Google Ads.
-    google.ads.googleads.v22.enums.ProductIssueSeverityEnum.ProductIssueSeverity
+    google.ads.googleads.v23.enums.ProductIssueSeverityEnum.ProductIssueSeverity
         ads_severity = 2 [(google.api.field_behavior) = OUTPUT_ONLY];

     // Output only. The name of the product's attribute, if any, that triggered
     // the issue.
     optional string attribute_name = 3
         [(google.api.field_behavior) = OUTPUT_ONLY];

     // Output only. The short description of the issue in English.
     string description = 4 [(google.api.field_behavior) = OUTPUT_ONLY];

     // Output only. The detailed description of the issue in English.
     string detail = 5 [(google.api.field_behavior) = OUTPUT_ONLY];

     // Output only. The URL of the Help Center article for the issue.
     string documentation = 6 [(google.api.field_behavior) = OUTPUT_ONLY];

     // Output only. List of upper-case two-letter ISO 3166-1 codes of the
     // regions affected by the issue. If empty, all regions are affected.
     repeated string affected_regions = 7
         [(google.api.field_behavior) = OUTPUT_ONLY];
   }

   // Output only. The resource name of the shopping product.
   // Shopping product resource names have the form:
   //
   // `customers/{customer_id}/shoppingProducts/{merchant_center_id}~{channel}~{language_code}~{feed_label}~{item_id}`
   string resource_name = 1 [
     (google.api.field_behavior) = OUTPUT_ONLY,
     (google.api.resource_reference) = {
       type: "googleads.googleapis.com/ShoppingProduct"
     }
   ];

   // Output only. The id of the merchant that owns the product.
   int64 merchant_center_id = 2 [(google.api.field_behavior) = OUTPUT_ONLY];

   // Output only. The product channel describing the locality of the product.
-  google.ads.googleads.v22.enums.ProductChannelEnum.ProductChannel channel = 3
+  google.ads.googleads.v23.enums.ProductChannelEnum.ProductChannel channel = 3
       [(google.api.field_behavior) = OUTPUT_ONLY];

   // Output only. The language code as provided by the merchant, in BCP 47
   // format.
   string language_code = 4 [(google.api.field_behavior) = OUTPUT_ONLY];

   // Output only. The product feed label as provided by the merchant.
   string feed_label = 5 [(google.api.field_behavior) = OUTPUT_ONLY];

   // Output only. The item id of the product as provided by the merchant.
   string item_id = 6 [(google.api.field_behavior) = OUTPUT_ONLY];

   // Output only. The id of the Multi Client Account of the merchant, if
   // present.
   optional int64 multi_client_account_id = 7
       [(google.api.field_behavior) = OUTPUT_ONLY];

   // Output only. The title of the product as provided by the merchant.
   optional string title = 8 [(google.api.field_behavior) = OUTPUT_ONLY];

   // Output only. The brand of the product as provided by the merchant.
   optional string brand = 9 [(google.api.field_behavior) = OUTPUT_ONLY];

+  // Output only. The URI of the product image as provided by the merchant.
+  optional string product_image_uri = 36
+      [(google.api.field_behavior) = OUTPUT_ONLY];
+
   // Output only. The price of the product in micros as provided by the
   // merchant, in the currency specified in `currency_code` (e.g. $2.97 is
   // reported as 2970000).
   optional int64 price_micros = 10 [(google.api.field_behavior) = OUTPUT_ONLY];

   // Output only. The currency code as provided by the merchant, in ISO 4217
   // format.
   optional string currency_code = 11
       [(google.api.field_behavior) = OUTPUT_ONLY];

   // Output only. The channel exclusivity of the product as provided by the
   // merchant.
-  optional google.ads.googleads.v22.enums.ProductChannelExclusivityEnum
+  optional google.ads.googleads.v23.enums.ProductChannelExclusivityEnum
       .ProductChannelExclusivity channel_exclusivity = 12
       [(google.api.field_behavior) = OUTPUT_ONLY];

   // Output only. The condition of the product as provided by the merchant.
-  optional google.ads.googleads.v22.enums.ProductConditionEnum.ProductCondition
+  optional google.ads.googleads.v23.enums.ProductConditionEnum.ProductCondition
       condition = 13 [(google.api.field_behavior) = OUTPUT_ONLY];

   // Output only. The availability of the product as provided by the merchant.
   optional
-      google.ads.googleads.v22.enums.ProductAvailabilityEnum.ProductAvailability
+      google.ads.googleads.v23.enums.ProductAvailabilityEnum.ProductAvailability
           availability = 14 [(google.api.field_behavior) = OUTPUT_ONLY];

   // Output only. Upper-case two-letter ISO 3166-1 code of the regions where the
   // product is intended to be shown in ads.
   repeated string target_countries = 15
       [(google.api.field_behavior) = OUTPUT_ONLY];

   // Output only. The custom attribute 0 of the product as provided by the
   // merchant.
   optional string custom_attribute0 = 16
       [(google.api.field_behavior) = OUTPUT_ONLY];

   // Output only. The custom attribute 1 of the product as provided by the
   // merchant.
   optional string custom_attribute1 = 17
       [(google.api.field_behavior) = OUTPUT_ONLY];

   // Output only. The custom attribute 2 of the product as provided by the
   // merchant.
   optional string custom_attribute2 = 18
       [(google.api.field_behavior) = OUTPUT_ONLY];

   // Output only. The custom attribute 3 of the product as provided by the
   // merchant.
   optional string custom_attribute3 = 19
       [(google.api.field_behavior) = OUTPUT_ONLY];

   // Output only. The custom attribute 4 of the product as provided by the
   // merchant.
   optional string custom_attribute4 = 20
       [(google.api.field_behavior) = OUTPUT_ONLY];

   // Output only. The category level 1 of the product.
   optional string category_level1 = 21 [
     (google.api.field_behavior) = OUTPUT_ONLY,
     (google.api.resource_reference) = {
       type: "googleads.googleapis.com/ProductCategoryConstant"
     }
   ];

   // Output only. The category level 2 of the product.
   optional string category_level2 = 22 [
     (google.api.field_behavior) = OUTPUT_ONLY,
     (google.api.resource_reference) = {
       type: "googleads.googleapis.com/ProductCategoryConstant"
     }
   ];

   // Output only. The category level 3 of the product.
   optional string category_level3 = 23 [
     (google.api.field_behavior) = OUTPUT_ONLY,
     (google.api.resource_reference) = {
       type: "googleads.googleapis.com/ProductCategoryConstant"
     }
   ];

   // Output only. The category level 4 of the product.
   optional string category_level4 = 24 [
     (google.api.field_behavior) = OUTPUT_ONLY,
     (google.api.resource_reference) = {
       type: "googleads.googleapis.com/ProductCategoryConstant"
     }
   ];

   // Output only. The category level 5 of the product.
   optional string category_level5 = 25 [
     (google.api.field_behavior) = OUTPUT_ONLY,
     (google.api.resource_reference) = {
       type: "googleads.googleapis.com/ProductCategoryConstant"
     }
   ];

   // Output only. The product type level 1 as provided by the merchant.
   optional string product_type_level1 = 26
       [(google.api.field_behavior) = OUTPUT_ONLY];

   // Output only. The product type level 2 as provided by the merchant.
   optional string product_type_level2 = 27
       [(google.api.field_behavior) = OUTPUT_ONLY];

   // Output only. The product type level 3 as provided by the merchant.
   optional string product_type_level3 = 28
       [(google.api.field_behavior) = OUTPUT_ONLY];

   // Output only. The product type level 4 as provided by the merchant.
   optional string product_type_level4 = 29
       [(google.api.field_behavior) = OUTPUT_ONLY];

   // Output only. The product type level 5 as provided by the merchant.
   optional string product_type_level5 = 30
       [(google.api.field_behavior) = OUTPUT_ONLY];

   // Output only. The effective maximum cost-per-click (effective max. CPC) of
   // the product. This field is available only if the query specifies the
   // campaign or ad group scope, and if the campaign uses manual bidding. The
   // value is the highest bid set for the product in product groups across all
   // enabled ad groups. It represents the most you're willing to pay for a click
   // on the product. This field can take up to 24 hours to update.
   optional int64 effective_max_cpc_micros = 31
       [(google.api.field_behavior) = OUTPUT_ONLY];

   // Output only. The status that indicates whether the product can show in ads.
   // The value of this field is restricted to the scope specified in the query,
   // see the documentation of the resource.
   // This field can take up to 24 hours to update.
-  google.ads.googleads.v22.enums.ProductStatusEnum.ProductStatus status = 32
+  google.ads.googleads.v23.enums.ProductStatusEnum.ProductStatus status = 32
       [(google.api.field_behavior) = OUTPUT_ONLY];

   // Output only. The list of issues affecting whether the product can show in
   // ads. The value of this field is restricted to the scope specified in the
   // query, see the documentation of the resource. This field can take up to 24
   // hours to update.
   repeated ProductIssue issues = 33 [(google.api.field_behavior) = OUTPUT_ONLY];

   // Output only. A campaign that includes the product.
   // This field is selectable only in the campaign scope, which requires an
   // equality filter on `campaign`.
   optional string campaign = 34 [
     (google.api.field_behavior) = OUTPUT_ONLY,
     (google.api.resource_reference) = {
       type: "googleads.googleapis.com/Campaign"
     }
   ];

   // Output only. An ad group of a campaign that includes the product.
   // This field is selectable only in the ad group scope, which requires an
   // equality filter on `campaign` and `ad_group`.
   optional string ad_group = 35 [
     (google.api.field_behavior) = OUTPUT_ONLY,
     (google.api.resource_reference) = {
       type: "googleads.googleapis.com/AdGroup"
     }
   ];
 }