// Copyright 2021 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/resources.proto";
import "google/api/annotations.proto";
import "google/api/client.proto";
import "google/api/field_behavior.proto";
import "google/api/resource.proto";
import "google/protobuf/empty.proto";
import "google/protobuf/field_mask.proto";
import "google/protobuf/timestamp.proto";

option go_package = "google.golang.org/genproto/googleapis/analytics/admin/v1alpha;admin";
option java_multiple_files = true;
option java_outer_classname = "AnalyticsAdminProto";
option java_package = "com.google.analytics.admin.v1alpha";

// Service Interface for the Analytics Admin API (GA4).
service AnalyticsAdminService {
  option (google.api.default_host) = "analyticsadmin.googleapis.com";
  option (google.api.oauth_scopes) =
      "https://www.googleapis.com/auth/analytics.edit,"
      "https://www.googleapis.com/auth/analytics.manage.users,"
      "https://www.googleapis.com/auth/analytics.manage.users.readonly,"
      "https://www.googleapis.com/auth/analytics.readonly";

  // Lookup for a single Account.
  rpc GetAccount(GetAccountRequest) returns (Account) {
    option (google.api.http) = {
      get: "/v1alpha/{name=accounts/*}"
    };
    option (google.api.method_signature) = "name";
  }

  // Returns all accounts accessible by the caller.
  //
  // Note that these accounts might not currently have GA4 properties.
  // Soft-deleted (ie: "trashed") accounts are excluded by default.
  // Returns an empty list if no relevant accounts are found.
  rpc ListAccounts(ListAccountsRequest) returns (ListAccountsResponse) {
    option (google.api.http) = {
      get: "/v1alpha/accounts"
    };
  }

  // Marks target Account as soft-deleted (ie: "trashed") and returns it.
  //
  // This API does not have a method to restore soft-deleted accounts.
  // However, they can be restored using the Trash Can UI.
  //
  // If the accounts are not restored before the expiration time, the account
  // and all child resources (eg: Properties, GoogleAdsLinks, Streams,
  // UserLinks) will be permanently purged.
  // https://support.google.com/analytics/answer/6154772
  //
  // Returns an error if the target is not found.
  rpc DeleteAccount(DeleteAccountRequest) returns (google.protobuf.Empty) {
    option (google.api.http) = {
      delete: "/v1alpha/{name=accounts/*}"
    };
    option (google.api.method_signature) = "name";
  }

  // Updates an account.
  rpc UpdateAccount(UpdateAccountRequest) returns (Account) {
    option (google.api.http) = {
      patch: "/v1alpha/{account.name=accounts/*}"
      body: "account"
    };
    option (google.api.method_signature) = "account,update_mask";
  }

  // Requests a ticket for creating an account.
  rpc ProvisionAccountTicket(ProvisionAccountTicketRequest) returns (ProvisionAccountTicketResponse) {
    option (google.api.http) = {
      post: "/v1alpha/accounts:provisionAccountTicket"
      body: "*"
    };
  }

  // Returns summaries of all accounts accessible by the caller.
  rpc ListAccountSummaries(ListAccountSummariesRequest) returns (ListAccountSummariesResponse) {
    option (google.api.http) = {
      get: "/v1alpha/accountSummaries"
    };
  }

  // Lookup for a single "GA4" Property.
  rpc GetProperty(GetPropertyRequest) returns (Property) {
    option (google.api.http) = {
      get: "/v1alpha/{name=properties/*}"
    };
    option (google.api.method_signature) = "name";
  }

  // Returns child Properties under the specified parent Account.
  //
  // Only "GA4" properties will be returned.
  // Properties will be excluded if the caller does not have access.
  // Soft-deleted (ie: "trashed") properties are excluded by default.
  // Returns an empty list if no relevant properties are found.
  rpc ListProperties(ListPropertiesRequest) returns (ListPropertiesResponse) {
    option (google.api.http) = {
      get: "/v1alpha/properties"
    };
  }

  // Creates an "GA4" property with the specified location and attributes.
  rpc CreateProperty(CreatePropertyRequest) returns (Property) {
    option (google.api.http) = {
      post: "/v1alpha/properties"
      body: "property"
    };
    option (google.api.method_signature) = "property";
  }

  // Marks target Property as soft-deleted (ie: "trashed") and returns it.
  //
  // This API does not have a method to restore soft-deleted properties.
  // However, they can be restored using the Trash Can UI.
  //
  // If the properties are not restored before the expiration time, the Property
  // and all child resources (eg: GoogleAdsLinks, Streams, UserLinks)
  // will be permanently purged.
  // https://support.google.com/analytics/answer/6154772
  //
  // Returns an error if the target is not found, or is not an GA4 Property.
  rpc DeleteProperty(DeletePropertyRequest) returns (Property) {
    option (google.api.http) = {
      delete: "/v1alpha/{name=properties/*}"
    };
    option (google.api.method_signature) = "name";
  }

  // Updates a property.
  rpc UpdateProperty(UpdatePropertyRequest) returns (Property) {
    option (google.api.http) = {
      patch: "/v1alpha/{property.name=properties/*}"
      body: "property"
    };
    option (google.api.method_signature) = "property,update_mask";
  }

  // Gets information about a user's link to an account or property.
  rpc GetUserLink(GetUserLinkRequest) returns (UserLink) {
    option (google.api.http) = {
      get: "/v1alpha/{name=accounts/*/userLinks/*}"
      additional_bindings {
        get: "/v1alpha/{name=properties/*/userLinks/*}"
      }
    };
    option (google.api.method_signature) = "name";
  }

  // Gets information about multiple users' links to an account or property.
  rpc BatchGetUserLinks(BatchGetUserLinksRequest) returns (BatchGetUserLinksResponse) {
    option (google.api.http) = {
      get: "/v1alpha/{parent=accounts/*}/userLinks:batchGet"
      additional_bindings {
        get: "/v1alpha/{parent=properties/*}/userLinks:batchGet"
      }
    };
  }

  // Lists all user links on an account or property.
  rpc ListUserLinks(ListUserLinksRequest) returns (ListUserLinksResponse) {
    option (google.api.http) = {
      get: "/v1alpha/{parent=accounts/*}/userLinks"
      additional_bindings {
        get: "/v1alpha/{parent=properties/*}/userLinks"
      }
    };
    option (google.api.method_signature) = "parent";
  }

  // Lists all user links on an account or property, including implicit ones
  // that come from effective permissions granted by groups or organization
  // admin roles.
  //
  // If a returned user link does not have direct permissions, they cannot
  // be removed from the account or property directly with the DeleteUserLink
  // command. They have to be removed from the group/etc that gives them
  // permissions, which is currently only usable/discoverable in the GA or GMP
  // UIs.
  rpc AuditUserLinks(AuditUserLinksRequest) returns (AuditUserLinksResponse) {
    option (google.api.http) = {
      post: "/v1alpha/{parent=accounts/*}/userLinks:audit"
      body: "*"
      additional_bindings {
        post: "/v1alpha/{parent=properties/*}/userLinks:audit"
        body: "*"
      }
    };
  }

  // Creates a user link on an account or property.
  //
  // If the user with the specified email already has permissions on the
  // account or property, then the user's existing permissions will be unioned
  // with the permissions specified in the new UserLink.
  rpc CreateUserLink(CreateUserLinkRequest) returns (UserLink) {
    option (google.api.http) = {
      post: "/v1alpha/{parent=accounts/*}/userLinks"
      body: "user_link"
      additional_bindings {
        post: "/v1alpha/{parent=properties/*}/userLinks"
        body: "user_link"
      }
    };
    option (google.api.method_signature) = "parent,user_link";
  }

  // Creates information about multiple users' links to an account or property.
  //
  // This method is transactional. If any UserLink cannot be created, none of
  // the UserLinks will be created.
  rpc BatchCreateUserLinks(BatchCreateUserLinksRequest) returns (BatchCreateUserLinksResponse) {
    option (google.api.http) = {
      post: "/v1alpha/{parent=accounts/*}/userLinks:batchCreate"
      body: "*"
      additional_bindings {
        post: "/v1alpha/{parent=properties/*}/userLinks:batchCreate"
        body: "*"
      }
    };
  }

  // Updates a user link on an account or property.
  rpc UpdateUserLink(UpdateUserLinkRequest) returns (UserLink) {
    option (google.api.http) = {
      patch: "/v1alpha/{user_link.name=accounts/*/userLinks/*}"
      body: "user_link"
      additional_bindings {
        patch: "/v1alpha/{user_link.name=properties/*/userLinks/*}"
        body: "user_link"
      }
    };
    option (google.api.method_signature) = "user_link";
  }

  // Updates information about multiple users' links to an account or property.
  rpc BatchUpdateUserLinks(BatchUpdateUserLinksRequest) returns (BatchUpdateUserLinksResponse) {
    option (google.api.http) = {
      post: "/v1alpha/{parent=accounts/*}/userLinks:batchUpdate"
      body: "*"
      additional_bindings {
        post: "/v1alpha/{parent=properties/*}/userLinks:batchUpdate"
        body: "*"
      }
    };
  }

  // Deletes a user link on an account or property.
  rpc DeleteUserLink(DeleteUserLinkRequest) returns (google.protobuf.Empty) {
    option (google.api.http) = {
      delete: "/v1alpha/{name=accounts/*/userLinks/*}"
      additional_bindings {
        delete: "/v1alpha/{name=properties/*/userLinks/*}"
      }
    };
    option (google.api.method_signature) = "name";
  }

  // Deletes information about multiple users' links to an account or property.
  rpc BatchDeleteUserLinks(BatchDeleteUserLinksRequest) returns (google.protobuf.Empty) {
    option (google.api.http) = {
      post: "/v1alpha/{parent=accounts/*}/userLinks:batchDelete"
      body: "*"
      additional_bindings {
        post: "/v1alpha/{parent=properties/*}/userLinks:batchDelete"
        body: "*"
      }
    };
  }

  // Lookup for a single WebDataStream
  rpc GetWebDataStream(GetWebDataStreamRequest) returns (WebDataStream) {
    option (google.api.http) = {
      get: "/v1alpha/{name=properties/*/webDataStreams/*}"
    };
    option (google.api.method_signature) = "name";
  }

  // Deletes a web stream on a property.
  rpc DeleteWebDataStream(DeleteWebDataStreamRequest) returns (google.protobuf.Empty) {
    option (google.api.http) = {
      delete: "/v1alpha/{name=properties/*/webDataStreams/*}"
    };
    option (google.api.method_signature) = "name";
  }

  // Updates a web stream on a property.
  rpc UpdateWebDataStream(UpdateWebDataStreamRequest) returns (WebDataStream) {
    option (google.api.http) = {
      patch: "/v1alpha/{web_data_stream.name=properties/*/webDataStreams/*}"
      body: "web_data_stream"
    };
    option (google.api.method_signature) = "web_data_stream,update_mask";
  }

  // Creates a web stream with the specified location and attributes.
  rpc CreateWebDataStream(CreateWebDataStreamRequest) returns (WebDataStream) {
    option (google.api.http) = {
      post: "/v1alpha/{parent=properties/*}/webDataStreams"
      body: "web_data_stream"
    };
    option (google.api.method_signature) = "parent,web_data_stream";
  }

  // Returns child web data streams under the specified parent property.
  //
  // Web data streams will be excluded if the caller does not have access.
  // Returns an empty list if no relevant web data streams are found.
  rpc ListWebDataStreams(ListWebDataStreamsRequest) returns (ListWebDataStreamsResponse) {
    option (google.api.http) = {
      get: "/v1alpha/{parent=properties/*}/webDataStreams"
    };
    option (google.api.method_signature) = "parent";
  }

  // Lookup for a single IosAppDataStream
  rpc GetIosAppDataStream(GetIosAppDataStreamRequest) returns (IosAppDataStream) {
    option (google.api.http) = {
      get: "/v1alpha/{name=properties/*/iosAppDataStreams/*}"
    };
    option (google.api.method_signature) = "name";
  }

  // Deletes an iOS app stream on a property.
  rpc DeleteIosAppDataStream(DeleteIosAppDataStreamRequest) returns (google.protobuf.Empty) {
    option (google.api.http) = {
      delete: "/v1alpha/{name=properties/*/iosAppDataStreams/*}"
    };
    option (google.api.method_signature) = "name";
  }

  // Updates an iOS app stream on a property.
  rpc UpdateIosAppDataStream(UpdateIosAppDataStreamRequest) returns (IosAppDataStream) {
    option (google.api.http) = {
      patch: "/v1alpha/{ios_app_data_stream.name=properties/*/iosAppDataStreams/*}"
      body: "ios_app_data_stream"
    };
    option (google.api.method_signature) = "ios_app_data_stream,update_mask";
  }

  // Returns child iOS app data streams under the specified parent property.
  //
  // iOS app data streams will be excluded if the caller does not have access.
  // Returns an empty list if no relevant iOS app data streams are found.
  rpc ListIosAppDataStreams(ListIosAppDataStreamsRequest) returns (ListIosAppDataStreamsResponse) {
    option (google.api.http) = {
      get: "/v1alpha/{parent=properties/*}/iosAppDataStreams"
    };
    option (google.api.method_signature) = "parent";
  }

  // Lookup for a single AndroidAppDataStream
  rpc GetAndroidAppDataStream(GetAndroidAppDataStreamRequest) returns (AndroidAppDataStream) {
    option (google.api.http) = {
      get: "/v1alpha/{name=properties/*/androidAppDataStreams/*}"
    };
    option (google.api.method_signature) = "name";
  }

  // Deletes an android app stream on a property.
  rpc DeleteAndroidAppDataStream(DeleteAndroidAppDataStreamRequest) returns (google.protobuf.Empty) {
    option (google.api.http) = {
      delete: "/v1alpha/{name=properties/*/androidAppDataStreams/*}"
    };
    option (google.api.method_signature) = "name";
  }

  // Updates an android app stream on a property.
  rpc UpdateAndroidAppDataStream(UpdateAndroidAppDataStreamRequest) returns (AndroidAppDataStream) {
    option (google.api.http) = {
      patch: "/v1alpha/{android_app_data_stream.name=properties/*/androidAppDataStreams/*}"
      body: "android_app_data_stream"
    };
    option (google.api.method_signature) = "android_app_data_stream,update_mask";
  }

  // Returns child android app streams under the specified parent property.
  //
  // Android app streams will be excluded if the caller does not have access.
  // Returns an empty list if no relevant android app streams are found.
  rpc ListAndroidAppDataStreams(ListAndroidAppDataStreamsRequest) returns (ListAndroidAppDataStreamsResponse) {
    option (google.api.http) = {
      get: "/v1alpha/{parent=properties/*}/androidAppDataStreams"
    };
    option (google.api.method_signature) = "parent";
  }

  // Returns the singleton enhanced measurement settings for this web stream.
  // Note that the stream must enable enhanced measurement for these settings to
  // take effect.
  rpc GetEnhancedMeasurementSettings(GetEnhancedMeasurementSettingsRequest) returns (EnhancedMeasurementSettings) {
    option (google.api.http) = {
      get: "/v1alpha/{name=properties/*/webDataStreams/*/enhancedMeasurementSettings}"
    };
    option (google.api.method_signature) = "name";
  }

  // Updates the singleton enhanced measurement settings for this web stream.
  // Note that the stream must enable enhanced measurement for these settings to
  // take effect.
  rpc UpdateEnhancedMeasurementSettings(UpdateEnhancedMeasurementSettingsRequest) returns (EnhancedMeasurementSettings) {
    option (google.api.http) = {
      patch: "/v1alpha/{enhanced_measurement_settings.name=properties/*/webDataStreams/*/enhancedMeasurementSettings}"
      body: "enhanced_measurement_settings"
    };
    option (google.api.method_signature) = "enhanced_measurement_settings,update_mask";
  }

  // Creates a FirebaseLink.
  //
  // Properties can have at most one FirebaseLink.
  rpc CreateFirebaseLink(CreateFirebaseLinkRequest) returns (FirebaseLink) {
    option (google.api.http) = {
      post: "/v1alpha/{parent=properties/*}/firebaseLinks"
      body: "firebase_link"
    };
    option (google.api.method_signature) = "parent,firebase_link";
  }

  // Updates a FirebaseLink on a property
  rpc UpdateFirebaseLink(UpdateFirebaseLinkRequest) returns (FirebaseLink) {
    option (google.api.http) = {
      patch: "/v1alpha/{firebase_link.name=properties/*/firebaseLinks/*}"
      body: "firebase_link"
    };
    option (google.api.method_signature) = "firebase_link,update_mask";
  }

  // Deletes a FirebaseLink on a property
  rpc DeleteFirebaseLink(DeleteFirebaseLinkRequest) returns (google.protobuf.Empty) {
    option (google.api.http) = {
      delete: "/v1alpha/{name=properties/*/firebaseLinks/*}"
    };
    option (google.api.method_signature) = "name";
  }

  // Lists FirebaseLinks on a property.
  // Properties can have at most one FirebaseLink.
  rpc ListFirebaseLinks(ListFirebaseLinksRequest) returns (ListFirebaseLinksResponse) {
    option (google.api.http) = {
      get: "/v1alpha/{parent=properties/*}/firebaseLinks"
    };
    option (google.api.method_signature) = "parent";
  }

  // Returns the Site Tag for the specified web stream.
  // Site Tags are immutable singletons.
  rpc GetGlobalSiteTag(GetGlobalSiteTagRequest) returns (GlobalSiteTag) {
    option (google.api.http) = {
      get: "/v1alpha/{name=properties/*/webDataStreams/*/globalSiteTag}"
    };
    option (google.api.method_signature) = "name";
  }

  // Creates a GoogleAdsLink.
  rpc CreateGoogleAdsLink(CreateGoogleAdsLinkRequest) returns (GoogleAdsLink) {
    option (google.api.http) = {
      post: "/v1alpha/{parent=properties/*}/googleAdsLinks"
      body: "google_ads_link"
    };
    option (google.api.method_signature) = "parent,google_ads_link";
  }

  // Updates a GoogleAdsLink on a property
  rpc UpdateGoogleAdsLink(UpdateGoogleAdsLinkRequest) returns (GoogleAdsLink) {
    option (google.api.http) = {
      patch: "/v1alpha/{google_ads_link.name=properties/*/googleAdsLinks/*}"
      body: "google_ads_link"
    };
    option (google.api.method_signature) = "google_ads_link,update_mask";
  }

  // Deletes a GoogleAdsLink on a property
  rpc DeleteGoogleAdsLink(DeleteGoogleAdsLinkRequest) returns (google.protobuf.Empty) {
    option (google.api.http) = {
      delete: "/v1alpha/{name=properties/*/googleAdsLinks/*}"
    };
    option (google.api.method_signature) = "name";
  }

  // Lists GoogleAdsLinks on a property.
  rpc ListGoogleAdsLinks(ListGoogleAdsLinksRequest) returns (ListGoogleAdsLinksResponse) {
    option (google.api.http) = {
      get: "/v1alpha/{parent=properties/*}/googleAdsLinks"
    };
    option (google.api.method_signature) = "parent";
  }

  // Get data sharing settings on an account.
  // Data sharing settings are singletons.
  rpc GetDataSharingSettings(GetDataSharingSettingsRequest) returns (DataSharingSettings) {
    option (google.api.http) = {
      get: "/v1alpha/{name=accounts/*/dataSharingSettings}"
    };
    option (google.api.method_signature) = "name";
  }

  // Lookup for a single "GA4" MeasurementProtocolSecret.
  rpc GetMeasurementProtocolSecret(GetMeasurementProtocolSecretRequest) returns (MeasurementProtocolSecret) {
    option (google.api.http) = {
      get: "/v1alpha/{name=properties/*/webDataStreams/*/measurementProtocolSecrets/*}"
      additional_bindings {
        get: "/v1alpha/{name=properties/*/iosAppDataStreams/*/measurementProtocolSecrets/*}"
      }
      additional_bindings {
        get: "/v1alpha/{name=properties/*/androidAppDataStreams/*/measurementProtocolSecrets/*}"
      }
    };
    option (google.api.method_signature) = "name";
  }

  // Returns child MeasurementProtocolSecrets under the specified parent
  // Property.
  rpc ListMeasurementProtocolSecrets(ListMeasurementProtocolSecretsRequest) returns (ListMeasurementProtocolSecretsResponse) {
    option (google.api.http) = {
      get: "/v1alpha/{parent=properties/*/webDataStreams/*}/measurementProtocolSecrets"
      additional_bindings {
        get: "/v1alpha/{parent=properties/*/iosAppDataStreams/*}/measurementProtocolSecrets"
      }
      additional_bindings {
        get: "/v1alpha/{parent=properties/*/androidAppDataStreams/*}/measurementProtocolSecrets"
      }
    };
    option (google.api.method_signature) = "parent";
  }

  // Creates a measurement protocol secret.
  rpc CreateMeasurementProtocolSecret(CreateMeasurementProtocolSecretRequest) returns (MeasurementProtocolSecret) {
    option (google.api.http) = {
      post: "/v1alpha/{parent=properties/*/webDataStreams/*}/measurementProtocolSecrets"
      body: "measurement_protocol_secret"
      additional_bindings {
        post: "/v1alpha/{parent=properties/*/iosAppDataStreams/*}/measurementProtocolSecrets"
        body: "measurement_protocol_secret"
      }
      additional_bindings {
        post: "/v1alpha/{parent=properties/*/androidAppDataStreams/*}/measurementProtocolSecrets"
        body: "measurement_protocol_secret"
      }
    };
    option (google.api.method_signature) = "parent,measurement_protocol_secret";
  }

  // Deletes target MeasurementProtocolSecret.
  rpc DeleteMeasurementProtocolSecret(DeleteMeasurementProtocolSecretRequest) returns (google.protobuf.Empty) {
    option (google.api.http) = {
      delete: "/v1alpha/{name=properties/*/webDataStreams/*/measurementProtocolSecrets/*}"
      additional_bindings {
        delete: "/v1alpha/{name=properties/*/iosAppDataStreams/*/measurementProtocolSecrets/*}"
      }
      additional_bindings {
        delete: "/v1alpha/{name=properties/*/androidAppDataStreams/*/measurementProtocolSecrets/*}"
      }
    };
    option (google.api.method_signature) = "name";
  }

  // Updates a measurement protocol secret.
  rpc UpdateMeasurementProtocolSecret(UpdateMeasurementProtocolSecretRequest) returns (MeasurementProtocolSecret) {
    option (google.api.http) = {
      patch: "/v1alpha/{measurement_protocol_secret.name=properties/*/webDataStreams/*/measurementProtocolSecrets/*}"
      body: "measurement_protocol_secret"
      additional_bindings {
        patch: "/v1alpha/{measurement_protocol_secret.name=properties/*/iosAppDataStreams/*/measurementProtocolSecrets/*}"
        body: "measurement_protocol_secret"
      }
      additional_bindings {
        patch: "/v1alpha/{measurement_protocol_secret.name=properties/*/androidAppDataStreams/*/measurementProtocolSecrets/*}"
        body: "measurement_protocol_secret"
      }
    };
    option (google.api.method_signature) = "measurement_protocol_secret,update_mask";
  }

  // Searches through all changes to an account or its children given the
  // specified set of filters.
  rpc SearchChangeHistoryEvents(SearchChangeHistoryEventsRequest) returns (SearchChangeHistoryEventsResponse) {
    option (google.api.http) = {
      post: "/v1alpha/{account=accounts/*}:searchChangeHistoryEvents"
      body: "*"
    };
  }

  // Lookup for Google Signals settings for a property.
  rpc GetGoogleSignalsSettings(GetGoogleSignalsSettingsRequest) returns (GoogleSignalsSettings) {
    option (google.api.http) = {
      get: "/v1alpha/{name=properties/*/googleSignalsSettings}"
    };
    option (google.api.method_signature) = "name";
  }

  // Updates Google Signals settings for a property.
  rpc UpdateGoogleSignalsSettings(UpdateGoogleSignalsSettingsRequest) returns (GoogleSignalsSettings) {
    option (google.api.http) = {
      patch: "/v1alpha/{google_signals_settings.name=properties/*/googleSignalsSettings}"
      body: "google_signals_settings"
    };
    option (google.api.method_signature) = "google_signals_settings,update_mask";
  }

  // Creates a conversion event with the specified attributes.
  rpc CreateConversionEvent(CreateConversionEventRequest) returns (ConversionEvent) {
    option (google.api.http) = {
      post: "/v1alpha/{parent=properties/*}/conversionEvents"
      body: "conversion_event"
    };
    option (google.api.method_signature) = "parent,conversion_event";
  }

  // Retrieve a single conversion event.
  rpc GetConversionEvent(GetConversionEventRequest) returns (ConversionEvent) {
    option (google.api.http) = {
      get: "/v1alpha/{name=properties/*/conversionEvents/*}"
    };
    option (google.api.method_signature) = "name";
  }

  // Deletes a conversion event in a property.
  rpc DeleteConversionEvent(DeleteConversionEventRequest) returns (google.protobuf.Empty) {
    option (google.api.http) = {
      delete: "/v1alpha/{name=properties/*/conversionEvents/*}"
    };
    option (google.api.method_signature) = "name";
  }

  // Returns a list of conversion events in the specified parent property.
  //
  // Returns an empty list if no conversion events are found.
  rpc ListConversionEvents(ListConversionEventsRequest) returns (ListConversionEventsResponse) {
    option (google.api.http) = {
      get: "/v1alpha/{parent=properties/*}/conversionEvents"
    };
    option (google.api.method_signature) = "parent";
  }

  // Creates a CustomDimension.
  rpc CreateCustomDimension(CreateCustomDimensionRequest) returns (CustomDimension) {
    option (google.api.http) = {
      post: "/v1alpha/{parent=properties/*}/customDimensions"
      body: "custom_dimension"
    };
    option (google.api.method_signature) = "parent,custom_dimension";
  }

  // Updates a CustomDimension on a property.
  rpc UpdateCustomDimension(UpdateCustomDimensionRequest) returns (CustomDimension) {
    option (google.api.http) = {
      patch: "/v1alpha/{custom_dimension.name=properties/*/customDimensions/*}"
      body: "custom_dimension"
    };
    option (google.api.method_signature) = "custom_dimension,update_mask";
  }

  // Lists CustomDimensions on a property.
  rpc ListCustomDimensions(ListCustomDimensionsRequest) returns (ListCustomDimensionsResponse) {
    option (google.api.http) = {
      get: "/v1alpha/{parent=properties/*}/customDimensions"
    };
    option (google.api.method_signature) = "parent";
  }

  // Archives a CustomDimension on a property.
  rpc ArchiveCustomDimension(ArchiveCustomDimensionRequest) returns (google.protobuf.Empty) {
    option (google.api.http) = {
      post: "/v1alpha/{name=properties/*/customDimensions/*}:archive"
      body: "*"
    };
    option (google.api.method_signature) = "name";
  }

  // Lookup for a single CustomDimension.
  rpc GetCustomDimension(GetCustomDimensionRequest) returns (CustomDimension) {
    option (google.api.http) = {
      get: "/v1alpha/{name=properties/*/customDimensions/*}"
    };
    option (google.api.method_signature) = "name";
  }

  // Creates a CustomMetric.
  rpc CreateCustomMetric(CreateCustomMetricRequest) returns (CustomMetric) {
    option (google.api.http) = {
      post: "/v1alpha/{parent=properties/*}/customMetrics"
      body: "custom_metric"
    };
    option (google.api.method_signature) = "parent,custom_metric";
  }

  // Updates a CustomMetric on a property.
  rpc UpdateCustomMetric(UpdateCustomMetricRequest) returns (CustomMetric) {
    option (google.api.http) = {
      patch: "/v1alpha/{custom_metric.name=properties/*/customMetrics/*}"
      body: "custom_metric"
    };
    option (google.api.method_signature) = "custom_metric,update_mask";
  }

  // Lists CustomMetrics on a property.
  rpc ListCustomMetrics(ListCustomMetricsRequest) returns (ListCustomMetricsResponse) {
    option (google.api.http) = {
      get: "/v1alpha/{parent=properties/*}/customMetrics"
    };
    option (google.api.method_signature) = "parent";
  }

  // Archives a CustomMetric on a property.
  rpc ArchiveCustomMetric(ArchiveCustomMetricRequest) returns (google.protobuf.Empty) {
    option (google.api.http) = {
      post: "/v1alpha/{name=properties/*/customMetrics/*}:archive"
      body: "*"
    };
    option (google.api.method_signature) = "name";
  }

  // Lookup for a single CustomMetric.
  rpc GetCustomMetric(GetCustomMetricRequest) returns (CustomMetric) {
    option (google.api.http) = {
      get: "/v1alpha/{name=properties/*/customMetrics/*}"
    };
    option (google.api.method_signature) = "name";
  }
}

