// Copyright 2023 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.analytics.admin.v1alpha;

import "google/analytics/admin/v1alpha/audience.proto";
import "google/analytics/admin/v1alpha/channel_group.proto";
import "google/analytics/admin/v1alpha/event_create_and_edit.proto";
import "google/analytics/admin/v1alpha/expanded_data_set.proto";
import "google/api/field_behavior.proto";
import "google/api/resource.proto";
import "google/protobuf/timestamp.proto";
import "google/protobuf/wrappers.proto";

option go_package = "cloud.google.com/go/analytics/admin/apiv1alpha/adminpb;adminpb";
option java_multiple_files = true;
option java_outer_classname = "ResourcesProto";
option java_package = "com.google.analytics.admin.v1alpha";

// The category selected for this property, used for industry benchmarking.
enum IndustryCategory {
  // Industry category unspecified
  INDUSTRY_CATEGORY_UNSPECIFIED = 0;

  // Automotive
  AUTOMOTIVE = 1;

  // Business and industrial markets
  BUSINESS_AND_INDUSTRIAL_MARKETS = 2;

  // Finance
  FINANCE = 3;

  // Healthcare
  HEALTHCARE = 4;

  // Technology
  TECHNOLOGY = 5;

  // Travel
  TRAVEL = 6;

  // Other
  OTHER = 7;

  // Arts and entertainment
  ARTS_AND_ENTERTAINMENT = 8;

  // Beauty and fitness
  BEAUTY_AND_FITNESS = 9;

  // Books and literature
  BOOKS_AND_LITERATURE = 10;

  // Food and drink
  FOOD_AND_DRINK = 11;

  // Games
  GAMES = 12;

  // Hobbies and leisure
  HOBBIES_AND_LEISURE = 13;

  // Home and garden
  HOME_AND_GARDEN = 14;

  // Internet and telecom
  INTERNET_AND_TELECOM = 15;

  // Law and government
  LAW_AND_GOVERNMENT = 16;

  // News
  NEWS = 17;

  // Online communities
  ONLINE_COMMUNITIES = 18;

  // People and society
  PEOPLE_AND_SOCIETY = 19;

  // Pets and animals
  PETS_AND_ANIMALS = 20;

  // Real estate
  REAL_ESTATE = 21;

  // Reference
  REFERENCE = 22;

  // Science
  SCIENCE = 23;

  // Sports
  SPORTS = 24;

  // Jobs and education
  JOBS_AND_EDUCATION = 25;

  // Shopping
  SHOPPING = 26;
}

// Various levels of service for Google Analytics.
enum ServiceLevel {
  // Service level not specified or invalid.
  SERVICE_LEVEL_UNSPECIFIED = 0;

  // The standard version of Google Analytics.
  GOOGLE_ANALYTICS_STANDARD = 1;

  // The paid, premium version of Google Analytics.
  GOOGLE_ANALYTICS_360 = 2;
}

// Different kinds of actors that can make changes to Google Analytics
// resources.
enum ActorType {
  // Unknown or unspecified actor type.
  ACTOR_TYPE_UNSPECIFIED = 0;

  // Changes made by the user specified in actor_email.
  USER = 1;

  // Changes made by the Google Analytics system.
  SYSTEM = 2;

  // Changes made by Google Analytics support team staff.
  SUPPORT = 3;
}

// Types of actions that may change a resource.
enum ActionType {
  // Action type unknown or not specified.
  ACTION_TYPE_UNSPECIFIED = 0;

  // Resource was created in this change.
  CREATED = 1;

  // Resource was updated in this change.
  UPDATED = 2;

  // Resource was deleted in this change.
  DELETED = 3;
}

// Types of resources whose changes may be returned from change history.
enum ChangeHistoryResourceType {
  // Resource type unknown or not specified.
  CHANGE_HISTORY_RESOURCE_TYPE_UNSPECIFIED = 0;

  // Account resource
  ACCOUNT = 1;

  // Property resource
  PROPERTY = 2;

  // FirebaseLink resource
  FIREBASE_LINK = 6;

  // GoogleAdsLink resource
  GOOGLE_ADS_LINK = 7;

  // GoogleSignalsSettings resource
  GOOGLE_SIGNALS_SETTINGS = 8;

  // ConversionEvent resource
  CONVERSION_EVENT = 9;

  // MeasurementProtocolSecret resource
  MEASUREMENT_PROTOCOL_SECRET = 10;

  // CustomDimension resource
  CUSTOM_DIMENSION = 11;

  // CustomMetric resource
  CUSTOM_METRIC = 12;

  // DataRetentionSettings resource
  DATA_RETENTION_SETTINGS = 13;

  // DisplayVideo360AdvertiserLink resource
  DISPLAY_VIDEO_360_ADVERTISER_LINK = 14;

  // DisplayVideo360AdvertiserLinkProposal resource
  DISPLAY_VIDEO_360_ADVERTISER_LINK_PROPOSAL = 15;

  // SearchAds360Link resource
  SEARCH_ADS_360_LINK = 16;

  // DataStream resource
  DATA_STREAM = 18;

  // AttributionSettings resource
  ATTRIBUTION_SETTINGS = 20;

  // ExpandedDataSet resource
  EXPANDED_DATA_SET = 21;

  // ChannelGroup resource
  CHANNEL_GROUP = 22;

  // EnhancedMeasurementSettings resource
  ENHANCED_MEASUREMENT_SETTINGS = 24;

  // DataRedactionSettings resource
  DATA_REDACTION_SETTINGS = 25;

  // SKAdNetworkConversionValueSchema resource
  SKADNETWORK_CONVERSION_VALUE_SCHEMA = 26;

  // AdSenseLink resource
  ADSENSE_LINK = 27;

  // Audience resource
  AUDIENCE = 28;

  // EventCreateRule resource
  EVENT_CREATE_RULE = 29;

  // CalculatedMetric resource
  CALCULATED_METRIC = 31;
}

// Status of the Google Signals settings.
enum GoogleSignalsState {
  // Google Signals status defaults to GOOGLE_SIGNALS_STATE_UNSPECIFIED to
  // represent that the user has not made an explicit choice.
  GOOGLE_SIGNALS_STATE_UNSPECIFIED = 0;

  // Google Signals is enabled.
  GOOGLE_SIGNALS_ENABLED = 1;

  // Google Signals is disabled.
  GOOGLE_SIGNALS_DISABLED = 2;
}

// Consent field of the Google Signals settings.
enum GoogleSignalsConsent {
  // Google Signals consent value defaults to
  // GOOGLE_SIGNALS_CONSENT_UNSPECIFIED.  This will be treated as
  // GOOGLE_SIGNALS_CONSENT_NOT_CONSENTED.
  GOOGLE_SIGNALS_CONSENT_UNSPECIFIED = 0;

  // Terms of service have been accepted
  GOOGLE_SIGNALS_CONSENT_CONSENTED = 2;

  // Terms of service have not been accepted
  GOOGLE_SIGNALS_CONSENT_NOT_CONSENTED = 1;
}

// An indication of which product the user initiated a link proposal from.
enum LinkProposalInitiatingProduct {
  // Unspecified product.
  LINK_PROPOSAL_INITIATING_PRODUCT_UNSPECIFIED = 0;

  // This proposal was created by a user from Google Analytics.
  GOOGLE_ANALYTICS = 1;

  // This proposal was created by a user from a linked product (not Google
  // Analytics).
  LINKED_PRODUCT = 2;
}

// The state of a link proposal resource.
enum LinkProposalState {
  // Unspecified state
  LINK_PROPOSAL_STATE_UNSPECIFIED = 0;

  // This proposal is awaiting review from a Google Analytics user. This
  // proposal will automatically expire after some time.
  AWAITING_REVIEW_FROM_GOOGLE_ANALYTICS = 1;

  // This proposal is awaiting review from a user of a linked product. This
  // proposal will automatically expire after some time.
  AWAITING_REVIEW_FROM_LINKED_PRODUCT = 2;

  // This proposal has been withdrawn by an admin on the initiating product.
  // This proposal will be automatically deleted after some time.
  WITHDRAWN = 3;

  // This proposal has been declined by an admin on the receiving product. This
  // proposal will be automatically deleted after some time.
  DECLINED = 4;

