// Copyright 2024 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

syntax = "proto3";

package google.analytics.data.v1alpha;

import "google/analytics/data/v1alpha/data.proto";
import "google/api/annotations.proto";
import "google/api/client.proto";
import "google/api/field_behavior.proto";
import "google/api/resource.proto";
import "google/longrunning/operations.proto";
import "google/protobuf/timestamp.proto";

option go_package = "google.golang.org/genproto/googleapis/analytics/data/v1alpha;data";
option java_multiple_files = true;
option java_outer_classname = "AnalyticsDataApiProto";
option java_package = "com.google.analytics.data.v1alpha";
option (google.api.resource_definition) = {
  type: "analyticsadmin.googleapis.com/Property"
  pattern: "properties/{property}"
};

// Google Analytics reporting data service.
service AlphaAnalyticsData {
  option (google.api.default_host) = "analyticsdata.googleapis.com";
  option (google.api.oauth_scopes) =
      "https://www.googleapis.com/auth/analytics,"
      "https://www.googleapis.com/auth/analytics.readonly,"
      "https://www.googleapis.com/auth/drive,"
      "https://www.googleapis.com/auth/drive.file,"
      "https://www.googleapis.com/auth/spreadsheets";

  // Returns a customized funnel report of your Google Analytics event data. The
  // data returned from the API is as a table with columns for the requested
  // dimensions and metrics.
  //
  // Funnel exploration lets you visualize the steps your users take to complete
  // a task and quickly see how well they are succeeding or failing at each
  // step. For example, how do prospects become shoppers and then become buyers?
  // How do one time buyers become repeat buyers? With this information, you can
  // improve inefficient or abandoned customer journeys. To learn more, see [GA4
  // Funnel Explorations](https://support.google.com/analytics/answer/9327974).
  //
  // This method is introduced at alpha stability with the intention of
  // gathering feedback on syntax and capabilities before entering beta. To give
  // your feedback on this API, complete the [Google Analytics Data API Funnel
  // Reporting
  // Feedback](https://docs.google.com/forms/d/e/1FAIpQLSdwOlQDJAUoBiIgUZZ3S_Lwi8gr7Bb0k1jhvc-DEg7Rol3UjA/viewform).
  rpc RunFunnelReport(RunFunnelReportRequest)
      returns (RunFunnelReportResponse) {
    option (google.api.http) = {
      post: "/v1alpha/{property=properties/*}:runFunnelReport"
      body: "*"
    };
  }

  // Creates an audience list for later retrieval. This method quickly returns
  // the audience list's resource name and initiates a long running asynchronous
  // request to form an audience list. To list the users in an audience list,
  // first create the audience list through this method and then send the
  // audience resource name to the `QueryAudienceList` method.
  //
  // See [Creating an Audience
  // List](https://developers.google.com/analytics/devguides/reporting/data/v1/audience-list-basics)
  // for an introduction to Audience Lists with examples.
  //
  // An audience list is a snapshot of the users currently in the audience at
  // the time of audience list creation. Creating audience lists for one
  // audience on different days will return different results as users enter and
  // exit the audience.
  //
  // Audiences in Google Analytics 4 allow you to segment your users in the ways
  // that are important to your business. To learn more, see
  // https://support.google.com/analytics/answer/9267572. Audience lists contain
  // the users in each audience.
  //
  // This method is available at beta stability at
  // [audienceExports.create](https://developers.google.com/analytics/devguides/reporting/data/v1/rest/v1beta/properties.audienceExports/create).
  // To give your feedback on this API, complete the [Google Analytics Audience
  // Export API Feedback](https://forms.gle/EeA5u5LW6PEggtCEA) form.
  rpc CreateAudienceList(CreateAudienceListRequest)
      returns (google.longrunning.Operation) {
    option (google.api.http) = {
      post: "/v1alpha/{parent=properties/*}/audienceLists"
      body: "audience_list"
    };
    option (google.api.method_signature) = "parent,audience_list";
    option (google.longrunning.operation_info) = {
      response_type: "AudienceList"
      metadata_type: "AudienceListMetadata"
    };
  }

  // Retrieves an audience list of users. After creating an audience, the users
  // are not immediately available for listing. First, a request to
  // `CreateAudienceList` is necessary to create an audience list of users, and
  // then second, this method is used to retrieve the users in the audience
  // list.
  //
  // See [Creating an Audience
  // List](https://developers.google.com/analytics/devguides/reporting/data/v1/audience-list-basics)
  // for an introduction to Audience Lists with examples.
  //
  // Audiences in Google Analytics 4 allow you to segment your users in the ways
  // that are important to your business. To learn more, see
  // https://support.google.com/analytics/answer/9267572.
  //
  // This method is available at beta stability at
  // [audienceExports.query](https://developers.google.com/analytics/devguides/reporting/data/v1/rest/v1beta/properties.audienceExports/query).
  // To give your feedback on this API, complete the [Google Analytics Audience
  // Export API Feedback](https://forms.gle/EeA5u5LW6PEggtCEA) form.
  rpc QueryAudienceList(QueryAudienceListRequest)
      returns (QueryAudienceListResponse) {
    option (google.api.http) = {
      post: "/v1alpha/{name=properties/*/audienceLists/*}:query"
      body: "*"
    };
    option (google.api.method_signature) = "name";
  }

  // Exports an audience list of users to a Google Sheet. After creating an
  // audience, the users are not immediately available for listing. First, a
  // request to `CreateAudienceList` is necessary to create an audience list of
  // users, and then second, this method is used to export those users in the
  // audience list to a Google Sheet.
  //
  // See [Creating an Audience
  // List](https://developers.google.com/analytics/devguides/reporting/data/v1/audience-list-basics)
  // for an introduction to Audience Lists with examples.
  //
  // Audiences in Google Analytics 4 allow you to segment your users in the ways
  // that are important to your business. To learn more, see
  // https://support.google.com/analytics/answer/9267572.
  //
  // This method is introduced at alpha stability with the intention of
  // gathering feedback on syntax and capabilities before entering beta. To give
  // your feedback on this API, complete the
  // [Google Analytics Audience Export API
  // Feedback](https://forms.gle/EeA5u5LW6PEggtCEA) form.
  rpc SheetExportAudienceList(SheetExportAudienceListRequest)
      returns (SheetExportAudienceListResponse) {
    option (google.api.http) = {
      post: "/v1alpha/{name=properties/*/audienceLists/*}:exportSheet"
      body: "*"
    };
    option (google.api.method_signature) = "name";
  }

  // Gets configuration metadata about a specific audience list. This method
  // can be used to understand an audience list after it has been created.
  //
  // See [Creating an Audience
  // List](https://developers.google.com/analytics/devguides/reporting/data/v1/audience-list-basics)
  // for an introduction to Audience Lists with examples.
  //
  // This method is available at beta stability at
  // [audienceExports.get](https://developers.google.com/analytics/devguides/reporting/data/v1/rest/v1beta/properties.audienceExports/get).
  // To give your feedback on this API, complete the
  // [Google Analytics Audience Export API
  // Feedback](https://forms.gle/EeA5u5LW6PEggtCEA) form.
  rpc GetAudienceList(GetAudienceListRequest) returns (AudienceList) {
    option (google.api.http) = {
      get: "/v1alpha/{name=properties/*/audienceLists/*}"
    };
    option (google.api.method_signature) = "name";
  }

  // Lists all audience lists for a property. This method can be used for you to
  // find and reuse existing audience lists rather than creating unnecessary new
  // audience lists. The same audience can have multiple audience lists that
  // represent the list of users that were in an audience on different days.
  //
  // See [Creating an Audience
  // List](https://developers.google.com/analytics/devguides/reporting/data/v1/audience-list-basics)
  // for an introduction to Audience Lists with examples.
  //
  // This method is available at beta stability at
  // [audienceExports.list](https://developers.google.com/analytics/devguides/reporting/data/v1/rest/v1beta/properties.audienceExports/list).
  // To give your feedback on this API, complete the
  // [Google Analytics Audience Export API
  // Feedback](https://forms.gle/EeA5u5LW6PEggtCEA) form.
  rpc ListAudienceLists(ListAudienceListsRequest)
      returns (ListAudienceListsResponse) {
    option (google.api.http) = {
      get: "/v1alpha/{parent=properties/*}/audienceLists"
    };
    option (google.api.method_signature) = "parent";
  }

  // Creates a recurring audience list. Recurring audience lists produces new
  // audience lists each day. Audience lists are users in an audience at the
  // time of the list's creation.
  //
  // A recurring audience list ensures that you have audience list based on the
  // most recent data available for use each day. If you manually create
  // audience list, you don't know when an audience list based on an additional
  // day's data is available. This recurring audience list automates the
  // creation of an audience list when an additional day's data is available.
  // You will consume fewer quota tokens by using recurring audience list versus
  // manually creating audience list at various times of day trying to guess
  // when an additional day's data is ready.
  //
  // This method is introduced at alpha stability with the intention of
  // gathering feedback on syntax and capabilities before entering beta. To give
  // your feedback on this API, complete the
  // [Google Analytics Audience Export API
  // Feedback](https://forms.gle/EeA5u5LW6PEggtCEA) form.
  rpc CreateRecurringAudienceList(CreateRecurringAudienceListRequest)
      returns (RecurringAudienceList) {
    option (google.api.http) = {
      post: "/v1alpha/{parent=properties/*}/recurringAudienceLists"
      body: "recurring_audience_list"
    };
    option (google.api.method_signature) = "parent,recurring_audience_list";
  }

  // Gets configuration metadata about a specific recurring audience list. This
  // method can be used to understand a recurring audience list's state after it
  // has been created. For example, a recurring audience list resource will
  // generate audience list instances for each day, and this method can be used
  // to get the resource name of the most recent audience list instance.
  //
  // This method is introduced at alpha stability with the intention of
  // gathering feedback on syntax and capabilities before entering beta. To give
  // your feedback on this API, complete the
  // [Google Analytics Audience Export API
  // Feedback](https://forms.gle/EeA5u5LW6PEggtCEA) form.
  rpc GetRecurringAudienceList(GetRecurringAudienceListRequest)
      returns (RecurringAudienceList) {
    option (google.api.http) = {
      get: "/v1alpha/{name=properties/*/recurringAudienceLists/*}"
    };
    option (google.api.method_signature) = "name";
  }

  // Lists all recurring audience lists for a property. This method can be used
  // for you to find and reuse existing recurring audience lists rather than
  // creating unnecessary new recurring audience lists. The same audience can
  // have multiple recurring audience lists that represent different dimension
  // combinations; for example, just the dimension `deviceId` or both the
  // dimensions `deviceId` and `userId`.
  //
  // This method is introduced at alpha stability with the intention of
  // gathering feedback on syntax and capabilities before entering beta. To give
  // your feedback on this API, complete the
  // [Google Analytics Audience Export API
  // Feedback](https://forms.gle/EeA5u5LW6PEggtCEA) form.
  rpc ListRecurringAudienceLists(ListRecurringAudienceListsRequest)
      returns (ListRecurringAudienceListsResponse) {
    option (google.api.http) = {
      get: "/v1alpha/{parent=properties/*}/recurringAudienceLists"
    };
    option (google.api.method_signature) = "parent";
  }

  // Initiates the creation of a report task. This method quickly
  // returns a report task and initiates a long running
  // asynchronous request to form a customized report of your Google Analytics
  // event data.
  rpc CreateReportTask(CreateReportTaskRequest)
      returns (google.longrunning.Operation) {
    option (google.api.http) = {
      post: "/v1alpha/{parent=properties/*}/reportTasks"
      body: "report_task"
    };
    option (google.api.method_signature) = "parent,report_task";
    option (google.longrunning.operation_info) = {
      response_type: "ReportTask"
      metadata_type: "ReportTaskMetadata"
    };
  }

  // Retrieves a report task's content. After requesting the `CreateReportTask`,
  // you are able to retrieve the report content once the report is
  // ACTIVE. This method will return an error if the report task's state is not
  // `ACTIVE`. A query response will return the tabular row & column values of
  // the report.
  rpc QueryReportTask(QueryReportTaskRequest)
      returns (QueryReportTaskResponse) {
    option (google.api.http) = {
      post: "/v1alpha/{name=properties/*/reportTasks/*}:query"
      body: "*"
    };
    option (google.api.method_signature) = "name";
  }

  // Gets report metadata about a specific report task. After creating a report
  // task, use this method to check its processing state or inspect its
  // report definition.
  rpc GetReportTask(GetReportTaskRequest) returns (ReportTask) {
    option (google.api.http) = {
      get: "/v1alpha/{name=properties/*/reportTasks/*}"
    };
    option (google.api.method_signature) = "name";
  }

  // Lists all report tasks for a property.
  rpc ListReportTasks(ListReportTasksRequest)
      returns (ListReportTasksResponse) {
    option (google.api.http) = {
      get: "/v1alpha/{parent=properties/*}/reportTasks"
    };
    option (google.api.method_signature) = "parent";
  }
}

