/services/audience_insights_service.proto

--- v17/services/audience_insights_service.proto    2024-06-05 23:17:09.000000000 +0000
+++ v17-1/services/audience_insights_service.proto  2024-08-06 12:40:19.000000000 +0000
@@ -1,619 +1,721 @@
 // Copyright 2024 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.v17.services;

 import "google/ads/googleads/v17/common/criteria.proto";
 import "google/ads/googleads/v17/common/dates.proto";
 import "google/ads/googleads/v17/enums/audience_insights_dimension.proto";
 import "google/api/annotations.proto";
 import "google/api/client.proto";
 import "google/api/field_behavior.proto";

 option csharp_namespace = "Google.Ads.GoogleAds.V17.Services";
 option go_package = "google.golang.org/genproto/googleapis/ads/googleads/v17/services;services";
 option java_multiple_files = true;
 option java_outer_classname = "AudienceInsightsServiceProto";
 option java_package = "com.google.ads.googleads.v17.services";
 option objc_class_prefix = "GAA";
 option php_namespace = "Google\\Ads\\GoogleAds\\V17\\Services";
 option ruby_package = "Google::Ads::GoogleAds::V17::Services";

 // Proto file describing the audience insights service.

 // Audience Insights Service helps users find information about groups of
 // people and how they can be reached with Google Ads. Accessible to
 // allowlisted customers only.
 service AudienceInsightsService {
   option (google.api.default_host) = "googleads.googleapis.com";
   option (google.api.oauth_scopes) = "https://www.googleapis.com/auth/adwords";

   // Creates a saved report that can be viewed in the Insights Finder tool.
   //
   // List of thrown errors:
   //   [AuthenticationError]()
   //   [AuthorizationError]()
   //   [FieldError]()
   //   [HeaderError]()
   //   [InternalError]()
   //   [QuotaError]()
   //   [RangeError]()
   //   [RequestError]()
   rpc GenerateInsightsFinderReport(GenerateInsightsFinderReportRequest)
       returns (GenerateInsightsFinderReportResponse) {
     option (google.api.http) = {
       post: "/v17/customers/{customer_id=*}:generateInsightsFinderReport"
       body: "*"
     };
     option (google.api.method_signature) =
         "customer_id,baseline_audience,specific_audience";
   }

   // Searches for audience attributes that can be used to generate insights.
   //
   // List of thrown errors:
   //   [AuthenticationError]()
   //   [AuthorizationError]()
   //   [FieldError]()
   //   [HeaderError]()
   //   [InternalError]()
   //   [QuotaError]()
   //   [RangeError]()
   //   [RequestError]()
   rpc ListAudienceInsightsAttributes(ListAudienceInsightsAttributesRequest)
       returns (ListAudienceInsightsAttributesResponse) {
     option (google.api.http) = {
       post: "/v17/customers/{customer_id=*}:searchAudienceInsightsAttributes"
       body: "*"
     };
     option (google.api.method_signature) = "customer_id,dimensions,query_text";
   }

   // Lists date ranges for which audience insights data can be requested.
   //
   // List of thrown errors:
   //   [AuthenticationError]()
   //   [AuthorizationError]()
   //   [FieldError]()
   //   [HeaderError]()
   //   [InternalError]()
   //   [QuotaError]()
   //   [RangeError]()
   //   [RequestError]()
   rpc ListInsightsEligibleDates(ListInsightsEligibleDatesRequest)
       returns (ListInsightsEligibleDatesResponse) {
     option (google.api.http) = {
       post: "/v17/audienceInsights:listInsightsEligibleDates"
       body: "*"
     };
   }

   // Returns a collection of attributes that are represented in an audience of
   // interest, with metrics that compare each attribute's share of the audience
   // with its share of a baseline audience.
   //
   // List of thrown errors:
   //   [AudienceInsightsError]()
   //   [AuthenticationError]()
   //   [AuthorizationError]()
   //   [FieldError]()
   //   [HeaderError]()
   //   [InternalError]()
   //   [QuotaError]()
   //   [RangeError]()
   //   [RequestError]()
   rpc GenerateAudienceCompositionInsights(
       GenerateAudienceCompositionInsightsRequest)
       returns (GenerateAudienceCompositionInsightsResponse) {
     option (google.api.http) = {
       post: "/v17/customers/{customer_id=*}:generateAudienceCompositionInsights"
       body: "*"
     };
     option (google.api.method_signature) = "customer_id,audience,dimensions";
   }

   // Returns a collection of targeting insights (e.g. targetable audiences) that
   // are relevant to the requested audience.
   //
   // List of thrown errors:
   //   [AudienceInsightsError]()
   //   [AuthenticationError]()
   //   [AuthorizationError]()
   //   [FieldError]()
   //   [HeaderError]()
   //   [InternalError]()
   //   [QuotaError]()
   //   [RangeError]()
   //   [RequestError]()
   rpc GenerateSuggestedTargetingInsights(
       GenerateSuggestedTargetingInsightsRequest)
       returns (GenerateSuggestedTargetingInsightsResponse) {
     option (google.api.http) = {
       post: "/v17/customers/{customer_id=*}:generateSuggestedTargetingInsights"
       body: "*"
     };
     option (google.api.method_signature) = "customer_id,audience";
   }
+
+  // Returns a collection of audience attributes along with estimates of the
+  // overlap between their potential YouTube reach and that of a given input
+  // attribute.
+  //
+  // List of thrown errors:
+  //   [AudienceInsightsError]()
+  //   [AuthenticationError]()
+  //   [AuthorizationError]()
+  //   [FieldError]()
+  //   [HeaderError]()
+  //   [InternalError]()
+  //   [QuotaError]()
+  //   [RangeError]()
+  //   [RequestError]()
+  rpc GenerateAudienceOverlapInsights(GenerateAudienceOverlapInsightsRequest)
+      returns (GenerateAudienceOverlapInsightsResponse) {
+    option (google.api.http) = {
+      post: "/v17/customers/{customer_id=*}:generateAudienceOverlapInsights"
+      body: "*"
+    };
+    option (google.api.method_signature) =
+        "customer_id,country_location,primary_attribute,dimensions";
+  }
 }

 // Request message for
 // [AudienceInsightsService.GenerateInsightsFinderReport][google.ads.googleads.v17.services.AudienceInsightsService.GenerateInsightsFinderReport].
 message GenerateInsightsFinderReportRequest {
   // Required. The ID of the customer.
   string customer_id = 1 [(google.api.field_behavior) = REQUIRED];

   // Required. A baseline audience for this report, typically all people in a
   // region.
   BasicInsightsAudience baseline_audience = 2
       [(google.api.field_behavior) = REQUIRED];

   // Required. The specific audience of interest for this report.  The insights
   // in the report will be based on attributes more prevalent in this audience
   // than in the report's baseline audience.
   BasicInsightsAudience specific_audience = 3
       [(google.api.field_behavior) = REQUIRED];

   // The name of the customer being planned for.  This is a user-defined value.
   string customer_insights_group = 4;
 }

 // The response message for
 // [AudienceInsightsService.GenerateInsightsFinderReport][google.ads.googleads.v17.services.AudienceInsightsService.GenerateInsightsFinderReport],
 // containing the shareable URL for the report.
 message GenerateInsightsFinderReportResponse {
   // An HTTPS URL providing a deep link into the Insights Finder UI with the
   // report inputs filled in according to the request.
   string saved_report_url = 1;
 }

 // Request message for
 // [AudienceInsightsService.GenerateAudienceCompositionInsights][google.ads.googleads.v17.services.AudienceInsightsService.GenerateAudienceCompositionInsights].
 message GenerateAudienceCompositionInsightsRequest {
   // Required. The ID of the customer.
   string customer_id = 1 [(google.api.field_behavior) = REQUIRED];

   // Required. The audience of interest for which insights are being requested.
   InsightsAudience audience = 2 [(google.api.field_behavior) = REQUIRED];

   // The baseline audience to which the audience of interest is being
   // compared.
   InsightsAudience baseline_audience = 6;

   // The one-month range of historical data to use for insights, in the format
   // "yyyy-mm". If unset, insights will be returned for the last thirty days of
   // data.
   string data_month = 3;

   // Required. The audience dimensions for which composition insights should be
   // returned.
   repeated google.ads.googleads.v17.enums.AudienceInsightsDimensionEnum
       .AudienceInsightsDimension dimensions = 4
       [(google.api.field_behavior) = REQUIRED];

   // The name of the customer being planned for.  This is a user-defined value.
   string customer_insights_group = 5;
 }

 // Response message for
 // [AudienceInsightsService.GenerateAudienceCompositionInsights][google.ads.googleads.v17.services.AudienceInsightsService.GenerateAudienceCompositionInsights].
 message GenerateAudienceCompositionInsightsResponse {
   // The contents of the insights report, organized into sections.
   // Each section is associated with one of the AudienceInsightsDimension values
   // in the request. There may be more than one section per dimension.
   repeated AudienceCompositionSection sections = 1;
 }

 // Request message for
 // [AudienceInsightsService.GenerateSuggestedTargetingInsights][google.ads.googleads.v17.services.AudienceInsightsService.GenerateSuggestedTargetingInsights].
 message GenerateSuggestedTargetingInsightsRequest {
   // Required. The ID of the customer.
   string customer_id = 1 [(google.api.field_behavior) = REQUIRED];

   // Required. The audience of interest for which insights are being requested.
   InsightsAudience audience = 2 [(google.api.field_behavior) = REQUIRED];

   // Optional. The baseline audience.  The default, if unspecified, is all
   // people in the same country as the audience of interest.
   InsightsAudience baseline_audience = 3
       [(google.api.field_behavior) = OPTIONAL];

   // Optional. The one-month range of historical data to use for insights, in
   // the format "yyyy-mm". If unset, insights will be returned for the last
   // thirty days of data.
   string data_month = 4 [(google.api.field_behavior) = OPTIONAL];

   // Optional. The name of the customer being planned for.  This is a
   // user-defined value.
   string customer_insights_group = 5 [(google.api.field_behavior) = OPTIONAL];
 }

 // Response message for
 // [AudienceInsightsService.GenerateSuggestedTargetingInsights][google.ads.googleads.v17.services.AudienceInsightsService.GenerateSuggestedTargetingInsights].
 message GenerateSuggestedTargetingInsightsResponse {
   // Suggested insights for targetable audiences.
   repeated TargetingSuggestionMetrics suggestions = 1;
 }

 // A suggested targetable audience relevant to the requested audience.
 message TargetingSuggestionMetrics {
   // Suggested location targeting.  These attributes all have dimension
   // GEO_TARGET_COUNTRY or SUB_COUNTRY_LOCATION
   repeated AudienceInsightsAttributeMetadata locations = 1;

   // Suggested age targeting; may be empty indicating no age targeting.
   repeated google.ads.googleads.v17.common.AgeRangeInfo age_ranges = 2;

   // Suggested gender targeting.  If present, this attribute has dimension
   // GENDER.
   google.ads.googleads.v17.common.GenderInfo gender = 3;

   // Suggested audience segments to target.  These attributes all have dimension
   // AFFINITY_USER_INTEREST or IN_MARKET_USER_INTEREST
   repeated AudienceInsightsAttributeMetadata user_interests = 4;

   // The fraction (from 0 to 1 inclusive) of the requested audience that can be
   // reached using the suggested targeting.
   double coverage = 5;

   // The ratio of coverage to the coverage of the baseline audience or zero if
   // this ratio is undefined or is not meaningful.
   double index = 6;

   // The approximate estimated number of people that can be reached on YouTube
   // using this targeting.
   int64 potential_youtube_reach = 7;
 }

 // Request message for
 // [AudienceInsightsService.ListAudienceInsightsAttributes][google.ads.googleads.v17.services.AudienceInsightsService.ListAudienceInsightsAttributes].
 message ListAudienceInsightsAttributesRequest {
   // Required. The ID of the customer.
   string customer_id = 1 [(google.api.field_behavior) = REQUIRED];

   // Required. The types of attributes to be returned.
   repeated google.ads.googleads.v17.enums.AudienceInsightsDimensionEnum
       .AudienceInsightsDimension dimensions = 2
       [(google.api.field_behavior) = REQUIRED];

   // Required. A free text query.  If the requested dimensions include
   // Attributes CATEGORY or KNOWLEDGE_GRAPH, then the attributes returned for
   // those dimensions will match or be related to this string.  For other
   // dimensions, this field is ignored and all available attributes are
   // returned.
   string query_text = 3 [(google.api.field_behavior) = REQUIRED];

   // The name of the customer being planned for.  This is a user-defined value.
   string customer_insights_group = 4;

   // If SUB_COUNTRY_LOCATION attributes are one of the requested dimensions and
   // this field is present, then the SUB_COUNTRY_LOCATION attributes returned
   // will be located in these countries. If this field is absent, then location
   // attributes are not filtered by country. Setting this field when
   // SUB_COUNTRY_LOCATION attributes are not requested will return an error.
   repeated google.ads.googleads.v17.common.LocationInfo
       location_country_filters = 5;
+
+  // If present, potential YouTube reach estimates within the specified market
+  // will be returned for attributes for which they are available.  Reach is
+  // only available for the AGE_RANGE, GENDER, AFFINITY_USER_INTEREST and
+  // IN_MARKET_USER_INTEREST dimensions, and may not be available for every
+  // attribute of those dimensions in every market.
+  google.ads.googleads.v17.common.LocationInfo youtube_reach_location = 6;
 }

 // Response message for
 // [AudienceInsightsService.ListAudienceInsightsAttributes][google.ads.googleads.v17.services.AudienceInsightsService.ListAudienceInsightsAttributes].
 message ListAudienceInsightsAttributesResponse {
   // The attributes matching the search query.
   repeated AudienceInsightsAttributeMetadata attributes = 1;
 }

 // Request message for
 // [AudienceInsightsService.ListInsightsEligibleDates][google.ads.googleads.v17.services.AudienceInsightsService.ListInsightsEligibleDates].
 message ListInsightsEligibleDatesRequest {}

 // Response message for
 // [AudienceInsightsService.ListInsightsEligibleDates][google.ads.googleads.v17.services.AudienceInsightsService.ListInsightsEligibleDates].
 message ListInsightsEligibleDatesResponse {
   // The months for which AudienceInsights data is currently
   // available, each represented as a string in the form "YYYY-MM".
   repeated string data_months = 1;

   // The actual dates covered by the "last 30 days" date range that will be used
   // implicitly for
   // [AudienceInsightsService.GenerateAudienceCompositionInsights][google.ads.googleads.v17.services.AudienceInsightsService.GenerateAudienceCompositionInsights]
   // requests that have no data_month set.
   google.ads.googleads.v17.common.DateRange last_thirty_days = 2;
 }