  // This proposal expired due to lack of response from an admin on the
  // receiving product. This proposal will be automatically deleted after some
  // time.
  EXPIRED = 5;

  // This proposal has become obsolete because a link was directly created to
  // the same external product resource that this proposal specifies. This
  // proposal will be automatically deleted after some time.
  OBSOLETE = 6;
}

// Types of Property resources.
enum PropertyType {
  // Unknown or unspecified property type
  PROPERTY_TYPE_UNSPECIFIED = 0;

  // Ordinary GA4 property
  PROPERTY_TYPE_ORDINARY = 1;

  // GA4 subproperty
  PROPERTY_TYPE_SUBPROPERTY = 2;

  // GA4 rollup property
  PROPERTY_TYPE_ROLLUP = 3;
}

// The coarse conversion value set on the updatePostbackConversionValue SDK call
// when a ConversionValues.event_mappings conditions are satisfied. For
// more information, see
// [SKAdNetwork.CoarseConversionValue](https://developer.apple.com/documentation/storekit/skadnetwork/coarseconversionvalue).
enum CoarseValue {
  // Coarse value not specified.
  COARSE_VALUE_UNSPECIFIED = 0;

  // Coarse value of low.
  COARSE_VALUE_LOW = 1;

  // Coarse value of medium.
  COARSE_VALUE_MEDIUM = 2;

  // Coarse value of high.
  COARSE_VALUE_HIGH = 3;
}

// A resource message representing a Google Analytics account.
message Account {
  option (google.api.resource) = {
    type: "analyticsadmin.googleapis.com/Account"
    pattern: "accounts/{account}"
  };

  // Output only. Resource name of this account.
  // Format: accounts/{account}
  // Example: "accounts/100"
  string name = 1 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Time when this account was originally created.
  google.protobuf.Timestamp create_time = 2
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Time when account payload fields were last updated.
  google.protobuf.Timestamp update_time = 3
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Required. Human-readable display name for this account.
  string display_name = 4 [(google.api.field_behavior) = REQUIRED];

  // Country of business. Must be a Unicode CLDR region code.
  string region_code = 5;

  // Output only. Indicates whether this Account is soft-deleted or not. Deleted
  // accounts are excluded from List results unless specifically requested.
  bool deleted = 6 [(google.api.field_behavior) = OUTPUT_ONLY];
}

// A resource message representing a Google Analytics GA4 property.
message Property {
  option (google.api.resource) = {
    type: "analyticsadmin.googleapis.com/Property"
    pattern: "properties/{property}"
  };

  // Output only. Resource name of this property.
  // Format: properties/{property_id}
  // Example: "properties/1000"
  string name = 1 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Immutable. The property type for this Property resource. When creating a
  // property, if the type is "PROPERTY_TYPE_UNSPECIFIED", then
  // "ORDINARY_PROPERTY" will be implied.
  PropertyType property_type = 14 [(google.api.field_behavior) = IMMUTABLE];

  // Output only. Time when the entity was originally created.
  google.protobuf.Timestamp create_time = 3
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Time when entity payload fields were last updated.
  google.protobuf.Timestamp update_time = 4
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Immutable. Resource name of this property's logical parent.
  //
  // Note: The Property-Moving UI can be used to change the parent.
  // Format: accounts/{account}, properties/{property}
  // Example: "accounts/100", "properties/101"
  string parent = 2 [(google.api.field_behavior) = IMMUTABLE];

  // Required. Human-readable display name for this property.
  //
  // The max allowed display name length is 100 UTF-16 code units.
  string display_name = 5 [(google.api.field_behavior) = REQUIRED];

  // Industry associated with this property
  // Example: AUTOMOTIVE, FOOD_AND_DRINK
  IndustryCategory industry_category = 6;

  // Required. Reporting Time Zone, used as the day boundary for reports,
  // regardless of where the data originates. If the time zone honors DST,
  // Analytics will automatically adjust for the changes.
  //
  // NOTE: Changing the time zone only affects data going forward, and is not
  // applied retroactively.
  //
  // Format: https://www.iana.org/time-zones
  // Example: "America/Los_Angeles"
  string time_zone = 7 [(google.api.field_behavior) = REQUIRED];

  // The currency type used in reports involving monetary values.
  //
  //
  // Format: https://en.wikipedia.org/wiki/ISO_4217
  // Examples: "USD", "EUR", "JPY"
  string currency_code = 8;

  // Output only. The Google Analytics service level that applies to this
  // property.
  ServiceLevel service_level = 10 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. If set, the time at which this property was trashed. If not
  // set, then this property is not currently in the trash can.
  google.protobuf.Timestamp delete_time = 11
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. If set, the time at which this trashed property will be
  // permanently deleted. If not set, then this property is not currently in the
  // trash can and is not slated to be deleted.
  google.protobuf.Timestamp expire_time = 12
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Immutable. The resource name of the parent account
  // Format: accounts/{account_id}
  // Example: "accounts/123"
  string account = 13 [
    (google.api.field_behavior) = IMMUTABLE,
    (google.api.resource_reference) = {
      type: "analyticsadmin.googleapis.com/Account"
    }
  ];
}

// A resource message representing a data stream.
message DataStream {
  option (google.api.resource) = {
    type: "analyticsadmin.googleapis.com/DataStream"
    pattern: "properties/{property}/dataStreams/{data_stream}"
  };

  // Data specific to web streams.
  message WebStreamData {
    // Output only. Analytics Measurement ID.
    //
    // Example: "G-1A2BCD345E"
    string measurement_id = 1 [(google.api.field_behavior) = OUTPUT_ONLY];

    // Output only. ID of the corresponding web app in Firebase, if any.
    // This ID can change if the web app is deleted and recreated.
    string firebase_app_id = 2 [(google.api.field_behavior) = OUTPUT_ONLY];

    // Domain name of the web app being measured, or empty.
    // Example: "http://www.google.com", "https://www.google.com"
    string default_uri = 3;
  }

  // Data specific to Android app streams.
  message AndroidAppStreamData {
    // Output only. ID of the corresponding Android app in Firebase, if any.
    // This ID can change if the Android app is deleted and recreated.
    string firebase_app_id = 1 [(google.api.field_behavior) = OUTPUT_ONLY];

    // Immutable. The package name for the app being measured.
    // Example: "com.example.myandroidapp"
    string package_name = 2 [(google.api.field_behavior) = IMMUTABLE];
  }

  // Data specific to iOS app streams.
  message IosAppStreamData {
    // Output only. ID of the corresponding iOS app in Firebase, if any.
    // This ID can change if the iOS app is deleted and recreated.
    string firebase_app_id = 1 [(google.api.field_behavior) = OUTPUT_ONLY];

    // Required. Immutable. The Apple App Store Bundle ID for the app
    // Example: "com.example.myiosapp"
    string bundle_id = 2 [
      (google.api.field_behavior) = IMMUTABLE,
      (google.api.field_behavior) = REQUIRED
    ];
  }

  // The type of the data stream.
  enum DataStreamType {
    // Type unknown or not specified.
    DATA_STREAM_TYPE_UNSPECIFIED = 0;

    // Web data stream.
    WEB_DATA_STREAM = 1;

    // Android app data stream.
    ANDROID_APP_DATA_STREAM = 2;

    // iOS app data stream.
    IOS_APP_DATA_STREAM = 3;
  }

  // Data for specific data stream types. The message that will be
  // set corresponds to the type of this stream.
  oneof stream_data {
    // Data specific to web streams. Must be populated if type is
    // WEB_DATA_STREAM.
    WebStreamData web_stream_data = 6;

    // Data specific to Android app streams. Must be populated if type is
    // ANDROID_APP_DATA_STREAM.
    AndroidAppStreamData android_app_stream_data = 7;

    // Data specific to iOS app streams. Must be populated if type is
    // IOS_APP_DATA_STREAM.
    IosAppStreamData ios_app_stream_data = 8;
  }

  // Output only. Resource name of this Data Stream.
  // Format: properties/{property_id}/dataStreams/{stream_id}
  // Example: "properties/1000/dataStreams/2000"
  string name = 1 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Required. Immutable. The type of this DataStream resource.
  DataStreamType type = 2 [
    (google.api.field_behavior) = IMMUTABLE,
    (google.api.field_behavior) = REQUIRED
  ];

  // Human-readable display name for the Data Stream.
  //
  // Required for web data streams.
  //
  // The max allowed display name length is 255 UTF-16 code units.
  string display_name = 3;

  // Output only. Time when this stream was originally created.
  google.protobuf.Timestamp create_time = 4
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Time when stream payload fields were last updated.
  google.protobuf.Timestamp update_time = 5
      [(google.api.field_behavior) = OUTPUT_ONLY];
}