// A request to create a new recurring audience list.
message CreateRecurringAudienceListRequest {
  // Required. The parent resource where this recurring audience list will be
  // created. Format: `properties/{property}`
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "analyticsdata.googleapis.com/RecurringAudienceList"
    }
  ];

  // Required. The recurring audience list to create.
  RecurringAudienceList recurring_audience_list = 2
      [(google.api.field_behavior) = REQUIRED];
}

// A recurring audience list produces new audience lists each day. Audience
// lists are users in an audience at the time of the list's creation. A
// recurring audience list ensures that you have audience list based on the most
// recent data available for use each day.
message RecurringAudienceList {
  option (google.api.resource) = {
    type: "analyticsdata.googleapis.com/RecurringAudienceList"
    pattern: "properties/{property}/recurringAudienceLists/{recurring_audience_list}"
    plural: "recurringAudienceLists"
    singular: "recurringAudienceList"
  };

  // Output only. Identifier. The recurring audience list resource name assigned
  // during creation. This resource name identifies this
  // `RecurringAudienceList`.
  //
  // Format:
  // `properties/{property}/recurringAudienceLists/{recurring_audience_list}`
  string name = 1 [
    (google.api.field_behavior) = IDENTIFIER,
    (google.api.field_behavior) = OUTPUT_ONLY
  ];

  // Required. The audience resource name. This resource name identifies the
  // audience being listed and is shared between the Analytics Data & Admin
  // APIs.
  //
  // Format: `properties/{property}/audiences/{audience}`
  string audience = 2 [(google.api.field_behavior) = REQUIRED];

  // Output only. The descriptive display name for this audience. For example,
  // "Purchasers".
  string audience_display_name = 3 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Required. The dimensions requested and displayed in the audience list
  // response.
  repeated AudienceDimension dimensions = 4
      [(google.api.field_behavior) = REQUIRED];

  // Optional. The number of remaining days that a recurring audience export
  // will produce an audience list instance. This counter decreases by one each
  // day, and when it reaches zero, no new audience lists will be created.
  //
  // Recurring audience list request for Analytics 360 properties default to 180
  // days and have a maximum of 365 days. Requests for standard Analytics
  // properties default to 14 days and have a maximum of 30 days.
  //
  // The minimum value allowed during creation is 1. Requests above their
  // respective maximum will be coerced to their maximum.
  optional int32 active_days_remaining = 5
      [(google.api.field_behavior) = OPTIONAL];

  // Output only. Audience list resource names for audience list instances
  // created for this recurring audience list. One audience list is created for
  // each day, and the audience list will be listed here.
  //
  // This list is ordered with the most recently created audience list first.
  repeated string audience_lists = 6
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Optional. Configures webhook notifications to be sent from the Google
  // Analytics Data API to your webhook server. Use of webhooks is optional. If
  // unused, you'll need to poll this API to determine when a recurring audience
  // list creates new audience lists. Webhooks allow a notification to be sent
  // to your servers & avoid the need for polling.
  //
  // Two POST requests will be sent each time a recurring audience list creates
  // an audience list. This happens once per day until a recurring audience list
  // reaches 0 active days remaining. The first request will be sent showing a
  // newly created audience list in its CREATING state. The second request will
  // be sent after the audience list completes creation (either the ACTIVE or
  // FAILED state).
  optional WebhookNotification webhook_notification = 8
      [(google.api.field_behavior) = OPTIONAL];
}