+// Request message for
+// [AudienceInsightsService.GenerateAudienceOverlapInsights][google.ads.googleads.v17.services.AudienceInsightsService.GenerateAudienceOverlapInsights].
+message GenerateAudienceOverlapInsightsRequest {
+  // Required. The ID of the customer.
+  string customer_id = 1 [(google.api.field_behavior) = REQUIRED];
+
+  // Required. The country in which to calculate the sizes and overlaps of
+  // audiences.
+  google.ads.googleads.v17.common.LocationInfo country_location = 2
+      [(google.api.field_behavior) = REQUIRED];
+
+  // Required. The audience attribute that should be intersected with all other
+  // eligible audiences.  This must be an Affinity or In-Market UserInterest, an
+  // AgeRange or a Gender.
+  AudienceInsightsAttribute primary_attribute = 3
+      [(google.api.field_behavior) = REQUIRED];
+
+  // Required. The types of attributes of which to calculate the overlap with
+  // the primary_attribute. The values must be a subset of
+  // AFFINITY_USER_INTEREST, IN_MARKET_USER_INTEREST, AGE_RANGE and GENDER.
+  repeated google.ads.googleads.v17.enums.AudienceInsightsDimensionEnum
+      .AudienceInsightsDimension dimensions = 4
+      [(google.api.field_behavior) = REQUIRED];
+
+  // The name of the customer being planned for.  This is a user-defined value.
+  string customer_insights_group = 5;
+}
+
+// Response message for
+// [AudienceInsightsService.GenerateAudienceOverlapInsights][google.ads.googleads.v17.services.AudienceInsightsService.GenerateAudienceOverlapInsights].
+message GenerateAudienceOverlapInsightsResponse {
+  // Metadata for the primary attribute, including potential YouTube reach.
+  AudienceInsightsAttributeMetadata primary_attribute_metadata = 1;
+
+  // Lists of attributes and their overlap with the primary attribute, one list
+  // per requested dimension.
+  repeated DimensionOverlapResult dimension_results = 2;
+}
+
+// A list of audience attributes of a single dimension, including their overlap
+// with a primary attribute, returned as part of a
+// [GenerateAudienceOverlapInsightsResponse][google.ads.googleads.v17.services.GenerateAudienceOverlapInsightsResponse].
+message DimensionOverlapResult {
+  // The dimension of all the attributes in this section.
+  google.ads.googleads.v17.enums.AudienceInsightsDimensionEnum
+      .AudienceInsightsDimension dimension = 1;
+
+  // The attributes and their overlap with the primary attribute.
+  repeated AudienceOverlapItem items = 2;
+}
+
+// An audience attribute, with metadata including the overlap between this
+// attribute's potential YouTube reach and that of a primary attribute.
+message AudienceOverlapItem {
+  // The attribute and its metadata, including potential YouTube reach.
+  AudienceInsightsAttributeMetadata attribute_metadata = 1;
+
+  // The estimated size of the intersection of this audience attribute with the
+  // primary attribute, that is, the number of reachable YouTube users who match
+  // BOTH the primary attribute and this one.
+  int64 potential_youtube_reach_intersection = 2;
+}
+
 // An audience attribute that can be used to request insights about the
 // audience.
 message AudienceInsightsAttribute {
   // An audience attribute.
   oneof attribute {
     // An audience attribute defined by an age range.
     google.ads.googleads.v17.common.AgeRangeInfo age_range = 1;

     // An audience attribute defined by a gender.
     google.ads.googleads.v17.common.GenderInfo gender = 2;

     // An audience attribute defined by a geographic location.
     google.ads.googleads.v17.common.LocationInfo location = 3;

     // An Affinity or In-Market audience.
     google.ads.googleads.v17.common.UserInterestInfo user_interest = 4;

     // An audience attribute defined by interest in a topic represented by a
     // Knowledge Graph entity.
     AudienceInsightsEntity entity = 5;

     // An audience attribute defined by interest in a Product & Service
     // category.
     AudienceInsightsCategory category = 6;

     // A YouTube Dynamic Lineup
     AudienceInsightsDynamicLineup dynamic_lineup = 7;

     // A Parental Status value (parent, or not a parent).
     google.ads.googleads.v17.common.ParentalStatusInfo parental_status = 8;

     // A household income percentile range.
     google.ads.googleads.v17.common.IncomeRangeInfo income_range = 9;

     // A YouTube channel.
     google.ads.googleads.v17.common.YouTubeChannelInfo youtube_channel = 10;
   }
 }

 // An entity or category representing a topic that defines an audience.
 message AudienceInsightsTopic {
   // An entity or category attribute.
   oneof topic {
     // A Knowledge Graph entity
     AudienceInsightsEntity entity = 1;

     // A Product & Service category
     AudienceInsightsCategory category = 2;
   }
 }

 // A Knowledge Graph entity, represented by its machine id.
 message AudienceInsightsEntity {
   // Required. The machine id (mid) of the Knowledge Graph entity.
   string knowledge_graph_machine_id = 1
       [(google.api.field_behavior) = REQUIRED];
 }

 // A Product and Service category.
 message AudienceInsightsCategory {
   // Required. The criterion id of the category.
   string category_id = 1 [(google.api.field_behavior) = REQUIRED];
 }

 // A YouTube Dynamic Lineup.
 message AudienceInsightsDynamicLineup {
   // Required. The numeric ID of the dynamic lineup.
   string dynamic_lineup_id = 1 [(google.api.field_behavior) = REQUIRED];
 }

 // A description of an audience used for requesting insights.
 message BasicInsightsAudience {
   // Required. The countries for this audience.
   repeated google.ads.googleads.v17.common.LocationInfo country_location = 1
       [(google.api.field_behavior) = REQUIRED];

   // Sub-country geographic location attributes.  If present, each of these
   // must be contained in one of the countries in this audience.
   repeated google.ads.googleads.v17.common.LocationInfo sub_country_locations =
       2;

   // Gender for the audience.  If absent, the audience does not restrict by
   // gender.
   google.ads.googleads.v17.common.GenderInfo gender = 3;

   // Age ranges for the audience.  If absent, the audience represents all people
   // over 18 that match the other attributes.
   repeated google.ads.googleads.v17.common.AgeRangeInfo age_ranges = 4;

   // User interests defining this audience.  Affinity and In-Market audiences
   // are supported.
   repeated google.ads.googleads.v17.common.UserInterestInfo user_interests = 5;

   // Topics, represented by Knowledge Graph entities and/or Product & Service
   // categories, that this audience is interested in.
   repeated AudienceInsightsTopic topics = 6;
 }

 // An audience attribute, with metadata about it, returned in response to a
 // search.
 message AudienceInsightsAttributeMetadata {
   // The type of the attribute.
   google.ads.googleads.v17.enums.AudienceInsightsDimensionEnum
       .AudienceInsightsDimension dimension = 1;

   // The attribute itself.
   AudienceInsightsAttribute attribute = 2;

   // The human-readable name of the attribute.
   string display_name = 3;

   // A string that supplements the display_name to identify the attribute.
   // If the dimension is TOPIC, this is a brief description of the
   // Knowledge Graph entity, such as "American singer-songwriter".
   // If the dimension is CATEGORY, this is the complete path to the category in
   // The Product & Service taxonomy, for example
   // "/Apparel/Clothing/Outerwear".
   string display_info = 5;

+  // An estimate of the number of reachable YouTube users matching this
+  // attribute in the requested location, or zero if that information is not
+  // available for this attribute.  Only populated in
+  // GenerateAudienceOverlapInsightsResponses and in
+  // ListAudienceInsightsAttributesResponses when youtube_reach_location is
+  // present in the request.
+  int64 potential_youtube_reach = 9;
+
   // Metadata specific to the dimension of this attribute.
   oneof dimension_metadata {
     // Special metadata for a YouTube channel.
     YouTubeChannelAttributeMetadata youtube_channel_metadata = 6;

     // Special metadata for a YouTube Dynamic Lineup.
     DynamicLineupAttributeMetadata dynamic_attribute_metadata = 7;

     // Special metadata for a Location.
     LocationAttributeMetadata location_attribute_metadata = 8;
   }
 }

 // Metadata associated with a YouTube channel attribute.
 message YouTubeChannelAttributeMetadata {
   // The approximate number of subscribers to the YouTube channel.
   int64 subscriber_count = 1;
 }

 // Metadata associated with a Dynamic Lineup attribute.
 message DynamicLineupAttributeMetadata {
   // A YouTube channel returned as an example of the content in a lineup.
   message SampleChannel {
     // A YouTube channel.
     google.ads.googleads.v17.common.YouTubeChannelInfo youtube_channel = 1;

     // The name of the sample channel.
     string display_name = 2;

     // Metadata for the sample channel.
     YouTubeChannelAttributeMetadata youtube_channel_metadata = 3;
   }

   // The national market associated with the lineup.
   google.ads.googleads.v17.common.LocationInfo inventory_country = 1;

   // The median number of impressions per month on this lineup.
   optional int64 median_monthly_inventory = 2;

   // The lower end of a range containing the number of channels in the lineup.
   optional int64 channel_count_lower_bound = 3;

   // The upper end of a range containing the number of channels in the lineup.
   optional int64 channel_count_upper_bound = 4;

   // Examples of channels that are included in the lineup.
   repeated SampleChannel sample_channels = 5;
 }

 // Metadata associated with a Location attribute.
 message LocationAttributeMetadata {
   // The country location of the sub country location.
   google.ads.googleads.v17.common.LocationInfo country_location = 1;
 }

 // A set of users, defined by various characteristics, for which insights can
 // be requested in AudienceInsightsService.
 message InsightsAudience {
   // Required. The countries for the audience.
   repeated google.ads.googleads.v17.common.LocationInfo country_locations = 1
       [(google.api.field_behavior) = REQUIRED];

   // Sub-country geographic location attributes.  If present, each of these
   // must be contained in one of the countries in this audience.  If absent, the
   // audience is geographically to the country_locations and no further.
   repeated google.ads.googleads.v17.common.LocationInfo sub_country_locations =
       2;

   // Gender for the audience.  If absent, the audience does not restrict by
   // gender.
   google.ads.googleads.v17.common.GenderInfo gender = 3;

   // Age ranges for the audience.  If absent, the audience represents all people
   // over 18 that match the other attributes.
   repeated google.ads.googleads.v17.common.AgeRangeInfo age_ranges = 4;

   // Parental status for the audience.  If absent, the audience does not
   // restrict by parental status.
   google.ads.googleads.v17.common.ParentalStatusInfo parental_status = 5;

   // Household income percentile ranges for the audience.  If absent, the
   // audience does not restrict by household income range.
   repeated google.ads.googleads.v17.common.IncomeRangeInfo income_ranges = 6;

   // Dynamic lineups representing the YouTube content viewed by the audience.
   repeated AudienceInsightsDynamicLineup dynamic_lineups = 7;

   // A combination of entity, category and user interest attributes defining the
   // audience. The combination has a logical AND-of-ORs structure: Attributes
   // within each InsightsAudienceAttributeGroup are combined with OR, and
   // the combinations themselves are combined together with AND.  For example,
   // the expression (Entity OR Affinity) AND (In-Market OR Category) can be
   // formed using two InsightsAudienceAttributeGroups with two Attributes
   // each.
   repeated InsightsAudienceAttributeGroup topic_audience_combinations = 8;
 }

 // A list of AudienceInsightsAttributes.
 message InsightsAudienceAttributeGroup {
   // Required. A collection of audience attributes to be combined with logical
   // OR. Attributes need not all be the same dimension.  Only Knowledge Graph
   // entities, Product & Service Categories, and Affinity and In-Market
   // audiences are supported in this context.
   repeated AudienceInsightsAttribute attributes = 1
       [(google.api.field_behavior) = REQUIRED];
 }

 // A collection of related attributes of the same type in an audience
 // composition insights report.
 message AudienceCompositionSection {
   // The type of the attributes in this section.
   google.ads.googleads.v17.enums.AudienceInsightsDimensionEnum
       .AudienceInsightsDimension dimension = 1;

   // The most relevant segments for this audience.  If dimension is GENDER,
   // AGE_RANGE or PARENTAL_STATUS, then this list of attributes is exhaustive.
   repeated AudienceCompositionAttribute top_attributes = 3;

   // Additional attributes for this audience, grouped into clusters.  Only
   // populated if dimension is YOUTUBE_CHANNEL.
   repeated AudienceCompositionAttributeCluster clustered_attributes = 4;
 }

 // A collection of related attributes, with metadata and metrics, in an audience
 // composition insights report.
 message AudienceCompositionAttributeCluster {
   // The name of this cluster of attributes
   string cluster_display_name = 1;

   // If the dimension associated with this cluster is YOUTUBE_CHANNEL, then
   // cluster_metrics are metrics associated with the cluster as a whole.
   // For other dimensions, this field is unset.
   AudienceCompositionMetrics cluster_metrics = 3;

   // The individual attributes that make up this cluster, with metadata and
   // metrics.
   repeated AudienceCompositionAttribute attributes = 4;
 }

 // The share and index metrics associated with an attribute in an audience
 // composition insights report.
 message AudienceCompositionMetrics {
   // The fraction (from 0 to 1 inclusive) of the baseline audience that match
   // the attribute.
   double baseline_audience_share = 1;

   // The fraction (from 0 to 1 inclusive) of the specific audience that match
   // the attribute.
   double audience_share = 2;

   // The ratio of audience_share to baseline_audience_share, or zero if this
   // ratio is undefined or is not meaningful.
   double index = 3;

   // A relevance score from 0 to 1 inclusive.
   double score = 4;
 }

 // An audience attribute with metadata and metrics.
 message AudienceCompositionAttribute {
   // The attribute with its metadata.
   AudienceInsightsAttributeMetadata attribute_metadata = 1;

   // Share and index metrics for the attribute.
   AudienceCompositionMetrics metrics = 2;
 }