// Request message for GetAccount RPC.
message GetAccountRequest {
  // Required. The name of the account to lookup.
  // Format: accounts/{account}
  // Example: "accounts/100"
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "analyticsadmin.googleapis.com/Account"
    }
  ];
}

// Request message for ListAccounts RPC.
message ListAccountsRequest {
  // The maximum number of resources to return. The service may return
  // fewer than this value, even if there are additional pages.
  // If unspecified, at most 50 resources will be returned.
  // The maximum value is 200; (higher values will be coerced to the maximum)
  int32 page_size = 1;

  // A page token, received from a previous `ListAccounts` call.
  // Provide this to retrieve the subsequent page.
  // When paginating, all other parameters provided to `ListAccounts` must
  // match the call that provided the page token.
  string page_token = 2;

  // Whether to include soft-deleted (ie: "trashed") Accounts in the
  // results. Accounts can be inspected to determine whether they are deleted or
  // not.
  bool show_deleted = 3;
}

// Request message for ListAccounts RPC.
message ListAccountsResponse {
  // Results that were accessible to the caller.
  repeated Account accounts = 1;

  // A token, which can be sent as `page_token` to retrieve the next page.
  // If this field is omitted, there are no subsequent pages.
  string next_page_token = 2;
}

// Request message for DeleteAccount RPC.
message DeleteAccountRequest {
  // Required. The name of the Account to soft-delete.
  // Format: accounts/{account}
  // Example: "accounts/100"
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "analyticsadmin.googleapis.com/Account"
    }
  ];
}