// Configures a long-running operation resource to send a webhook notification
// from the Google Analytics Data API to your webhook server when the resource
// updates.
//
// Notification configurations contain private values & are only visible to your
// GCP project. Different GCP projects may attach different webhook
// notifications to the same long-running operation resource.
message WebhookNotification {
  // Optional. The web address that will receive the webhook notification. This
  // address will receive POST requests as the state of the long running
  // operation resource changes. The POST request will contain both a JSON
  // version of the long running operation resource in the body and a
  // `sentTimestamp` field. The sent timestamp will specify the unix
  // microseconds since the epoch that the request was sent; this lets you
  // identify replayed notifications.
  //
  // An example URI is
  // `https://us-central1-example-project-id.cloudfunctions.net/example-function-1`.
  //
  // The URI must use HTTPS and point to a site with a valid SSL certificate on
  // the web server. The URI must have a maximum string length of 128 characters
  // & use only the allowlisted characters from [RFC
  // 1738](https://www.rfc-editor.org/rfc/rfc1738).
  //
  // When your webhook server receives a notification, it is expected to reply
  // with an HTTP response status code of 200 within 5 seconds.
  //
  // A URI is required to use webhook notifications.
  //
  // Requests to this webhook server will contain an ID token authenticating the
  // service account
  // `google-analytics-audience-export@system.gserviceaccount.com`. To learn
  // more about ID tokens, see
  // https://cloud.google.com/docs/authentication/token-types#id. For Google
  // Cloud Functions, this lets you configure your function to require
  // authentication. In Cloud IAM, you will need to grant the service account
  // permissions to the Cloud Run Invoker (`roles/run.invoker`) & Cloud
  // Functions Invoker (`roles/cloudfunctions.invoker`) roles for the webhook
  // post request to pass Google Cloud Functions authentication. This API can
  // send webhook notifications to arbitrary URIs; for webhook servers other
  // than Google Cloud Functions, this ID token in the authorization bearer
  // header should be ignored if it is not needed.
  optional string uri = 1 [(google.api.field_behavior) = OPTIONAL];

  // Optional. The channel token is an arbitrary string value and must have a
  // maximum string length of 64 characters. Channel tokens allow you to verify
  // the source of a webhook notification. This guards against the message being
  // spoofed. The channel token will be specified in the `X-Goog-Channel-Token`
  // HTTP header of the webhook POST request.
  //
  // A channel token is not required to use webhook notifications.
  optional string channel_token = 2 [(google.api.field_behavior) = OPTIONAL];
}