// A link between a GA4 property and a Firebase project.
message FirebaseLink {
  option (google.api.resource) = {
    type: "analyticsadmin.googleapis.com/FirebaseLink"
    pattern: "properties/{property}/firebaseLinks/{firebase_link}"
  };

  // Output only. Example format: properties/1234/firebaseLinks/5678
  string name = 1 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Immutable. Firebase project resource name. When creating a FirebaseLink,
  // you may provide this resource name using either a project number or project
  // ID. Once this resource has been created, returned FirebaseLinks will always
  // have a project_name that contains a project number.
  //
  // Format: 'projects/{project number}'
  // Example: 'projects/1234'
  string project = 2 [(google.api.field_behavior) = IMMUTABLE];

  // Output only. Time when this FirebaseLink was originally created.
  google.protobuf.Timestamp create_time = 3
      [(google.api.field_behavior) = OUTPUT_ONLY];
}

// Read-only resource with the tag for sending data from a website to a
// DataStream. Only present for web DataStream resources.
message GlobalSiteTag {
  option (google.api.resource) = {
    type: "analyticsadmin.googleapis.com/GlobalSiteTag"
    pattern: "properties/{property}/dataStreams/{data_stream}/globalSiteTag"
  };

  // Output only. Resource name for this GlobalSiteTag resource.
  // Format: properties/{property_id}/dataStreams/{stream_id}/globalSiteTag
  // Example: "properties/123/dataStreams/456/globalSiteTag"
  string name = 1 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Immutable. JavaScript code snippet to be pasted as the first item into the
  // head tag of every webpage to measure.
  string snippet = 2 [(google.api.field_behavior) = IMMUTABLE];
}

// A link between a GA4 property and a Google Ads account.
message GoogleAdsLink {
  option (google.api.resource) = {
    type: "analyticsadmin.googleapis.com/GoogleAdsLink"
    pattern: "properties/{property}/googleAdsLinks/{google_ads_link}"
  };

  // Output only. Format:
  // properties/{propertyId}/googleAdsLinks/{googleAdsLinkId}
  //
  // Note: googleAdsLinkId is not the Google Ads customer ID.
  string name = 1 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Immutable. Google Ads customer ID.
  string customer_id = 3 [(google.api.field_behavior) = IMMUTABLE];

  // Output only. If true, this link is for a Google Ads manager account.
  bool can_manage_clients = 4 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Enable personalized advertising features with this integration.
  // Automatically publish my Google Analytics audience lists and Google
  // Analytics remarketing events/parameters to the linked Google Ads account.
  // If this field is not set on create/update, it will be defaulted to true.
  google.protobuf.BoolValue ads_personalization_enabled = 5;

  // Output only. Time when this link was originally created.
  google.protobuf.Timestamp create_time = 7
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Time when this link was last updated.
  google.protobuf.Timestamp update_time = 8
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Email address of the user that created the link.
  // An empty string will be returned if the email address can't be retrieved.
  string creator_email_address = 9 [(google.api.field_behavior) = OUTPUT_ONLY];
}

// A resource message representing data sharing settings of a Google Analytics
// account.
message DataSharingSettings {
  option (google.api.resource) = {
    type: "analyticsadmin.googleapis.com/DataSharingSettings"
    pattern: "accounts/{account}/dataSharingSettings"
  };

  // Output only. Resource name.
  // Format: accounts/{account}/dataSharingSettings
  // Example: "accounts/1000/dataSharingSettings"
  string name = 1 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Allows Google support to access the data in order to help troubleshoot
  // issues.
  bool sharing_with_google_support_enabled = 2;

  // Allows Google sales teams that are assigned to the customer to access the
  // data in order to suggest configuration changes to improve results.
  // Sales team restrictions still apply when enabled.
  bool sharing_with_google_assigned_sales_enabled = 3;

  // Allows any of Google sales to access the data in order to suggest
  // configuration changes to improve results.
  bool sharing_with_google_any_sales_enabled = 4;

  // Allows Google to use the data to improve other Google products or services.
  bool sharing_with_google_products_enabled = 5;

  // Allows Google to share the data anonymously in aggregate form with others.
  bool sharing_with_others_enabled = 6;
}

// A virtual resource representing an overview of an account and
// all its child GA4 properties.
message AccountSummary {
  option (google.api.resource) = {
    type: "analyticsadmin.googleapis.com/AccountSummary"
    pattern: "accountSummaries/{account_summary}"
  };

  // Resource name for this account summary.
  // Format: accountSummaries/{account_id}
  // Example: "accountSummaries/1000"
  string name = 1;

  // Resource name of account referred to by this account summary
  // Format: accounts/{account_id}
  // Example: "accounts/1000"
  string account = 2 [(google.api.resource_reference) = {
    type: "analyticsadmin.googleapis.com/Account"
  }];

  // Display name for the account referred to in this account summary.
  string display_name = 3;

  // List of summaries for child accounts of this account.
  repeated PropertySummary property_summaries = 4;
}

// A virtual resource representing metadata for a GA4 property.
message PropertySummary {
  // Resource name of property referred to by this property summary
  // Format: properties/{property_id}
  // Example: "properties/1000"
  string property = 1 [(google.api.resource_reference) = {
    type: "analyticsadmin.googleapis.com/Property"
  }];

  // Display name for the property referred to in this property summary.
  string display_name = 2;

  // The property's property type.
  PropertyType property_type = 3;

  // Resource name of this property's logical parent.
  //
  // Note: The Property-Moving UI can be used to change the parent.
  // Format: accounts/{account}, properties/{property}
  // Example: "accounts/100", "properties/200"
  string parent = 4;
}

// A secret value used for sending hits to Measurement Protocol.
message MeasurementProtocolSecret {
  option (google.api.resource) = {
    type: "analyticsadmin.googleapis.com/MeasurementProtocolSecret"
    pattern: "properties/{property}/dataStreams/{data_stream}/measurementProtocolSecrets/{measurement_protocol_secret}"
  };

  // Output only. Resource name of this secret. This secret may be a child of
  // any type of stream. Format:
  // properties/{property}/dataStreams/{dataStream}/measurementProtocolSecrets/{measurementProtocolSecret}
  string name = 1 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Required. Human-readable display name for this secret.
  string display_name = 2 [(google.api.field_behavior) = REQUIRED];

  // Output only. The measurement protocol secret value. Pass this value to the
  // api_secret field of the Measurement Protocol API when sending hits to this
  // secret's parent property.
  string secret_value = 3 [(google.api.field_behavior) = OUTPUT_ONLY];
}

// SKAdNetwork conversion value schema of an iOS stream.
message SKAdNetworkConversionValueSchema {
  option (google.api.resource) = {
    type: "analyticsadmin.googleapis.com/SKAdNetworkConversionValueSchema"
    pattern: "properties/{property}/dataStreams/{data_stream}/sKAdNetworkConversionValueSchema/{skadnetwork_conversion_value_schema}"
  };

  // Output only. Resource name of the schema. This will be child of ONLY an iOS
  // stream, and there can be at most one such child under an iOS stream.
  // Format:
  // properties/{property}/dataStreams/{dataStream}/sKAdNetworkConversionValueSchema
  string name = 1 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Required. The conversion value settings for the first postback window.
  // These differ from values for postback window two and three in that they
  // contain a "Fine" grained conversion value (a numeric value).
  //
  // Conversion values for this postback window must be set.  The other windows
  // are optional and may inherit this window's settings if unset or disabled.
  PostbackWindow postback_window_one = 2
      [(google.api.field_behavior) = REQUIRED];

  // The conversion value settings for the second postback window.
  //
  // This field should only be configured if there is a need to define different
  // conversion values for this postback window.
  //
  // If enable_postback_window_settings is set to false for this postback
  // window, the values from postback_window_one will be used.
  PostbackWindow postback_window_two = 3;

  // The conversion value settings for the third postback window.
  //
  // This field should only be set if the user chose to define different
  // conversion values for this postback window. It is allowed to configure
  // window 3 without setting window 2. In case window 1 & 2 settings are set
  // and enable_postback_window_settings for this postback window is set to
  // false, the schema will inherit settings from postback_window_two.
  PostbackWindow postback_window_three = 4;

  // If enabled, the GA SDK will set conversion values using this schema
  // definition, and schema will be exported to any Google Ads accounts linked
  // to this property. If disabled, the GA SDK will not automatically set
  // conversion values, and also the schema will not be exported to Ads.
  bool apply_conversion_values = 5;
}