// Request message for UpdateAccount RPC.
message UpdateAccountRequest {
  // Required. The account to update.
  // The account's `name` field is used to identify the account.
  Account account = 1 [(google.api.field_behavior) = REQUIRED];

  // Required. The list of fields to be updated. Field names must be in snake case
  // (e.g., "field_to_update"). Omitted fields will not be updated. To replace
  // the entire entity, use one path with the string "*" to match all fields.
  google.protobuf.FieldMask update_mask = 2 [(google.api.field_behavior) = REQUIRED];
}

// Request message for ProvisionAccountTicket RPC.
message ProvisionAccountTicketRequest {
  // The account to create.
  Account account = 1;

  // Redirect URI where the user will be sent after accepting Terms of Service.
  // Must be configured in Developers Console as a Redirect URI
  string redirect_uri = 2;
}

// Response message for ProvisionAccountTicket RPC.
message ProvisionAccountTicketResponse {
  // The param to be passed in the ToS link.
  string account_ticket_id = 1;
}

// Request message for GetProperty RPC.
message GetPropertyRequest {
  // Required. The name of the property to lookup.
  // Format: properties/{property_id}
  // Example: "properties/1000"
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "analyticsadmin.googleapis.com/Property"
    }
  ];
}

// Request message for ListProperties RPC.
message ListPropertiesRequest {
  // Required. An expression for filtering the results of the request.
  // Fields eligible for filtering are:
  // `parent:`(The resource name of the parent account) or
  // `firebase_project:`(The id or number of the linked firebase project).
  // Some examples of filters:
  //
  // ```
  // | Filter                      | Description                               |
  // |-----------------------------|-------------------------------------------|
  // | parent:accounts/123         | The account with account id: 123.         |
  // | firebase_project:project-id | The firebase project with id: project-id. |
  // | firebase_project:123        | The firebase project with number: 123.    |
  // ```
  string filter = 1 [(google.api.field_behavior) = REQUIRED];

  // The maximum number of resources to return. The service may return
  // fewer than this value, even if there are additional pages.
  // If unspecified, at most 50 resources will be returned.
  // The maximum value is 200; (higher values will be coerced to the maximum)
  int32 page_size = 2;

  // A page token, received from a previous `ListProperties` call.
  // Provide this to retrieve the subsequent page.
  // When paginating, all other parameters provided to `ListProperties` must
  // match the call that provided the page token.
  string page_token = 3;

  // Whether to include soft-deleted (ie: "trashed") Properties in the
  // results. Properties can be inspected to determine whether they are deleted
  // or not.
  bool show_deleted = 4;
}