// A request to retrieve configuration metadata about a specific recurring
// audience list.
message GetRecurringAudienceListRequest {
  // Required. The recurring audience list resource name.
  // Format:
  // `properties/{property}/recurringAudienceLists/{recurring_audience_list}`
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "analyticsdata.googleapis.com/RecurringAudienceList"
    }
  ];
}

// A request to list all recurring audience lists for a property.
message ListRecurringAudienceListsRequest {
  // Required. All recurring audience lists for this property will be listed in
  // the response. Format: `properties/{property}`
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "analyticsdata.googleapis.com/RecurringAudienceList"
    }
  ];

  // Optional. The maximum number of recurring audience lists to return. The
  // service may return fewer than this value. If unspecified, at most 200
  // recurring audience lists will be returned. The maximum value is 1000
  // (higher values will be coerced to the maximum).
  int32 page_size = 2 [(google.api.field_behavior) = OPTIONAL];

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

// A list of all recurring audience lists for a property.
message ListRecurringAudienceListsResponse {
  // Each recurring audience list for a property.
  repeated RecurringAudienceList recurring_audience_lists = 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.
  optional string next_page_token = 2;
}

// A request to retrieve configuration metadata about a specific audience list.
message GetAudienceListRequest {
  // Required. The audience list resource name.
  // Format: `properties/{property}/audienceLists/{audience_list}`
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "analyticsdata.googleapis.com/AudienceList"
    }
  ];
}

// A request to list all audience lists for a property.
message ListAudienceListsRequest {
  // Required. All audience lists for this property will be listed in the
  // response. Format: `properties/{property}`
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "analyticsdata.googleapis.com/AudienceList"
    }
  ];

  // Optional. The maximum number of audience lists to return. The service may
  // return fewer than this value. If unspecified, at most 200 audience lists
  // will be returned. The maximum value is 1000 (higher values will be coerced
  // to the maximum).
  int32 page_size = 2 [(google.api.field_behavior) = OPTIONAL];

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

// A list of all audience lists for a property.
message ListAudienceListsResponse {
  // Each audience list for a property.
  repeated AudienceList audience_lists = 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.
  optional string next_page_token = 2;
}

// A request to create a new audience list.
message CreateAudienceListRequest {
  // Required. The parent resource where this audience list will be created.
  // Format: `properties/{property}`
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "analyticsdata.googleapis.com/AudienceList"
    }
  ];

  // Required. The audience list to create.
  AudienceList audience_list = 2 [(google.api.field_behavior) = REQUIRED];
}

// An audience list is a list of users in an audience at the time of the list's
// creation. One audience may have multiple audience lists created for different
// days.
message AudienceList {
  option (google.api.resource) = {
    type: "analyticsdata.googleapis.com/AudienceList"
    pattern: "properties/{property}/audienceLists/{audience_list}"
    plural: "audienceLists"
    singular: "audienceList"
  };

  // The AudienceList currently exists in this state.
  enum State {
    // Unspecified state will never be used.
    STATE_UNSPECIFIED = 0;

    // The AudienceList is currently creating and will be available in the
    // future. Creating occurs immediately after the CreateAudienceList call.
    CREATING = 1;

    // The AudienceList is fully created and ready for querying. An AudienceList
    // is updated to active asynchronously from a request; this occurs some
    // time (for example 15 minutes) after the initial create call.
    ACTIVE = 2;

    // The AudienceList failed to be created. It is possible that re-requesting
    // this audience list will succeed.
    FAILED = 3;
  }

  // Output only. Identifier. The audience list resource name assigned during
  // creation. This resource name identifies this `AudienceList`.
  //
  // Format: `properties/{property}/audienceLists/{audience_list}`
  string name = 1 [
    (google.api.field_behavior) = IDENTIFIER,
    (google.api.field_behavior) = OUTPUT_ONLY
  ];

  // Required. The audience resource name. This resource name identifies the
  // audience being listed and is shared between the Analytics Data & Admin
  // APIs.
  //
  // Format: `properties/{property}/audiences/{audience}`
  string audience = 2 [(google.api.field_behavior) = REQUIRED];

  // Output only. The descriptive display name for this audience. For example,
  // "Purchasers".
  string audience_display_name = 3 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Required. The dimensions requested and displayed in the query response.
  repeated AudienceDimension dimensions = 4
      [(google.api.field_behavior) = REQUIRED];

  // Output only. The current state for this AudienceList.
  optional State state = 5 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The time when CreateAudienceList was called and the
  // AudienceList began the `CREATING` state.
  optional google.protobuf.Timestamp begin_creating_time = 6
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The total quota tokens charged during creation of the
  // AudienceList. Because this token count is based on activity from the
  // `CREATING` state, this tokens charged will be fixed once an AudienceList
  // enters the `ACTIVE` or `FAILED` states.
  int32 creation_quota_tokens_charged = 7
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The total number of rows in the AudienceList result.
  optional int32 row_count = 8 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Error message is populated when an audience list fails during
  // creation. A common reason for such a failure is quota exhaustion.
  optional string error_message = 9 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The percentage completed for this audience export ranging
  // between 0 to 100.
  optional double percentage_completed = 11
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The recurring audience list that created this audience list.
  // Recurring audience lists create audience lists daily.
  //
  // If audience lists are created directly, they will have no associated
  // recurring audience list, and this field will be blank.
  optional string recurring_audience_list = 12
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Optional. Configures webhook notifications to be sent from the Google
  // Analytics Data API to your webhook server. Use of webhooks is optional. If
  // unused, you'll need to poll this API to determine when an audience list is
  // ready to be used. Webhooks allow a notification to be sent to your servers
  // & avoid the need for polling.
  //
  // Either one or two POST requests will be sent to the webhook. The first POST
  // request will be sent immediately showing the newly created audience list in
  // its CREATING state. The second POST request will be sent after the audience
  // list completes creation (either the ACTIVE or FAILED state).
  //
  // If identical audience lists are requested in quick succession, the second &
  // subsequent audience lists can be served from cache. In that case, the
  // audience list create method can return an audience list is already ACTIVE.
  // In this scenario, only one POST request will be sent to the webhook.
  optional WebhookNotification webhook_notification = 13
      [(google.api.field_behavior) = OPTIONAL];
}