// Settings for a SKAdNetwork conversion postback window.
message PostbackWindow {
  // Ordering of the repeated field will be used to prioritize the conversion
  // value settings. Lower indexed entries are prioritized higher. The first
  // conversion value setting that evaluates to true will be selected. It must
  // have at least one entry if enable_postback_window_settings is set to
  // true. It can have maximum of 128 entries.
  repeated ConversionValues conversion_values = 1;

  // If enable_postback_window_settings is true, conversion_values
  // must be populated and will be used for determining when and how to set the
  // Conversion Value on a client device and exporting schema to linked Ads
  // accounts. If false, the settings are not used, but are retained in case
  // they may be used in the future. This must always be true for
  // postback_window_one.
  bool postback_window_settings_enabled = 2;
}

// Conversion value settings for a postback window for SKAdNetwork conversion
// value schema.
message ConversionValues {
  // Display name of the SKAdNetwork conversion value.
  // The max allowed display name length is 50 UTF-16 code units.
  string display_name = 1;

  // The fine-grained conversion value.  This is applicable only to the first
  // postback window. Its valid values are [0,63], both inclusive. It must be
  // set for postback window 1, and must not be set for postback window 2 & 3.
  // This value is not guaranteed to be unique.
  //
  // If the configuration for the first postback window is re-used for second or
  // third postback windows this field has no effect.
  optional int32 fine_value = 2;

  // Required. A coarse grained conversion value.
  //
  // This value is not guaranteed to be unique.
  CoarseValue coarse_value = 3 [(google.api.field_behavior) = REQUIRED];

  // Event conditions that must be met for this Conversion Value to be achieved.
  // The conditions in this list are ANDed together. It must have minimum of 1
  // entry and maximum of 3 entries, if the postback window is enabled.
  repeated EventMapping event_mappings = 4;

  // If true, the SDK should lock to this conversion value for the current
  // postback window.
  bool lock_enabled = 5;
}

// Event setting conditions to match an event.
message EventMapping {
  // Required. Name of the GA4 event. It must always be set.
  // The max allowed display name length is 40 UTF-16 code units.
  string event_name = 1 [(google.api.field_behavior) = REQUIRED];

  // At least one of the following four min/max values must be set. The
  // values set will be ANDed together to qualify an event.
  // The minimum number of times the event occurred. If not set, minimum event
  // count won't be checked.
  optional int64 min_event_count = 2;

  // The maximum number of times the event occurred. If not set, maximum event
  // count won't be checked.
  optional int64 max_event_count = 3;

  // The minimum revenue generated due to the event. Revenue currency will be
  // defined at the property level. If not set, minimum event value won't be
  // checked.
  optional double min_event_value = 4;

  // The maximum revenue generated due to the event. Revenue currency will be
  // defined at the property level. If not set, maximum event value won't be
  // checked.
  optional double max_event_value = 5;
}

// A set of changes within a Google Analytics account or its child properties
// that resulted from the same cause. Common causes would be updates made in the
// Google Analytics UI, changes from customer support, or automatic Google
// Analytics system changes.
message ChangeHistoryEvent {
  // ID of this change history event. This ID is unique across Google Analytics.
  string id = 1;

  // Time when change was made.
  google.protobuf.Timestamp change_time = 2;

  // The type of actor that made this change.
  ActorType actor_type = 3;

  // Email address of the Google account that made the change. This will be a
  // valid email address if the actor field is set to USER, and empty otherwise.
  // Google accounts that have been deleted will cause an error.
  string user_actor_email = 4;

  // If true, then the list of changes returned was filtered, and does not
  // represent all changes that occurred in this event.
  bool changes_filtered = 5;

  // A list of changes made in this change history event that fit the filters
  // specified in SearchChangeHistoryEventsRequest.
  repeated ChangeHistoryChange changes = 6;
}

// A description of a change to a single Google Analytics resource.
message ChangeHistoryChange {
  // A snapshot of a resource as before or after the result of a change in
  // change history.
  message ChangeHistoryResource {
    oneof resource {
      // A snapshot of an Account resource in change history.
      Account account = 1;

      // A snapshot of a Property resource in change history.
      Property property = 2;

      // A snapshot of a FirebaseLink resource in change history.
      FirebaseLink firebase_link = 6;

      // A snapshot of a GoogleAdsLink resource in change history.
      GoogleAdsLink google_ads_link = 7;

      // A snapshot of a GoogleSignalsSettings resource in change history.
      GoogleSignalsSettings google_signals_settings = 8;

      // A snapshot of a DisplayVideo360AdvertiserLink resource in change
      // history.
      DisplayVideo360AdvertiserLink display_video_360_advertiser_link = 9;

      // A snapshot of a DisplayVideo360AdvertiserLinkProposal resource in
      // change history.
      DisplayVideo360AdvertiserLinkProposal
          display_video_360_advertiser_link_proposal = 10;

      // A snapshot of a ConversionEvent resource in change history.
      ConversionEvent conversion_event = 11;

      // A snapshot of a MeasurementProtocolSecret resource in change history.
      MeasurementProtocolSecret measurement_protocol_secret = 12;

      // A snapshot of a CustomDimension resource in change history.
      CustomDimension custom_dimension = 13;

      // A snapshot of a CustomMetric resource in change history.
      CustomMetric custom_metric = 14;

      // A snapshot of a data retention settings resource in change history.
      DataRetentionSettings data_retention_settings = 15;

      // A snapshot of a SearchAds360Link resource in change history.
      SearchAds360Link search_ads_360_link = 16;

      // A snapshot of a DataStream resource in change history.
      DataStream data_stream = 18;

      // A snapshot of AttributionSettings resource in change history.
      AttributionSettings attribution_settings = 20;

      // A snapshot of an ExpandedDataSet resource in change history.
      ExpandedDataSet expanded_data_set = 21;

      // A snapshot of a ChannelGroup resource in change history.
      ChannelGroup channel_group = 22;

      // A snapshot of a BigQuery link resource in change history.
      BigQueryLink bigquery_link = 23;

      // A snapshot of EnhancedMeasurementSettings resource in change history.
      EnhancedMeasurementSettings enhanced_measurement_settings = 24;

      // A snapshot of DataRedactionSettings resource in change history.
      DataRedactionSettings data_redaction_settings = 25;

      // A snapshot of SKAdNetworkConversionValueSchema resource in change
      // history.
      SKAdNetworkConversionValueSchema skadnetwork_conversion_value_schema = 26;

      // A snapshot of an AdSenseLink resource in change history.
      AdSenseLink adsense_link = 27;

      // A snapshot of an Audience resource in change history.
      Audience audience = 28;

      // A snapshot of an EventCreateRule resource in change history.
      EventCreateRule event_create_rule = 29;

      // A snapshot of a CalculatedMetric resource in change history.
      CalculatedMetric calculated_metric = 31;
    }
  }

  // Resource name of the resource whose changes are described by this entry.
  string resource = 1;

  // The type of action that changed this resource.
  ActionType action = 2;

  // Resource contents from before the change was made. If this resource was
  // created in this change, this field will be missing.
  ChangeHistoryResource resource_before_change = 3;

  // Resource contents from after the change was made. If this resource was
  // deleted in this change, this field will be missing.
  ChangeHistoryResource resource_after_change = 4;
}