// Response message for ListProperties RPC.
message ListPropertiesResponse {
  // Results that matched the filter criteria and were accessible to the caller.
  repeated Property properties = 1;

  // A token, which can be sent as `page_token` to retrieve the next page.
  // If this field is omitted, there are no subsequent pages.
  string next_page_token = 2;
}

// Request message for UpdateProperty RPC.
message UpdatePropertyRequest {
  // Required. The property to update.
  // The property's `name` field is used to identify the property to be
  // updated.
  Property property = 1 [(google.api.field_behavior) = REQUIRED];

  // Required. The list of fields to be updated. Field names must be in snake case
  // (e.g., "field_to_update"). Omitted fields will not be updated. To replace
  // the entire entity, use one path with the string "*" to match all fields.
  google.protobuf.FieldMask update_mask = 2 [(google.api.field_behavior) = REQUIRED];
}

// Request message for CreateProperty RPC.
message CreatePropertyRequest {
  // Required. The property to create.
  // Note: the supplied property must specify its parent.
  Property property = 1 [(google.api.field_behavior) = REQUIRED];
}

// Request message for DeleteProperty RPC.
message DeletePropertyRequest {
  // Required. The name of the Property to soft-delete.
  // Format: properties/{property_id}
  // Example: "properties/1000"
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "analyticsadmin.googleapis.com/Property"
    }
  ];
}