// This metadata is currently blank.
message AudienceListMetadata {}

// A request to list users in an audience list.
message QueryAudienceListRequest {
  // Required. The name of the audience list to retrieve users from.
  // Format: `properties/{property}/audienceLists/{audience_list}`
  string name = 1 [(google.api.field_behavior) = REQUIRED];

  // Optional. The row count of the start row. The first row is counted as row
  // 0.
  //
  // When paging, the first request does not specify offset; or equivalently,
  // sets offset to 0; the first request returns the first `limit` of rows. The
  // second request sets offset to the `limit` of the first request; the second
  // request returns the second `limit` of rows.
  //
  // To learn more about this pagination parameter, see
  // [Pagination](https://developers.google.com/analytics/devguides/reporting/data/v1/basics#pagination).
  int64 offset = 2 [(google.api.field_behavior) = OPTIONAL];

  // Optional. The number of rows to return. If unspecified, 10,000 rows are
  // returned. The API returns a maximum of 250,000 rows per request, no matter
  // how many you ask for. `limit` must be positive.
  //
  // The API can also return fewer rows than the requested `limit`, if there
  // aren't as many dimension values as the `limit`.
  //
  // To learn more about this pagination parameter, see
  // [Pagination](https://developers.google.com/analytics/devguides/reporting/data/v1/basics#pagination).
  int64 limit = 3 [(google.api.field_behavior) = OPTIONAL];
}

// A list of users in an audience list.
message QueryAudienceListResponse {
  // Configuration data about AudienceList being queried. Returned to help
  // interpret the audience rows in this response. For example, the dimensions
  // in this AudienceList correspond to the columns in the AudienceRows.
  optional AudienceList audience_list = 1;

  // Rows for each user in an audience list. The number of rows in this
  // response will be less than or equal to request's page size.
  repeated AudienceRow audience_rows = 2;

  // The total number of rows in the AudienceList result. `rowCount` is
  // independent of the number of rows returned in the response, the `limit`
  // request parameter, and the `offset` request parameter. For example if a
  // query returns 175 rows and includes `limit` of 50 in the API request, the
  // response will contain `rowCount` of 175 but only 50 rows.
  //
  // To learn more about this pagination parameter, see
  // [Pagination](https://developers.google.com/analytics/devguides/reporting/data/v1/basics#pagination).
  optional int32 row_count = 3;
}

// A request to export users in an audience list to a Google Sheet.
message SheetExportAudienceListRequest {
  // Required. The name of the audience list to retrieve users from.
  // Format: `properties/{property}/audienceLists/{audience_list}`
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "analyticsdata.googleapis.com/AudienceList"
    }
  ];

  // Optional. The row count of the start row. The first row is counted as row
  // 0.
  //
  // When paging, the first request does not specify offset; or equivalently,
  // sets offset to 0; the first request returns the first `limit` of rows. The
  // second request sets offset to the `limit` of the first request; the second
  // request returns the second `limit` of rows.
  //
  // To learn more about this pagination parameter, see
  // [Pagination](https://developers.google.com/analytics/devguides/reporting/data/v1/basics#pagination).
  int64 offset = 2 [(google.api.field_behavior) = OPTIONAL];

  // Optional. The number of rows to return. If unspecified, 10,000 rows are
  // returned. The API returns a maximum of 250,000 rows per request, no matter
  // how many you ask for. `limit` must be positive.
  //
  // The API can also return fewer rows than the requested `limit`, if there
  // aren't as many dimension values as the `limit`.
  //
  // To learn more about this pagination parameter, see
  // [Pagination](https://developers.google.com/analytics/devguides/reporting/data/v1/basics#pagination).
  int64 limit = 3 [(google.api.field_behavior) = OPTIONAL];
}

// The created Google Sheet with the list of users in an audience list.
message SheetExportAudienceListResponse {
  // A uri for you to visit in your browser to view the Google Sheet.
  optional string spreadsheet_uri = 1;

  // An ID that identifies the created Google Sheet resource.
  optional string spreadsheet_id = 2;

  // The total number of rows in the AudienceList result. `rowCount` is
  // independent of the number of rows returned in the response, the `limit`
  // request parameter, and the `offset` request parameter. For example if a
  // query returns 175 rows and includes `limit` of 50 in the API request, the
  // response will contain `rowCount` of 175 but only 50 rows.
  //
  // To learn more about this pagination parameter, see
  // [Pagination](https://developers.google.com/analytics/devguides/reporting/data/v1/basics#pagination).
  optional int32 row_count = 3;

  // Configuration data about AudienceList being exported. Returned to help
  // interpret the AudienceList in the Google Sheet of this response.
  //
  // For example, the AudienceList may have more rows than are present in the
  // Google Sheet, and in that case, you may want to send an additional sheet
  // export request with a different `offset` value to retrieve the next page of
  // rows in an additional Google Sheet.
  optional AudienceList audience_list = 4;
}