// A link between a GA4 property and a Display & Video 360 advertiser.
message DisplayVideo360AdvertiserLink {
  option (google.api.resource) = {
    type: "analyticsadmin.googleapis.com/DisplayVideo360AdvertiserLink"
    pattern: "properties/{property}/displayVideo360AdvertiserLinks/{display_video_360_advertiser_link}"
  };

  // Output only. The resource name for this DisplayVideo360AdvertiserLink
  // resource. Format:
  // properties/{propertyId}/displayVideo360AdvertiserLinks/{linkId}
  //
  // Note: linkId is not the Display & Video 360 Advertiser ID
  string name = 1 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Immutable. The Display & Video 360 Advertiser's advertiser ID.
  string advertiser_id = 2 [(google.api.field_behavior) = IMMUTABLE];

  // Output only. The display name of the Display & Video 360 Advertiser.
  string advertiser_display_name = 3
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Enables personalized advertising features with this integration.
  // If this field is not set on create/update, it will be defaulted to true.
  google.protobuf.BoolValue ads_personalization_enabled = 4;

  // Immutable. Enables the import of campaign data from Display & Video 360
  // into the GA4 property. After link creation, this can only be updated from
  // the Display & Video 360 product. If this field is not set on create, it
  // will be defaulted to true.
  google.protobuf.BoolValue campaign_data_sharing_enabled = 5
      [(google.api.field_behavior) = IMMUTABLE];

  // Immutable. Enables the import of cost data from Display & Video 360 into
  // the GA4 property. This can only be enabled if campaign_data_sharing_enabled
  // is enabled. After link creation, this can only be updated from the Display
  // & Video 360 product. If this field is not set on create, it will be
  // defaulted to true.
  google.protobuf.BoolValue cost_data_sharing_enabled = 6
      [(google.api.field_behavior) = IMMUTABLE];
}

// A proposal for a link between a GA4 property and a Display & Video 360
// advertiser.
//
// A proposal is converted to a DisplayVideo360AdvertiserLink once approved.
// Google Analytics admins approve inbound proposals while Display & Video 360
// admins approve outbound proposals.
message DisplayVideo360AdvertiserLinkProposal {
  option (google.api.resource) = {
    type: "analyticsadmin.googleapis.com/DisplayVideo360AdvertiserLinkProposal"
    pattern: "properties/{property}/displayVideo360AdvertiserLinkProposals/{display_video_360_advertiser_link_proposal}"
  };

  // Output only. The resource name for this
  // DisplayVideo360AdvertiserLinkProposal resource. Format:
  // properties/{propertyId}/displayVideo360AdvertiserLinkProposals/{proposalId}
  //
  // Note: proposalId is not the Display & Video 360 Advertiser ID
  string name = 1 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Immutable. The Display & Video 360 Advertiser's advertiser ID.
  string advertiser_id = 2 [(google.api.field_behavior) = IMMUTABLE];

  // Output only. The status information for this link proposal.
  LinkProposalStatusDetails link_proposal_status_details = 3
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The display name of the Display & Video Advertiser.
  // Only populated for proposals that originated from Display & Video 360.
  string advertiser_display_name = 4
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Input only. On a proposal being sent to Display & Video 360, this field
  // must be set to the email address of an admin on the target advertiser. This
  // is used to verify that the Google Analytics admin is aware of at least one
  // admin on the Display & Video 360 Advertiser. This does not restrict
  // approval of the proposal to a single user. Any admin on the Display & Video
  // 360 Advertiser may approve the proposal.
  string validation_email = 5 [(google.api.field_behavior) = INPUT_ONLY];

  // Immutable. Enables personalized advertising features with this integration.
  // If this field is not set on create, it will be defaulted to true.
  google.protobuf.BoolValue ads_personalization_enabled = 6
      [(google.api.field_behavior) = IMMUTABLE];

  // Immutable. Enables the import of campaign data from Display & Video 360.
  // If this field is not set on create, it will be defaulted to true.
  google.protobuf.BoolValue campaign_data_sharing_enabled = 7
      [(google.api.field_behavior) = IMMUTABLE];

  // Immutable. Enables the import of cost data from Display & Video 360.
  // This can only be enabled if campaign_data_sharing_enabled is enabled.
  // If this field is not set on create, it will be defaulted to true.
  google.protobuf.BoolValue cost_data_sharing_enabled = 8
      [(google.api.field_behavior) = IMMUTABLE];
}

// A link between a GA4 property and a Search Ads 360 entity.
message SearchAds360Link {
  option (google.api.resource) = {
    type: "analyticsadmin.googleapis.com/SearchAds360Link"
    pattern: "properties/{property}/searchAds360Links/{search_ads_360_link}"
  };

  // Output only. The resource name for this SearchAds360Link resource.
  // Format: properties/{propertyId}/searchAds360Links/{linkId}
  //
  // Note: linkId is not the Search Ads 360 advertiser ID
  string name = 1 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Immutable. This field represents the Advertiser ID of the Search Ads 360
  // Advertiser. that has been linked.
  string advertiser_id = 2 [(google.api.field_behavior) = IMMUTABLE];

  // Immutable. Enables the import of campaign data from Search Ads 360 into the
  // GA4 property. After link creation, this can only be updated from the Search
  // Ads 360 product.
  // If this field is not set on create, it will be defaulted to true.
  google.protobuf.BoolValue campaign_data_sharing_enabled = 3
      [(google.api.field_behavior) = IMMUTABLE];

  // Immutable. Enables the import of cost data from Search Ads 360 to the GA4
  // property. This can only be enabled if campaign_data_sharing_enabled is
  // enabled. After link creation, this can only be updated from
  // the Search Ads 360 product.
  // If this field is not set on create, it will be defaulted to true.
  google.protobuf.BoolValue cost_data_sharing_enabled = 4
      [(google.api.field_behavior) = IMMUTABLE];

  // Output only. The display name of the Search Ads 360 Advertiser.
  // Allows users to easily identify the linked resource.
  string advertiser_display_name = 5
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Enables personalized advertising features with this integration.
  // If this field is not set on create, it will be defaulted to true.
  google.protobuf.BoolValue ads_personalization_enabled = 6;

  // Enables export of site stats with this integration.
  // If this field is not set on create, it will be defaulted to true.
  google.protobuf.BoolValue site_stats_sharing_enabled = 7;
}

// Status information for a link proposal.
message LinkProposalStatusDetails {
  // Output only. The source of this proposal.
  LinkProposalInitiatingProduct link_proposal_initiating_product = 1
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The email address of the user that proposed this linkage.
  string requestor_email = 2 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The state of this proposal.
  LinkProposalState link_proposal_state = 3
      [(google.api.field_behavior) = OUTPUT_ONLY];
}

// A conversion event in a Google Analytics property.
message ConversionEvent {
  option (google.api.resource) = {
    type: "analyticsadmin.googleapis.com/ConversionEvent"
    pattern: "properties/{property}/conversionEvents/{conversion_event}"
  };

  // Defines a default value/currency for a conversion event. Both value and
  // currency must be provided.
  message DefaultConversionValue {
    // This value will be used to populate the value for all conversions
    // of the specified event_name where the event "value" parameter is unset.
    optional double value = 1;

    // When a conversion event for this event_name has no set currency,
    // this currency will be applied as the default. Must be in ISO 4217
    // currency code format. See https://en.wikipedia.org/wiki/ISO_4217 for
    // more information.
    optional string currency_code = 2;
  }

  // The method by which conversions will be counted across multiple events
  // within a session.
  enum ConversionCountingMethod {
    // Counting method not specified.
    CONVERSION_COUNTING_METHOD_UNSPECIFIED = 0;

    // Each Event instance is considered a Conversion.
    ONCE_PER_EVENT = 1;

    // An Event instance is considered a Conversion at most once per session per
    // user.
    ONCE_PER_SESSION = 2;
  }

  // Output only. Resource name of this conversion event.
  // Format: properties/{property}/conversionEvents/{conversion_event}
  string name = 1 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Immutable. The event name for this conversion event.
  // Examples: 'click', 'purchase'
  string event_name = 2 [(google.api.field_behavior) = IMMUTABLE];

  // Output only. Time when this conversion event was created in the property.
  google.protobuf.Timestamp create_time = 3
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. If set, this event can currently be deleted with
  // DeleteConversionEvent.
  bool deletable = 4 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. If set to true, this conversion event refers to a custom
  // event.  If set to false, this conversion event refers to a default event in
  // GA. Default events typically have special meaning in GA. Default events are
  // usually created for you by the GA system, but in some cases can be created
  // by property admins. Custom events count towards the maximum number of
  // custom conversion events that may be created per property.
  bool custom = 5 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Optional. The method by which conversions will be counted across multiple
  // events within a session. If this value is not provided, it will be set to
  // `ONCE_PER_EVENT`.
  ConversionCountingMethod counting_method = 6
      [(google.api.field_behavior) = OPTIONAL];

  // Optional. Defines a default value/currency for a conversion event.
  optional DefaultConversionValue default_conversion_value = 7
      [(google.api.field_behavior) = OPTIONAL];
}