// Request message for GetUserLink RPC.
message GetUserLinkRequest {
  // Required. Example format: accounts/1234/userLinks/5678
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "analyticsadmin.googleapis.com/UserLink"
    }
  ];
}

// Request message for BatchGetUserLinks RPC.
message BatchGetUserLinksRequest {
  // Required. The account or property that all user links in the request are
  // for. The parent of all provided values for the 'names' field must match
  // this field.
  // Example format: accounts/1234
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "analyticsadmin.googleapis.com/UserLink"
    }
  ];

  // Required. The names of the user links to retrieve.
  // A maximum of 1000 user links can be retrieved in a batch.
  // Format: accounts/{accountId}/userLinks/{userLinkId}
  repeated string names = 2 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "analyticsadmin.googleapis.com/UserLink"
    }
  ];
}

// Response message for BatchGetUserLinks RPC.
message BatchGetUserLinksResponse {
  // The requested user links.
  repeated UserLink user_links = 1;
}

// Request message for ListUserLinks RPC.
message ListUserLinksRequest {
  // Required. Example format: accounts/1234
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "analyticsadmin.googleapis.com/UserLink"
    }
  ];

  // The maximum number of user links to return.
  // The service may return fewer than this value.
  // If unspecified, at most 200 user links will be returned.
  // The maximum value is 500; values above 500 will be coerced to 500.
  int32 page_size = 2;

  // A page token, received from a previous `ListUserLinks` call.
  // Provide this to retrieve the subsequent page.
  // When paginating, all other parameters provided to `ListUserLinks` must
  // match the call that provided the page token.
  string page_token = 3;
}

// Response message for ListUserLinks RPC.
message ListUserLinksResponse {
  // List of UserLinks. These will be ordered stably, but in an arbitrary order.
  repeated UserLink user_links = 1;

  // A token, which can be sent as `page_token` to retrieve the next page.
  // If this field is omitted, there are no subsequent pages.
  string next_page_token = 2;
}

// Request message for AuditUserLinks RPC.
message AuditUserLinksRequest {
  // Required. Example format: accounts/1234
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "analyticsadmin.googleapis.com/UserLink"
    }
  ];

  // The maximum number of user links to return.
  // The service may return fewer than this value.
  // If unspecified, at most 1000 user links will be returned.
  // The maximum value is 5000; values above 5000 will be coerced to 5000.
  int32 page_size = 2;

  // A page token, received from a previous `AuditUserLinks` call.
  // Provide this to retrieve the subsequent page.
  // When paginating, all other parameters provided to `AuditUserLinks` must
  // match the call that provided the page token.
  string page_token = 3;
}

// Response message for AuditUserLinks RPC.
message AuditUserLinksResponse {
  // List of AuditUserLinks. These will be ordered stably, but in an arbitrary
  // order.
  repeated AuditUserLink user_links = 1;

  // A token, which can be sent as `page_token` to retrieve the next page.
  // If this field is omitted, there are no subsequent pages.
  string next_page_token = 2;
}

// Request message for CreateUserLink RPC.
//
// Users can have multiple email addresses associated with their Google
// account, and one of these email addresses is the "primary" email address.
// Any of the email addresses associated with a Google account may be used
// for a new UserLink, but the returned UserLink will always contain the
// "primary" email address. As a result, the input and output email address
// for this request may differ.
message CreateUserLinkRequest {
  // Required. Example format: accounts/1234
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "analyticsadmin.googleapis.com/UserLink"
    }
  ];

  // Optional. If set, then email the new user notifying them that they've been granted
  // permissions to the resource.
  bool notify_new_user = 2 [(google.api.field_behavior) = OPTIONAL];

  // Required. The user link to create.
  UserLink user_link = 3 [(google.api.field_behavior) = REQUIRED];
}

// Request message for BatchCreateUserLinks RPC.
message BatchCreateUserLinksRequest {
  // Required. The account or property that all user links in the request are for.
  // This field is required. The parent field in the CreateUserLinkRequest
  // messages must either be empty or match this field.
  // Example format: accounts/1234
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "analyticsadmin.googleapis.com/UserLink"
    }
  ];

  // Optional. If set, then email the new users notifying them that they've been granted
  // permissions to the resource. Regardless of whether this is set or not,
  // notify_new_user field inside each individual request is ignored.
  bool notify_new_users = 2 [(google.api.field_behavior) = OPTIONAL];

  // Required. The requests specifying the user links to create.
  // A maximum of 1000 user links can be created in a batch.
  repeated CreateUserLinkRequest requests = 3 [(google.api.field_behavior) = REQUIRED];
}

// Response message for BatchCreateUserLinks RPC.
message BatchCreateUserLinksResponse {
  // The user links created.
  repeated UserLink user_links = 1;
}

// Request message for UpdateUserLink RPC.
message UpdateUserLinkRequest {
  // Required. The user link to update.
  UserLink user_link = 1 [(google.api.field_behavior) = REQUIRED];
}

// Request message for BatchUpdateUserLinks RPC.
message BatchUpdateUserLinksRequest {
  // Required. The account or property that all user links in the request are
  // for. The parent field in the UpdateUserLinkRequest messages must either be
  // empty or match this field.
  // Example format: accounts/1234
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "analyticsadmin.googleapis.com/UserLink"
    }
  ];

  // Required. The requests specifying the user links to update.
  // A maximum of 1000 user links can be updated in a batch.
  repeated UpdateUserLinkRequest requests = 2 [(google.api.field_behavior) = REQUIRED];
}

// Response message for BatchUpdateUserLinks RPC.
message BatchUpdateUserLinksResponse {
  // The user links updated.
  repeated UserLink user_links = 1;
}

// Request message for DeleteUserLink RPC.
message DeleteUserLinkRequest {
  // Required. Example format: accounts/1234/userLinks/5678
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "analyticsadmin.googleapis.com/UserLink"
    }
  ];
}

// Request message for BatchDeleteUserLinks RPC.
message BatchDeleteUserLinksRequest {
  // Required. The account or property that all user links in the request are
  // for. The parent of all values for user link names to delete must match this
  // field.
  // Example format: accounts/1234
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "analyticsadmin.googleapis.com/UserLink"
    }
  ];

  // Required. The requests specifying the user links to update.
  // A maximum of 1000 user links can be updated in a batch.
  repeated DeleteUserLinkRequest requests = 2 [(google.api.field_behavior) = REQUIRED];
}

// Request message for GetWebDataStream RPC.
message GetWebDataStreamRequest {
  // Required. The name of the web data stream to lookup.
  // Format: properties/{property_id}/webDataStreams/{stream_id}
  // Example: "properties/123/webDataStreams/456"
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "analyticsadmin.googleapis.com/WebDataStream"
    }
  ];
}

// Request message for DeleteWebDataStream RPC.
message DeleteWebDataStreamRequest {
  // Required. The name of the web data stream to delete.
  // Format: properties/{property_id}/webDataStreams/{stream_id}
  // Example: "properties/123/webDataStreams/456"
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "analyticsadmin.googleapis.com/WebDataStream"
    }
  ];
}

// Request message for UpdateWebDataStream RPC.
message UpdateWebDataStreamRequest {
  // Required. The web stream to update.
  // The `name` field is used to identify the web stream to be updated.
  WebDataStream web_data_stream = 1 [(google.api.field_behavior) = REQUIRED];

  // Required. The list of fields to be updated. Field names must be in snake case
  // (e.g., "field_to_update"). Omitted fields will not be updated. To replace
  // the entire entity, use one path with the string "*" to match all fields.
  google.protobuf.FieldMask update_mask = 2 [(google.api.field_behavior) = REQUIRED];
}

// Request message for CreateWebDataStream RPC.
message CreateWebDataStreamRequest {
  // Required. The web stream to create.
  WebDataStream web_data_stream = 1 [(google.api.field_behavior) = REQUIRED];

  // Required. The parent resource where this web data stream will be created.
  // Format: properties/123
  string parent = 2 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "analyticsadmin.googleapis.com/WebDataStream"
    }
  ];
}

// Request message for ListWebDataStreams RPC.
message ListWebDataStreamsRequest {
  // Required. The name of the parent property.
  // For example, to list results of web streams under the property with Id
  // 123: "properties/123"
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "analyticsadmin.googleapis.com/WebDataStream"
    }
  ];

  // The maximum number of resources to return.
  // If unspecified, at most 50 resources will be returned.
  // The maximum value is 200; (higher values will be coerced to the maximum)
  int32 page_size = 2;

  // A page token, received from a previous `ListWebDataStreams` call.
  // Provide this to retrieve the subsequent page.
  // When paginating, all other parameters provided to `ListWebDataStreams` must
  // match the call that provided the page token.
  string page_token = 3;
}