// Dimension value attributes for the audience user row.
message AudienceRow {
  // Each dimension value attribute for an audience user. One dimension value
  // will be added for each dimension column requested.
  repeated AudienceDimensionValue dimension_values = 1;
}

// An audience dimension is a user attribute. Specific user attributed are
// requested and then later returned in the `QueryAudienceListResponse`.
message AudienceDimension {
  // Optional. The API name of the dimension. See the [API
  // Dimensions](https://developers.google.com/analytics/devguides/reporting/data/v1/audience-list-api-schema#dimensions)
  // for the list of dimension names.
  string dimension_name = 1 [(google.api.field_behavior) = OPTIONAL];
}

// The value of a dimension.
message AudienceDimensionValue {
  // One kind of dimension value.
  oneof one_value {
    // Value as a string if the dimension type is a string.
    string value = 1;
  }
}

// The request for a funnel report.
message RunFunnelReportRequest {
  // Controls the dimensions present in the funnel visualization sub report
  // response.
  enum FunnelVisualizationType {
    // Unspecified type.
    FUNNEL_VISUALIZATION_TYPE_UNSPECIFIED = 0;

    // A standard (stepped) funnel. The funnel visualization sub report in the
    // response will not contain date.
    STANDARD_FUNNEL = 1;

    // A trended (line chart) funnel. The funnel visualization sub report in the
    // response will contain the date dimension.
    TRENDED_FUNNEL = 2;
  }

  // Optional. A Google Analytics GA4 property identifier whose events are
  // tracked. Specified in the URL path and not the body. To learn more, see
  // [where to find your Property
  // ID](https://developers.google.com/analytics/devguides/reporting/data/v1/property-id).
  // Within a batch request, this property should either be unspecified or
  // consistent with the batch-level property.
  //
  // Example: properties/1234
  string property = 1 [(google.api.field_behavior) = OPTIONAL];

  // Optional. Date ranges of data to read. If multiple date ranges are
  // requested, each response row will contain a zero based date range index. If
  // two date ranges overlap, the event data for the overlapping days is
  // included in the response rows for both date ranges.
  repeated DateRange date_ranges = 2 [(google.api.field_behavior) = OPTIONAL];

  // Optional. The configuration of this request's funnel. This funnel
  // configuration is required.
  Funnel funnel = 3 [(google.api.field_behavior) = OPTIONAL];

  // Optional. If specified, this breakdown adds a dimension to the funnel table
  // sub report response. This breakdown dimension expands each funnel step to
  // the unique values of the breakdown dimension. For example, a breakdown by
  // the `deviceCategory` dimension will create rows for `mobile`, `tablet`,
  // `desktop`, and the total.
  FunnelBreakdown funnel_breakdown = 4 [(google.api.field_behavior) = OPTIONAL];

  // Optional. If specified, next action adds a dimension to the funnel
  // visualization sub report response. This next action dimension expands each
  // funnel step to the unique values of the next action. For example a next
  // action of the `eventName` dimension will create rows for several events
  // (for example `session_start` & `click`) and the total.
  //
  // Next action only supports `eventName` and most Page / Screen dimensions
  // like `pageTitle` and `pagePath`.
  FunnelNextAction funnel_next_action = 5
      [(google.api.field_behavior) = OPTIONAL];

  // Optional. The funnel visualization type controls the dimensions present in
  // the funnel visualization sub report response. If not specified,
  // `STANDARD_FUNNEL` is used.
  FunnelVisualizationType funnel_visualization_type = 6
      [(google.api.field_behavior) = OPTIONAL];

  // Optional. The configurations of segments. Segments are subsets of a
  // property's data. In a funnel report with segments, the funnel is evaluated
  // in each segment.
  //
  // Each segment specified in this request
  // produces a separate row in the response; in the response, each segment
  // identified by its name.
  //
  // The segments parameter is optional. Requests are limited to 4 segments.
  repeated Segment segments = 7 [(google.api.field_behavior) = OPTIONAL];

  // Optional. The number of rows to return. If unspecified, 10,000 rows are
  // returned. The API returns a maximum of 250,000 rows per request, no matter
  // how many you ask for. `limit` must be positive.
  //
  // The API can also return fewer rows than the requested `limit`, if there
  // aren't as many dimension values as the `limit`.
  int64 limit = 9 [(google.api.field_behavior) = OPTIONAL];

  // Optional. Dimension filters allow you to ask for only specific dimension
  // values in the report. To learn more, see [Creating a Report: Dimension
  // Filters](https://developers.google.com/analytics/devguides/reporting/data/v1/basics#dimension_filters)
  // for examples. Metrics cannot be used in this filter.
  FilterExpression dimension_filter = 10
      [(google.api.field_behavior) = OPTIONAL];

  // Optional. Toggles whether to return the current state of this Analytics
  // Property's quota. Quota is returned in [PropertyQuota](#PropertyQuota).
  bool return_property_quota = 12 [(google.api.field_behavior) = OPTIONAL];
}

// The funnel report response contains two sub reports. The two sub reports are
// different combinations of dimensions and metrics.
message RunFunnelReportResponse {
  // The funnel table is a report with the funnel step, segment, breakdown
  // dimension, active users, completion rate, abandonments, and abandonments
  // rate.
  //
  // The segment dimension is only present in this response if a segment was
  // requested. The breakdown dimension is only present in this response if it
  // was requested.
  FunnelSubReport funnel_table = 1;

  // The funnel visualization is a report with the funnel step, segment, date,
  // next action dimension, and active users.
  //
  // The segment dimension is only present in this response if a segment was
  // requested. The date dimension is only present in this response if it was
  // requested through the `TRENDED_FUNNEL` funnel type. The next action
  // dimension is only present in the response if it was requested.
  FunnelSubReport funnel_visualization = 2;

  // This Analytics Property's quota state including this request.
  PropertyQuota property_quota = 3;

  // Identifies what kind of resource this message is. This `kind` is always the
  // fixed string "analyticsData#runFunnelReport". Useful to distinguish between
  // response types in JSON.
  string kind = 4;
}