// Settings values for Google Signals.  This is a singleton resource.
message GoogleSignalsSettings {
  option (google.api.resource) = {
    type: "analyticsadmin.googleapis.com/GoogleSignalsSettings"
    pattern: "properties/{property}/googleSignalsSettings"
  };

  // Output only. Resource name of this setting.
  // Format: properties/{property_id}/googleSignalsSettings
  // Example: "properties/1000/googleSignalsSettings"
  string name = 1 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Status of this setting.
  GoogleSignalsState state = 3;

  // Output only. Terms of Service acceptance.
  GoogleSignalsConsent consent = 4 [(google.api.field_behavior) = OUTPUT_ONLY];
}

// A definition for a CustomDimension.
message CustomDimension {
  option (google.api.resource) = {
    type: "analyticsadmin.googleapis.com/CustomDimension"
    pattern: "properties/{property}/customDimensions/{custom_dimension}"
  };

  // Valid values for the scope of this dimension.
  enum DimensionScope {
    // Scope unknown or not specified.
    DIMENSION_SCOPE_UNSPECIFIED = 0;

    // Dimension scoped to an event.
    EVENT = 1;

    // Dimension scoped to a user.
    USER = 2;

    // Dimension scoped to eCommerce items
    ITEM = 3;
  }

  // Output only. Resource name for this CustomDimension resource.
  // Format: properties/{property}/customDimensions/{customDimension}
  string name = 1 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Required. Immutable. Tagging parameter name for this custom dimension.
  //
  // If this is a user-scoped dimension, then this is the user property name.
  // If this is an event-scoped dimension, then this is the event parameter
  // name.
  //
  // If this is an item-scoped dimension, then this is the parameter
  // name found in the eCommerce items array.
  //
  // May only contain alphanumeric and underscore characters, starting with a
  // letter. Max length of 24 characters for user-scoped dimensions, 40
  // characters for event-scoped dimensions.
  string parameter_name = 2 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.field_behavior) = IMMUTABLE
  ];

  // Required. Display name for this custom dimension as shown in the Analytics
  // UI. Max length of 82 characters, alphanumeric plus space and underscore
  // starting with a letter. Legacy system-generated display names may contain
  // square brackets, but updates to this field will never permit square
  // brackets.
  string display_name = 3 [(google.api.field_behavior) = REQUIRED];

  // Optional. Description for this custom dimension. Max length of 150
  // characters.
  string description = 4 [(google.api.field_behavior) = OPTIONAL];

  // Required. Immutable. The scope of this dimension.
  DimensionScope scope = 5 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.field_behavior) = IMMUTABLE
  ];

  // Optional. If set to true, sets this dimension as NPA and excludes it from
  // ads personalization.
  //
  // This is currently only supported by user-scoped custom dimensions.
  bool disallow_ads_personalization = 6
      [(google.api.field_behavior) = OPTIONAL];
}

// A definition for a custom metric.
message CustomMetric {
  option (google.api.resource) = {
    type: "analyticsadmin.googleapis.com/CustomMetric"
    pattern: "properties/{property}/customMetrics/{custom_metric}"
  };

  // Possible types of representing the custom metric's value.
  //
  // Currency representation may change in the future, requiring a breaking API
  // change.
  enum MeasurementUnit {
    // MeasurementUnit unspecified or missing.
    MEASUREMENT_UNIT_UNSPECIFIED = 0;

    // This metric uses default units.
    STANDARD = 1;

    // This metric measures a currency.
    CURRENCY = 2;

    // This metric measures feet.
    FEET = 3;

    // This metric measures meters.
    METERS = 4;

    // This metric measures kilometers.
    KILOMETERS = 5;

    // This metric measures miles.
    MILES = 6;

    // This metric measures milliseconds.
    MILLISECONDS = 7;

    // This metric measures seconds.
    SECONDS = 8;

    // This metric measures minutes.
    MINUTES = 9;

    // This metric measures hours.
    HOURS = 10;
  }

  // The scope of this metric.
  enum MetricScope {
    // Scope unknown or not specified.
    METRIC_SCOPE_UNSPECIFIED = 0;

    // Metric scoped to an event.
    EVENT = 1;
  }

  // Labels that mark the data in this custom metric as data that should be
  // restricted to specific users.
  enum RestrictedMetricType {
    // Type unknown or unspecified.
    RESTRICTED_METRIC_TYPE_UNSPECIFIED = 0;

    // Metric reports cost data.
    COST_DATA = 1;

    // Metric reports revenue data.
    REVENUE_DATA = 2;
  }

  // Output only. Resource name for this CustomMetric resource.
  // Format: properties/{property}/customMetrics/{customMetric}
  string name = 1 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Required. Immutable. Tagging name for this custom metric.
  //
  // If this is an event-scoped metric, then this is the event parameter
  // name.
  //
  // May only contain alphanumeric and underscore charactes, starting with a
  // letter. Max length of 40 characters for event-scoped metrics.
  string parameter_name = 2 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.field_behavior) = IMMUTABLE
  ];

  // Required. Display name for this custom metric as shown in the Analytics UI.
  // Max length of 82 characters, alphanumeric plus space and underscore
  // starting with a letter. Legacy system-generated display names may contain
  // square brackets, but updates to this field will never permit square
  // brackets.
  string display_name = 3 [(google.api.field_behavior) = REQUIRED];

  // Optional. Description for this custom dimension.
  // Max length of 150 characters.
  string description = 4 [(google.api.field_behavior) = OPTIONAL];

  // Required. The type for the custom metric's value.
  MeasurementUnit measurement_unit = 5 [(google.api.field_behavior) = REQUIRED];

  // Required. Immutable. The scope of this custom metric.
  MetricScope scope = 6 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.field_behavior) = IMMUTABLE
  ];

  // Optional. Types of restricted data that this metric may contain. Required
  // for metrics with CURRENCY measurement unit. Must be empty for metrics with
  // a non-CURRENCY measurement unit.
  repeated RestrictedMetricType restricted_metric_type = 8
      [(google.api.field_behavior) = OPTIONAL];
}