// Request message for ListWebDataStreams RPC.
message ListWebDataStreamsResponse {
  // Results that matched the filter criteria and were accessible to the caller.
  repeated WebDataStream web_data_streams = 1;

  // A token, which can be sent as `page_token` to retrieve the next page.
  // If this field is omitted, there are no subsequent pages.
  string next_page_token = 2;
}

// Request message for GetIosAppDataStream RPC.
message GetIosAppDataStreamRequest {
  // Required. The name of the iOS app data stream to lookup.
  // Format: properties/{property_id}/iosAppDataStreams/{stream_id}
  // Example: "properties/123/iosAppDataStreams/456"
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "analyticsadmin.googleapis.com/IosAppDataStream"
    }
  ];
}

// Request message for DeleteIosAppDataStream RPC.
message DeleteIosAppDataStreamRequest {
  // Required. The name of the iOS app data stream to delete.
  // Format: properties/{property_id}/iosAppDataStreams/{stream_id}
  // Example: "properties/123/iosAppDataStreams/456"
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "analyticsadmin.googleapis.com/IosAppDataStream"
    }
  ];
}

// Request message for UpdateIosAppDataStream RPC.
message UpdateIosAppDataStreamRequest {
  // Required. The iOS app stream to update.
  // The `name` field is used to identify the iOS app stream to be updated.
  IosAppDataStream ios_app_data_stream = 1 [(google.api.field_behavior) = REQUIRED];

  // Required. The list of fields to be updated. Field names must be in snake case
  // (e.g., "field_to_update"). Omitted fields will not be updated. To replace
  // the entire entity, use one path with the string "*" to match all fields.
  google.protobuf.FieldMask update_mask = 2 [(google.api.field_behavior) = REQUIRED];
}

// Request message for ListIosAppDataStreams RPC.
message ListIosAppDataStreamsRequest {
  // Required. The name of the parent property.
  // For example, to list results of app streams under the property with Id
  // 123: "properties/123"
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "analyticsadmin.googleapis.com/IosAppDataStream"
    }
  ];

  // The maximum number of resources to return.
  // If unspecified, at most 50 resources will be returned.
  // The maximum value is 200; (higher values will be coerced to the maximum)
  int32 page_size = 2;

  // A page token, received from a previous `ListIosAppDataStreams`
  // call. Provide this to retrieve the subsequent page.
  // When paginating, all other parameters provided to `ListIosAppDataStreams`
  // must match the call that provided the page token.
  string page_token = 3;
}

// Request message for ListIosAppDataStreams RPC.
message ListIosAppDataStreamsResponse {
  // Results that matched the filter criteria and were accessible to the caller.
  repeated IosAppDataStream ios_app_data_streams = 1;

  // A token, which can be sent as `page_token` to retrieve the next page.
  // If this field is omitted, there are no subsequent pages.
  string next_page_token = 2;
}

// Request message for GetAndroidAppDataStream RPC.
message GetAndroidAppDataStreamRequest {
  // Required. The name of the android app data stream to lookup.
  // Format: properties/{property_id}/androidAppDataStreams/{stream_id}
  // Example: "properties/123/androidAppDataStreams/456"
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "analyticsadmin.googleapis.com/AndroidAppDataStream"
    }
  ];
}

// Request message for DeleteAndroidAppDataStream RPC.
message DeleteAndroidAppDataStreamRequest {
  // Required. The name of the android app data stream to delete.
  // Format: properties/{property_id}/androidAppDataStreams/{stream_id}
  // Example: "properties/123/androidAppDataStreams/456"
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "analyticsadmin.googleapis.com/AndroidAppDataStream"
    }
  ];
}

// Request message for UpdateAndroidAppDataStream RPC.
message UpdateAndroidAppDataStreamRequest {
  // Required. The android app stream to update.
  // The `name` field is used to identify the android app stream to be updated.
  AndroidAppDataStream android_app_data_stream = 1 [(google.api.field_behavior) = REQUIRED];

  // Required. The list of fields to be updated. Field names must be in snake case
  // (e.g., "field_to_update"). Omitted fields will not be updated. To replace
  // the entire entity, use one path with the string "*" to match all fields.
  google.protobuf.FieldMask update_mask = 2 [(google.api.field_behavior) = REQUIRED];
}

// Request message for ListAndroidAppDataStreams RPC.
message ListAndroidAppDataStreamsRequest {
  // Required. The name of the parent property.
  // For example, to limit results to app streams under the property with Id
  // 123: "properties/123"
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "analyticsadmin.googleapis.com/AndroidAppDataStream"
    }
  ];

  // The maximum number of resources to return.
  //
  // If unspecified, at most 50 resources will be returned.
  // The maximum value is 200; (higher values will be coerced to the maximum)
  int32 page_size = 2;

  // A page token, received from a previous call. Provide this to
  // retrieve the subsequent page.
  // When paginating, all other parameters provided to
  // `ListAndroidAppDataStreams` must match the call that provided the page
  // token.
  string page_token = 3;
}

// Request message for ListAndroidDataStreams RPC.
message ListAndroidAppDataStreamsResponse {
  // Results that matched the filter criteria and were accessible to the caller.
  repeated AndroidAppDataStream android_app_data_streams = 1;

  // A token, which can be sent as `page_token` to retrieve the next page.
  // If this field is omitted, there are no subsequent pages.
  string next_page_token = 2;
}

// Request message for GetEnhancedMeasurementSettings RPC.
message GetEnhancedMeasurementSettingsRequest {
  // Required. The name of the settings to lookup.
  // Format:
  // properties/{property_id}/webDataStreams/{stream_id}/enhancedMeasurementSettings
  // Example: "properties/1000/webDataStreams/2000/enhancedMeasurementSettings"
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "analyticsadmin.googleapis.com/EnhancedMeasurementSettings"
    }
  ];
}

// Request message for UpdateEnhancedMeasurementSettings RPC.
message UpdateEnhancedMeasurementSettingsRequest {
  // Required. The settings to update.
  // The `name` field is used to identify the settings to be updated.
  EnhancedMeasurementSettings enhanced_measurement_settings = 1 [(google.api.field_behavior) = REQUIRED];

  // Required. The list of fields to be updated. Field names must be in snake case
  // (e.g., "field_to_update"). Omitted fields will not be updated. To replace
  // the entire entity, use one path with the string "*" to match all fields.
  google.protobuf.FieldMask update_mask = 2 [(google.api.field_behavior) = REQUIRED];
}

// Request message for CreateFirebaseLink RPC
message CreateFirebaseLinkRequest {
  // Required. Format: properties/{property_id}
  // Example: properties/1234
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "analyticsadmin.googleapis.com/FirebaseLink"
    }
  ];

  // Required. The Firebase link to create.
  FirebaseLink firebase_link = 2 [(google.api.field_behavior) = REQUIRED];
}

// Request message for UpdateFirebaseLink RPC
message UpdateFirebaseLinkRequest {
  // Required. The Firebase link to update.
  FirebaseLink firebase_link = 1 [(google.api.field_behavior) = REQUIRED];

  // Required. The list of fields to be updated. Field names must be in snake case
  // (e.g., "field_to_update"). Omitted fields will not be updated. To replace
  // the entire entity, use one path with the string "*" to match all fields.
  google.protobuf.FieldMask update_mask = 2 [(google.api.field_behavior) = REQUIRED];
}

// Request message for DeleteFirebaseLink RPC
message DeleteFirebaseLinkRequest {
  // Required. Format: properties/{property_id}/firebaseLinks/{firebase_link_id}
  // Example: properties/1234/firebaseLinks/5678
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "analyticsadmin.googleapis.com/FirebaseLink"
    }
  ];
}

// Request message for ListFirebaseLinks RPC
message ListFirebaseLinksRequest {
  // Required. Format: properties/{property_id}
  // Example: properties/1234
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "analyticsadmin.googleapis.com/FirebaseLink"
    }
  ];

  // The maximum number of resources to return. The service may return
  // fewer than this value, even if there are additional pages.
  // If unspecified, at most 50 resources will be returned.
  // The maximum value is 200; (higher values will be coerced to the maximum)
  int32 page_size = 2;

  // A page token, received from a previous `ListFirebaseLinks` call.
  // Provide this to retrieve the subsequent page.
  // When paginating, all other parameters provided to `ListProperties` must
  // match the call that provided the page token.
  string page_token = 3;
}