// A specific report task configuration.
message ReportTask {
  option (google.api.resource) = {
    type: "analyticsdata.googleapis.com/ReportTask"
    pattern: "properties/{property}/reportTasks/{report_task}"
    plural: "reportTasks"
    singular: "reportTask"
  };

  // The definition of how a report should be run.
  message ReportDefinition {
    // Optional. The dimensions requested and displayed.
    repeated Dimension dimensions = 2 [(google.api.field_behavior) = OPTIONAL];

    // Optional. The metrics requested and displayed.
    repeated Metric metrics = 3 [(google.api.field_behavior) = OPTIONAL];

    // Optional. Date ranges of data to read. If multiple date ranges are
    // requested, each response row will contain a zero based date range index.
    // If two date ranges overlap, the event data for the overlapping days is
    // included in the response rows for both date ranges. In a cohort request,
    // this `dateRanges` must be unspecified.
    repeated DateRange date_ranges = 4 [(google.api.field_behavior) = OPTIONAL];

    // Optional. Dimension filters let you ask for only specific dimension
    // values in the report. To learn more, see [Fundamentals of Dimension
    // Filters](https://developers.google.com/analytics/devguides/reporting/data/v1/basics#dimension_filters)
    // for examples. Metrics cannot be used in this filter.
    FilterExpression dimension_filter = 5
        [(google.api.field_behavior) = OPTIONAL];

    // Optional. The filter clause of metrics. Applied after aggregating the
    // report's rows, similar to SQL having-clause. Dimensions cannot be used in
    // this filter.
    FilterExpression metric_filter = 6 [(google.api.field_behavior) = OPTIONAL];

    // Optional. The row count of the start row from Google Analytics Storage.
    // The first row is counted as row 0.
    //
    // When creating a report task, the `offset` and `limit` parameters define
    // the subset of data rows from Google Analytics storage to be included in
    // the generated report. For example, if there are a total of 300,000 rows
    // in Google Analytics storage, the initial report task may have the
    // first 10,000 rows with a limit of 10,000 and an offset of 0.
    // Subsequently, another report task could cover the next 10,000 rows with a
    // limit of 10,000 and an offset of 10,000.
    int64 offset = 7 [(google.api.field_behavior) = OPTIONAL];

    // Optional. The number of rows to return in the Report. If unspecified,
    // 10,000 rows are returned. The API returns a maximum of 250,000 rows per
    // request, no matter how many you ask for. `limit` must be positive.
    //
    // The API can also return fewer rows than the requested `limit`, if there
    // aren't as many dimension values as the `limit`. For instance, there are
    // fewer than 300 possible values for the dimension `country`, so when
    // reporting on only `country`, you can't get more than 300 rows, even if
    // you set `limit` to a higher value.
    int64 limit = 8 [(google.api.field_behavior) = OPTIONAL];

    // Optional. Aggregation of metrics. Aggregated metric values will be shown
    // in rows where the dimension_values are set to
    // "RESERVED_(MetricAggregation)".
    repeated MetricAggregation metric_aggregations = 9
        [(google.api.field_behavior) = OPTIONAL];

    // Optional. Specifies how rows are ordered in the response.
    repeated OrderBy order_bys = 10 [(google.api.field_behavior) = OPTIONAL];

    // Optional. A currency code in ISO4217 format, such as "AED", "USD", "JPY".
    // If the field is empty, the report uses the property's default currency.
    string currency_code = 11 [(google.api.field_behavior) = OPTIONAL];

    // Optional. Cohort group associated with this request. If there is a cohort
    // group in the request the 'cohort' dimension must be present.
    CohortSpec cohort_spec = 12 [(google.api.field_behavior) = OPTIONAL];

    // Optional. If false or unspecified, each row with all metrics equal to 0
    // will not be returned. If true, these rows will be returned if they are
    // not separately removed by a filter.
    //
    // Regardless of this `keep_empty_rows` setting, only data recorded by the
    // Google Analytics (GA4) property can be displayed in a report.
    //
    // For example if a property never logs a `purchase` event, then a query for
    // the `eventName` dimension and  `eventCount` metric will not have a row
    // containing eventName: "purchase" and eventCount: 0.
    bool keep_empty_rows = 13 [(google.api.field_behavior) = OPTIONAL];
  }

  // The report metadata for a specific report task.
  message ReportMetadata {
    // The processing state.
    enum State {
      // Unspecified state will never be used.
      STATE_UNSPECIFIED = 0;

      // The report is currently creating and will be available in the
      // future. Creating occurs immediately after the CreateReport call.
      CREATING = 1;

      // The report is fully created and ready for querying.
      ACTIVE = 2;

      // The report failed to be created.
      FAILED = 3;
    }

    // Output only. The current state for this report task.
    optional State state = 1 [(google.api.field_behavior) = OUTPUT_ONLY];

    // Output only. The time when `CreateReportTask` was called and the report
    // began the `CREATING` state.
    optional google.protobuf.Timestamp begin_creating_time = 2
        [(google.api.field_behavior) = OUTPUT_ONLY];

    // Output only. The total quota tokens charged during creation of the
    // report. Because this token count is based on activity from the `CREATING`
    // state, this tokens charge will be fixed once a report task enters the
    // `ACTIVE` or `FAILED` state.
    int32 creation_quota_tokens_charged = 3
        [(google.api.field_behavior) = OUTPUT_ONLY];

    // Output only. The total number of rows in the report result. This field
    // will be populated when the state is active. You can utilize
    // `task_row_count` for pagination within the confines of their existing
    // report.
    optional int32 task_row_count = 4
        [(google.api.field_behavior) = OUTPUT_ONLY];

    // Output only. Error message is populated if a report task fails during
    // creation.
    optional string error_message = 5
        [(google.api.field_behavior) = OUTPUT_ONLY];

    // Output only. The total number of rows in Google Analytics storage. If you
    // want to query additional data rows beyond the current report, they can
    // initiate a new report task based on the `total_row_count`.
    //
    // The `task_row_count` represents the number of rows specifically
    // pertaining to the current report, whereas `total_row_count` encompasses
    // the total count of rows across all data retrieved from Google
    // Analytics storage.
    //
    // For example, suppose the current report's `task_row_count` is 20,
    // displaying the data from the first 20 rows. Simultaneously, the
    // `total_row_count` is 30, indicating the presence of data for all 30 rows.
    // The `task_row_count` can be utilizated to paginate through the initial 20
    // rows. To expand the report and include data from all 30 rows, a new
    // report task can be created using the total_row_count to access the full
    // set of 30 rows' worth of data.
    optional int32 total_row_count = 6
        [(google.api.field_behavior) = OUTPUT_ONLY];
  }

  // Output only. Identifier. The report task resource name assigned during
  // creation. Format: `properties/{property}/reportTasks/{report_task}`
  string name = 1 [
    (google.api.field_behavior) = IDENTIFIER,
    (google.api.field_behavior) = OUTPUT_ONLY
  ];

  // Optional. A report definition to fetch report data, which describes the
  // structure of a report. It typically includes the fields that will be
  // included in the report and the criteria that will be used to filter the
  // data.
  ReportDefinition report_definition = 2
      [(google.api.field_behavior) = OPTIONAL];

  // Output only. The report metadata for a specific report task, which provides
  // information about a report.  It typically includes the following
  // information: the resource name of the report, the state of the report, the
  // timestamp the report was created, etc,
  ReportMetadata report_metadata = 3
      [(google.api.field_behavior) = OUTPUT_ONLY];
}

