// Copyright 2020 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";

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.
  // Throws "Target not found" if no such account found, or if caller does not
  // have permissions to access it.
  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.
  //
  // Throws "Target not found" if no such property found, if property is not
  // of the type "GA4", or if caller does not have permissions to access it.
  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 (google.protobuf.Empty) {
    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
  //
  // Throws "Target not found" if no such web data stream found, or if the
  // caller does not have permissions to access it.
  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
  //
  // Throws "Target not found" if no such iOS app data stream found, or if the
  // caller does not have permissions to access it.
  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";
  }

  // Creates an iOS app data stream with the specified location and attributes.
  rpc CreateIosAppDataStream(CreateIosAppDataStreamRequest) returns (IosAppDataStream) {
    option (google.api.http) = {
      post: "/v1alpha/{parent=properties/*}/iosAppDataStreams"
      body: "ios_app_data_stream"
    };
    option (google.api.method_signature) = "parent,ios_app_data_stream";
  }

  // 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
  //
  // Throws "Target not found" if no such android app data stream found, or if
  // the caller does not have permissions to access it.
  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";
  }

  // Creates an android app stream with the specified location and attributes.
  rpc CreateAndroidAppDataStream(CreateAndroidAppDataStreamRequest) returns (AndroidAppDataStream) {
    option (google.api.http) = {
      post: "/v1alpha/{parent=properties/*}/androidAppDataStreams"
      body: "android_app_data_stream"
    };
    option (google.api.method_signature) = "parent,android_app_data_stream";
  }

  // 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";
  }
}

// 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];

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

// 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];

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

// 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 notify_new_user is set, then email new user that they've been given
  // permissions on 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];

  // Optional. If notify_new_users is set, then email new users that they've been given
  // permissions on the resource.
  bool notify_new_users = 2 [(google.api.field_behavior) = OPTIONAL];

  // The requests specifying the user links to create.
  // A maximum of 1000 user links can be created in a batch.
  repeated CreateUserLinkRequest requests = 3;
}

// 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];

  // The requests specifying the user links to update.
  // A maximum of 1000 user links can be updated in a batch.
  repeated UpdateUserLinkRequest requests = 2;
}

// 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];

  // The requests specifying the user links to update.
  // A maximum of 1000 user links can be updated in a batch.
  repeated DeleteUserLinkRequest requests = 2;
}

// 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];

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

// 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];

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

// Request message for CreateIosAppDataStream RPC.
message CreateIosAppDataStreamRequest {
  // Required. The iOS app data stream to create.
  IosAppDataStream ios_app_data_stream = 1 [(google.api.field_behavior) = REQUIRED];

  // Required. The parent resource where this ios app 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/IosAppDataStream"
    }
  ];
}

// 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];

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

// Request message for CreateAndroidAppDataStream RPC.
message CreateAndroidAppDataStreamRequest {
  // Required. The android app stream to create.
  AndroidAppDataStream android_app_data_stream = 1 [(google.api.field_behavior) = REQUIRED];

  // Required. The parent resource where this android app 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/AndroidAppDataStream"
    }
  ];
}

// 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];

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

// 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];

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

// 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"
    }
  ];
}

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

// 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;

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

// 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;
}