// Response message for ListFirebaseLinks RPC
message ListFirebaseLinksResponse {
  // List of FirebaseLinks. This will have at most one value.
  repeated FirebaseLink firebase_links = 1;

  // A token, which can be sent as `page_token` to retrieve the next page.
  // If this field is omitted, there are no subsequent pages.
  // Currently, Google Analytics supports only one FirebaseLink per property,
  // so this will never be populated.
  string next_page_token = 2;
}

// Request message for GetGlobalSiteTag RPC.
message GetGlobalSiteTagRequest {
  // Required. The name of the site tag to lookup.
  // Note that site tags are singletons and do not have unique IDs.
  // Format: properties/{property_id}/webDataStreams/{stream_id}/globalSiteTag
  // Example: "properties/123/webDataStreams/456/globalSiteTag"
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "analyticsadmin.googleapis.com/GlobalSiteTag"
    }
  ];
}

// Request message for CreateGoogleAdsLink RPC
message CreateGoogleAdsLinkRequest {
  // Required. Example format: properties/1234
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "analyticsadmin.googleapis.com/GoogleAdsLink"
    }
  ];

  // Required. The GoogleAdsLink to create.
  GoogleAdsLink google_ads_link = 2 [(google.api.field_behavior) = REQUIRED];
}

// Request message for UpdateGoogleAdsLink RPC
message UpdateGoogleAdsLinkRequest {
  // The GoogleAdsLink to update
  GoogleAdsLink google_ads_link = 1;

  // Required. The list of fields to be updated. Field names must be in snake case
  // (e.g., "field_to_update"). Omitted fields will not be updated. To replace
  // the entire entity, use one path with the string "*" to match all fields.
  google.protobuf.FieldMask update_mask = 2 [(google.api.field_behavior) = REQUIRED];
}

// Request message for DeleteGoogleAdsLink RPC.
message DeleteGoogleAdsLinkRequest {
  // Required. Example format: properties/1234/googleAdsLinks/5678
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "analyticsadmin.googleapis.com/GoogleAdsLink"
    }
  ];
}

// Request message for ListGoogleAdsLinks RPC.
message ListGoogleAdsLinksRequest {
  // Required. Example format: properties/1234
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "analyticsadmin.googleapis.com/GoogleAdsLink"
    }
  ];

  // The maximum number of resources to return.
  // If unspecified, at most 50 resources will be returned.
  // The maximum value is 200 (higher values will be coerced to the maximum).
  int32 page_size = 2;

  // A page token, received from a previous `ListGoogleAdsLinks` call.
  // Provide this to retrieve the subsequent page.
  //
  // When paginating, all other parameters provided to `ListGoogleAdsLinks` must
  // match the call that provided the page token.
  string page_token = 3;
}

// Response message for ListGoogleAdsLinks RPC.
message ListGoogleAdsLinksResponse {
  // List of GoogleAdsLinks.
  repeated GoogleAdsLink google_ads_links = 1;

  // A token, which can be sent as `page_token` to retrieve the next page.
  // If this field is omitted, there are no subsequent pages.
  string next_page_token = 2;
}

// Request message for GetDataSharingSettings RPC.
message GetDataSharingSettingsRequest {
  // Required. The name of the settings to lookup.
  // Format: accounts/{account}/dataSharingSettings
  // Example: "accounts/1000/dataSharingSettings"
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "analyticsadmin.googleapis.com/DataSharingSettings"
    }
  ];
}

// Request message for ListAccountSummaries RPC.
message ListAccountSummariesRequest {
  // The maximum number of AccountSummary resources to return. The service may
  // return fewer than this value, even if there are additional pages.
  // If unspecified, at most 50 resources will be returned.
  // The maximum value is 200; (higher values will be coerced to the maximum)
  int32 page_size = 1;

  // A page token, received from a previous `ListAccountSummaries` call.
  // Provide this to retrieve the subsequent page.
  // When paginating, all other parameters provided to `ListAccountSummaries`
  // must match the call that provided the page token.
  string page_token = 2;
}

// Response message for ListAccountSummaries RPC.
message ListAccountSummariesResponse {
  // Account summaries of all accounts the caller has access to.
  repeated AccountSummary account_summaries = 1;

  // A token, which can be sent as `page_token` to retrieve the next page.
  // If this field is omitted, there are no subsequent pages.
  string next_page_token = 2;
}

// Request message for SearchChangeHistoryEvents RPC.
message SearchChangeHistoryEventsRequest {
  // Required. The account resource for which to return change history resources.
  string account = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "analyticsadmin.googleapis.com/Account"
    }
  ];

  // Optional. Resource name for a child property. If set, only return changes
  // made to this property or its child resources.
  string property = 2 [
    (google.api.field_behavior) = OPTIONAL,
    (google.api.resource_reference) = {
      type: "analyticsadmin.googleapis.com/Property"
    }
  ];

  // Optional. If set, only return changes if they are for a resource that matches at
  // least one of these types.
  repeated ChangeHistoryResourceType resource_type = 3 [(google.api.field_behavior) = OPTIONAL];

  // Optional. If set, only return changes that match one or more of these types of
  // actions.
  repeated ActionType action = 4 [(google.api.field_behavior) = OPTIONAL];

  // Optional. If set, only return changes if they are made by a user in this list.
  repeated string actor_email = 5 [(google.api.field_behavior) = OPTIONAL];

  // Optional. If set, only return changes made after this time (inclusive).
  google.protobuf.Timestamp earliest_change_time = 6 [(google.api.field_behavior) = OPTIONAL];

  // Optional. If set, only return changes made before this time (inclusive).
  google.protobuf.Timestamp latest_change_time = 7 [(google.api.field_behavior) = OPTIONAL];

  // Optional. The maximum number of ChangeHistoryEvent items to return.
  // The service may return fewer than this value, even if there are additional
  // pages. If unspecified, at most 50 items will be returned.
  // The maximum value is 200 (higher values will be coerced to the maximum).
  int32 page_size = 8 [(google.api.field_behavior) = OPTIONAL];

  // Optional. A page token, received from a previous `SearchChangeHistoryEvents` call.
  // Provide this to retrieve the subsequent page. When paginating, all other
  // parameters provided to `SearchChangeHistoryEvents` must match the call that
  // provided the page token.
  string page_token = 9 [(google.api.field_behavior) = OPTIONAL];
}

// Response message for SearchAccounts RPC.
message SearchChangeHistoryEventsResponse {
  // Results that were accessible to the caller.
  repeated ChangeHistoryEvent change_history_events = 1;

  // A token, which can be sent as `page_token` to retrieve the next page.
  // If this field is omitted, there are no subsequent pages.
  string next_page_token = 2;
}

// Request message for GetMeasurementProtocolSecret RPC.
message GetMeasurementProtocolSecretRequest {
  // Required. The name of the measurement protocol secret to lookup.
  // Format:
  // properties/{property}/webDataStreams/{webDataStream}/measurementProtocolSecrets/{measurementProtocolSecret}
  // Note: Any type of stream (WebDataStream, IosAppDataStream,
  // AndroidAppDataStream) may be a parent.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "analyticsadmin.googleapis.com/MeasurementProtocolSecret"
    }
  ];
}

// Request message for CreateMeasurementProtocolSecret RPC
message CreateMeasurementProtocolSecretRequest {
  // Required. The parent resource where this secret will be created.
  // Any type of stream (WebDataStream, IosAppDataStream, AndroidAppDataStream)
  // may be a parent.
  // Format: properties/{property}/webDataStreams/{webDataStream}
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "analyticsadmin.googleapis.com/MeasurementProtocolSecret"
    }
  ];

  // Required. The measurement protocol secret to create.
  MeasurementProtocolSecret measurement_protocol_secret = 2 [(google.api.field_behavior) = REQUIRED];
}

// Request message for DeleteMeasurementProtocolSecret RPC
message DeleteMeasurementProtocolSecretRequest {
  // Required. The name of the MeasurementProtocolSecret to delete.
  // Format:
  // properties/{property}/webDataStreams/{webDataStream}/measurementProtocolSecrets/{measurementProtocolSecret}
  // Note: Any type of stream (WebDataStream, IosAppDataStream,
  // AndroidAppDataStream) may be a parent.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "analyticsadmin.googleapis.com/MeasurementProtocolSecret"
    }
  ];
}

// Request message for UpdateMeasurementProtocolSecret RPC
message UpdateMeasurementProtocolSecretRequest {
  // Required. The measurement protocol secret to update.
  MeasurementProtocolSecret measurement_protocol_secret = 1 [(google.api.field_behavior) = REQUIRED];

  // The list of fields to be updated. Omitted fields will not be updated.
  google.protobuf.FieldMask update_mask = 2;
}