// A request to create a report task.
message CreateReportTaskRequest {
  // Required. The parent resource where this report task will be created.
  // Format: `properties/{propertyId}`
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "analyticsdata.googleapis.com/ReportTask"
    }
  ];

  // Required. The report task configuration to create.
  ReportTask report_task = 2 [(google.api.field_behavior) = REQUIRED];
}

// Represents the metadata of a long-running operation. Currently, this metadata
// is blank.
message ReportTaskMetadata {}

// A request to fetch the report content for a report task.
message QueryReportTaskRequest {
  // Required. The report source name.
  // Format: `properties/{property}/reportTasks/{report}`
  string name = 1 [(google.api.field_behavior) = REQUIRED];

  // Optional. The row count of the start row in the report. The first row is
  // counted as row 0.
  //
  // When paging, the first request does not specify offset; or equivalently,
  // sets offset to 0; the first request returns the first `limit` of rows. The
  // second request sets offset to the `limit` of the first request; the second
  // request returns the second `limit` of rows.
  //
  // To learn more about this pagination parameter, see
  // [Pagination](https://developers.google.com/analytics/devguides/reporting/data/v1/basics#pagination).
  int64 offset = 2 [(google.api.field_behavior) = OPTIONAL];

  // Optional. The number of rows to return from the report. If unspecified,
  // 10,000 rows are returned. The API returns a maximum of 250,000 rows per
  // request, no matter how many you ask for. `limit` must be positive.
  //
  // The API can also return fewer rows than the requested `limit`, if there
  // aren't as many dimension values as the `limit`. The number of rows
  // available to a QueryReportTaskRequest is further limited by the limit of
  // the associated ReportTask. A query can retrieve at most ReportTask.limit
  // rows. For example, if the ReportTask has a limit of 1,000, then a
  // QueryReportTask request with offset=900 and limit=500 will return at most
  // 100 rows.
  //
  // To learn more about this pagination parameter, see
  // [Pagination](https://developers.google.com/analytics/devguides/reporting/data/v1/basics#pagination).
  int64 limit = 3 [(google.api.field_behavior) = OPTIONAL];
}

// The report content corresponding to a report task.
message QueryReportTaskResponse {
  // Describes dimension columns. The number of DimensionHeaders and ordering of
  // DimensionHeaders matches the dimensions present in rows.
  repeated DimensionHeader dimension_headers = 1;

  // Describes metric columns. The number of MetricHeaders and ordering of
  // MetricHeaders matches the metrics present in rows.
  repeated MetricHeader metric_headers = 2;

  // Rows of dimension value combinations and metric values in the report.
  repeated Row rows = 3;

  // If requested, the totaled values of metrics.
  repeated Row totals = 4;

  // If requested, the maximum values of metrics.
  repeated Row maximums = 5;

  // If requested, the minimum values of metrics.
  repeated Row minimums = 6;

  // The total number of rows in the query result.
  int32 row_count = 7;

  // Metadata for the report.
  ResponseMetaData metadata = 8;
}

// A request to retrieve configuration metadata about a specific report task.
message GetReportTaskRequest {
  // Required. The report task resource name.
  // Format: `properties/{property}/reportTasks/{report_task}`
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "analyticsdata.googleapis.com/ReportTask"
    }
  ];
}

// A request to list all report tasks for a property.
message ListReportTasksRequest {
  // Required. All report tasks for this property will be listed in the
  // response. Format: `properties/{property}`
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "analyticsdata.googleapis.com/ReportTask"
    }
  ];

  // Optional. The maximum number of report tasks to return.
  int32 page_size = 2 [(google.api.field_behavior) = OPTIONAL];

  // Optional. A page token, received from a previous `ListReportTasks` call.
  // Provide this to retrieve the subsequent page.
  string page_token = 3 [(google.api.field_behavior) = OPTIONAL];
}

// A list of all report tasks for a property.
message ListReportTasksResponse {
  // Each report task for a property.
  repeated ReportTask report_tasks = 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.
  optional string next_page_token = 2;
}