// A definition for a calculated metric.
message CalculatedMetric {
  option (google.api.resource) = {
    type: "analyticsadmin.googleapis.com/CalculatedMetric"
    pattern: "properties/{property}/calculatedMetrics/{calculated_metric}"
    plural: "calculatedMetrics"
    singular: "calculatedMetric"
  };

  // Possible types of representing the calculated metric's value.
  enum MetricUnit {
    // MetricUnit unspecified or missing.
    METRIC_UNIT_UNSPECIFIED = 0;

    // This metric uses default units.
    STANDARD = 1;

    // This metric measures a currency.
    CURRENCY = 2;

    // This metric measures feet.
    FEET = 3;

    // This metric measures miles.
    MILES = 4;

    // This metric measures meters.
    METERS = 5;

    // This metric measures kilometers.
    KILOMETERS = 6;

    // This metric measures milliseconds.
    MILLISECONDS = 7;

    // This metric measures seconds.
    SECONDS = 8;

    // This metric measures minutes.
    MINUTES = 9;

    // This metric measures hours.
    HOURS = 10;
  }

  // Labels that mark the data in calculated metric used in conjunction with
  // user roles that restrict access to cost and/or revenue metrics.
  enum RestrictedMetricType {
    // Type unknown or unspecified.
    RESTRICTED_METRIC_TYPE_UNSPECIFIED = 0;

    // Metric reports cost data.
    COST_DATA = 1;

    // Metric reports revenue data.
    REVENUE_DATA = 2;
  }

  // Output only. Resource name for this CalculatedMetric.
  // Format: 'properties/{property_id}/calculatedMetrics/{calculated_metric_id}'
  string name = 1 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Optional. Description for this calculated metric.
  // Max length of 4096 characters.
  string description = 2 [(google.api.field_behavior) = OPTIONAL];

  // Required. Display name for this calculated metric as shown in the
  // Google Analytics UI. Max length 82 characters.
  string display_name = 3 [(google.api.field_behavior) = REQUIRED];

  // Output only. The ID to use for the calculated metric. In the UI, this is
  // referred to as the "API name."
  //
  // The calculated_metric_id is used when referencing this calculated metric
  // from external APIs. For example, "calcMetric:{calculated_metric_id}".
  string calculated_metric_id = 4 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Required. The type for the calculated metric's value.
  MetricUnit metric_unit = 5 [(google.api.field_behavior) = REQUIRED];

  // Output only. Types of restricted data that this metric contains.
  repeated RestrictedMetricType restricted_metric_type = 6
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Required. The calculated metric's definition. Maximum number of unique
  // referenced custom metrics is 5. Formulas supports the following operations:
  // + (addition),  - (subtraction), - (negative),  * (multiplication), /
  // (division), () (parenthesis). Any valid real numbers are acceptable that
  // fit in a Long (64bit integer) or a Double (64 bit floating point number).
  // Example formula:
  //   "( customEvent:parameter_name + cartPurchaseQuantity ) / 2.0"
  string formula = 7 [(google.api.field_behavior) = REQUIRED];

  // Output only. If true, this calculated metric has a invalid metric
  // reference. Anything using a calculated metric with invalid_metric_reference
  // set to true may fail, produce warnings, or produce unexpected results.
  bool invalid_metric_reference = 9 [(google.api.field_behavior) = OUTPUT_ONLY];
}

// Settings values for data retention. This is a singleton resource.
message DataRetentionSettings {
  option (google.api.resource) = {
    type: "analyticsadmin.googleapis.com/DataRetentionSettings"
    pattern: "properties/{property}/dataRetentionSettings"
  };

  // Valid values for the data retention duration.
  enum RetentionDuration {
    // Data retention time duration is not specified.
    RETENTION_DURATION_UNSPECIFIED = 0;

    // The data retention time duration is 2 months.
    TWO_MONTHS = 1;

    // The data retention time duration is 14 months.
    FOURTEEN_MONTHS = 3;

    // The data retention time duration is 26 months.
    // Available to 360 properties only.
    TWENTY_SIX_MONTHS = 4;

    // The data retention time duration is 38 months.
    // Available to 360 properties only.
    THIRTY_EIGHT_MONTHS = 5;

    // The data retention time duration is 50 months.
    // Available to 360 properties only.
    FIFTY_MONTHS = 6;
  }

  // Output only. Resource name for this DataRetentionSetting resource.
  // Format: properties/{property}/dataRetentionSettings
  string name = 1 [(google.api.field_behavior) = OUTPUT_ONLY];

  // The length of time that event-level data is retained.
  RetentionDuration event_data_retention = 2;

  // If true, reset the retention period for the user identifier with every
  // event from that user.
  bool reset_user_data_on_new_activity = 3;
}

// The attribution settings used for a given property. This is a singleton
// resource.
message AttributionSettings {
  option (google.api.resource) = {
    type: "analyticsadmin.googleapis.com/AttributionSettings"
    pattern: "properties/{property}/attributionSettings"
  };

  // How far back in time events should be considered for inclusion in a
  // converting path which leads to the first install of an app or the first
  // visit to a site.
  enum AcquisitionConversionEventLookbackWindow {
    // Lookback window size unspecified.
    ACQUISITION_CONVERSION_EVENT_LOOKBACK_WINDOW_UNSPECIFIED = 0;

    // 7-day lookback window.
    ACQUISITION_CONVERSION_EVENT_LOOKBACK_WINDOW_7_DAYS = 1;

    // 30-day lookback window.
    ACQUISITION_CONVERSION_EVENT_LOOKBACK_WINDOW_30_DAYS = 2;
  }

  // How far back in time events should be considered for inclusion in a
  // converting path for all conversions other than first app install/first site
  // visit.
  enum OtherConversionEventLookbackWindow {
    // Lookback window size unspecified.
    OTHER_CONVERSION_EVENT_LOOKBACK_WINDOW_UNSPECIFIED = 0;

    // 30-day lookback window.
    OTHER_CONVERSION_EVENT_LOOKBACK_WINDOW_30_DAYS = 1;

    // 60-day lookback window.
    OTHER_CONVERSION_EVENT_LOOKBACK_WINDOW_60_DAYS = 2;

    // 90-day lookback window.
    OTHER_CONVERSION_EVENT_LOOKBACK_WINDOW_90_DAYS = 3;
  }

  // The reporting attribution model used to calculate conversion credit in this
  // property's reports.
  enum ReportingAttributionModel {
    // Reporting attribution model unspecified.
    REPORTING_ATTRIBUTION_MODEL_UNSPECIFIED = 0;

    // Data-driven attribution distributes credit for the conversion based on
    // data for each conversion event. Each Data-driven model is specific to
    // each advertiser and each conversion event.
    // Previously CROSS_CHANNEL_DATA_DRIVEN
    PAID_AND_ORGANIC_CHANNELS_DATA_DRIVEN = 1;

    // Ignores direct traffic and attributes 100% of the conversion value to the
    // last channel that the customer clicked through (or engaged view through
    // for YouTube) before converting.
    // Previously CROSS_CHANNEL_LAST_CLICK
    PAID_AND_ORGANIC_CHANNELS_LAST_CLICK = 2;

    // Attributes 100% of the conversion value to the last Google Paid channel
    // that the customer clicked through before converting.
    // Previously ADS_PREFERRED_LAST_CLICK
    GOOGLE_PAID_CHANNELS_LAST_CLICK = 7;
  }

  // The Conversion Export Scope for data exported to linked Ads Accounts.
  enum AdsWebConversionDataExportScope {
    // Default value. This value is unused.
    ADS_WEB_CONVERSION_DATA_EXPORT_SCOPE_UNSPECIFIED = 0;

    // No data export scope selected yet.
    // Export scope can never be changed back to this value.
    NOT_SELECTED_YET = 1;

    // Paid and organic channels are eligible to receive conversion credit, but
    // only credit assigned to Google Ads channels will appear in your Ads
    // accounts. To learn more, see [Paid and Organic
    // channels](https://support.google.com/analytics/answer/10632359).
    PAID_AND_ORGANIC_CHANNELS = 2;

    // Only Google Ads paid channels are eligible to receive conversion credit.
    // To learn more, see [Google Paid
    // channels](https://support.google.com/analytics/answer/10632359).
    GOOGLE_PAID_CHANNELS = 3;
  }

  // Output only. Resource name of this attribution settings resource.
  // Format: properties/{property_id}/attributionSettings
  // Example: "properties/1000/attributionSettings"
  string name = 1 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Required. The lookback window configuration for acquisition conversion
  // events. The default window size is 30 days.
  AcquisitionConversionEventLookbackWindow
      acquisition_conversion_event_lookback_window = 2
      [(google.api.field_behavior) = REQUIRED];

  // Required. The lookback window for all other, non-acquisition conversion
  // events. The default window size is 90 days.
  OtherConversionEventLookbackWindow other_conversion_event_lookback_window = 3
      [(google.api.field_behavior) = REQUIRED];

  // Required. The reporting attribution model used to calculate conversion
  // credit in this property's reports.
  //
  // Changing the attribution model will apply to both historical and future
  // data. These changes will be reflected in reports with conversion and
  // revenue data. User and session data will be unaffected.
  ReportingAttributionModel reporting_attribution_model = 4
      [(google.api.field_behavior) = REQUIRED];

  // Required. The Conversion Export Scope for data exported to linked Ads
  // Accounts.
  AdsWebConversionDataExportScope ads_web_conversion_data_export_scope = 5
      [(google.api.field_behavior) = REQUIRED];
}