// Request message for ListMeasurementProtocolSecret RPC
message ListMeasurementProtocolSecretsRequest {
  // Required. The resource name of the parent stream.
  // Any type of stream (WebDataStream, IosAppDataStream, AndroidAppDataStream)
  // may be a parent.
  // Format:
  // properties/{property}/webDataStreams/{webDataStream}/measurementProtocolSecrets
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "analyticsadmin.googleapis.com/MeasurementProtocolSecret"
    }
  ];

  // The maximum number of resources to return.
  // If unspecified, at most 10 resources will be returned.
  // The maximum value is 10. Higher values will be coerced to the maximum.
  int32 page_size = 2;

  // A page token, received from a previous `ListMeasurementProtocolSecrets`
  // call. Provide this to retrieve the subsequent page. When paginating, all
  // other parameters provided to `ListMeasurementProtocolSecrets` must match
  // the call that provided the page token.
  string page_token = 3;
}

// Response message for ListMeasurementProtocolSecret RPC
message ListMeasurementProtocolSecretsResponse {
  // A list of secrets for the parent stream specified in the request.
  repeated MeasurementProtocolSecret measurement_protocol_secrets = 1;

  // A token, which can be sent as `page_token` to retrieve the next page.
  // If this field is omitted, there are no subsequent pages.
  string next_page_token = 2;
}

// Request message for GetGoogleSignalsSettings RPC
message GetGoogleSignalsSettingsRequest {
  // Required. The name of the google signals settings to retrieve.
  // Format: properties/{property}/googleSignalsSettings
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "analyticsadmin.googleapis.com/GoogleSignalsSettings"
    }
  ];
}

// Request message for UpdateGoogleSignalsSettings RPC
message UpdateGoogleSignalsSettingsRequest {
  // Required. The settings to update.
  // The `name` field is used to identify the settings to be updated.
  GoogleSignalsSettings google_signals_settings = 1 [(google.api.field_behavior) = REQUIRED];

  // Required. The list of fields to be updated. Field names must be in snake case
  // (e.g., "field_to_update"). Omitted fields will not be updated. To replace
  // the entire entity, use one path with the string "*" to match all fields.
  google.protobuf.FieldMask update_mask = 2 [(google.api.field_behavior) = REQUIRED];
}

// Request message for CreateConversionEvent RPC
message CreateConversionEventRequest {
  // Required. The conversion event to create.
  ConversionEvent conversion_event = 1 [(google.api.field_behavior) = REQUIRED];

  // Required. The resource name of the parent property where this conversion event will
  // be created. Format: properties/123
  string parent = 2 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "analyticsadmin.googleapis.com/ConversionEvent"
    }
  ];
}

// Request message for GetConversionEvent RPC
message GetConversionEventRequest {
  // Required. The resource name of the conversion event to retrieve.
  // Format: properties/{property}/conversionEvents/{conversion_event}
  // Example: "properties/123/conversionEvents/456"
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "analyticsadmin.googleapis.com/ConversionEvent"
    }
  ];
}

// Request message for DeleteConversionEvent RPC
message DeleteConversionEventRequest {
  // Required. The resource name of the conversion event to delete.
  // Format: properties/{property}/conversionEvents/{conversion_event}
  // Example: "properties/123/conversionEvents/456"
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "analyticsadmin.googleapis.com/ConversionEvent"
    }
  ];
}

// Request message for ListConversionEvents RPC
message ListConversionEventsRequest {
  // Required. The resource name of the parent property.
  // Example: 'properties/123'
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "analyticsadmin.googleapis.com/ConversionEvent"
    }
  ];

  // The maximum number of resources to return.
  // If unspecified, at most 50 resources will be returned.
  // The maximum value is 200; (higher values will be coerced to the maximum)
  int32 page_size = 2;

  // A page token, received from a previous `ListConversionEvents` call.
  // Provide this to retrieve the subsequent page.
  // When paginating, all other parameters provided to `ListConversionEvents`
  // must match the call that provided the page token.
  string page_token = 3;
}

// Response message for ListConversionEvents RPC.
message ListConversionEventsResponse {
  // The requested conversion events
  repeated ConversionEvent conversion_events = 1;

  // A token, which can be sent as `page_token` to retrieve the next page.
  // If this field is omitted, there are no subsequent pages.
  string next_page_token = 2;
}

// Request message for CreateCustomDimension RPC.
message CreateCustomDimensionRequest {
  // Required. Example format: properties/1234
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "analyticsadmin.googleapis.com/CustomDimension"
    }
  ];

  // Required. The CustomDimension to create.
  CustomDimension custom_dimension = 2 [(google.api.field_behavior) = REQUIRED];
}

// Request message for UpdateCustomDimension RPC.
message UpdateCustomDimensionRequest {
  // The CustomDimension to update
  CustomDimension custom_dimension = 1;

  // Required. The list of fields to be updated. Omitted fields will not be updated.
  // To replace the entire entity, use one path with the string "*" to match
  // all fields.
  google.protobuf.FieldMask update_mask = 2 [(google.api.field_behavior) = REQUIRED];
}

// Request message for ListCustomDimensions RPC.
message ListCustomDimensionsRequest {
  // Required. Example format: properties/1234
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "analyticsadmin.googleapis.com/CustomDimension"
    }
  ];

  // The maximum number of resources to return.
  // If unspecified, at most 50 resources will be returned.
  // The maximum value is 200 (higher values will be coerced to the maximum).
  int32 page_size = 2;

  // A page token, received from a previous `ListCustomDimensions` call.
  // Provide this to retrieve the subsequent page.
  //
  // When paginating, all other parameters provided to `ListCustomDimensions`
  // must match the call that provided the page token.
  string page_token = 3;
}

// Response message for ListCustomDimensions RPC.
message ListCustomDimensionsResponse {
  // List of CustomDimensions.
  repeated CustomDimension custom_dimensions = 1;

  // A token, which can be sent as `page_token` to retrieve the next page.
  // If this field is omitted, there are no subsequent pages.
  string next_page_token = 2;
}

// Request message for ArchiveCustomDimension RPC.
message ArchiveCustomDimensionRequest {
  // Required. The name of the CustomDimension to archive.
  // Example format: properties/1234/customDimensions/5678
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "analyticsadmin.googleapis.com/CustomDimension"
    }
  ];
}

// Request message for GetCustomDimension RPC.
message GetCustomDimensionRequest {
  // Required. The name of the CustomDimension to get.
  // Example format: properties/1234/customDimensions/5678
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "analyticsadmin.googleapis.com/CustomDimension"
    }
  ];
}

// Request message for CreateCustomMetric RPC.
message CreateCustomMetricRequest {
  // Required. Example format: properties/1234
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "analyticsadmin.googleapis.com/CustomMetric"
    }
  ];

  // Required. The CustomMetric to create.
  CustomMetric custom_metric = 2 [(google.api.field_behavior) = REQUIRED];
}

// Request message for UpdateCustomMetric RPC.
message UpdateCustomMetricRequest {
  // The CustomMetric to update
  CustomMetric custom_metric = 1;

  // Required. The list of fields to be updated. Omitted fields will not be updated.
  // To replace the entire entity, use one path with the string "*" to match
  // all fields.
  google.protobuf.FieldMask update_mask = 2 [(google.api.field_behavior) = REQUIRED];
}

// Request message for ListCustomMetrics RPC.
message ListCustomMetricsRequest {
  // Required. Example format: properties/1234
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "analyticsadmin.googleapis.com/CustomMetric"
    }
  ];

  // The maximum number of resources to return.
  // If unspecified, at most 50 resources will be returned.
  // The maximum value is 200 (higher values will be coerced to the maximum).
  int32 page_size = 2;

  // A page token, received from a previous `ListCustomMetrics` call.
  // Provide this to retrieve the subsequent page.
  //
  // When paginating, all other parameters provided to `ListCustomMetrics` must
  // match the call that provided the page token.
  string page_token = 3;
}

// Response message for ListCustomMetrics RPC.
message ListCustomMetricsResponse {
  // List of CustomMetrics.
  repeated CustomMetric custom_metrics = 1;

  // A token, which can be sent as `page_token` to retrieve the next page.
  // If this field is omitted, there are no subsequent pages.
  string next_page_token = 2;
}

// Request message for ArchiveCustomMetric RPC.
message ArchiveCustomMetricRequest {
  // Required. The name of the CustomMetric to archive.
  // Example format: properties/1234/customMetrics/5678
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "analyticsadmin.googleapis.com/CustomMetric"
    }
  ];
}

// Request message for GetCustomMetric RPC.
message GetCustomMetricRequest {
  // Required. The name of the CustomMetric to get.
  // Example format: properties/1234/customMetrics/5678
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "analyticsadmin.googleapis.com/CustomMetric"
    }
  ];
}