// A binding of a user to a set of roles.
message AccessBinding {
  option (google.api.resource) = {
    type: "analyticsadmin.googleapis.com/AccessBinding"
    pattern: "accounts/{account}/accessBindings/{access_binding}"
    pattern: "properties/{property}/accessBindings/{access_binding}"
  };

  // The target for which to set roles for.
  oneof access_target {
    // If set, the email address of the user to set roles for.
    // Format: "someuser@gmail.com"
    string user = 2;
  }

  // Output only. Resource name of this binding.
  //
  // Format: accounts/{account}/accessBindings/{access_binding} or
  // properties/{property}/accessBindings/{access_binding}
  //
  // Example:
  // "accounts/100/accessBindings/200"
  string name = 1 [(google.api.field_behavior) = OUTPUT_ONLY];

  // A list of roles for to grant to the parent resource.
  //
  // Valid values:
  // predefinedRoles/viewer
  // predefinedRoles/analyst
  // predefinedRoles/editor
  // predefinedRoles/admin
  // predefinedRoles/no-cost-data
  // predefinedRoles/no-revenue-data
  //
  // For users, if an empty list of roles is set, this AccessBinding will be
  // deleted.
  repeated string roles = 3;
}

// A link between a GA4 Property and BigQuery project.
message BigQueryLink {
  option (google.api.resource) = {
    type: "analyticsadmin.googleapis.com/BigQueryLink"
    pattern: "properties/{property}/bigQueryLinks/{bigquery_link}"
  };

  // Output only. Resource name of this BigQuery link.
  // Format: 'properties/{property_id}/bigQueryLinks/{bigquery_link_id}'
  // Format: 'properties/1234/bigQueryLinks/abc567'
  string name = 1 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Immutable. The linked Google Cloud project. When creating a BigQueryLink,
  // you may provide this resource name using either a project number or project
  // ID. Once this resource has been created, the returned project will always
  // have a project that contains a project number.
  // Format: 'projects/{project number}'
  // Example: 'projects/1234'
  string project = 2 [(google.api.field_behavior) = IMMUTABLE];

  // Output only. Time when the link was created.
  google.protobuf.Timestamp create_time = 3
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // If set true, enables daily data export to the linked Google Cloud project.
  bool daily_export_enabled = 4;

  // If set true, enables streaming export to the linked Google Cloud project.
  bool streaming_export_enabled = 5;

  // If set true, enables fresh daily export to the linked Google Cloud project.
  bool fresh_daily_export_enabled = 9;

  // If set true, exported data will include advertising identifiers for mobile
  // app streams.
  bool include_advertising_id = 6;

  // The list of streams under the parent property for which data will be
  // exported.
  // Format: properties/{property_id}/dataStreams/{stream_id}
  // Example: ['properties/1000/dataStreams/2000']
  repeated string export_streams = 7;

  // The list of event names that will be excluded from exports.
  repeated string excluded_events = 8;
}

// Singleton resource under a web DataStream, configuring measurement of
// additional site interactions and content.
message EnhancedMeasurementSettings {
  option (google.api.resource) = {
    type: "analyticsadmin.googleapis.com/EnhancedMeasurementSettings"
    pattern: "properties/{property}/dataStreams/{data_stream}/enhancedMeasurementSettings"
  };

  // Output only. Resource name of the Enhanced Measurement Settings.
  // Format:
  // properties/{property_id}/dataStreams/{data_stream}/enhancedMeasurementSettings
  // Example: "properties/1000/dataStreams/2000/enhancedMeasurementSettings"
  string name = 1 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Indicates whether Enhanced Measurement Settings will be used to
  // automatically measure interactions and content on this web stream.
  //
  // Changing this value does not affect the settings themselves, but determines
  // whether they are respected.
  bool stream_enabled = 2;

  // If enabled, capture scroll events each time a visitor gets to the bottom of
  // a page.
  bool scrolls_enabled = 3;

  // If enabled, capture an outbound click event each time a visitor clicks a
  // link that leads them away from your domain.
  bool outbound_clicks_enabled = 4;

  // If enabled, capture a view search results event each time a visitor
  // performs a search on your site (based on a query parameter).
  bool site_search_enabled = 5;

  // If enabled, capture video play, progress, and complete events as visitors
  // view embedded videos on your site.
  bool video_engagement_enabled = 6;

  // If enabled, capture a file download event each time a link is clicked with
  // a common document, compressed file, application, video, or audio extension.
  bool file_downloads_enabled = 7;

  // If enabled, capture a page view event each time the website changes the
  // browser history state.
  bool page_changes_enabled = 8;

  // If enabled, capture a form interaction event each time a visitor interacts
  // with a form on your website.
  // False by default.
  bool form_interactions_enabled = 9;

  // Required. URL query parameters to interpret as site search parameters.
  // Max length is 1024 characters. Must not be empty.
  string search_query_parameter = 10 [(google.api.field_behavior) = REQUIRED];

  // Additional URL query parameters.
  // Max length is 1024 characters.
  string uri_query_parameter = 11;
}

// Configuration for a specific Connected Site Tag.
message ConnectedSiteTag {
  // Required. User-provided display name for the connected site tag. Must be
  // less than 256 characters.
  string display_name = 1 [(google.api.field_behavior) = REQUIRED];

  // Required. "Tag ID to forward events to. Also known as the Measurement ID,
  // or the "G-ID"  (For example: G-12345).
  string tag_id = 2 [(google.api.field_behavior) = REQUIRED];
}

// Settings for client-side data redaction. Singleton resource under a Web
// Stream.
message DataRedactionSettings {
  option (google.api.resource) = {
    type: "analyticsadmin.googleapis.com/DataRedactionSettings"
    pattern: "properties/{property}/dataStreams/{data_stream}/dataRedactionSettings"
  };

  // Output only. Name of this Data Redaction Settings resource.
  // Format:
  // properties/{property_id}/dataStreams/{data_stream}/dataRedactionSettings
  // Example: "properties/1000/dataStreams/2000/dataRedactionSettings"
  string name = 1 [(google.api.field_behavior) = OUTPUT_ONLY];

  // If enabled, any event parameter or user property values that look like an
  // email will be redacted.
  bool email_redaction_enabled = 2;

  // Query Parameter redaction removes the key and value portions of a
  // query parameter if it is in the configured set of query parameters.
  //
  // If enabled, URL query replacement logic will be run for the Stream. Any
  // query parameters defined in query_parameter_keys will be redacted.
  bool query_parameter_redaction_enabled = 3;

  // The query parameter keys to apply redaction logic to if present in the URL.
  // Query parameter matching is case-insensitive.
  //
  // Must contain at least one element if query_parameter_replacement_enabled
  // is true. Keys cannot contain commas.
  repeated string query_parameter_keys = 4;
}

// A link between a GA4 Property and an AdSense for Content ad client.
message AdSenseLink {
  option (google.api.resource) = {
    type: "analyticsadmin.googleapis.com/AdSenseLink"
    pattern: "properties/{property}/adSenseLinks/{adsense_link}"
  };

  // Output only. The resource name for this AdSense Link resource.
  // Format: properties/{propertyId}/adSenseLinks/{linkId}
  // Example: properties/1234/adSenseLinks/6789
  string name = 1 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Immutable. The AdSense ad client code that the GA4 property is linked to.
  // Example format: "ca-pub-1234567890"
  string ad_client_code = 2 [(google.api.field_behavior) = IMMUTABLE];
}

// A link that references a source property under the parent rollup property.
message RollupPropertySourceLink {
  option (google.api.resource) = {
    type: "analyticsadmin.googleapis.com/RollupPropertySourceLink"
    pattern: "properties/{property}/rollupPropertySourceLinks/{rollup_property_source_link}"
    plural: "rollupPropertySourceLinks"
    singular: "rollupPropertySourceLink"
  };

  // Output only. Resource name of this RollupPropertySourceLink.
  // Format:
  // 'properties/{property_id}/rollupPropertySourceLinks/{rollup_property_source_link}'
  // Format: 'properties/123/rollupPropertySourceLinks/456'
  string name = 1 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Immutable. Resource name of the source property.
  // Format: properties/{property_id}
  // Example: "properties/789"
  string source_property = 2 [(google.api.field_behavior) = IMMUTABLE];
}
