From 2099c503c2bb91347761b083140c66f22b042a0d Mon Sep 17 00:00:00 2001
From: "gcf-owl-bot[bot]" <78513119+gcf-owl-bot[bot]@users.noreply.github.com>
Date: Tue, 9 Nov 2021 11:55:26 -0800
Subject: [PATCH] feat: add reCAPTCHA Enterprise account defender API methods
 (#328)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

* feat: add reCAPTCHA Enterprise account defender API methods

This cl adds the following API methods to support the Preview release of reCAPTCHA Enterprise account defender: ListRelatedAccountGroups, ListRelatedAccountGroupMemberships, and SearchRelatedAccountGroupMemberships. Additionally it modifies the existing createAssessment API method to add a new hashed_account_id parameter along with AccountDefenderAssessment return value.

PiperOrigin-RevId: 407130991

Source-Link: https://github.com/googleapis/googleapis/commit/d58e602ed8a92b8d21da92543528fa5980be6811

Source-Link: https://github.com/googleapis/googleapis-gen/commit/d1b97bf27608e42b5324f65916b16986d855e1b9
Copy-Tag: eyJwIjoiLmdpdGh1Yi8uT3dsQm90LnlhbWwiLCJoIjoiZDFiOTdiZjI3NjA4ZTQyYjUzMjRmNjU5MTZiMTY5ODZkODU1ZTFiOSJ9

* 🦉 Updates from OwlBot

See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md

* chore: change supported node version

Co-authored-by: Owl Bot <gcf-owl-bot[bot]@users.noreply.github.com>
Co-authored-by: Takashi Matsuo <tmatsuo@google.com>
---
 .../v1/recaptchaenterprise.proto              |  235 +-
 protos/protos.d.ts                            |  969 +++++++
 protos/protos.js                              | 2275 +++++++++++++++++
 protos/protos.json                            |  259 +-
 ..._enterprise_service.annotate_assessment.js |   74 +
 ...ha_enterprise_service.create_assessment.js |   59 +
 ...recaptcha_enterprise_service.create_key.js |   59 +
 ...recaptcha_enterprise_service.delete_key.js |   54 +
 .../recaptcha_enterprise_service.get_key.js   |   54 +
 ...ecaptcha_enterprise_service.get_metrics.js |   54 +
 .../recaptcha_enterprise_service.list_keys.js |   66 +
 ....list_related_account_group_memberships.js |   74 +
 ...ise_service.list_related_account_groups.js |   72 +
 ...ecaptcha_enterprise_service.migrate_key.js |   54 +
 ...earch_related_account_group_memberships.js |   81 +
 ...recaptcha_enterprise_service.update_key.js |   58 +
 ...se_service_v1_beta1.annotate_assessment.js |   62 +
 ...rise_service_v1_beta1.create_assessment.js |   60 +
 ..._enterprise_service_v1_beta1.create_key.js |   60 +
 ..._enterprise_service_v1_beta1.delete_key.js |   55 +
 ...cha_enterprise_service_v1_beta1.get_key.js |   55 +
 ...a_enterprise_service_v1_beta1.list_keys.js |   67 +
 ..._enterprise_service_v1_beta1.update_key.js |   59 +
 samples/package.json                          |    2 +-
 src/v1/gapic_metadata.json                    |   42 +
 src/v1/recaptcha_enterprise_service_client.ts |  835 +++++-
 ...tcha_enterprise_service_client_config.json |   12 +
 ...tcha_enterprise_service_v1_beta1_client.ts |    6 +-
 test/gapic_recaptcha_enterprise_service_v1.ts | 1219 +++++++++
 29 files changed, 7015 insertions(+), 16 deletions(-)
 create mode 100644 samples/generated/v1/recaptcha_enterprise_service.annotate_assessment.js
 create mode 100644 samples/generated/v1/recaptcha_enterprise_service.create_assessment.js
 create mode 100644 samples/generated/v1/recaptcha_enterprise_service.create_key.js
 create mode 100644 samples/generated/v1/recaptcha_enterprise_service.delete_key.js
 create mode 100644 samples/generated/v1/recaptcha_enterprise_service.get_key.js
 create mode 100644 samples/generated/v1/recaptcha_enterprise_service.get_metrics.js
 create mode 100644 samples/generated/v1/recaptcha_enterprise_service.list_keys.js
 create mode 100644 samples/generated/v1/recaptcha_enterprise_service.list_related_account_group_memberships.js
 create mode 100644 samples/generated/v1/recaptcha_enterprise_service.list_related_account_groups.js
 create mode 100644 samples/generated/v1/recaptcha_enterprise_service.migrate_key.js
 create mode 100644 samples/generated/v1/recaptcha_enterprise_service.search_related_account_group_memberships.js
 create mode 100644 samples/generated/v1/recaptcha_enterprise_service.update_key.js
 create mode 100644 samples/generated/v1beta1/recaptcha_enterprise_service_v1_beta1.annotate_assessment.js
 create mode 100644 samples/generated/v1beta1/recaptcha_enterprise_service_v1_beta1.create_assessment.js
 create mode 100644 samples/generated/v1beta1/recaptcha_enterprise_service_v1_beta1.create_key.js
 create mode 100644 samples/generated/v1beta1/recaptcha_enterprise_service_v1_beta1.delete_key.js
 create mode 100644 samples/generated/v1beta1/recaptcha_enterprise_service_v1_beta1.get_key.js
 create mode 100644 samples/generated/v1beta1/recaptcha_enterprise_service_v1_beta1.list_keys.js
 create mode 100644 samples/generated/v1beta1/recaptcha_enterprise_service_v1_beta1.update_key.js

diff --git a/protos/google/cloud/recaptchaenterprise/v1/recaptchaenterprise.proto b/protos/google/cloud/recaptchaenterprise/v1/recaptchaenterprise.proto
index c28fbde..a2dd1ba 100644
--- a/protos/google/cloud/recaptchaenterprise/v1/recaptchaenterprise.proto
+++ b/protos/google/cloud/recaptchaenterprise/v1/recaptchaenterprise.proto
@@ -115,6 +115,31 @@ service RecaptchaEnterpriseService {
     };
     option (google.api.method_signature) = "name";
   }
+
+  // List groups of related accounts.
+  rpc ListRelatedAccountGroups(ListRelatedAccountGroupsRequest) returns (ListRelatedAccountGroupsResponse) {
+    option (google.api.http) = {
+      get: "/v1/{parent=projects/*}/relatedaccountgroups"
+    };
+    option (google.api.method_signature) = "parent";
+  }
+
+  // Get the memberships in a group of related accounts.
+  rpc ListRelatedAccountGroupMemberships(ListRelatedAccountGroupMembershipsRequest) returns (ListRelatedAccountGroupMembershipsResponse) {
+    option (google.api.http) = {
+      get: "/v1/{parent=projects/*/relatedaccountgroups/*}/memberships"
+    };
+    option (google.api.method_signature) = "parent";
+  }
+
+  // Search group memberships related to a given account.
+  rpc SearchRelatedAccountGroupMemberships(SearchRelatedAccountGroupMembershipsRequest) returns (SearchRelatedAccountGroupMembershipsResponse) {
+    option (google.api.http) = {
+      post: "/v1/{parent=projects/*}/relatedaccountgroupmemberships:search"
+      body: "*"
+    };
+    option (google.api.method_signature) = "parent,hashed_account_id";
+  }
 }
 
 // The create assessment request message.
@@ -205,6 +230,13 @@ message AnnotateAssessmentRequest {
 
   // Optional. Optional reasons for the annotation that will be assigned to the Event.
   repeated Reason reasons = 3 [(google.api.field_behavior) = OPTIONAL];
+
+  // Optional. Optional unique stable hashed user identifier to apply to the assessment.
+  // This is an alternative to setting the hashed_account_id in
+  // CreateAssessment, for example when the account identifier is not yet known
+  // in the initial request. It is recommended that the identifier is hashed
+  // using hmac-sha256 with stable secret.
+  bytes hashed_account_id = 4 [(google.api.field_behavior) = OPTIONAL];
 }
 
 // Empty response for AnnotateAssessment.
@@ -231,6 +263,10 @@ message Assessment {
 
   // Output only. Properties of the provided event token.
   TokenProperties token_properties = 4 [(google.api.field_behavior) = OUTPUT_ONLY];
+
+  // Assessment returned by Account Defender when a hashed_account_id is
+  // provided.
+  AccountDefenderAssessment account_defender_assessment = 6;
 }
 
 message Event {
@@ -253,6 +289,10 @@ message Event {
   // provided at token generation time on client-side platforms already
   // integrated with recaptcha enterprise.
   string expected_action = 5 [(google.api.field_behavior) = OPTIONAL];
+
+  // Optional. Optional unique stable hashed user identifier for the request. The
+  // identifier should ideally be hashed using sha256 with stable secret.
+  bytes hashed_account_id = 6 [(google.api.field_behavior) = OPTIONAL];
 }
 
 // Risk analysis result for an event.
@@ -335,6 +375,34 @@ message TokenProperties {
   string action = 5;
 }
 
+// Account Defender risk assessment.
+message AccountDefenderAssessment {
+  // Labels returned by Account Defender for this request.
+  enum AccountDefenderLabel {
+    // Default unspecified type.
+    ACCOUNT_DEFENDER_LABEL_UNSPECIFIED = 0;
+
+    // The request matches a known good profile for the user.
+    PROFILE_MATCH = 1;
+
+    // The request is potentially a suspicious login event and should be further
+    // verified either via multi-factor authentication or another system.
+    SUSPICIOUS_LOGIN_ACTIVITY = 2;
+
+    // The request matched a profile that previously had suspicious account
+    // creation behavior. This could mean this is a fake account.
+    SUSPICIOUS_ACCOUNT_CREATION = 3;
+
+    // The account in the request has a high number of related accounts. It does
+    // not necessarily imply that the account is bad but could require
+    // investigating.
+    RELATED_ACCOUNTS_NUMBER_HIGH = 4;
+  }
+
+  // Labels for this request.
+  repeated AccountDefenderLabel labels = 1;
+}
+
 // The create key request message.
 message CreateKeyRequest {
   // Required. The name of the project in which the key will be created, in the
@@ -510,11 +578,11 @@ message TestingOptions {
     // challenge depending on risk and trust factors.
     TESTING_CHALLENGE_UNSPECIFIED = 0;
 
-    // Challenge requests for this key will always return a nocaptcha, which
+    // Challenge requests for this key always return a nocaptcha, which
     // does not require a solution.
     NOCAPTCHA = 1;
 
-    // Challenge requests for this key will always return an unsolvable
+    // Challenge requests for this key always return an unsolvable
     // challenge.
     UNSOLVABLE_CHALLENGE = 2;
   }
@@ -576,9 +644,9 @@ message WebKeySettings {
   // Examples: 'example.com' or 'subdomain.example.com'
   repeated string allowed_domains = 1;
 
-  // Required. Whether this key can be used on AMP (Accelerated Mobile Pages) websites.
-  // This can only be set for the SCORE integration type.
-  bool allow_amp_traffic = 2 [(google.api.field_behavior) = REQUIRED];
+  // If set to true, the key can be used on AMP (Accelerated Mobile Pages)
+  // websites. This is supported only for the SCORE integration type.
+  bool allow_amp_traffic = 2;
 
   // Required. Describes how this key is integrated with the website.
   IntegrationType integration_type = 4 [(google.api.field_behavior) = REQUIRED];
@@ -591,7 +659,7 @@ message WebKeySettings {
 
 // Settings specific to keys that can be used by Android apps.
 message AndroidKeySettings {
-  // If set to true, it means allowed_package_names will not be enforced.
+  // If set to true, allowed_package_names are not enforced.
   bool allow_all_package_names = 2;
 
   // Android package names of apps allowed to use the key.
@@ -601,7 +669,7 @@ message AndroidKeySettings {
 
 // Settings specific to keys that can be used by iOS apps.
 message IOSKeySettings {
-  // If set to true, it means allowed_bundle_ids will not be enforced.
+  // If set to true, allowed_bundle_ids are not enforced.
   bool allow_all_bundle_ids = 2;
 
   // iOS bundle ids of apps allowed to use the key.
@@ -646,3 +714,156 @@ message ChallengeMetrics {
   // verification.
   int64 passed_count = 4;
 }
+
+// The request message to list memberships in a related account group.
+message ListRelatedAccountGroupMembershipsRequest {
+  // Required. The resource name for the related account group in the format
+  // `projects/{project}/relatedaccountgroups/{relatedaccountgroup}`.
+  string parent = 1 [
+    (google.api.field_behavior) = REQUIRED,
+    (google.api.resource_reference) = {
+      child_type: "recaptchaenterprise.googleapis.com/RelatedAccountGroupMembership"
+    }
+  ];
+
+  // Optional. The maximum number of accounts to return. The service may return fewer than
+  // this value.
+  // If unspecified, at most 50 accounts will be returned.
+  // The maximum value is 1000; values above 1000 will be coerced to 1000.
+  int32 page_size = 2 [(google.api.field_behavior) = OPTIONAL];
+
+  // Optional. A page token, received from a previous `ListRelatedAccountGroupMemberships`
+  // call.
+  //
+  // When paginating, all other parameters provided to
+  // `ListRelatedAccountGroupMemberships` must match the call that provided the
+  // page token.
+  string page_token = 3 [(google.api.field_behavior) = OPTIONAL];
+}
+
+// The response to a `ListRelatedAccountGroupMemberships` call.
+message ListRelatedAccountGroupMembershipsResponse {
+  // The memberships listed by the query.
+  repeated RelatedAccountGroupMembership related_account_group_memberships = 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;
+}
+
+// The request message to list related account groups.
+message ListRelatedAccountGroupsRequest {
+  // Required. The name of the project to list related account groups from, in the format
+  // "projects/{project}".
+  string parent = 1 [
+    (google.api.field_behavior) = REQUIRED,
+    (google.api.resource_reference) = {
+      child_type: "recaptchaenterprise.googleapis.com/RelatedAccountGroup"
+    }
+  ];
+
+  // Optional. The maximum number of groups to return. The service may return fewer than
+  // this value.
+  // If unspecified, at most 50 groups will be returned.
+  // The maximum value is 1000; values above 1000 will be coerced to 1000.
+  int32 page_size = 2 [(google.api.field_behavior) = OPTIONAL];
+
+  // Optional. A page token, received from a previous `ListRelatedAccountGroups` call.
+  // Provide this to retrieve the subsequent page.
+  //
+  // When paginating, all other parameters provided to
+  // `ListRelatedAccountGroups` must match the call that provided the page
+  // token.
+  string page_token = 3 [(google.api.field_behavior) = OPTIONAL];
+}
+
+// The response to a `ListRelatedAccountGroups` call.
+message ListRelatedAccountGroupsResponse {
+  // The groups of related accounts listed by the query.
+  repeated RelatedAccountGroup related_account_groups = 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;
+}
+
+// The request message to search related account group memberships.
+message SearchRelatedAccountGroupMembershipsRequest {
+  // Required. The name of the project to search related account group memberships from,
+  // in the format "projects/{project}".
+  string parent = 1 [
+    (google.api.field_behavior) = REQUIRED,
+    (google.api.resource_reference) = {
+      child_type: "recaptchaenterprise.googleapis.com/RelatedAccountGroupMembership"
+    }
+  ];
+
+  // Optional. The unique stable hashed user identifier we should search connections to.
+  // The identifier should correspond to a `hashed_account_id` provided in a
+  // previous CreateAssessment or AnnotateAssessment call.
+  bytes hashed_account_id = 2 [(google.api.field_behavior) = OPTIONAL];
+
+  // Optional. The maximum number of groups to return. The service may return fewer than
+  // this value.
+  // If unspecified, at most 50 groups will be returned.
+  // The maximum value is 1000; values above 1000 will be coerced to 1000.
+  int32 page_size = 3 [(google.api.field_behavior) = OPTIONAL];
+
+  // Optional. A page token, received from a previous
+  // `SearchRelatedAccountGroupMemberships` call. Provide this to retrieve the
+  // subsequent page.
+  //
+  // When paginating, all other parameters provided to
+  // `SearchRelatedAccountGroupMemberships` must match the call that provided
+  // the page token.
+  string page_token = 4 [(google.api.field_behavior) = OPTIONAL];
+}
+
+// The response to a `SearchRelatedAccountGroupMemberships` call.
+message SearchRelatedAccountGroupMembershipsResponse {
+  // The queried memberships.
+  repeated RelatedAccountGroupMembership related_account_group_memberships = 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;
+}
+
+// A membership in a group of related accounts.
+message RelatedAccountGroupMembership {
+  option (google.api.resource) = {
+    type: "recaptchaenterprise.googleapis.com/RelatedAccountGroupMembership"
+    pattern: "projects/{project}/relatedaccountgroups/{relatedaccountgroup}/memberships/{membership}"
+  };
+
+  // Required. The resource name for this membership in the format
+  // `projects/{project}/relatedaccountgroups/{relatedaccountgroup}/memberships/{membership}`.
+  string name = 1 [
+    (google.api.field_behavior) = REQUIRED,
+    (google.api.resource_reference) = {
+      type: "recaptchaenterprise.googleapis.com/RelatedAccountGroupMembership"
+    }
+  ];
+
+  // The unique stable hashed user identifier of the member. The identifier
+  // corresponds to a `hashed_account_id` provided in a previous
+  // CreateAssessment or AnnotateAssessment call.
+  bytes hashed_account_id = 2;
+}
+
+// A group of related accounts.
+message RelatedAccountGroup {
+  option (google.api.resource) = {
+    type: "recaptchaenterprise.googleapis.com/RelatedAccountGroup"
+    pattern: "projects/{project}/relatedaccountgroups/{relatedaccountgroup}"
+  };
+
+  // Required. The resource name for the related account group in the format
+  // `projects/{project}/relatedaccountgroups/{related_account_group}`.
+  string name = 1 [
+    (google.api.field_behavior) = REQUIRED,
+    (google.api.resource_reference) = {
+      type: "recaptchaenterprise.googleapis.com/RelatedAccountGroup"
+    }
+  ];
+}
diff --git a/protos/protos.d.ts b/protos/protos.d.ts
index 41b0006..5f2fd7b 100644
--- a/protos/protos.d.ts
+++ b/protos/protos.d.ts
@@ -171,6 +171,48 @@ export namespace google {
                      * @returns Promise
                      */
                     public getMetrics(request: google.cloud.recaptchaenterprise.v1.IGetMetricsRequest): Promise<google.cloud.recaptchaenterprise.v1.Metrics>;
+
+                    /**
+                     * Calls ListRelatedAccountGroups.
+                     * @param request ListRelatedAccountGroupsRequest message or plain object
+                     * @param callback Node-style callback called with the error, if any, and ListRelatedAccountGroupsResponse
+                     */
+                    public listRelatedAccountGroups(request: google.cloud.recaptchaenterprise.v1.IListRelatedAccountGroupsRequest, callback: google.cloud.recaptchaenterprise.v1.RecaptchaEnterpriseService.ListRelatedAccountGroupsCallback): void;
+
+                    /**
+                     * Calls ListRelatedAccountGroups.
+                     * @param request ListRelatedAccountGroupsRequest message or plain object
+                     * @returns Promise
+                     */
+                    public listRelatedAccountGroups(request: google.cloud.recaptchaenterprise.v1.IListRelatedAccountGroupsRequest): Promise<google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupsResponse>;
+
+                    /**
+                     * Calls ListRelatedAccountGroupMemberships.
+                     * @param request ListRelatedAccountGroupMembershipsRequest message or plain object
+                     * @param callback Node-style callback called with the error, if any, and ListRelatedAccountGroupMembershipsResponse
+                     */
+                    public listRelatedAccountGroupMemberships(request: google.cloud.recaptchaenterprise.v1.IListRelatedAccountGroupMembershipsRequest, callback: google.cloud.recaptchaenterprise.v1.RecaptchaEnterpriseService.ListRelatedAccountGroupMembershipsCallback): void;
+
+                    /**
+                     * Calls ListRelatedAccountGroupMemberships.
+                     * @param request ListRelatedAccountGroupMembershipsRequest message or plain object
+                     * @returns Promise
+                     */
+                    public listRelatedAccountGroupMemberships(request: google.cloud.recaptchaenterprise.v1.IListRelatedAccountGroupMembershipsRequest): Promise<google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupMembershipsResponse>;
+
+                    /**
+                     * Calls SearchRelatedAccountGroupMemberships.
+                     * @param request SearchRelatedAccountGroupMembershipsRequest message or plain object
+                     * @param callback Node-style callback called with the error, if any, and SearchRelatedAccountGroupMembershipsResponse
+                     */
+                    public searchRelatedAccountGroupMemberships(request: google.cloud.recaptchaenterprise.v1.ISearchRelatedAccountGroupMembershipsRequest, callback: google.cloud.recaptchaenterprise.v1.RecaptchaEnterpriseService.SearchRelatedAccountGroupMembershipsCallback): void;
+
+                    /**
+                     * Calls SearchRelatedAccountGroupMemberships.
+                     * @param request SearchRelatedAccountGroupMembershipsRequest message or plain object
+                     * @returns Promise
+                     */
+                    public searchRelatedAccountGroupMemberships(request: google.cloud.recaptchaenterprise.v1.ISearchRelatedAccountGroupMembershipsRequest): Promise<google.cloud.recaptchaenterprise.v1.SearchRelatedAccountGroupMembershipsResponse>;
                 }
 
                 namespace RecaptchaEnterpriseService {
@@ -237,6 +279,27 @@ export namespace google {
                      * @param [response] Metrics
                      */
                     type GetMetricsCallback = (error: (Error|null), response?: google.cloud.recaptchaenterprise.v1.Metrics) => void;
+
+                    /**
+                     * Callback as used by {@link google.cloud.recaptchaenterprise.v1.RecaptchaEnterpriseService#listRelatedAccountGroups}.
+                     * @param error Error, if any
+                     * @param [response] ListRelatedAccountGroupsResponse
+                     */
+                    type ListRelatedAccountGroupsCallback = (error: (Error|null), response?: google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupsResponse) => void;
+
+                    /**
+                     * Callback as used by {@link google.cloud.recaptchaenterprise.v1.RecaptchaEnterpriseService#listRelatedAccountGroupMemberships}.
+                     * @param error Error, if any
+                     * @param [response] ListRelatedAccountGroupMembershipsResponse
+                     */
+                    type ListRelatedAccountGroupMembershipsCallback = (error: (Error|null), response?: google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupMembershipsResponse) => void;
+
+                    /**
+                     * Callback as used by {@link google.cloud.recaptchaenterprise.v1.RecaptchaEnterpriseService#searchRelatedAccountGroupMemberships}.
+                     * @param error Error, if any
+                     * @param [response] SearchRelatedAccountGroupMembershipsResponse
+                     */
+                    type SearchRelatedAccountGroupMembershipsCallback = (error: (Error|null), response?: google.cloud.recaptchaenterprise.v1.SearchRelatedAccountGroupMembershipsResponse) => void;
                 }
 
                 /** Properties of a CreateAssessmentRequest. */
@@ -346,6 +409,9 @@ export namespace google {
 
                     /** AnnotateAssessmentRequest reasons */
                     reasons?: (google.cloud.recaptchaenterprise.v1.AnnotateAssessmentRequest.Reason[]|null);
+
+                    /** AnnotateAssessmentRequest hashedAccountId */
+                    hashedAccountId?: (Uint8Array|string|null);
                 }
 
                 /** Represents an AnnotateAssessmentRequest. */
@@ -366,6 +432,9 @@ export namespace google {
                     /** AnnotateAssessmentRequest reasons. */
                     public reasons: google.cloud.recaptchaenterprise.v1.AnnotateAssessmentRequest.Reason[];
 
+                    /** AnnotateAssessmentRequest hashedAccountId. */
+                    public hashedAccountId: (Uint8Array|string);
+
                     /**
                      * Creates a new AnnotateAssessmentRequest instance using the specified properties.
                      * @param [properties] Properties to set
@@ -559,6 +628,9 @@ export namespace google {
 
                     /** Assessment tokenProperties */
                     tokenProperties?: (google.cloud.recaptchaenterprise.v1.ITokenProperties|null);
+
+                    /** Assessment accountDefenderAssessment */
+                    accountDefenderAssessment?: (google.cloud.recaptchaenterprise.v1.IAccountDefenderAssessment|null);
                 }
 
                 /** Represents an Assessment. */
@@ -582,6 +654,9 @@ export namespace google {
                     /** Assessment tokenProperties. */
                     public tokenProperties?: (google.cloud.recaptchaenterprise.v1.ITokenProperties|null);
 
+                    /** Assessment accountDefenderAssessment. */
+                    public accountDefenderAssessment?: (google.cloud.recaptchaenterprise.v1.IAccountDefenderAssessment|null);
+
                     /**
                      * Creates a new Assessment instance using the specified properties.
                      * @param [properties] Properties to set
@@ -670,6 +745,9 @@ export namespace google {
 
                     /** Event expectedAction */
                     expectedAction?: (string|null);
+
+                    /** Event hashedAccountId */
+                    hashedAccountId?: (Uint8Array|string|null);
                 }
 
                 /** Represents an Event. */
@@ -696,6 +774,9 @@ export namespace google {
                     /** Event expectedAction. */
                     public expectedAction: string;
 
+                    /** Event hashedAccountId. */
+                    public hashedAccountId: (Uint8Array|string);
+
                     /**
                      * Creates a new Event instance using the specified properties.
                      * @param [properties] Properties to set
@@ -1004,6 +1085,108 @@ export namespace google {
                     }
                 }
 
+                /** Properties of an AccountDefenderAssessment. */
+                interface IAccountDefenderAssessment {
+
+                    /** AccountDefenderAssessment labels */
+                    labels?: (google.cloud.recaptchaenterprise.v1.AccountDefenderAssessment.AccountDefenderLabel[]|null);
+                }
+
+                /** Represents an AccountDefenderAssessment. */
+                class AccountDefenderAssessment implements IAccountDefenderAssessment {
+
+                    /**
+                     * Constructs a new AccountDefenderAssessment.
+                     * @param [properties] Properties to set
+                     */
+                    constructor(properties?: google.cloud.recaptchaenterprise.v1.IAccountDefenderAssessment);
+
+                    /** AccountDefenderAssessment labels. */
+                    public labels: google.cloud.recaptchaenterprise.v1.AccountDefenderAssessment.AccountDefenderLabel[];
+
+                    /**
+                     * Creates a new AccountDefenderAssessment instance using the specified properties.
+                     * @param [properties] Properties to set
+                     * @returns AccountDefenderAssessment instance
+                     */
+                    public static create(properties?: google.cloud.recaptchaenterprise.v1.IAccountDefenderAssessment): google.cloud.recaptchaenterprise.v1.AccountDefenderAssessment;
+
+                    /**
+                     * Encodes the specified AccountDefenderAssessment message. Does not implicitly {@link google.cloud.recaptchaenterprise.v1.AccountDefenderAssessment.verify|verify} messages.
+                     * @param message AccountDefenderAssessment message or plain object to encode
+                     * @param [writer] Writer to encode to
+                     * @returns Writer
+                     */
+                    public static encode(message: google.cloud.recaptchaenterprise.v1.IAccountDefenderAssessment, writer?: $protobuf.Writer): $protobuf.Writer;
+
+                    /**
+                     * Encodes the specified AccountDefenderAssessment message, length delimited. Does not implicitly {@link google.cloud.recaptchaenterprise.v1.AccountDefenderAssessment.verify|verify} messages.
+                     * @param message AccountDefenderAssessment message or plain object to encode
+                     * @param [writer] Writer to encode to
+                     * @returns Writer
+                     */
+                    public static encodeDelimited(message: google.cloud.recaptchaenterprise.v1.IAccountDefenderAssessment, writer?: $protobuf.Writer): $protobuf.Writer;
+
+                    /**
+                     * Decodes an AccountDefenderAssessment message from the specified reader or buffer.
+                     * @param reader Reader or buffer to decode from
+                     * @param [length] Message length if known beforehand
+                     * @returns AccountDefenderAssessment
+                     * @throws {Error} If the payload is not a reader or valid buffer
+                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
+                     */
+                    public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): google.cloud.recaptchaenterprise.v1.AccountDefenderAssessment;
+
+                    /**
+                     * Decodes an AccountDefenderAssessment message from the specified reader or buffer, length delimited.
+                     * @param reader Reader or buffer to decode from
+                     * @returns AccountDefenderAssessment
+                     * @throws {Error} If the payload is not a reader or valid buffer
+                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
+                     */
+                    public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): google.cloud.recaptchaenterprise.v1.AccountDefenderAssessment;
+
+                    /**
+                     * Verifies an AccountDefenderAssessment message.
+                     * @param message Plain object to verify
+                     * @returns `null` if valid, otherwise the reason why it is not
+                     */
+                    public static verify(message: { [k: string]: any }): (string|null);
+
+                    /**
+                     * Creates an AccountDefenderAssessment message from a plain object. Also converts values to their respective internal types.
+                     * @param object Plain object
+                     * @returns AccountDefenderAssessment
+                     */
+                    public static fromObject(object: { [k: string]: any }): google.cloud.recaptchaenterprise.v1.AccountDefenderAssessment;
+
+                    /**
+                     * Creates a plain object from an AccountDefenderAssessment message. Also converts values to other types if specified.
+                     * @param message AccountDefenderAssessment
+                     * @param [options] Conversion options
+                     * @returns Plain object
+                     */
+                    public static toObject(message: google.cloud.recaptchaenterprise.v1.AccountDefenderAssessment, options?: $protobuf.IConversionOptions): { [k: string]: any };
+
+                    /**
+                     * Converts this AccountDefenderAssessment to JSON.
+                     * @returns JSON object
+                     */
+                    public toJSON(): { [k: string]: any };
+                }
+
+                namespace AccountDefenderAssessment {
+
+                    /** AccountDefenderLabel enum. */
+                    enum AccountDefenderLabel {
+                        ACCOUNT_DEFENDER_LABEL_UNSPECIFIED = 0,
+                        PROFILE_MATCH = 1,
+                        SUSPICIOUS_LOGIN_ACTIVITY = 2,
+                        SUSPICIOUS_ACCOUNT_CREATION = 3,
+                        RELATED_ACCOUNTS_NUMBER_HIGH = 4
+                    }
+                }
+
                 /** Properties of a CreateKeyRequest. */
                 interface ICreateKeyRequest {
 
@@ -2721,6 +2904,792 @@ export namespace google {
                      */
                     public toJSON(): { [k: string]: any };
                 }
+
+                /** Properties of a ListRelatedAccountGroupMembershipsRequest. */
+                interface IListRelatedAccountGroupMembershipsRequest {
+
+                    /** ListRelatedAccountGroupMembershipsRequest parent */
+                    parent?: (string|null);
+
+                    /** ListRelatedAccountGroupMembershipsRequest pageSize */
+                    pageSize?: (number|null);
+
+                    /** ListRelatedAccountGroupMembershipsRequest pageToken */
+                    pageToken?: (string|null);
+                }
+
+                /** Represents a ListRelatedAccountGroupMembershipsRequest. */
+                class ListRelatedAccountGroupMembershipsRequest implements IListRelatedAccountGroupMembershipsRequest {
+
+                    /**
+                     * Constructs a new ListRelatedAccountGroupMembershipsRequest.
+                     * @param [properties] Properties to set
+                     */
+                    constructor(properties?: google.cloud.recaptchaenterprise.v1.IListRelatedAccountGroupMembershipsRequest);
+
+                    /** ListRelatedAccountGroupMembershipsRequest parent. */
+                    public parent: string;
+
+                    /** ListRelatedAccountGroupMembershipsRequest pageSize. */
+                    public pageSize: number;
+
+                    /** ListRelatedAccountGroupMembershipsRequest pageToken. */
+                    public pageToken: string;
+
+                    /**
+                     * Creates a new ListRelatedAccountGroupMembershipsRequest instance using the specified properties.
+                     * @param [properties] Properties to set
+                     * @returns ListRelatedAccountGroupMembershipsRequest instance
+                     */
+                    public static create(properties?: google.cloud.recaptchaenterprise.v1.IListRelatedAccountGroupMembershipsRequest): google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupMembershipsRequest;
+
+                    /**
+                     * Encodes the specified ListRelatedAccountGroupMembershipsRequest message. Does not implicitly {@link google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupMembershipsRequest.verify|verify} messages.
+                     * @param message ListRelatedAccountGroupMembershipsRequest message or plain object to encode
+                     * @param [writer] Writer to encode to
+                     * @returns Writer
+                     */
+                    public static encode(message: google.cloud.recaptchaenterprise.v1.IListRelatedAccountGroupMembershipsRequest, writer?: $protobuf.Writer): $protobuf.Writer;
+
+                    /**
+                     * Encodes the specified ListRelatedAccountGroupMembershipsRequest message, length delimited. Does not implicitly {@link google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupMembershipsRequest.verify|verify} messages.
+                     * @param message ListRelatedAccountGroupMembershipsRequest message or plain object to encode
+                     * @param [writer] Writer to encode to
+                     * @returns Writer
+                     */
+                    public static encodeDelimited(message: google.cloud.recaptchaenterprise.v1.IListRelatedAccountGroupMembershipsRequest, writer?: $protobuf.Writer): $protobuf.Writer;
+
+                    /**
+                     * Decodes a ListRelatedAccountGroupMembershipsRequest message from the specified reader or buffer.
+                     * @param reader Reader or buffer to decode from
+                     * @param [length] Message length if known beforehand
+                     * @returns ListRelatedAccountGroupMembershipsRequest
+                     * @throws {Error} If the payload is not a reader or valid buffer
+                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
+                     */
+                    public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupMembershipsRequest;
+
+                    /**
+                     * Decodes a ListRelatedAccountGroupMembershipsRequest message from the specified reader or buffer, length delimited.
+                     * @param reader Reader or buffer to decode from
+                     * @returns ListRelatedAccountGroupMembershipsRequest
+                     * @throws {Error} If the payload is not a reader or valid buffer
+                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
+                     */
+                    public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupMembershipsRequest;
+
+                    /**
+                     * Verifies a ListRelatedAccountGroupMembershipsRequest message.
+                     * @param message Plain object to verify
+                     * @returns `null` if valid, otherwise the reason why it is not
+                     */
+                    public static verify(message: { [k: string]: any }): (string|null);
+
+                    /**
+                     * Creates a ListRelatedAccountGroupMembershipsRequest message from a plain object. Also converts values to their respective internal types.
+                     * @param object Plain object
+                     * @returns ListRelatedAccountGroupMembershipsRequest
+                     */
+                    public static fromObject(object: { [k: string]: any }): google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupMembershipsRequest;
+
+                    /**
+                     * Creates a plain object from a ListRelatedAccountGroupMembershipsRequest message. Also converts values to other types if specified.
+                     * @param message ListRelatedAccountGroupMembershipsRequest
+                     * @param [options] Conversion options
+                     * @returns Plain object
+                     */
+                    public static toObject(message: google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupMembershipsRequest, options?: $protobuf.IConversionOptions): { [k: string]: any };
+
+                    /**
+                     * Converts this ListRelatedAccountGroupMembershipsRequest to JSON.
+                     * @returns JSON object
+                     */
+                    public toJSON(): { [k: string]: any };
+                }
+
+                /** Properties of a ListRelatedAccountGroupMembershipsResponse. */
+                interface IListRelatedAccountGroupMembershipsResponse {
+
+                    /** ListRelatedAccountGroupMembershipsResponse relatedAccountGroupMemberships */
+                    relatedAccountGroupMemberships?: (google.cloud.recaptchaenterprise.v1.IRelatedAccountGroupMembership[]|null);
+
+                    /** ListRelatedAccountGroupMembershipsResponse nextPageToken */
+                    nextPageToken?: (string|null);
+                }
+
+                /** Represents a ListRelatedAccountGroupMembershipsResponse. */
+                class ListRelatedAccountGroupMembershipsResponse implements IListRelatedAccountGroupMembershipsResponse {
+
+                    /**
+                     * Constructs a new ListRelatedAccountGroupMembershipsResponse.
+                     * @param [properties] Properties to set
+                     */
+                    constructor(properties?: google.cloud.recaptchaenterprise.v1.IListRelatedAccountGroupMembershipsResponse);
+
+                    /** ListRelatedAccountGroupMembershipsResponse relatedAccountGroupMemberships. */
+                    public relatedAccountGroupMemberships: google.cloud.recaptchaenterprise.v1.IRelatedAccountGroupMembership[];
+
+                    /** ListRelatedAccountGroupMembershipsResponse nextPageToken. */
+                    public nextPageToken: string;
+
+                    /**
+                     * Creates a new ListRelatedAccountGroupMembershipsResponse instance using the specified properties.
+                     * @param [properties] Properties to set
+                     * @returns ListRelatedAccountGroupMembershipsResponse instance
+                     */
+                    public static create(properties?: google.cloud.recaptchaenterprise.v1.IListRelatedAccountGroupMembershipsResponse): google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupMembershipsResponse;
+
+                    /**
+                     * Encodes the specified ListRelatedAccountGroupMembershipsResponse message. Does not implicitly {@link google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupMembershipsResponse.verify|verify} messages.
+                     * @param message ListRelatedAccountGroupMembershipsResponse message or plain object to encode
+                     * @param [writer] Writer to encode to
+                     * @returns Writer
+                     */
+                    public static encode(message: google.cloud.recaptchaenterprise.v1.IListRelatedAccountGroupMembershipsResponse, writer?: $protobuf.Writer): $protobuf.Writer;
+
+                    /**
+                     * Encodes the specified ListRelatedAccountGroupMembershipsResponse message, length delimited. Does not implicitly {@link google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupMembershipsResponse.verify|verify} messages.
+                     * @param message ListRelatedAccountGroupMembershipsResponse message or plain object to encode
+                     * @param [writer] Writer to encode to
+                     * @returns Writer
+                     */
+                    public static encodeDelimited(message: google.cloud.recaptchaenterprise.v1.IListRelatedAccountGroupMembershipsResponse, writer?: $protobuf.Writer): $protobuf.Writer;
+
+                    /**
+                     * Decodes a ListRelatedAccountGroupMembershipsResponse message from the specified reader or buffer.
+                     * @param reader Reader or buffer to decode from
+                     * @param [length] Message length if known beforehand
+                     * @returns ListRelatedAccountGroupMembershipsResponse
+                     * @throws {Error} If the payload is not a reader or valid buffer
+                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
+                     */
+                    public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupMembershipsResponse;
+
+                    /**
+                     * Decodes a ListRelatedAccountGroupMembershipsResponse message from the specified reader or buffer, length delimited.
+                     * @param reader Reader or buffer to decode from
+                     * @returns ListRelatedAccountGroupMembershipsResponse
+                     * @throws {Error} If the payload is not a reader or valid buffer
+                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
+                     */
+                    public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupMembershipsResponse;
+
+                    /**
+                     * Verifies a ListRelatedAccountGroupMembershipsResponse message.
+                     * @param message Plain object to verify
+                     * @returns `null` if valid, otherwise the reason why it is not
+                     */
+                    public static verify(message: { [k: string]: any }): (string|null);
+
+                    /**
+                     * Creates a ListRelatedAccountGroupMembershipsResponse message from a plain object. Also converts values to their respective internal types.
+                     * @param object Plain object
+                     * @returns ListRelatedAccountGroupMembershipsResponse
+                     */
+                    public static fromObject(object: { [k: string]: any }): google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupMembershipsResponse;
+
+                    /**
+                     * Creates a plain object from a ListRelatedAccountGroupMembershipsResponse message. Also converts values to other types if specified.
+                     * @param message ListRelatedAccountGroupMembershipsResponse
+                     * @param [options] Conversion options
+                     * @returns Plain object
+                     */
+                    public static toObject(message: google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupMembershipsResponse, options?: $protobuf.IConversionOptions): { [k: string]: any };
+
+                    /**
+                     * Converts this ListRelatedAccountGroupMembershipsResponse to JSON.
+                     * @returns JSON object
+                     */
+                    public toJSON(): { [k: string]: any };
+                }
+
+                /** Properties of a ListRelatedAccountGroupsRequest. */
+                interface IListRelatedAccountGroupsRequest {
+
+                    /** ListRelatedAccountGroupsRequest parent */
+                    parent?: (string|null);
+
+                    /** ListRelatedAccountGroupsRequest pageSize */
+                    pageSize?: (number|null);
+
+                    /** ListRelatedAccountGroupsRequest pageToken */
+                    pageToken?: (string|null);
+                }
+
+                /** Represents a ListRelatedAccountGroupsRequest. */
+                class ListRelatedAccountGroupsRequest implements IListRelatedAccountGroupsRequest {
+
+                    /**
+                     * Constructs a new ListRelatedAccountGroupsRequest.
+                     * @param [properties] Properties to set
+                     */
+                    constructor(properties?: google.cloud.recaptchaenterprise.v1.IListRelatedAccountGroupsRequest);
+
+                    /** ListRelatedAccountGroupsRequest parent. */
+                    public parent: string;
+
+                    /** ListRelatedAccountGroupsRequest pageSize. */
+                    public pageSize: number;
+
+                    /** ListRelatedAccountGroupsRequest pageToken. */
+                    public pageToken: string;
+
+                    /**
+                     * Creates a new ListRelatedAccountGroupsRequest instance using the specified properties.
+                     * @param [properties] Properties to set
+                     * @returns ListRelatedAccountGroupsRequest instance
+                     */
+                    public static create(properties?: google.cloud.recaptchaenterprise.v1.IListRelatedAccountGroupsRequest): google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupsRequest;
+
+                    /**
+                     * Encodes the specified ListRelatedAccountGroupsRequest message. Does not implicitly {@link google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupsRequest.verify|verify} messages.
+                     * @param message ListRelatedAccountGroupsRequest message or plain object to encode
+                     * @param [writer] Writer to encode to
+                     * @returns Writer
+                     */
+                    public static encode(message: google.cloud.recaptchaenterprise.v1.IListRelatedAccountGroupsRequest, writer?: $protobuf.Writer): $protobuf.Writer;
+
+                    /**
+                     * Encodes the specified ListRelatedAccountGroupsRequest message, length delimited. Does not implicitly {@link google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupsRequest.verify|verify} messages.
+                     * @param message ListRelatedAccountGroupsRequest message or plain object to encode
+                     * @param [writer] Writer to encode to
+                     * @returns Writer
+                     */
+                    public static encodeDelimited(message: google.cloud.recaptchaenterprise.v1.IListRelatedAccountGroupsRequest, writer?: $protobuf.Writer): $protobuf.Writer;
+
+                    /**
+                     * Decodes a ListRelatedAccountGroupsRequest message from the specified reader or buffer.
+                     * @param reader Reader or buffer to decode from
+                     * @param [length] Message length if known beforehand
+                     * @returns ListRelatedAccountGroupsRequest
+                     * @throws {Error} If the payload is not a reader or valid buffer
+                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
+                     */
+                    public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupsRequest;
+
+                    /**
+                     * Decodes a ListRelatedAccountGroupsRequest message from the specified reader or buffer, length delimited.
+                     * @param reader Reader or buffer to decode from
+                     * @returns ListRelatedAccountGroupsRequest
+                     * @throws {Error} If the payload is not a reader or valid buffer
+                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
+                     */
+                    public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupsRequest;
+
+                    /**
+                     * Verifies a ListRelatedAccountGroupsRequest message.
+                     * @param message Plain object to verify
+                     * @returns `null` if valid, otherwise the reason why it is not
+                     */
+                    public static verify(message: { [k: string]: any }): (string|null);
+
+                    /**
+                     * Creates a ListRelatedAccountGroupsRequest message from a plain object. Also converts values to their respective internal types.
+                     * @param object Plain object
+                     * @returns ListRelatedAccountGroupsRequest
+                     */
+                    public static fromObject(object: { [k: string]: any }): google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupsRequest;
+
+                    /**
+                     * Creates a plain object from a ListRelatedAccountGroupsRequest message. Also converts values to other types if specified.
+                     * @param message ListRelatedAccountGroupsRequest
+                     * @param [options] Conversion options
+                     * @returns Plain object
+                     */
+                    public static toObject(message: google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupsRequest, options?: $protobuf.IConversionOptions): { [k: string]: any };
+
+                    /**
+                     * Converts this ListRelatedAccountGroupsRequest to JSON.
+                     * @returns JSON object
+                     */
+                    public toJSON(): { [k: string]: any };
+                }
+
+                /** Properties of a ListRelatedAccountGroupsResponse. */
+                interface IListRelatedAccountGroupsResponse {
+
+                    /** ListRelatedAccountGroupsResponse relatedAccountGroups */
+                    relatedAccountGroups?: (google.cloud.recaptchaenterprise.v1.IRelatedAccountGroup[]|null);
+
+                    /** ListRelatedAccountGroupsResponse nextPageToken */
+                    nextPageToken?: (string|null);
+                }
+
+                /** Represents a ListRelatedAccountGroupsResponse. */
+                class ListRelatedAccountGroupsResponse implements IListRelatedAccountGroupsResponse {
+
+                    /**
+                     * Constructs a new ListRelatedAccountGroupsResponse.
+                     * @param [properties] Properties to set
+                     */
+                    constructor(properties?: google.cloud.recaptchaenterprise.v1.IListRelatedAccountGroupsResponse);
+
+                    /** ListRelatedAccountGroupsResponse relatedAccountGroups. */
+                    public relatedAccountGroups: google.cloud.recaptchaenterprise.v1.IRelatedAccountGroup[];
+
+                    /** ListRelatedAccountGroupsResponse nextPageToken. */
+                    public nextPageToken: string;
+
+                    /**
+                     * Creates a new ListRelatedAccountGroupsResponse instance using the specified properties.
+                     * @param [properties] Properties to set
+                     * @returns ListRelatedAccountGroupsResponse instance
+                     */
+                    public static create(properties?: google.cloud.recaptchaenterprise.v1.IListRelatedAccountGroupsResponse): google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupsResponse;
+
+                    /**
+                     * Encodes the specified ListRelatedAccountGroupsResponse message. Does not implicitly {@link google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupsResponse.verify|verify} messages.
+                     * @param message ListRelatedAccountGroupsResponse message or plain object to encode
+                     * @param [writer] Writer to encode to
+                     * @returns Writer
+                     */
+                    public static encode(message: google.cloud.recaptchaenterprise.v1.IListRelatedAccountGroupsResponse, writer?: $protobuf.Writer): $protobuf.Writer;
+
+                    /**
+                     * Encodes the specified ListRelatedAccountGroupsResponse message, length delimited. Does not implicitly {@link google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupsResponse.verify|verify} messages.
+                     * @param message ListRelatedAccountGroupsResponse message or plain object to encode
+                     * @param [writer] Writer to encode to
+                     * @returns Writer
+                     */
+                    public static encodeDelimited(message: google.cloud.recaptchaenterprise.v1.IListRelatedAccountGroupsResponse, writer?: $protobuf.Writer): $protobuf.Writer;
+
+                    /**
+                     * Decodes a ListRelatedAccountGroupsResponse message from the specified reader or buffer.
+                     * @param reader Reader or buffer to decode from
+                     * @param [length] Message length if known beforehand
+                     * @returns ListRelatedAccountGroupsResponse
+                     * @throws {Error} If the payload is not a reader or valid buffer
+                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
+                     */
+                    public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupsResponse;
+
+                    /**
+                     * Decodes a ListRelatedAccountGroupsResponse message from the specified reader or buffer, length delimited.
+                     * @param reader Reader or buffer to decode from
+                     * @returns ListRelatedAccountGroupsResponse
+                     * @throws {Error} If the payload is not a reader or valid buffer
+                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
+                     */
+                    public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupsResponse;
+
+                    /**
+                     * Verifies a ListRelatedAccountGroupsResponse message.
+                     * @param message Plain object to verify
+                     * @returns `null` if valid, otherwise the reason why it is not
+                     */
+                    public static verify(message: { [k: string]: any }): (string|null);
+
+                    /**
+                     * Creates a ListRelatedAccountGroupsResponse message from a plain object. Also converts values to their respective internal types.
+                     * @param object Plain object
+                     * @returns ListRelatedAccountGroupsResponse
+                     */
+                    public static fromObject(object: { [k: string]: any }): google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupsResponse;
+
+                    /**
+                     * Creates a plain object from a ListRelatedAccountGroupsResponse message. Also converts values to other types if specified.
+                     * @param message ListRelatedAccountGroupsResponse
+                     * @param [options] Conversion options
+                     * @returns Plain object
+                     */
+                    public static toObject(message: google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupsResponse, options?: $protobuf.IConversionOptions): { [k: string]: any };
+
+                    /**
+                     * Converts this ListRelatedAccountGroupsResponse to JSON.
+                     * @returns JSON object
+                     */
+                    public toJSON(): { [k: string]: any };
+                }
+
+                /** Properties of a SearchRelatedAccountGroupMembershipsRequest. */
+                interface ISearchRelatedAccountGroupMembershipsRequest {
+
+                    /** SearchRelatedAccountGroupMembershipsRequest parent */
+                    parent?: (string|null);
+
+                    /** SearchRelatedAccountGroupMembershipsRequest hashedAccountId */
+                    hashedAccountId?: (Uint8Array|string|null);
+
+                    /** SearchRelatedAccountGroupMembershipsRequest pageSize */
+                    pageSize?: (number|null);
+
+                    /** SearchRelatedAccountGroupMembershipsRequest pageToken */
+                    pageToken?: (string|null);
+                }
+
+                /** Represents a SearchRelatedAccountGroupMembershipsRequest. */
+                class SearchRelatedAccountGroupMembershipsRequest implements ISearchRelatedAccountGroupMembershipsRequest {
+
+                    /**
+                     * Constructs a new SearchRelatedAccountGroupMembershipsRequest.
+                     * @param [properties] Properties to set
+                     */
+                    constructor(properties?: google.cloud.recaptchaenterprise.v1.ISearchRelatedAccountGroupMembershipsRequest);
+
+                    /** SearchRelatedAccountGroupMembershipsRequest parent. */
+                    public parent: string;
+
+                    /** SearchRelatedAccountGroupMembershipsRequest hashedAccountId. */
+                    public hashedAccountId: (Uint8Array|string);
+
+                    /** SearchRelatedAccountGroupMembershipsRequest pageSize. */
+                    public pageSize: number;
+
+                    /** SearchRelatedAccountGroupMembershipsRequest pageToken. */
+                    public pageToken: string;
+
+                    /**
+                     * Creates a new SearchRelatedAccountGroupMembershipsRequest instance using the specified properties.
+                     * @param [properties] Properties to set
+                     * @returns SearchRelatedAccountGroupMembershipsRequest instance
+                     */
+                    public static create(properties?: google.cloud.recaptchaenterprise.v1.ISearchRelatedAccountGroupMembershipsRequest): google.cloud.recaptchaenterprise.v1.SearchRelatedAccountGroupMembershipsRequest;
+
+                    /**
+                     * Encodes the specified SearchRelatedAccountGroupMembershipsRequest message. Does not implicitly {@link google.cloud.recaptchaenterprise.v1.SearchRelatedAccountGroupMembershipsRequest.verify|verify} messages.
+                     * @param message SearchRelatedAccountGroupMembershipsRequest message or plain object to encode
+                     * @param [writer] Writer to encode to
+                     * @returns Writer
+                     */
+                    public static encode(message: google.cloud.recaptchaenterprise.v1.ISearchRelatedAccountGroupMembershipsRequest, writer?: $protobuf.Writer): $protobuf.Writer;
+
+                    /**
+                     * Encodes the specified SearchRelatedAccountGroupMembershipsRequest message, length delimited. Does not implicitly {@link google.cloud.recaptchaenterprise.v1.SearchRelatedAccountGroupMembershipsRequest.verify|verify} messages.
+                     * @param message SearchRelatedAccountGroupMembershipsRequest message or plain object to encode
+                     * @param [writer] Writer to encode to
+                     * @returns Writer
+                     */
+                    public static encodeDelimited(message: google.cloud.recaptchaenterprise.v1.ISearchRelatedAccountGroupMembershipsRequest, writer?: $protobuf.Writer): $protobuf.Writer;
+
+                    /**
+                     * Decodes a SearchRelatedAccountGroupMembershipsRequest message from the specified reader or buffer.
+                     * @param reader Reader or buffer to decode from
+                     * @param [length] Message length if known beforehand
+                     * @returns SearchRelatedAccountGroupMembershipsRequest
+                     * @throws {Error} If the payload is not a reader or valid buffer
+                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
+                     */
+                    public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): google.cloud.recaptchaenterprise.v1.SearchRelatedAccountGroupMembershipsRequest;
+
+                    /**
+                     * Decodes a SearchRelatedAccountGroupMembershipsRequest message from the specified reader or buffer, length delimited.
+                     * @param reader Reader or buffer to decode from
+                     * @returns SearchRelatedAccountGroupMembershipsRequest
+                     * @throws {Error} If the payload is not a reader or valid buffer
+                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
+                     */
+                    public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): google.cloud.recaptchaenterprise.v1.SearchRelatedAccountGroupMembershipsRequest;
+
+                    /**
+                     * Verifies a SearchRelatedAccountGroupMembershipsRequest message.
+                     * @param message Plain object to verify
+                     * @returns `null` if valid, otherwise the reason why it is not
+                     */
+                    public static verify(message: { [k: string]: any }): (string|null);
+
+                    /**
+                     * Creates a SearchRelatedAccountGroupMembershipsRequest message from a plain object. Also converts values to their respective internal types.
+                     * @param object Plain object
+                     * @returns SearchRelatedAccountGroupMembershipsRequest
+                     */
+                    public static fromObject(object: { [k: string]: any }): google.cloud.recaptchaenterprise.v1.SearchRelatedAccountGroupMembershipsRequest;
+
+                    /**
+                     * Creates a plain object from a SearchRelatedAccountGroupMembershipsRequest message. Also converts values to other types if specified.
+                     * @param message SearchRelatedAccountGroupMembershipsRequest
+                     * @param [options] Conversion options
+                     * @returns Plain object
+                     */
+                    public static toObject(message: google.cloud.recaptchaenterprise.v1.SearchRelatedAccountGroupMembershipsRequest, options?: $protobuf.IConversionOptions): { [k: string]: any };
+
+                    /**
+                     * Converts this SearchRelatedAccountGroupMembershipsRequest to JSON.
+                     * @returns JSON object
+                     */
+                    public toJSON(): { [k: string]: any };
+                }
+
+                /** Properties of a SearchRelatedAccountGroupMembershipsResponse. */
+                interface ISearchRelatedAccountGroupMembershipsResponse {
+
+                    /** SearchRelatedAccountGroupMembershipsResponse relatedAccountGroupMemberships */
+                    relatedAccountGroupMemberships?: (google.cloud.recaptchaenterprise.v1.IRelatedAccountGroupMembership[]|null);
+
+                    /** SearchRelatedAccountGroupMembershipsResponse nextPageToken */
+                    nextPageToken?: (string|null);
+                }
+
+                /** Represents a SearchRelatedAccountGroupMembershipsResponse. */
+                class SearchRelatedAccountGroupMembershipsResponse implements ISearchRelatedAccountGroupMembershipsResponse {
+
+                    /**
+                     * Constructs a new SearchRelatedAccountGroupMembershipsResponse.
+                     * @param [properties] Properties to set
+                     */
+                    constructor(properties?: google.cloud.recaptchaenterprise.v1.ISearchRelatedAccountGroupMembershipsResponse);
+
+                    /** SearchRelatedAccountGroupMembershipsResponse relatedAccountGroupMemberships. */
+                    public relatedAccountGroupMemberships: google.cloud.recaptchaenterprise.v1.IRelatedAccountGroupMembership[];
+
+                    /** SearchRelatedAccountGroupMembershipsResponse nextPageToken. */
+                    public nextPageToken: string;
+
+                    /**
+                     * Creates a new SearchRelatedAccountGroupMembershipsResponse instance using the specified properties.
+                     * @param [properties] Properties to set
+                     * @returns SearchRelatedAccountGroupMembershipsResponse instance
+                     */
+                    public static create(properties?: google.cloud.recaptchaenterprise.v1.ISearchRelatedAccountGroupMembershipsResponse): google.cloud.recaptchaenterprise.v1.SearchRelatedAccountGroupMembershipsResponse;
+
+                    /**
+                     * Encodes the specified SearchRelatedAccountGroupMembershipsResponse message. Does not implicitly {@link google.cloud.recaptchaenterprise.v1.SearchRelatedAccountGroupMembershipsResponse.verify|verify} messages.
+                     * @param message SearchRelatedAccountGroupMembershipsResponse message or plain object to encode
+                     * @param [writer] Writer to encode to
+                     * @returns Writer
+                     */
+                    public static encode(message: google.cloud.recaptchaenterprise.v1.ISearchRelatedAccountGroupMembershipsResponse, writer?: $protobuf.Writer): $protobuf.Writer;
+
+                    /**
+                     * Encodes the specified SearchRelatedAccountGroupMembershipsResponse message, length delimited. Does not implicitly {@link google.cloud.recaptchaenterprise.v1.SearchRelatedAccountGroupMembershipsResponse.verify|verify} messages.
+                     * @param message SearchRelatedAccountGroupMembershipsResponse message or plain object to encode
+                     * @param [writer] Writer to encode to
+                     * @returns Writer
+                     */
+                    public static encodeDelimited(message: google.cloud.recaptchaenterprise.v1.ISearchRelatedAccountGroupMembershipsResponse, writer?: $protobuf.Writer): $protobuf.Writer;
+
+                    /**
+                     * Decodes a SearchRelatedAccountGroupMembershipsResponse message from the specified reader or buffer.
+                     * @param reader Reader or buffer to decode from
+                     * @param [length] Message length if known beforehand
+                     * @returns SearchRelatedAccountGroupMembershipsResponse
+                     * @throws {Error} If the payload is not a reader or valid buffer
+                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
+                     */
+                    public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): google.cloud.recaptchaenterprise.v1.SearchRelatedAccountGroupMembershipsResponse;
+
+                    /**
+                     * Decodes a SearchRelatedAccountGroupMembershipsResponse message from the specified reader or buffer, length delimited.
+                     * @param reader Reader or buffer to decode from
+                     * @returns SearchRelatedAccountGroupMembershipsResponse
+                     * @throws {Error} If the payload is not a reader or valid buffer
+                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
+                     */
+                    public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): google.cloud.recaptchaenterprise.v1.SearchRelatedAccountGroupMembershipsResponse;
+
+                    /**
+                     * Verifies a SearchRelatedAccountGroupMembershipsResponse message.
+                     * @param message Plain object to verify
+                     * @returns `null` if valid, otherwise the reason why it is not
+                     */
+                    public static verify(message: { [k: string]: any }): (string|null);
+
+                    /**
+                     * Creates a SearchRelatedAccountGroupMembershipsResponse message from a plain object. Also converts values to their respective internal types.
+                     * @param object Plain object
+                     * @returns SearchRelatedAccountGroupMembershipsResponse
+                     */
+                    public static fromObject(object: { [k: string]: any }): google.cloud.recaptchaenterprise.v1.SearchRelatedAccountGroupMembershipsResponse;
+
+                    /**
+                     * Creates a plain object from a SearchRelatedAccountGroupMembershipsResponse message. Also converts values to other types if specified.
+                     * @param message SearchRelatedAccountGroupMembershipsResponse
+                     * @param [options] Conversion options
+                     * @returns Plain object
+                     */
+                    public static toObject(message: google.cloud.recaptchaenterprise.v1.SearchRelatedAccountGroupMembershipsResponse, options?: $protobuf.IConversionOptions): { [k: string]: any };
+
+                    /**
+                     * Converts this SearchRelatedAccountGroupMembershipsResponse to JSON.
+                     * @returns JSON object
+                     */
+                    public toJSON(): { [k: string]: any };
+                }
+
+                /** Properties of a RelatedAccountGroupMembership. */
+                interface IRelatedAccountGroupMembership {
+
+                    /** RelatedAccountGroupMembership name */
+                    name?: (string|null);
+
+                    /** RelatedAccountGroupMembership hashedAccountId */
+                    hashedAccountId?: (Uint8Array|string|null);
+                }
+
+                /** Represents a RelatedAccountGroupMembership. */
+                class RelatedAccountGroupMembership implements IRelatedAccountGroupMembership {
+
+                    /**
+                     * Constructs a new RelatedAccountGroupMembership.
+                     * @param [properties] Properties to set
+                     */
+                    constructor(properties?: google.cloud.recaptchaenterprise.v1.IRelatedAccountGroupMembership);
+
+                    /** RelatedAccountGroupMembership name. */
+                    public name: string;
+
+                    /** RelatedAccountGroupMembership hashedAccountId. */
+                    public hashedAccountId: (Uint8Array|string);
+
+                    /**
+                     * Creates a new RelatedAccountGroupMembership instance using the specified properties.
+                     * @param [properties] Properties to set
+                     * @returns RelatedAccountGroupMembership instance
+                     */
+                    public static create(properties?: google.cloud.recaptchaenterprise.v1.IRelatedAccountGroupMembership): google.cloud.recaptchaenterprise.v1.RelatedAccountGroupMembership;
+
+                    /**
+                     * Encodes the specified RelatedAccountGroupMembership message. Does not implicitly {@link google.cloud.recaptchaenterprise.v1.RelatedAccountGroupMembership.verify|verify} messages.
+                     * @param message RelatedAccountGroupMembership message or plain object to encode
+                     * @param [writer] Writer to encode to
+                     * @returns Writer
+                     */
+                    public static encode(message: google.cloud.recaptchaenterprise.v1.IRelatedAccountGroupMembership, writer?: $protobuf.Writer): $protobuf.Writer;
+
+                    /**
+                     * Encodes the specified RelatedAccountGroupMembership message, length delimited. Does not implicitly {@link google.cloud.recaptchaenterprise.v1.RelatedAccountGroupMembership.verify|verify} messages.
+                     * @param message RelatedAccountGroupMembership message or plain object to encode
+                     * @param [writer] Writer to encode to
+                     * @returns Writer
+                     */
+                    public static encodeDelimited(message: google.cloud.recaptchaenterprise.v1.IRelatedAccountGroupMembership, writer?: $protobuf.Writer): $protobuf.Writer;
+
+                    /**
+                     * Decodes a RelatedAccountGroupMembership message from the specified reader or buffer.
+                     * @param reader Reader or buffer to decode from
+                     * @param [length] Message length if known beforehand
+                     * @returns RelatedAccountGroupMembership
+                     * @throws {Error} If the payload is not a reader or valid buffer
+                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
+                     */
+                    public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): google.cloud.recaptchaenterprise.v1.RelatedAccountGroupMembership;
+
+                    /**
+                     * Decodes a RelatedAccountGroupMembership message from the specified reader or buffer, length delimited.
+                     * @param reader Reader or buffer to decode from
+                     * @returns RelatedAccountGroupMembership
+                     * @throws {Error} If the payload is not a reader or valid buffer
+                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
+                     */
+                    public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): google.cloud.recaptchaenterprise.v1.RelatedAccountGroupMembership;
+
+                    /**
+                     * Verifies a RelatedAccountGroupMembership message.
+                     * @param message Plain object to verify
+                     * @returns `null` if valid, otherwise the reason why it is not
+                     */
+                    public static verify(message: { [k: string]: any }): (string|null);
+
+                    /**
+                     * Creates a RelatedAccountGroupMembership message from a plain object. Also converts values to their respective internal types.
+                     * @param object Plain object
+                     * @returns RelatedAccountGroupMembership
+                     */
+                    public static fromObject(object: { [k: string]: any }): google.cloud.recaptchaenterprise.v1.RelatedAccountGroupMembership;
+
+                    /**
+                     * Creates a plain object from a RelatedAccountGroupMembership message. Also converts values to other types if specified.
+                     * @param message RelatedAccountGroupMembership
+                     * @param [options] Conversion options
+                     * @returns Plain object
+                     */
+                    public static toObject(message: google.cloud.recaptchaenterprise.v1.RelatedAccountGroupMembership, options?: $protobuf.IConversionOptions): { [k: string]: any };
+
+                    /**
+                     * Converts this RelatedAccountGroupMembership to JSON.
+                     * @returns JSON object
+                     */
+                    public toJSON(): { [k: string]: any };
+                }
+
+                /** Properties of a RelatedAccountGroup. */
+                interface IRelatedAccountGroup {
+
+                    /** RelatedAccountGroup name */
+                    name?: (string|null);
+                }
+
+                /** Represents a RelatedAccountGroup. */
+                class RelatedAccountGroup implements IRelatedAccountGroup {
+
+                    /**
+                     * Constructs a new RelatedAccountGroup.
+                     * @param [properties] Properties to set
+                     */
+                    constructor(properties?: google.cloud.recaptchaenterprise.v1.IRelatedAccountGroup);
+
+                    /** RelatedAccountGroup name. */
+                    public name: string;
+
+                    /**
+                     * Creates a new RelatedAccountGroup instance using the specified properties.
+                     * @param [properties] Properties to set
+                     * @returns RelatedAccountGroup instance
+                     */
+                    public static create(properties?: google.cloud.recaptchaenterprise.v1.IRelatedAccountGroup): google.cloud.recaptchaenterprise.v1.RelatedAccountGroup;
+
+                    /**
+                     * Encodes the specified RelatedAccountGroup message. Does not implicitly {@link google.cloud.recaptchaenterprise.v1.RelatedAccountGroup.verify|verify} messages.
+                     * @param message RelatedAccountGroup message or plain object to encode
+                     * @param [writer] Writer to encode to
+                     * @returns Writer
+                     */
+                    public static encode(message: google.cloud.recaptchaenterprise.v1.IRelatedAccountGroup, writer?: $protobuf.Writer): $protobuf.Writer;
+
+                    /**
+                     * Encodes the specified RelatedAccountGroup message, length delimited. Does not implicitly {@link google.cloud.recaptchaenterprise.v1.RelatedAccountGroup.verify|verify} messages.
+                     * @param message RelatedAccountGroup message or plain object to encode
+                     * @param [writer] Writer to encode to
+                     * @returns Writer
+                     */
+                    public static encodeDelimited(message: google.cloud.recaptchaenterprise.v1.IRelatedAccountGroup, writer?: $protobuf.Writer): $protobuf.Writer;
+
+                    /**
+                     * Decodes a RelatedAccountGroup message from the specified reader or buffer.
+                     * @param reader Reader or buffer to decode from
+                     * @param [length] Message length if known beforehand
+                     * @returns RelatedAccountGroup
+                     * @throws {Error} If the payload is not a reader or valid buffer
+                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
+                     */
+                    public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): google.cloud.recaptchaenterprise.v1.RelatedAccountGroup;
+
+                    /**
+                     * Decodes a RelatedAccountGroup message from the specified reader or buffer, length delimited.
+                     * @param reader Reader or buffer to decode from
+                     * @returns RelatedAccountGroup
+                     * @throws {Error} If the payload is not a reader or valid buffer
+                     * @throws {$protobuf.util.ProtocolError} If required fields are missing
+                     */
+                    public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): google.cloud.recaptchaenterprise.v1.RelatedAccountGroup;
+
+                    /**
+                     * Verifies a RelatedAccountGroup message.
+                     * @param message Plain object to verify
+                     * @returns `null` if valid, otherwise the reason why it is not
+                     */
+                    public static verify(message: { [k: string]: any }): (string|null);
+
+                    /**
+                     * Creates a RelatedAccountGroup message from a plain object. Also converts values to their respective internal types.
+                     * @param object Plain object
+                     * @returns RelatedAccountGroup
+                     */
+                    public static fromObject(object: { [k: string]: any }): google.cloud.recaptchaenterprise.v1.RelatedAccountGroup;
+
+                    /**
+                     * Creates a plain object from a RelatedAccountGroup message. Also converts values to other types if specified.
+                     * @param message RelatedAccountGroup
+                     * @param [options] Conversion options
+                     * @returns Plain object
+                     */
+                    public static toObject(message: google.cloud.recaptchaenterprise.v1.RelatedAccountGroup, options?: $protobuf.IConversionOptions): { [k: string]: any };
+
+                    /**
+                     * Converts this RelatedAccountGroup to JSON.
+                     * @returns JSON object
+                     */
+                    public toJSON(): { [k: string]: any };
+                }
             }
 
             /** Namespace v1beta1. */
diff --git a/protos/protos.js b/protos/protos.js
index 17c66f5..b415fed 100644
--- a/protos/protos.js
+++ b/protos/protos.js
@@ -395,6 +395,105 @@
                          * @variation 2
                          */
     
+                        /**
+                         * Callback as used by {@link google.cloud.recaptchaenterprise.v1.RecaptchaEnterpriseService#listRelatedAccountGroups}.
+                         * @memberof google.cloud.recaptchaenterprise.v1.RecaptchaEnterpriseService
+                         * @typedef ListRelatedAccountGroupsCallback
+                         * @type {function}
+                         * @param {Error|null} error Error, if any
+                         * @param {google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupsResponse} [response] ListRelatedAccountGroupsResponse
+                         */
+    
+                        /**
+                         * Calls ListRelatedAccountGroups.
+                         * @function listRelatedAccountGroups
+                         * @memberof google.cloud.recaptchaenterprise.v1.RecaptchaEnterpriseService
+                         * @instance
+                         * @param {google.cloud.recaptchaenterprise.v1.IListRelatedAccountGroupsRequest} request ListRelatedAccountGroupsRequest message or plain object
+                         * @param {google.cloud.recaptchaenterprise.v1.RecaptchaEnterpriseService.ListRelatedAccountGroupsCallback} callback Node-style callback called with the error, if any, and ListRelatedAccountGroupsResponse
+                         * @returns {undefined}
+                         * @variation 1
+                         */
+                        Object.defineProperty(RecaptchaEnterpriseService.prototype.listRelatedAccountGroups = function listRelatedAccountGroups(request, callback) {
+                            return this.rpcCall(listRelatedAccountGroups, $root.google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupsRequest, $root.google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupsResponse, request, callback);
+                        }, "name", { value: "ListRelatedAccountGroups" });
+    
+                        /**
+                         * Calls ListRelatedAccountGroups.
+                         * @function listRelatedAccountGroups
+                         * @memberof google.cloud.recaptchaenterprise.v1.RecaptchaEnterpriseService
+                         * @instance
+                         * @param {google.cloud.recaptchaenterprise.v1.IListRelatedAccountGroupsRequest} request ListRelatedAccountGroupsRequest message or plain object
+                         * @returns {Promise<google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupsResponse>} Promise
+                         * @variation 2
+                         */
+    
+                        /**
+                         * Callback as used by {@link google.cloud.recaptchaenterprise.v1.RecaptchaEnterpriseService#listRelatedAccountGroupMemberships}.
+                         * @memberof google.cloud.recaptchaenterprise.v1.RecaptchaEnterpriseService
+                         * @typedef ListRelatedAccountGroupMembershipsCallback
+                         * @type {function}
+                         * @param {Error|null} error Error, if any
+                         * @param {google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupMembershipsResponse} [response] ListRelatedAccountGroupMembershipsResponse
+                         */
+    
+                        /**
+                         * Calls ListRelatedAccountGroupMemberships.
+                         * @function listRelatedAccountGroupMemberships
+                         * @memberof google.cloud.recaptchaenterprise.v1.RecaptchaEnterpriseService
+                         * @instance
+                         * @param {google.cloud.recaptchaenterprise.v1.IListRelatedAccountGroupMembershipsRequest} request ListRelatedAccountGroupMembershipsRequest message or plain object
+                         * @param {google.cloud.recaptchaenterprise.v1.RecaptchaEnterpriseService.ListRelatedAccountGroupMembershipsCallback} callback Node-style callback called with the error, if any, and ListRelatedAccountGroupMembershipsResponse
+                         * @returns {undefined}
+                         * @variation 1
+                         */
+                        Object.defineProperty(RecaptchaEnterpriseService.prototype.listRelatedAccountGroupMemberships = function listRelatedAccountGroupMemberships(request, callback) {
+                            return this.rpcCall(listRelatedAccountGroupMemberships, $root.google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupMembershipsRequest, $root.google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupMembershipsResponse, request, callback);
+                        }, "name", { value: "ListRelatedAccountGroupMemberships" });
+    
+                        /**
+                         * Calls ListRelatedAccountGroupMemberships.
+                         * @function listRelatedAccountGroupMemberships
+                         * @memberof google.cloud.recaptchaenterprise.v1.RecaptchaEnterpriseService
+                         * @instance
+                         * @param {google.cloud.recaptchaenterprise.v1.IListRelatedAccountGroupMembershipsRequest} request ListRelatedAccountGroupMembershipsRequest message or plain object
+                         * @returns {Promise<google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupMembershipsResponse>} Promise
+                         * @variation 2
+                         */
+    
+                        /**
+                         * Callback as used by {@link google.cloud.recaptchaenterprise.v1.RecaptchaEnterpriseService#searchRelatedAccountGroupMemberships}.
+                         * @memberof google.cloud.recaptchaenterprise.v1.RecaptchaEnterpriseService
+                         * @typedef SearchRelatedAccountGroupMembershipsCallback
+                         * @type {function}
+                         * @param {Error|null} error Error, if any
+                         * @param {google.cloud.recaptchaenterprise.v1.SearchRelatedAccountGroupMembershipsResponse} [response] SearchRelatedAccountGroupMembershipsResponse
+                         */
+    
+                        /**
+                         * Calls SearchRelatedAccountGroupMemberships.
+                         * @function searchRelatedAccountGroupMemberships
+                         * @memberof google.cloud.recaptchaenterprise.v1.RecaptchaEnterpriseService
+                         * @instance
+                         * @param {google.cloud.recaptchaenterprise.v1.ISearchRelatedAccountGroupMembershipsRequest} request SearchRelatedAccountGroupMembershipsRequest message or plain object
+                         * @param {google.cloud.recaptchaenterprise.v1.RecaptchaEnterpriseService.SearchRelatedAccountGroupMembershipsCallback} callback Node-style callback called with the error, if any, and SearchRelatedAccountGroupMembershipsResponse
+                         * @returns {undefined}
+                         * @variation 1
+                         */
+                        Object.defineProperty(RecaptchaEnterpriseService.prototype.searchRelatedAccountGroupMemberships = function searchRelatedAccountGroupMemberships(request, callback) {
+                            return this.rpcCall(searchRelatedAccountGroupMemberships, $root.google.cloud.recaptchaenterprise.v1.SearchRelatedAccountGroupMembershipsRequest, $root.google.cloud.recaptchaenterprise.v1.SearchRelatedAccountGroupMembershipsResponse, request, callback);
+                        }, "name", { value: "SearchRelatedAccountGroupMemberships" });
+    
+                        /**
+                         * Calls SearchRelatedAccountGroupMemberships.
+                         * @function searchRelatedAccountGroupMemberships
+                         * @memberof google.cloud.recaptchaenterprise.v1.RecaptchaEnterpriseService
+                         * @instance
+                         * @param {google.cloud.recaptchaenterprise.v1.ISearchRelatedAccountGroupMembershipsRequest} request SearchRelatedAccountGroupMembershipsRequest message or plain object
+                         * @returns {Promise<google.cloud.recaptchaenterprise.v1.SearchRelatedAccountGroupMembershipsResponse>} Promise
+                         * @variation 2
+                         */
+    
                         return RecaptchaEnterpriseService;
                     })();
     
@@ -622,6 +721,7 @@
                          * @property {string|null} [name] AnnotateAssessmentRequest name
                          * @property {google.cloud.recaptchaenterprise.v1.AnnotateAssessmentRequest.Annotation|null} [annotation] AnnotateAssessmentRequest annotation
                          * @property {Array.<google.cloud.recaptchaenterprise.v1.AnnotateAssessmentRequest.Reason>|null} [reasons] AnnotateAssessmentRequest reasons
+                         * @property {Uint8Array|null} [hashedAccountId] AnnotateAssessmentRequest hashedAccountId
                          */
     
                         /**
@@ -664,6 +764,14 @@
                          */
                         AnnotateAssessmentRequest.prototype.reasons = $util.emptyArray;
     
+                        /**
+                         * AnnotateAssessmentRequest hashedAccountId.
+                         * @member {Uint8Array} hashedAccountId
+                         * @memberof google.cloud.recaptchaenterprise.v1.AnnotateAssessmentRequest
+                         * @instance
+                         */
+                        AnnotateAssessmentRequest.prototype.hashedAccountId = $util.newBuffer([]);
+    
                         /**
                          * Creates a new AnnotateAssessmentRequest instance using the specified properties.
                          * @function create
@@ -698,6 +806,8 @@
                                     writer.int32(message.reasons[i]);
                                 writer.ldelim();
                             }
+                            if (message.hashedAccountId != null && Object.hasOwnProperty.call(message, "hashedAccountId"))
+                                writer.uint32(/* id 4, wireType 2 =*/34).bytes(message.hashedAccountId);
                             return writer;
                         };
     
@@ -748,6 +858,9 @@
                                     } else
                                         message.reasons.push(reader.int32());
                                     break;
+                                case 4:
+                                    message.hashedAccountId = reader.bytes();
+                                    break;
                                 default:
                                     reader.skipType(tag & 7);
                                     break;
@@ -815,6 +928,9 @@
                                         break;
                                     }
                             }
+                            if (message.hashedAccountId != null && message.hasOwnProperty("hashedAccountId"))
+                                if (!(message.hashedAccountId && typeof message.hashedAccountId.length === "number" || $util.isString(message.hashedAccountId)))
+                                    return "hashedAccountId: buffer expected";
                             return null;
                         };
     
@@ -895,6 +1011,11 @@
                                         break;
                                     }
                             }
+                            if (object.hashedAccountId != null)
+                                if (typeof object.hashedAccountId === "string")
+                                    $util.base64.decode(object.hashedAccountId, message.hashedAccountId = $util.newBuffer($util.base64.length(object.hashedAccountId)), 0);
+                                else if (object.hashedAccountId.length)
+                                    message.hashedAccountId = object.hashedAccountId;
                             return message;
                         };
     
@@ -916,6 +1037,13 @@
                             if (options.defaults) {
                                 object.name = "";
                                 object.annotation = options.enums === String ? "ANNOTATION_UNSPECIFIED" : 0;
+                                if (options.bytes === String)
+                                    object.hashedAccountId = "";
+                                else {
+                                    object.hashedAccountId = [];
+                                    if (options.bytes !== Array)
+                                        object.hashedAccountId = $util.newBuffer(object.hashedAccountId);
+                                }
                             }
                             if (message.name != null && message.hasOwnProperty("name"))
                                 object.name = message.name;
@@ -926,6 +1054,8 @@
                                 for (var j = 0; j < message.reasons.length; ++j)
                                     object.reasons[j] = options.enums === String ? $root.google.cloud.recaptchaenterprise.v1.AnnotateAssessmentRequest.Reason[message.reasons[j]] : message.reasons[j];
                             }
+                            if (message.hashedAccountId != null && message.hasOwnProperty("hashedAccountId"))
+                                object.hashedAccountId = options.bytes === String ? $util.base64.encode(message.hashedAccountId, 0, message.hashedAccountId.length) : options.bytes === Array ? Array.prototype.slice.call(message.hashedAccountId) : message.hashedAccountId;
                             return object;
                         };
     
@@ -1159,6 +1289,7 @@
                          * @property {google.cloud.recaptchaenterprise.v1.IEvent|null} [event] Assessment event
                          * @property {google.cloud.recaptchaenterprise.v1.IRiskAnalysis|null} [riskAnalysis] Assessment riskAnalysis
                          * @property {google.cloud.recaptchaenterprise.v1.ITokenProperties|null} [tokenProperties] Assessment tokenProperties
+                         * @property {google.cloud.recaptchaenterprise.v1.IAccountDefenderAssessment|null} [accountDefenderAssessment] Assessment accountDefenderAssessment
                          */
     
                         /**
@@ -1208,6 +1339,14 @@
                          */
                         Assessment.prototype.tokenProperties = null;
     
+                        /**
+                         * Assessment accountDefenderAssessment.
+                         * @member {google.cloud.recaptchaenterprise.v1.IAccountDefenderAssessment|null|undefined} accountDefenderAssessment
+                         * @memberof google.cloud.recaptchaenterprise.v1.Assessment
+                         * @instance
+                         */
+                        Assessment.prototype.accountDefenderAssessment = null;
+    
                         /**
                          * Creates a new Assessment instance using the specified properties.
                          * @function create
@@ -1240,6 +1379,8 @@
                                 $root.google.cloud.recaptchaenterprise.v1.RiskAnalysis.encode(message.riskAnalysis, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
                             if (message.tokenProperties != null && Object.hasOwnProperty.call(message, "tokenProperties"))
                                 $root.google.cloud.recaptchaenterprise.v1.TokenProperties.encode(message.tokenProperties, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();
+                            if (message.accountDefenderAssessment != null && Object.hasOwnProperty.call(message, "accountDefenderAssessment"))
+                                $root.google.cloud.recaptchaenterprise.v1.AccountDefenderAssessment.encode(message.accountDefenderAssessment, writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim();
                             return writer;
                         };
     
@@ -1286,6 +1427,9 @@
                                 case 4:
                                     message.tokenProperties = $root.google.cloud.recaptchaenterprise.v1.TokenProperties.decode(reader, reader.uint32());
                                     break;
+                                case 6:
+                                    message.accountDefenderAssessment = $root.google.cloud.recaptchaenterprise.v1.AccountDefenderAssessment.decode(reader, reader.uint32());
+                                    break;
                                 default:
                                     reader.skipType(tag & 7);
                                     break;
@@ -1339,6 +1483,11 @@
                                 if (error)
                                     return "tokenProperties." + error;
                             }
+                            if (message.accountDefenderAssessment != null && message.hasOwnProperty("accountDefenderAssessment")) {
+                                var error = $root.google.cloud.recaptchaenterprise.v1.AccountDefenderAssessment.verify(message.accountDefenderAssessment);
+                                if (error)
+                                    return "accountDefenderAssessment." + error;
+                            }
                             return null;
                         };
     
@@ -1371,6 +1520,11 @@
                                     throw TypeError(".google.cloud.recaptchaenterprise.v1.Assessment.tokenProperties: object expected");
                                 message.tokenProperties = $root.google.cloud.recaptchaenterprise.v1.TokenProperties.fromObject(object.tokenProperties);
                             }
+                            if (object.accountDefenderAssessment != null) {
+                                if (typeof object.accountDefenderAssessment !== "object")
+                                    throw TypeError(".google.cloud.recaptchaenterprise.v1.Assessment.accountDefenderAssessment: object expected");
+                                message.accountDefenderAssessment = $root.google.cloud.recaptchaenterprise.v1.AccountDefenderAssessment.fromObject(object.accountDefenderAssessment);
+                            }
                             return message;
                         };
     
@@ -1392,6 +1546,7 @@
                                 object.event = null;
                                 object.riskAnalysis = null;
                                 object.tokenProperties = null;
+                                object.accountDefenderAssessment = null;
                             }
                             if (message.name != null && message.hasOwnProperty("name"))
                                 object.name = message.name;
@@ -1401,6 +1556,8 @@
                                 object.riskAnalysis = $root.google.cloud.recaptchaenterprise.v1.RiskAnalysis.toObject(message.riskAnalysis, options);
                             if (message.tokenProperties != null && message.hasOwnProperty("tokenProperties"))
                                 object.tokenProperties = $root.google.cloud.recaptchaenterprise.v1.TokenProperties.toObject(message.tokenProperties, options);
+                            if (message.accountDefenderAssessment != null && message.hasOwnProperty("accountDefenderAssessment"))
+                                object.accountDefenderAssessment = $root.google.cloud.recaptchaenterprise.v1.AccountDefenderAssessment.toObject(message.accountDefenderAssessment, options);
                             return object;
                         };
     
@@ -1429,6 +1586,7 @@
                          * @property {string|null} [userAgent] Event userAgent
                          * @property {string|null} [userIpAddress] Event userIpAddress
                          * @property {string|null} [expectedAction] Event expectedAction
+                         * @property {Uint8Array|null} [hashedAccountId] Event hashedAccountId
                          */
     
                         /**
@@ -1486,6 +1644,14 @@
                          */
                         Event.prototype.expectedAction = "";
     
+                        /**
+                         * Event hashedAccountId.
+                         * @member {Uint8Array} hashedAccountId
+                         * @memberof google.cloud.recaptchaenterprise.v1.Event
+                         * @instance
+                         */
+                        Event.prototype.hashedAccountId = $util.newBuffer([]);
+    
                         /**
                          * Creates a new Event instance using the specified properties.
                          * @function create
@@ -1520,6 +1686,8 @@
                                 writer.uint32(/* id 4, wireType 2 =*/34).string(message.userIpAddress);
                             if (message.expectedAction != null && Object.hasOwnProperty.call(message, "expectedAction"))
                                 writer.uint32(/* id 5, wireType 2 =*/42).string(message.expectedAction);
+                            if (message.hashedAccountId != null && Object.hasOwnProperty.call(message, "hashedAccountId"))
+                                writer.uint32(/* id 6, wireType 2 =*/50).bytes(message.hashedAccountId);
                             return writer;
                         };
     
@@ -1569,6 +1737,9 @@
                                 case 5:
                                     message.expectedAction = reader.string();
                                     break;
+                                case 6:
+                                    message.hashedAccountId = reader.bytes();
+                                    break;
                                 default:
                                     reader.skipType(tag & 7);
                                     break;
@@ -1619,6 +1790,9 @@
                             if (message.expectedAction != null && message.hasOwnProperty("expectedAction"))
                                 if (!$util.isString(message.expectedAction))
                                     return "expectedAction: string expected";
+                            if (message.hashedAccountId != null && message.hasOwnProperty("hashedAccountId"))
+                                if (!(message.hashedAccountId && typeof message.hashedAccountId.length === "number" || $util.isString(message.hashedAccountId)))
+                                    return "hashedAccountId: buffer expected";
                             return null;
                         };
     
@@ -1644,6 +1818,11 @@
                                 message.userIpAddress = String(object.userIpAddress);
                             if (object.expectedAction != null)
                                 message.expectedAction = String(object.expectedAction);
+                            if (object.hashedAccountId != null)
+                                if (typeof object.hashedAccountId === "string")
+                                    $util.base64.decode(object.hashedAccountId, message.hashedAccountId = $util.newBuffer($util.base64.length(object.hashedAccountId)), 0);
+                                else if (object.hashedAccountId.length)
+                                    message.hashedAccountId = object.hashedAccountId;
                             return message;
                         };
     
@@ -1666,6 +1845,13 @@
                                 object.userAgent = "";
                                 object.userIpAddress = "";
                                 object.expectedAction = "";
+                                if (options.bytes === String)
+                                    object.hashedAccountId = "";
+                                else {
+                                    object.hashedAccountId = [];
+                                    if (options.bytes !== Array)
+                                        object.hashedAccountId = $util.newBuffer(object.hashedAccountId);
+                                }
                             }
                             if (message.token != null && message.hasOwnProperty("token"))
                                 object.token = message.token;
@@ -1677,6 +1863,8 @@
                                 object.userIpAddress = message.userIpAddress;
                             if (message.expectedAction != null && message.hasOwnProperty("expectedAction"))
                                 object.expectedAction = message.expectedAction;
+                            if (message.hashedAccountId != null && message.hasOwnProperty("hashedAccountId"))
+                                object.hashedAccountId = options.bytes === String ? $util.base64.encode(message.hashedAccountId, 0, message.hashedAccountId.length) : options.bytes === Array ? Array.prototype.slice.call(message.hashedAccountId) : message.hashedAccountId;
                             return object;
                         };
     
@@ -2328,6 +2516,267 @@
                         return TokenProperties;
                     })();
     
+                    v1.AccountDefenderAssessment = (function() {
+    
+                        /**
+                         * Properties of an AccountDefenderAssessment.
+                         * @memberof google.cloud.recaptchaenterprise.v1
+                         * @interface IAccountDefenderAssessment
+                         * @property {Array.<google.cloud.recaptchaenterprise.v1.AccountDefenderAssessment.AccountDefenderLabel>|null} [labels] AccountDefenderAssessment labels
+                         */
+    
+                        /**
+                         * Constructs a new AccountDefenderAssessment.
+                         * @memberof google.cloud.recaptchaenterprise.v1
+                         * @classdesc Represents an AccountDefenderAssessment.
+                         * @implements IAccountDefenderAssessment
+                         * @constructor
+                         * @param {google.cloud.recaptchaenterprise.v1.IAccountDefenderAssessment=} [properties] Properties to set
+                         */
+                        function AccountDefenderAssessment(properties) {
+                            this.labels = [];
+                            if (properties)
+                                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
+                                    if (properties[keys[i]] != null)
+                                        this[keys[i]] = properties[keys[i]];
+                        }
+    
+                        /**
+                         * AccountDefenderAssessment labels.
+                         * @member {Array.<google.cloud.recaptchaenterprise.v1.AccountDefenderAssessment.AccountDefenderLabel>} labels
+                         * @memberof google.cloud.recaptchaenterprise.v1.AccountDefenderAssessment
+                         * @instance
+                         */
+                        AccountDefenderAssessment.prototype.labels = $util.emptyArray;
+    
+                        /**
+                         * Creates a new AccountDefenderAssessment instance using the specified properties.
+                         * @function create
+                         * @memberof google.cloud.recaptchaenterprise.v1.AccountDefenderAssessment
+                         * @static
+                         * @param {google.cloud.recaptchaenterprise.v1.IAccountDefenderAssessment=} [properties] Properties to set
+                         * @returns {google.cloud.recaptchaenterprise.v1.AccountDefenderAssessment} AccountDefenderAssessment instance
+                         */
+                        AccountDefenderAssessment.create = function create(properties) {
+                            return new AccountDefenderAssessment(properties);
+                        };
+    
+                        /**
+                         * Encodes the specified AccountDefenderAssessment message. Does not implicitly {@link google.cloud.recaptchaenterprise.v1.AccountDefenderAssessment.verify|verify} messages.
+                         * @function encode
+                         * @memberof google.cloud.recaptchaenterprise.v1.AccountDefenderAssessment
+                         * @static
+                         * @param {google.cloud.recaptchaenterprise.v1.IAccountDefenderAssessment} message AccountDefenderAssessment message or plain object to encode
+                         * @param {$protobuf.Writer} [writer] Writer to encode to
+                         * @returns {$protobuf.Writer} Writer
+                         */
+                        AccountDefenderAssessment.encode = function encode(message, writer) {
+                            if (!writer)
+                                writer = $Writer.create();
+                            if (message.labels != null && message.labels.length) {
+                                writer.uint32(/* id 1, wireType 2 =*/10).fork();
+                                for (var i = 0; i < message.labels.length; ++i)
+                                    writer.int32(message.labels[i]);
+                                writer.ldelim();
+                            }
+                            return writer;
+                        };
+    
+                        /**
+                         * Encodes the specified AccountDefenderAssessment message, length delimited. Does not implicitly {@link google.cloud.recaptchaenterprise.v1.AccountDefenderAssessment.verify|verify} messages.
+                         * @function encodeDelimited
+                         * @memberof google.cloud.recaptchaenterprise.v1.AccountDefenderAssessment
+                         * @static
+                         * @param {google.cloud.recaptchaenterprise.v1.IAccountDefenderAssessment} message AccountDefenderAssessment message or plain object to encode
+                         * @param {$protobuf.Writer} [writer] Writer to encode to
+                         * @returns {$protobuf.Writer} Writer
+                         */
+                        AccountDefenderAssessment.encodeDelimited = function encodeDelimited(message, writer) {
+                            return this.encode(message, writer).ldelim();
+                        };
+    
+                        /**
+                         * Decodes an AccountDefenderAssessment message from the specified reader or buffer.
+                         * @function decode
+                         * @memberof google.cloud.recaptchaenterprise.v1.AccountDefenderAssessment
+                         * @static
+                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
+                         * @param {number} [length] Message length if known beforehand
+                         * @returns {google.cloud.recaptchaenterprise.v1.AccountDefenderAssessment} AccountDefenderAssessment
+                         * @throws {Error} If the payload is not a reader or valid buffer
+                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
+                         */
+                        AccountDefenderAssessment.decode = function decode(reader, length) {
+                            if (!(reader instanceof $Reader))
+                                reader = $Reader.create(reader);
+                            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.cloud.recaptchaenterprise.v1.AccountDefenderAssessment();
+                            while (reader.pos < end) {
+                                var tag = reader.uint32();
+                                switch (tag >>> 3) {
+                                case 1:
+                                    if (!(message.labels && message.labels.length))
+                                        message.labels = [];
+                                    if ((tag & 7) === 2) {
+                                        var end2 = reader.uint32() + reader.pos;
+                                        while (reader.pos < end2)
+                                            message.labels.push(reader.int32());
+                                    } else
+                                        message.labels.push(reader.int32());
+                                    break;
+                                default:
+                                    reader.skipType(tag & 7);
+                                    break;
+                                }
+                            }
+                            return message;
+                        };
+    
+                        /**
+                         * Decodes an AccountDefenderAssessment message from the specified reader or buffer, length delimited.
+                         * @function decodeDelimited
+                         * @memberof google.cloud.recaptchaenterprise.v1.AccountDefenderAssessment
+                         * @static
+                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
+                         * @returns {google.cloud.recaptchaenterprise.v1.AccountDefenderAssessment} AccountDefenderAssessment
+                         * @throws {Error} If the payload is not a reader or valid buffer
+                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
+                         */
+                        AccountDefenderAssessment.decodeDelimited = function decodeDelimited(reader) {
+                            if (!(reader instanceof $Reader))
+                                reader = new $Reader(reader);
+                            return this.decode(reader, reader.uint32());
+                        };
+    
+                        /**
+                         * Verifies an AccountDefenderAssessment message.
+                         * @function verify
+                         * @memberof google.cloud.recaptchaenterprise.v1.AccountDefenderAssessment
+                         * @static
+                         * @param {Object.<string,*>} message Plain object to verify
+                         * @returns {string|null} `null` if valid, otherwise the reason why it is not
+                         */
+                        AccountDefenderAssessment.verify = function verify(message) {
+                            if (typeof message !== "object" || message === null)
+                                return "object expected";
+                            if (message.labels != null && message.hasOwnProperty("labels")) {
+                                if (!Array.isArray(message.labels))
+                                    return "labels: array expected";
+                                for (var i = 0; i < message.labels.length; ++i)
+                                    switch (message.labels[i]) {
+                                    default:
+                                        return "labels: enum value[] expected";
+                                    case 0:
+                                    case 1:
+                                    case 2:
+                                    case 3:
+                                    case 4:
+                                        break;
+                                    }
+                            }
+                            return null;
+                        };
+    
+                        /**
+                         * Creates an AccountDefenderAssessment message from a plain object. Also converts values to their respective internal types.
+                         * @function fromObject
+                         * @memberof google.cloud.recaptchaenterprise.v1.AccountDefenderAssessment
+                         * @static
+                         * @param {Object.<string,*>} object Plain object
+                         * @returns {google.cloud.recaptchaenterprise.v1.AccountDefenderAssessment} AccountDefenderAssessment
+                         */
+                        AccountDefenderAssessment.fromObject = function fromObject(object) {
+                            if (object instanceof $root.google.cloud.recaptchaenterprise.v1.AccountDefenderAssessment)
+                                return object;
+                            var message = new $root.google.cloud.recaptchaenterprise.v1.AccountDefenderAssessment();
+                            if (object.labels) {
+                                if (!Array.isArray(object.labels))
+                                    throw TypeError(".google.cloud.recaptchaenterprise.v1.AccountDefenderAssessment.labels: array expected");
+                                message.labels = [];
+                                for (var i = 0; i < object.labels.length; ++i)
+                                    switch (object.labels[i]) {
+                                    default:
+                                    case "ACCOUNT_DEFENDER_LABEL_UNSPECIFIED":
+                                    case 0:
+                                        message.labels[i] = 0;
+                                        break;
+                                    case "PROFILE_MATCH":
+                                    case 1:
+                                        message.labels[i] = 1;
+                                        break;
+                                    case "SUSPICIOUS_LOGIN_ACTIVITY":
+                                    case 2:
+                                        message.labels[i] = 2;
+                                        break;
+                                    case "SUSPICIOUS_ACCOUNT_CREATION":
+                                    case 3:
+                                        message.labels[i] = 3;
+                                        break;
+                                    case "RELATED_ACCOUNTS_NUMBER_HIGH":
+                                    case 4:
+                                        message.labels[i] = 4;
+                                        break;
+                                    }
+                            }
+                            return message;
+                        };
+    
+                        /**
+                         * Creates a plain object from an AccountDefenderAssessment message. Also converts values to other types if specified.
+                         * @function toObject
+                         * @memberof google.cloud.recaptchaenterprise.v1.AccountDefenderAssessment
+                         * @static
+                         * @param {google.cloud.recaptchaenterprise.v1.AccountDefenderAssessment} message AccountDefenderAssessment
+                         * @param {$protobuf.IConversionOptions} [options] Conversion options
+                         * @returns {Object.<string,*>} Plain object
+                         */
+                        AccountDefenderAssessment.toObject = function toObject(message, options) {
+                            if (!options)
+                                options = {};
+                            var object = {};
+                            if (options.arrays || options.defaults)
+                                object.labels = [];
+                            if (message.labels && message.labels.length) {
+                                object.labels = [];
+                                for (var j = 0; j < message.labels.length; ++j)
+                                    object.labels[j] = options.enums === String ? $root.google.cloud.recaptchaenterprise.v1.AccountDefenderAssessment.AccountDefenderLabel[message.labels[j]] : message.labels[j];
+                            }
+                            return object;
+                        };
+    
+                        /**
+                         * Converts this AccountDefenderAssessment to JSON.
+                         * @function toJSON
+                         * @memberof google.cloud.recaptchaenterprise.v1.AccountDefenderAssessment
+                         * @instance
+                         * @returns {Object.<string,*>} JSON object
+                         */
+                        AccountDefenderAssessment.prototype.toJSON = function toJSON() {
+                            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
+                        };
+    
+                        /**
+                         * AccountDefenderLabel enum.
+                         * @name google.cloud.recaptchaenterprise.v1.AccountDefenderAssessment.AccountDefenderLabel
+                         * @enum {number}
+                         * @property {number} ACCOUNT_DEFENDER_LABEL_UNSPECIFIED=0 ACCOUNT_DEFENDER_LABEL_UNSPECIFIED value
+                         * @property {number} PROFILE_MATCH=1 PROFILE_MATCH value
+                         * @property {number} SUSPICIOUS_LOGIN_ACTIVITY=2 SUSPICIOUS_LOGIN_ACTIVITY value
+                         * @property {number} SUSPICIOUS_ACCOUNT_CREATION=3 SUSPICIOUS_ACCOUNT_CREATION value
+                         * @property {number} RELATED_ACCOUNTS_NUMBER_HIGH=4 RELATED_ACCOUNTS_NUMBER_HIGH value
+                         */
+                        AccountDefenderAssessment.AccountDefenderLabel = (function() {
+                            var valuesById = {}, values = Object.create(valuesById);
+                            values[valuesById[0] = "ACCOUNT_DEFENDER_LABEL_UNSPECIFIED"] = 0;
+                            values[valuesById[1] = "PROFILE_MATCH"] = 1;
+                            values[valuesById[2] = "SUSPICIOUS_LOGIN_ACTIVITY"] = 2;
+                            values[valuesById[3] = "SUSPICIOUS_ACCOUNT_CREATION"] = 3;
+                            values[valuesById[4] = "RELATED_ACCOUNTS_NUMBER_HIGH"] = 4;
+                            return values;
+                        })();
+    
+                        return AccountDefenderAssessment;
+                    })();
+    
                     v1.CreateKeyRequest = (function() {
     
                         /**
@@ -6587,6 +7036,1832 @@
                         return ChallengeMetrics;
                     })();
     
+                    v1.ListRelatedAccountGroupMembershipsRequest = (function() {
+    
+                        /**
+                         * Properties of a ListRelatedAccountGroupMembershipsRequest.
+                         * @memberof google.cloud.recaptchaenterprise.v1
+                         * @interface IListRelatedAccountGroupMembershipsRequest
+                         * @property {string|null} [parent] ListRelatedAccountGroupMembershipsRequest parent
+                         * @property {number|null} [pageSize] ListRelatedAccountGroupMembershipsRequest pageSize
+                         * @property {string|null} [pageToken] ListRelatedAccountGroupMembershipsRequest pageToken
+                         */
+    
+                        /**
+                         * Constructs a new ListRelatedAccountGroupMembershipsRequest.
+                         * @memberof google.cloud.recaptchaenterprise.v1
+                         * @classdesc Represents a ListRelatedAccountGroupMembershipsRequest.
+                         * @implements IListRelatedAccountGroupMembershipsRequest
+                         * @constructor
+                         * @param {google.cloud.recaptchaenterprise.v1.IListRelatedAccountGroupMembershipsRequest=} [properties] Properties to set
+                         */
+                        function ListRelatedAccountGroupMembershipsRequest(properties) {
+                            if (properties)
+                                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
+                                    if (properties[keys[i]] != null)
+                                        this[keys[i]] = properties[keys[i]];
+                        }
+    
+                        /**
+                         * ListRelatedAccountGroupMembershipsRequest parent.
+                         * @member {string} parent
+                         * @memberof google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupMembershipsRequest
+                         * @instance
+                         */
+                        ListRelatedAccountGroupMembershipsRequest.prototype.parent = "";
+    
+                        /**
+                         * ListRelatedAccountGroupMembershipsRequest pageSize.
+                         * @member {number} pageSize
+                         * @memberof google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupMembershipsRequest
+                         * @instance
+                         */
+                        ListRelatedAccountGroupMembershipsRequest.prototype.pageSize = 0;
+    
+                        /**
+                         * ListRelatedAccountGroupMembershipsRequest pageToken.
+                         * @member {string} pageToken
+                         * @memberof google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupMembershipsRequest
+                         * @instance
+                         */
+                        ListRelatedAccountGroupMembershipsRequest.prototype.pageToken = "";
+    
+                        /**
+                         * Creates a new ListRelatedAccountGroupMembershipsRequest instance using the specified properties.
+                         * @function create
+                         * @memberof google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupMembershipsRequest
+                         * @static
+                         * @param {google.cloud.recaptchaenterprise.v1.IListRelatedAccountGroupMembershipsRequest=} [properties] Properties to set
+                         * @returns {google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupMembershipsRequest} ListRelatedAccountGroupMembershipsRequest instance
+                         */
+                        ListRelatedAccountGroupMembershipsRequest.create = function create(properties) {
+                            return new ListRelatedAccountGroupMembershipsRequest(properties);
+                        };
+    
+                        /**
+                         * Encodes the specified ListRelatedAccountGroupMembershipsRequest message. Does not implicitly {@link google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupMembershipsRequest.verify|verify} messages.
+                         * @function encode
+                         * @memberof google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupMembershipsRequest
+                         * @static
+                         * @param {google.cloud.recaptchaenterprise.v1.IListRelatedAccountGroupMembershipsRequest} message ListRelatedAccountGroupMembershipsRequest message or plain object to encode
+                         * @param {$protobuf.Writer} [writer] Writer to encode to
+                         * @returns {$protobuf.Writer} Writer
+                         */
+                        ListRelatedAccountGroupMembershipsRequest.encode = function encode(message, writer) {
+                            if (!writer)
+                                writer = $Writer.create();
+                            if (message.parent != null && Object.hasOwnProperty.call(message, "parent"))
+                                writer.uint32(/* id 1, wireType 2 =*/10).string(message.parent);
+                            if (message.pageSize != null && Object.hasOwnProperty.call(message, "pageSize"))
+                                writer.uint32(/* id 2, wireType 0 =*/16).int32(message.pageSize);
+                            if (message.pageToken != null && Object.hasOwnProperty.call(message, "pageToken"))
+                                writer.uint32(/* id 3, wireType 2 =*/26).string(message.pageToken);
+                            return writer;
+                        };
+    
+                        /**
+                         * Encodes the specified ListRelatedAccountGroupMembershipsRequest message, length delimited. Does not implicitly {@link google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupMembershipsRequest.verify|verify} messages.
+                         * @function encodeDelimited
+                         * @memberof google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupMembershipsRequest
+                         * @static
+                         * @param {google.cloud.recaptchaenterprise.v1.IListRelatedAccountGroupMembershipsRequest} message ListRelatedAccountGroupMembershipsRequest message or plain object to encode
+                         * @param {$protobuf.Writer} [writer] Writer to encode to
+                         * @returns {$protobuf.Writer} Writer
+                         */
+                        ListRelatedAccountGroupMembershipsRequest.encodeDelimited = function encodeDelimited(message, writer) {
+                            return this.encode(message, writer).ldelim();
+                        };
+    
+                        /**
+                         * Decodes a ListRelatedAccountGroupMembershipsRequest message from the specified reader or buffer.
+                         * @function decode
+                         * @memberof google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupMembershipsRequest
+                         * @static
+                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
+                         * @param {number} [length] Message length if known beforehand
+                         * @returns {google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupMembershipsRequest} ListRelatedAccountGroupMembershipsRequest
+                         * @throws {Error} If the payload is not a reader or valid buffer
+                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
+                         */
+                        ListRelatedAccountGroupMembershipsRequest.decode = function decode(reader, length) {
+                            if (!(reader instanceof $Reader))
+                                reader = $Reader.create(reader);
+                            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupMembershipsRequest();
+                            while (reader.pos < end) {
+                                var tag = reader.uint32();
+                                switch (tag >>> 3) {
+                                case 1:
+                                    message.parent = reader.string();
+                                    break;
+                                case 2:
+                                    message.pageSize = reader.int32();
+                                    break;
+                                case 3:
+                                    message.pageToken = reader.string();
+                                    break;
+                                default:
+                                    reader.skipType(tag & 7);
+                                    break;
+                                }
+                            }
+                            return message;
+                        };
+    
+                        /**
+                         * Decodes a ListRelatedAccountGroupMembershipsRequest message from the specified reader or buffer, length delimited.
+                         * @function decodeDelimited
+                         * @memberof google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupMembershipsRequest
+                         * @static
+                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
+                         * @returns {google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupMembershipsRequest} ListRelatedAccountGroupMembershipsRequest
+                         * @throws {Error} If the payload is not a reader or valid buffer
+                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
+                         */
+                        ListRelatedAccountGroupMembershipsRequest.decodeDelimited = function decodeDelimited(reader) {
+                            if (!(reader instanceof $Reader))
+                                reader = new $Reader(reader);
+                            return this.decode(reader, reader.uint32());
+                        };
+    
+                        /**
+                         * Verifies a ListRelatedAccountGroupMembershipsRequest message.
+                         * @function verify
+                         * @memberof google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupMembershipsRequest
+                         * @static
+                         * @param {Object.<string,*>} message Plain object to verify
+                         * @returns {string|null} `null` if valid, otherwise the reason why it is not
+                         */
+                        ListRelatedAccountGroupMembershipsRequest.verify = function verify(message) {
+                            if (typeof message !== "object" || message === null)
+                                return "object expected";
+                            if (message.parent != null && message.hasOwnProperty("parent"))
+                                if (!$util.isString(message.parent))
+                                    return "parent: string expected";
+                            if (message.pageSize != null && message.hasOwnProperty("pageSize"))
+                                if (!$util.isInteger(message.pageSize))
+                                    return "pageSize: integer expected";
+                            if (message.pageToken != null && message.hasOwnProperty("pageToken"))
+                                if (!$util.isString(message.pageToken))
+                                    return "pageToken: string expected";
+                            return null;
+                        };
+    
+                        /**
+                         * Creates a ListRelatedAccountGroupMembershipsRequest message from a plain object. Also converts values to their respective internal types.
+                         * @function fromObject
+                         * @memberof google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupMembershipsRequest
+                         * @static
+                         * @param {Object.<string,*>} object Plain object
+                         * @returns {google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupMembershipsRequest} ListRelatedAccountGroupMembershipsRequest
+                         */
+                        ListRelatedAccountGroupMembershipsRequest.fromObject = function fromObject(object) {
+                            if (object instanceof $root.google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupMembershipsRequest)
+                                return object;
+                            var message = new $root.google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupMembershipsRequest();
+                            if (object.parent != null)
+                                message.parent = String(object.parent);
+                            if (object.pageSize != null)
+                                message.pageSize = object.pageSize | 0;
+                            if (object.pageToken != null)
+                                message.pageToken = String(object.pageToken);
+                            return message;
+                        };
+    
+                        /**
+                         * Creates a plain object from a ListRelatedAccountGroupMembershipsRequest message. Also converts values to other types if specified.
+                         * @function toObject
+                         * @memberof google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupMembershipsRequest
+                         * @static
+                         * @param {google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupMembershipsRequest} message ListRelatedAccountGroupMembershipsRequest
+                         * @param {$protobuf.IConversionOptions} [options] Conversion options
+                         * @returns {Object.<string,*>} Plain object
+                         */
+                        ListRelatedAccountGroupMembershipsRequest.toObject = function toObject(message, options) {
+                            if (!options)
+                                options = {};
+                            var object = {};
+                            if (options.defaults) {
+                                object.parent = "";
+                                object.pageSize = 0;
+                                object.pageToken = "";
+                            }
+                            if (message.parent != null && message.hasOwnProperty("parent"))
+                                object.parent = message.parent;
+                            if (message.pageSize != null && message.hasOwnProperty("pageSize"))
+                                object.pageSize = message.pageSize;
+                            if (message.pageToken != null && message.hasOwnProperty("pageToken"))
+                                object.pageToken = message.pageToken;
+                            return object;
+                        };
+    
+                        /**
+                         * Converts this ListRelatedAccountGroupMembershipsRequest to JSON.
+                         * @function toJSON
+                         * @memberof google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupMembershipsRequest
+                         * @instance
+                         * @returns {Object.<string,*>} JSON object
+                         */
+                        ListRelatedAccountGroupMembershipsRequest.prototype.toJSON = function toJSON() {
+                            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
+                        };
+    
+                        return ListRelatedAccountGroupMembershipsRequest;
+                    })();
+    
+                    v1.ListRelatedAccountGroupMembershipsResponse = (function() {
+    
+                        /**
+                         * Properties of a ListRelatedAccountGroupMembershipsResponse.
+                         * @memberof google.cloud.recaptchaenterprise.v1
+                         * @interface IListRelatedAccountGroupMembershipsResponse
+                         * @property {Array.<google.cloud.recaptchaenterprise.v1.IRelatedAccountGroupMembership>|null} [relatedAccountGroupMemberships] ListRelatedAccountGroupMembershipsResponse relatedAccountGroupMemberships
+                         * @property {string|null} [nextPageToken] ListRelatedAccountGroupMembershipsResponse nextPageToken
+                         */
+    
+                        /**
+                         * Constructs a new ListRelatedAccountGroupMembershipsResponse.
+                         * @memberof google.cloud.recaptchaenterprise.v1
+                         * @classdesc Represents a ListRelatedAccountGroupMembershipsResponse.
+                         * @implements IListRelatedAccountGroupMembershipsResponse
+                         * @constructor
+                         * @param {google.cloud.recaptchaenterprise.v1.IListRelatedAccountGroupMembershipsResponse=} [properties] Properties to set
+                         */
+                        function ListRelatedAccountGroupMembershipsResponse(properties) {
+                            this.relatedAccountGroupMemberships = [];
+                            if (properties)
+                                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
+                                    if (properties[keys[i]] != null)
+                                        this[keys[i]] = properties[keys[i]];
+                        }
+    
+                        /**
+                         * ListRelatedAccountGroupMembershipsResponse relatedAccountGroupMemberships.
+                         * @member {Array.<google.cloud.recaptchaenterprise.v1.IRelatedAccountGroupMembership>} relatedAccountGroupMemberships
+                         * @memberof google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupMembershipsResponse
+                         * @instance
+                         */
+                        ListRelatedAccountGroupMembershipsResponse.prototype.relatedAccountGroupMemberships = $util.emptyArray;
+    
+                        /**
+                         * ListRelatedAccountGroupMembershipsResponse nextPageToken.
+                         * @member {string} nextPageToken
+                         * @memberof google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupMembershipsResponse
+                         * @instance
+                         */
+                        ListRelatedAccountGroupMembershipsResponse.prototype.nextPageToken = "";
+    
+                        /**
+                         * Creates a new ListRelatedAccountGroupMembershipsResponse instance using the specified properties.
+                         * @function create
+                         * @memberof google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupMembershipsResponse
+                         * @static
+                         * @param {google.cloud.recaptchaenterprise.v1.IListRelatedAccountGroupMembershipsResponse=} [properties] Properties to set
+                         * @returns {google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupMembershipsResponse} ListRelatedAccountGroupMembershipsResponse instance
+                         */
+                        ListRelatedAccountGroupMembershipsResponse.create = function create(properties) {
+                            return new ListRelatedAccountGroupMembershipsResponse(properties);
+                        };
+    
+                        /**
+                         * Encodes the specified ListRelatedAccountGroupMembershipsResponse message. Does not implicitly {@link google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupMembershipsResponse.verify|verify} messages.
+                         * @function encode
+                         * @memberof google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupMembershipsResponse
+                         * @static
+                         * @param {google.cloud.recaptchaenterprise.v1.IListRelatedAccountGroupMembershipsResponse} message ListRelatedAccountGroupMembershipsResponse message or plain object to encode
+                         * @param {$protobuf.Writer} [writer] Writer to encode to
+                         * @returns {$protobuf.Writer} Writer
+                         */
+                        ListRelatedAccountGroupMembershipsResponse.encode = function encode(message, writer) {
+                            if (!writer)
+                                writer = $Writer.create();
+                            if (message.relatedAccountGroupMemberships != null && message.relatedAccountGroupMemberships.length)
+                                for (var i = 0; i < message.relatedAccountGroupMemberships.length; ++i)
+                                    $root.google.cloud.recaptchaenterprise.v1.RelatedAccountGroupMembership.encode(message.relatedAccountGroupMemberships[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
+                            if (message.nextPageToken != null && Object.hasOwnProperty.call(message, "nextPageToken"))
+                                writer.uint32(/* id 2, wireType 2 =*/18).string(message.nextPageToken);
+                            return writer;
+                        };
+    
+                        /**
+                         * Encodes the specified ListRelatedAccountGroupMembershipsResponse message, length delimited. Does not implicitly {@link google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupMembershipsResponse.verify|verify} messages.
+                         * @function encodeDelimited
+                         * @memberof google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupMembershipsResponse
+                         * @static
+                         * @param {google.cloud.recaptchaenterprise.v1.IListRelatedAccountGroupMembershipsResponse} message ListRelatedAccountGroupMembershipsResponse message or plain object to encode
+                         * @param {$protobuf.Writer} [writer] Writer to encode to
+                         * @returns {$protobuf.Writer} Writer
+                         */
+                        ListRelatedAccountGroupMembershipsResponse.encodeDelimited = function encodeDelimited(message, writer) {
+                            return this.encode(message, writer).ldelim();
+                        };
+    
+                        /**
+                         * Decodes a ListRelatedAccountGroupMembershipsResponse message from the specified reader or buffer.
+                         * @function decode
+                         * @memberof google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupMembershipsResponse
+                         * @static
+                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
+                         * @param {number} [length] Message length if known beforehand
+                         * @returns {google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupMembershipsResponse} ListRelatedAccountGroupMembershipsResponse
+                         * @throws {Error} If the payload is not a reader or valid buffer
+                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
+                         */
+                        ListRelatedAccountGroupMembershipsResponse.decode = function decode(reader, length) {
+                            if (!(reader instanceof $Reader))
+                                reader = $Reader.create(reader);
+                            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupMembershipsResponse();
+                            while (reader.pos < end) {
+                                var tag = reader.uint32();
+                                switch (tag >>> 3) {
+                                case 1:
+                                    if (!(message.relatedAccountGroupMemberships && message.relatedAccountGroupMemberships.length))
+                                        message.relatedAccountGroupMemberships = [];
+                                    message.relatedAccountGroupMemberships.push($root.google.cloud.recaptchaenterprise.v1.RelatedAccountGroupMembership.decode(reader, reader.uint32()));
+                                    break;
+                                case 2:
+                                    message.nextPageToken = reader.string();
+                                    break;
+                                default:
+                                    reader.skipType(tag & 7);
+                                    break;
+                                }
+                            }
+                            return message;
+                        };
+    
+                        /**
+                         * Decodes a ListRelatedAccountGroupMembershipsResponse message from the specified reader or buffer, length delimited.
+                         * @function decodeDelimited
+                         * @memberof google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupMembershipsResponse
+                         * @static
+                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
+                         * @returns {google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupMembershipsResponse} ListRelatedAccountGroupMembershipsResponse
+                         * @throws {Error} If the payload is not a reader or valid buffer
+                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
+                         */
+                        ListRelatedAccountGroupMembershipsResponse.decodeDelimited = function decodeDelimited(reader) {
+                            if (!(reader instanceof $Reader))
+                                reader = new $Reader(reader);
+                            return this.decode(reader, reader.uint32());
+                        };
+    
+                        /**
+                         * Verifies a ListRelatedAccountGroupMembershipsResponse message.
+                         * @function verify
+                         * @memberof google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupMembershipsResponse
+                         * @static
+                         * @param {Object.<string,*>} message Plain object to verify
+                         * @returns {string|null} `null` if valid, otherwise the reason why it is not
+                         */
+                        ListRelatedAccountGroupMembershipsResponse.verify = function verify(message) {
+                            if (typeof message !== "object" || message === null)
+                                return "object expected";
+                            if (message.relatedAccountGroupMemberships != null && message.hasOwnProperty("relatedAccountGroupMemberships")) {
+                                if (!Array.isArray(message.relatedAccountGroupMemberships))
+                                    return "relatedAccountGroupMemberships: array expected";
+                                for (var i = 0; i < message.relatedAccountGroupMemberships.length; ++i) {
+                                    var error = $root.google.cloud.recaptchaenterprise.v1.RelatedAccountGroupMembership.verify(message.relatedAccountGroupMemberships[i]);
+                                    if (error)
+                                        return "relatedAccountGroupMemberships." + error;
+                                }
+                            }
+                            if (message.nextPageToken != null && message.hasOwnProperty("nextPageToken"))
+                                if (!$util.isString(message.nextPageToken))
+                                    return "nextPageToken: string expected";
+                            return null;
+                        };
+    
+                        /**
+                         * Creates a ListRelatedAccountGroupMembershipsResponse message from a plain object. Also converts values to their respective internal types.
+                         * @function fromObject
+                         * @memberof google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupMembershipsResponse
+                         * @static
+                         * @param {Object.<string,*>} object Plain object
+                         * @returns {google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupMembershipsResponse} ListRelatedAccountGroupMembershipsResponse
+                         */
+                        ListRelatedAccountGroupMembershipsResponse.fromObject = function fromObject(object) {
+                            if (object instanceof $root.google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupMembershipsResponse)
+                                return object;
+                            var message = new $root.google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupMembershipsResponse();
+                            if (object.relatedAccountGroupMemberships) {
+                                if (!Array.isArray(object.relatedAccountGroupMemberships))
+                                    throw TypeError(".google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupMembershipsResponse.relatedAccountGroupMemberships: array expected");
+                                message.relatedAccountGroupMemberships = [];
+                                for (var i = 0; i < object.relatedAccountGroupMemberships.length; ++i) {
+                                    if (typeof object.relatedAccountGroupMemberships[i] !== "object")
+                                        throw TypeError(".google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupMembershipsResponse.relatedAccountGroupMemberships: object expected");
+                                    message.relatedAccountGroupMemberships[i] = $root.google.cloud.recaptchaenterprise.v1.RelatedAccountGroupMembership.fromObject(object.relatedAccountGroupMemberships[i]);
+                                }
+                            }
+                            if (object.nextPageToken != null)
+                                message.nextPageToken = String(object.nextPageToken);
+                            return message;
+                        };
+    
+                        /**
+                         * Creates a plain object from a ListRelatedAccountGroupMembershipsResponse message. Also converts values to other types if specified.
+                         * @function toObject
+                         * @memberof google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupMembershipsResponse
+                         * @static
+                         * @param {google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupMembershipsResponse} message ListRelatedAccountGroupMembershipsResponse
+                         * @param {$protobuf.IConversionOptions} [options] Conversion options
+                         * @returns {Object.<string,*>} Plain object
+                         */
+                        ListRelatedAccountGroupMembershipsResponse.toObject = function toObject(message, options) {
+                            if (!options)
+                                options = {};
+                            var object = {};
+                            if (options.arrays || options.defaults)
+                                object.relatedAccountGroupMemberships = [];
+                            if (options.defaults)
+                                object.nextPageToken = "";
+                            if (message.relatedAccountGroupMemberships && message.relatedAccountGroupMemberships.length) {
+                                object.relatedAccountGroupMemberships = [];
+                                for (var j = 0; j < message.relatedAccountGroupMemberships.length; ++j)
+                                    object.relatedAccountGroupMemberships[j] = $root.google.cloud.recaptchaenterprise.v1.RelatedAccountGroupMembership.toObject(message.relatedAccountGroupMemberships[j], options);
+                            }
+                            if (message.nextPageToken != null && message.hasOwnProperty("nextPageToken"))
+                                object.nextPageToken = message.nextPageToken;
+                            return object;
+                        };
+    
+                        /**
+                         * Converts this ListRelatedAccountGroupMembershipsResponse to JSON.
+                         * @function toJSON
+                         * @memberof google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupMembershipsResponse
+                         * @instance
+                         * @returns {Object.<string,*>} JSON object
+                         */
+                        ListRelatedAccountGroupMembershipsResponse.prototype.toJSON = function toJSON() {
+                            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
+                        };
+    
+                        return ListRelatedAccountGroupMembershipsResponse;
+                    })();
+    
+                    v1.ListRelatedAccountGroupsRequest = (function() {
+    
+                        /**
+                         * Properties of a ListRelatedAccountGroupsRequest.
+                         * @memberof google.cloud.recaptchaenterprise.v1
+                         * @interface IListRelatedAccountGroupsRequest
+                         * @property {string|null} [parent] ListRelatedAccountGroupsRequest parent
+                         * @property {number|null} [pageSize] ListRelatedAccountGroupsRequest pageSize
+                         * @property {string|null} [pageToken] ListRelatedAccountGroupsRequest pageToken
+                         */
+    
+                        /**
+                         * Constructs a new ListRelatedAccountGroupsRequest.
+                         * @memberof google.cloud.recaptchaenterprise.v1
+                         * @classdesc Represents a ListRelatedAccountGroupsRequest.
+                         * @implements IListRelatedAccountGroupsRequest
+                         * @constructor
+                         * @param {google.cloud.recaptchaenterprise.v1.IListRelatedAccountGroupsRequest=} [properties] Properties to set
+                         */
+                        function ListRelatedAccountGroupsRequest(properties) {
+                            if (properties)
+                                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
+                                    if (properties[keys[i]] != null)
+                                        this[keys[i]] = properties[keys[i]];
+                        }
+    
+                        /**
+                         * ListRelatedAccountGroupsRequest parent.
+                         * @member {string} parent
+                         * @memberof google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupsRequest
+                         * @instance
+                         */
+                        ListRelatedAccountGroupsRequest.prototype.parent = "";
+    
+                        /**
+                         * ListRelatedAccountGroupsRequest pageSize.
+                         * @member {number} pageSize
+                         * @memberof google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupsRequest
+                         * @instance
+                         */
+                        ListRelatedAccountGroupsRequest.prototype.pageSize = 0;
+    
+                        /**
+                         * ListRelatedAccountGroupsRequest pageToken.
+                         * @member {string} pageToken
+                         * @memberof google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupsRequest
+                         * @instance
+                         */
+                        ListRelatedAccountGroupsRequest.prototype.pageToken = "";
+    
+                        /**
+                         * Creates a new ListRelatedAccountGroupsRequest instance using the specified properties.
+                         * @function create
+                         * @memberof google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupsRequest
+                         * @static
+                         * @param {google.cloud.recaptchaenterprise.v1.IListRelatedAccountGroupsRequest=} [properties] Properties to set
+                         * @returns {google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupsRequest} ListRelatedAccountGroupsRequest instance
+                         */
+                        ListRelatedAccountGroupsRequest.create = function create(properties) {
+                            return new ListRelatedAccountGroupsRequest(properties);
+                        };
+    
+                        /**
+                         * Encodes the specified ListRelatedAccountGroupsRequest message. Does not implicitly {@link google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupsRequest.verify|verify} messages.
+                         * @function encode
+                         * @memberof google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupsRequest
+                         * @static
+                         * @param {google.cloud.recaptchaenterprise.v1.IListRelatedAccountGroupsRequest} message ListRelatedAccountGroupsRequest message or plain object to encode
+                         * @param {$protobuf.Writer} [writer] Writer to encode to
+                         * @returns {$protobuf.Writer} Writer
+                         */
+                        ListRelatedAccountGroupsRequest.encode = function encode(message, writer) {
+                            if (!writer)
+                                writer = $Writer.create();
+                            if (message.parent != null && Object.hasOwnProperty.call(message, "parent"))
+                                writer.uint32(/* id 1, wireType 2 =*/10).string(message.parent);
+                            if (message.pageSize != null && Object.hasOwnProperty.call(message, "pageSize"))
+                                writer.uint32(/* id 2, wireType 0 =*/16).int32(message.pageSize);
+                            if (message.pageToken != null && Object.hasOwnProperty.call(message, "pageToken"))
+                                writer.uint32(/* id 3, wireType 2 =*/26).string(message.pageToken);
+                            return writer;
+                        };
+    
+                        /**
+                         * Encodes the specified ListRelatedAccountGroupsRequest message, length delimited. Does not implicitly {@link google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupsRequest.verify|verify} messages.
+                         * @function encodeDelimited
+                         * @memberof google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupsRequest
+                         * @static
+                         * @param {google.cloud.recaptchaenterprise.v1.IListRelatedAccountGroupsRequest} message ListRelatedAccountGroupsRequest message or plain object to encode
+                         * @param {$protobuf.Writer} [writer] Writer to encode to
+                         * @returns {$protobuf.Writer} Writer
+                         */
+                        ListRelatedAccountGroupsRequest.encodeDelimited = function encodeDelimited(message, writer) {
+                            return this.encode(message, writer).ldelim();
+                        };
+    
+                        /**
+                         * Decodes a ListRelatedAccountGroupsRequest message from the specified reader or buffer.
+                         * @function decode
+                         * @memberof google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupsRequest
+                         * @static
+                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
+                         * @param {number} [length] Message length if known beforehand
+                         * @returns {google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupsRequest} ListRelatedAccountGroupsRequest
+                         * @throws {Error} If the payload is not a reader or valid buffer
+                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
+                         */
+                        ListRelatedAccountGroupsRequest.decode = function decode(reader, length) {
+                            if (!(reader instanceof $Reader))
+                                reader = $Reader.create(reader);
+                            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupsRequest();
+                            while (reader.pos < end) {
+                                var tag = reader.uint32();
+                                switch (tag >>> 3) {
+                                case 1:
+                                    message.parent = reader.string();
+                                    break;
+                                case 2:
+                                    message.pageSize = reader.int32();
+                                    break;
+                                case 3:
+                                    message.pageToken = reader.string();
+                                    break;
+                                default:
+                                    reader.skipType(tag & 7);
+                                    break;
+                                }
+                            }
+                            return message;
+                        };
+    
+                        /**
+                         * Decodes a ListRelatedAccountGroupsRequest message from the specified reader or buffer, length delimited.
+                         * @function decodeDelimited
+                         * @memberof google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupsRequest
+                         * @static
+                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
+                         * @returns {google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupsRequest} ListRelatedAccountGroupsRequest
+                         * @throws {Error} If the payload is not a reader or valid buffer
+                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
+                         */
+                        ListRelatedAccountGroupsRequest.decodeDelimited = function decodeDelimited(reader) {
+                            if (!(reader instanceof $Reader))
+                                reader = new $Reader(reader);
+                            return this.decode(reader, reader.uint32());
+                        };
+    
+                        /**
+                         * Verifies a ListRelatedAccountGroupsRequest message.
+                         * @function verify
+                         * @memberof google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupsRequest
+                         * @static
+                         * @param {Object.<string,*>} message Plain object to verify
+                         * @returns {string|null} `null` if valid, otherwise the reason why it is not
+                         */
+                        ListRelatedAccountGroupsRequest.verify = function verify(message) {
+                            if (typeof message !== "object" || message === null)
+                                return "object expected";
+                            if (message.parent != null && message.hasOwnProperty("parent"))
+                                if (!$util.isString(message.parent))
+                                    return "parent: string expected";
+                            if (message.pageSize != null && message.hasOwnProperty("pageSize"))
+                                if (!$util.isInteger(message.pageSize))
+                                    return "pageSize: integer expected";
+                            if (message.pageToken != null && message.hasOwnProperty("pageToken"))
+                                if (!$util.isString(message.pageToken))
+                                    return "pageToken: string expected";
+                            return null;
+                        };
+    
+                        /**
+                         * Creates a ListRelatedAccountGroupsRequest message from a plain object. Also converts values to their respective internal types.
+                         * @function fromObject
+                         * @memberof google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupsRequest
+                         * @static
+                         * @param {Object.<string,*>} object Plain object
+                         * @returns {google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupsRequest} ListRelatedAccountGroupsRequest
+                         */
+                        ListRelatedAccountGroupsRequest.fromObject = function fromObject(object) {
+                            if (object instanceof $root.google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupsRequest)
+                                return object;
+                            var message = new $root.google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupsRequest();
+                            if (object.parent != null)
+                                message.parent = String(object.parent);
+                            if (object.pageSize != null)
+                                message.pageSize = object.pageSize | 0;
+                            if (object.pageToken != null)
+                                message.pageToken = String(object.pageToken);
+                            return message;
+                        };
+    
+                        /**
+                         * Creates a plain object from a ListRelatedAccountGroupsRequest message. Also converts values to other types if specified.
+                         * @function toObject
+                         * @memberof google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupsRequest
+                         * @static
+                         * @param {google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupsRequest} message ListRelatedAccountGroupsRequest
+                         * @param {$protobuf.IConversionOptions} [options] Conversion options
+                         * @returns {Object.<string,*>} Plain object
+                         */
+                        ListRelatedAccountGroupsRequest.toObject = function toObject(message, options) {
+                            if (!options)
+                                options = {};
+                            var object = {};
+                            if (options.defaults) {
+                                object.parent = "";
+                                object.pageSize = 0;
+                                object.pageToken = "";
+                            }
+                            if (message.parent != null && message.hasOwnProperty("parent"))
+                                object.parent = message.parent;
+                            if (message.pageSize != null && message.hasOwnProperty("pageSize"))
+                                object.pageSize = message.pageSize;
+                            if (message.pageToken != null && message.hasOwnProperty("pageToken"))
+                                object.pageToken = message.pageToken;
+                            return object;
+                        };
+    
+                        /**
+                         * Converts this ListRelatedAccountGroupsRequest to JSON.
+                         * @function toJSON
+                         * @memberof google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupsRequest
+                         * @instance
+                         * @returns {Object.<string,*>} JSON object
+                         */
+                        ListRelatedAccountGroupsRequest.prototype.toJSON = function toJSON() {
+                            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
+                        };
+    
+                        return ListRelatedAccountGroupsRequest;
+                    })();
+    
+                    v1.ListRelatedAccountGroupsResponse = (function() {
+    
+                        /**
+                         * Properties of a ListRelatedAccountGroupsResponse.
+                         * @memberof google.cloud.recaptchaenterprise.v1
+                         * @interface IListRelatedAccountGroupsResponse
+                         * @property {Array.<google.cloud.recaptchaenterprise.v1.IRelatedAccountGroup>|null} [relatedAccountGroups] ListRelatedAccountGroupsResponse relatedAccountGroups
+                         * @property {string|null} [nextPageToken] ListRelatedAccountGroupsResponse nextPageToken
+                         */
+    
+                        /**
+                         * Constructs a new ListRelatedAccountGroupsResponse.
+                         * @memberof google.cloud.recaptchaenterprise.v1
+                         * @classdesc Represents a ListRelatedAccountGroupsResponse.
+                         * @implements IListRelatedAccountGroupsResponse
+                         * @constructor
+                         * @param {google.cloud.recaptchaenterprise.v1.IListRelatedAccountGroupsResponse=} [properties] Properties to set
+                         */
+                        function ListRelatedAccountGroupsResponse(properties) {
+                            this.relatedAccountGroups = [];
+                            if (properties)
+                                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
+                                    if (properties[keys[i]] != null)
+                                        this[keys[i]] = properties[keys[i]];
+                        }
+    
+                        /**
+                         * ListRelatedAccountGroupsResponse relatedAccountGroups.
+                         * @member {Array.<google.cloud.recaptchaenterprise.v1.IRelatedAccountGroup>} relatedAccountGroups
+                         * @memberof google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupsResponse
+                         * @instance
+                         */
+                        ListRelatedAccountGroupsResponse.prototype.relatedAccountGroups = $util.emptyArray;
+    
+                        /**
+                         * ListRelatedAccountGroupsResponse nextPageToken.
+                         * @member {string} nextPageToken
+                         * @memberof google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupsResponse
+                         * @instance
+                         */
+                        ListRelatedAccountGroupsResponse.prototype.nextPageToken = "";
+    
+                        /**
+                         * Creates a new ListRelatedAccountGroupsResponse instance using the specified properties.
+                         * @function create
+                         * @memberof google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupsResponse
+                         * @static
+                         * @param {google.cloud.recaptchaenterprise.v1.IListRelatedAccountGroupsResponse=} [properties] Properties to set
+                         * @returns {google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupsResponse} ListRelatedAccountGroupsResponse instance
+                         */
+                        ListRelatedAccountGroupsResponse.create = function create(properties) {
+                            return new ListRelatedAccountGroupsResponse(properties);
+                        };
+    
+                        /**
+                         * Encodes the specified ListRelatedAccountGroupsResponse message. Does not implicitly {@link google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupsResponse.verify|verify} messages.
+                         * @function encode
+                         * @memberof google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupsResponse
+                         * @static
+                         * @param {google.cloud.recaptchaenterprise.v1.IListRelatedAccountGroupsResponse} message ListRelatedAccountGroupsResponse message or plain object to encode
+                         * @param {$protobuf.Writer} [writer] Writer to encode to
+                         * @returns {$protobuf.Writer} Writer
+                         */
+                        ListRelatedAccountGroupsResponse.encode = function encode(message, writer) {
+                            if (!writer)
+                                writer = $Writer.create();
+                            if (message.relatedAccountGroups != null && message.relatedAccountGroups.length)
+                                for (var i = 0; i < message.relatedAccountGroups.length; ++i)
+                                    $root.google.cloud.recaptchaenterprise.v1.RelatedAccountGroup.encode(message.relatedAccountGroups[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
+                            if (message.nextPageToken != null && Object.hasOwnProperty.call(message, "nextPageToken"))
+                                writer.uint32(/* id 2, wireType 2 =*/18).string(message.nextPageToken);
+                            return writer;
+                        };
+    
+                        /**
+                         * Encodes the specified ListRelatedAccountGroupsResponse message, length delimited. Does not implicitly {@link google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupsResponse.verify|verify} messages.
+                         * @function encodeDelimited
+                         * @memberof google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupsResponse
+                         * @static
+                         * @param {google.cloud.recaptchaenterprise.v1.IListRelatedAccountGroupsResponse} message ListRelatedAccountGroupsResponse message or plain object to encode
+                         * @param {$protobuf.Writer} [writer] Writer to encode to
+                         * @returns {$protobuf.Writer} Writer
+                         */
+                        ListRelatedAccountGroupsResponse.encodeDelimited = function encodeDelimited(message, writer) {
+                            return this.encode(message, writer).ldelim();
+                        };
+    
+                        /**
+                         * Decodes a ListRelatedAccountGroupsResponse message from the specified reader or buffer.
+                         * @function decode
+                         * @memberof google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupsResponse
+                         * @static
+                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
+                         * @param {number} [length] Message length if known beforehand
+                         * @returns {google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupsResponse} ListRelatedAccountGroupsResponse
+                         * @throws {Error} If the payload is not a reader or valid buffer
+                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
+                         */
+                        ListRelatedAccountGroupsResponse.decode = function decode(reader, length) {
+                            if (!(reader instanceof $Reader))
+                                reader = $Reader.create(reader);
+                            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupsResponse();
+                            while (reader.pos < end) {
+                                var tag = reader.uint32();
+                                switch (tag >>> 3) {
+                                case 1:
+                                    if (!(message.relatedAccountGroups && message.relatedAccountGroups.length))
+                                        message.relatedAccountGroups = [];
+                                    message.relatedAccountGroups.push($root.google.cloud.recaptchaenterprise.v1.RelatedAccountGroup.decode(reader, reader.uint32()));
+                                    break;
+                                case 2:
+                                    message.nextPageToken = reader.string();
+                                    break;
+                                default:
+                                    reader.skipType(tag & 7);
+                                    break;
+                                }
+                            }
+                            return message;
+                        };
+    
+                        /**
+                         * Decodes a ListRelatedAccountGroupsResponse message from the specified reader or buffer, length delimited.
+                         * @function decodeDelimited
+                         * @memberof google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupsResponse
+                         * @static
+                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
+                         * @returns {google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupsResponse} ListRelatedAccountGroupsResponse
+                         * @throws {Error} If the payload is not a reader or valid buffer
+                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
+                         */
+                        ListRelatedAccountGroupsResponse.decodeDelimited = function decodeDelimited(reader) {
+                            if (!(reader instanceof $Reader))
+                                reader = new $Reader(reader);
+                            return this.decode(reader, reader.uint32());
+                        };
+    
+                        /**
+                         * Verifies a ListRelatedAccountGroupsResponse message.
+                         * @function verify
+                         * @memberof google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupsResponse
+                         * @static
+                         * @param {Object.<string,*>} message Plain object to verify
+                         * @returns {string|null} `null` if valid, otherwise the reason why it is not
+                         */
+                        ListRelatedAccountGroupsResponse.verify = function verify(message) {
+                            if (typeof message !== "object" || message === null)
+                                return "object expected";
+                            if (message.relatedAccountGroups != null && message.hasOwnProperty("relatedAccountGroups")) {
+                                if (!Array.isArray(message.relatedAccountGroups))
+                                    return "relatedAccountGroups: array expected";
+                                for (var i = 0; i < message.relatedAccountGroups.length; ++i) {
+                                    var error = $root.google.cloud.recaptchaenterprise.v1.RelatedAccountGroup.verify(message.relatedAccountGroups[i]);
+                                    if (error)
+                                        return "relatedAccountGroups." + error;
+                                }
+                            }
+                            if (message.nextPageToken != null && message.hasOwnProperty("nextPageToken"))
+                                if (!$util.isString(message.nextPageToken))
+                                    return "nextPageToken: string expected";
+                            return null;
+                        };
+    
+                        /**
+                         * Creates a ListRelatedAccountGroupsResponse message from a plain object. Also converts values to their respective internal types.
+                         * @function fromObject
+                         * @memberof google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupsResponse
+                         * @static
+                         * @param {Object.<string,*>} object Plain object
+                         * @returns {google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupsResponse} ListRelatedAccountGroupsResponse
+                         */
+                        ListRelatedAccountGroupsResponse.fromObject = function fromObject(object) {
+                            if (object instanceof $root.google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupsResponse)
+                                return object;
+                            var message = new $root.google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupsResponse();
+                            if (object.relatedAccountGroups) {
+                                if (!Array.isArray(object.relatedAccountGroups))
+                                    throw TypeError(".google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupsResponse.relatedAccountGroups: array expected");
+                                message.relatedAccountGroups = [];
+                                for (var i = 0; i < object.relatedAccountGroups.length; ++i) {
+                                    if (typeof object.relatedAccountGroups[i] !== "object")
+                                        throw TypeError(".google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupsResponse.relatedAccountGroups: object expected");
+                                    message.relatedAccountGroups[i] = $root.google.cloud.recaptchaenterprise.v1.RelatedAccountGroup.fromObject(object.relatedAccountGroups[i]);
+                                }
+                            }
+                            if (object.nextPageToken != null)
+                                message.nextPageToken = String(object.nextPageToken);
+                            return message;
+                        };
+    
+                        /**
+                         * Creates a plain object from a ListRelatedAccountGroupsResponse message. Also converts values to other types if specified.
+                         * @function toObject
+                         * @memberof google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupsResponse
+                         * @static
+                         * @param {google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupsResponse} message ListRelatedAccountGroupsResponse
+                         * @param {$protobuf.IConversionOptions} [options] Conversion options
+                         * @returns {Object.<string,*>} Plain object
+                         */
+                        ListRelatedAccountGroupsResponse.toObject = function toObject(message, options) {
+                            if (!options)
+                                options = {};
+                            var object = {};
+                            if (options.arrays || options.defaults)
+                                object.relatedAccountGroups = [];
+                            if (options.defaults)
+                                object.nextPageToken = "";
+                            if (message.relatedAccountGroups && message.relatedAccountGroups.length) {
+                                object.relatedAccountGroups = [];
+                                for (var j = 0; j < message.relatedAccountGroups.length; ++j)
+                                    object.relatedAccountGroups[j] = $root.google.cloud.recaptchaenterprise.v1.RelatedAccountGroup.toObject(message.relatedAccountGroups[j], options);
+                            }
+                            if (message.nextPageToken != null && message.hasOwnProperty("nextPageToken"))
+                                object.nextPageToken = message.nextPageToken;
+                            return object;
+                        };
+    
+                        /**
+                         * Converts this ListRelatedAccountGroupsResponse to JSON.
+                         * @function toJSON
+                         * @memberof google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupsResponse
+                         * @instance
+                         * @returns {Object.<string,*>} JSON object
+                         */
+                        ListRelatedAccountGroupsResponse.prototype.toJSON = function toJSON() {
+                            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
+                        };
+    
+                        return ListRelatedAccountGroupsResponse;
+                    })();
+    
+                    v1.SearchRelatedAccountGroupMembershipsRequest = (function() {
+    
+                        /**
+                         * Properties of a SearchRelatedAccountGroupMembershipsRequest.
+                         * @memberof google.cloud.recaptchaenterprise.v1
+                         * @interface ISearchRelatedAccountGroupMembershipsRequest
+                         * @property {string|null} [parent] SearchRelatedAccountGroupMembershipsRequest parent
+                         * @property {Uint8Array|null} [hashedAccountId] SearchRelatedAccountGroupMembershipsRequest hashedAccountId
+                         * @property {number|null} [pageSize] SearchRelatedAccountGroupMembershipsRequest pageSize
+                         * @property {string|null} [pageToken] SearchRelatedAccountGroupMembershipsRequest pageToken
+                         */
+    
+                        /**
+                         * Constructs a new SearchRelatedAccountGroupMembershipsRequest.
+                         * @memberof google.cloud.recaptchaenterprise.v1
+                         * @classdesc Represents a SearchRelatedAccountGroupMembershipsRequest.
+                         * @implements ISearchRelatedAccountGroupMembershipsRequest
+                         * @constructor
+                         * @param {google.cloud.recaptchaenterprise.v1.ISearchRelatedAccountGroupMembershipsRequest=} [properties] Properties to set
+                         */
+                        function SearchRelatedAccountGroupMembershipsRequest(properties) {
+                            if (properties)
+                                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
+                                    if (properties[keys[i]] != null)
+                                        this[keys[i]] = properties[keys[i]];
+                        }
+    
+                        /**
+                         * SearchRelatedAccountGroupMembershipsRequest parent.
+                         * @member {string} parent
+                         * @memberof google.cloud.recaptchaenterprise.v1.SearchRelatedAccountGroupMembershipsRequest
+                         * @instance
+                         */
+                        SearchRelatedAccountGroupMembershipsRequest.prototype.parent = "";
+    
+                        /**
+                         * SearchRelatedAccountGroupMembershipsRequest hashedAccountId.
+                         * @member {Uint8Array} hashedAccountId
+                         * @memberof google.cloud.recaptchaenterprise.v1.SearchRelatedAccountGroupMembershipsRequest
+                         * @instance
+                         */
+                        SearchRelatedAccountGroupMembershipsRequest.prototype.hashedAccountId = $util.newBuffer([]);
+    
+                        /**
+                         * SearchRelatedAccountGroupMembershipsRequest pageSize.
+                         * @member {number} pageSize
+                         * @memberof google.cloud.recaptchaenterprise.v1.SearchRelatedAccountGroupMembershipsRequest
+                         * @instance
+                         */
+                        SearchRelatedAccountGroupMembershipsRequest.prototype.pageSize = 0;
+    
+                        /**
+                         * SearchRelatedAccountGroupMembershipsRequest pageToken.
+                         * @member {string} pageToken
+                         * @memberof google.cloud.recaptchaenterprise.v1.SearchRelatedAccountGroupMembershipsRequest
+                         * @instance
+                         */
+                        SearchRelatedAccountGroupMembershipsRequest.prototype.pageToken = "";
+    
+                        /**
+                         * Creates a new SearchRelatedAccountGroupMembershipsRequest instance using the specified properties.
+                         * @function create
+                         * @memberof google.cloud.recaptchaenterprise.v1.SearchRelatedAccountGroupMembershipsRequest
+                         * @static
+                         * @param {google.cloud.recaptchaenterprise.v1.ISearchRelatedAccountGroupMembershipsRequest=} [properties] Properties to set
+                         * @returns {google.cloud.recaptchaenterprise.v1.SearchRelatedAccountGroupMembershipsRequest} SearchRelatedAccountGroupMembershipsRequest instance
+                         */
+                        SearchRelatedAccountGroupMembershipsRequest.create = function create(properties) {
+                            return new SearchRelatedAccountGroupMembershipsRequest(properties);
+                        };
+    
+                        /**
+                         * Encodes the specified SearchRelatedAccountGroupMembershipsRequest message. Does not implicitly {@link google.cloud.recaptchaenterprise.v1.SearchRelatedAccountGroupMembershipsRequest.verify|verify} messages.
+                         * @function encode
+                         * @memberof google.cloud.recaptchaenterprise.v1.SearchRelatedAccountGroupMembershipsRequest
+                         * @static
+                         * @param {google.cloud.recaptchaenterprise.v1.ISearchRelatedAccountGroupMembershipsRequest} message SearchRelatedAccountGroupMembershipsRequest message or plain object to encode
+                         * @param {$protobuf.Writer} [writer] Writer to encode to
+                         * @returns {$protobuf.Writer} Writer
+                         */
+                        SearchRelatedAccountGroupMembershipsRequest.encode = function encode(message, writer) {
+                            if (!writer)
+                                writer = $Writer.create();
+                            if (message.parent != null && Object.hasOwnProperty.call(message, "parent"))
+                                writer.uint32(/* id 1, wireType 2 =*/10).string(message.parent);
+                            if (message.hashedAccountId != null && Object.hasOwnProperty.call(message, "hashedAccountId"))
+                                writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.hashedAccountId);
+                            if (message.pageSize != null && Object.hasOwnProperty.call(message, "pageSize"))
+                                writer.uint32(/* id 3, wireType 0 =*/24).int32(message.pageSize);
+                            if (message.pageToken != null && Object.hasOwnProperty.call(message, "pageToken"))
+                                writer.uint32(/* id 4, wireType 2 =*/34).string(message.pageToken);
+                            return writer;
+                        };
+    
+                        /**
+                         * Encodes the specified SearchRelatedAccountGroupMembershipsRequest message, length delimited. Does not implicitly {@link google.cloud.recaptchaenterprise.v1.SearchRelatedAccountGroupMembershipsRequest.verify|verify} messages.
+                         * @function encodeDelimited
+                         * @memberof google.cloud.recaptchaenterprise.v1.SearchRelatedAccountGroupMembershipsRequest
+                         * @static
+                         * @param {google.cloud.recaptchaenterprise.v1.ISearchRelatedAccountGroupMembershipsRequest} message SearchRelatedAccountGroupMembershipsRequest message or plain object to encode
+                         * @param {$protobuf.Writer} [writer] Writer to encode to
+                         * @returns {$protobuf.Writer} Writer
+                         */
+                        SearchRelatedAccountGroupMembershipsRequest.encodeDelimited = function encodeDelimited(message, writer) {
+                            return this.encode(message, writer).ldelim();
+                        };
+    
+                        /**
+                         * Decodes a SearchRelatedAccountGroupMembershipsRequest message from the specified reader or buffer.
+                         * @function decode
+                         * @memberof google.cloud.recaptchaenterprise.v1.SearchRelatedAccountGroupMembershipsRequest
+                         * @static
+                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
+                         * @param {number} [length] Message length if known beforehand
+                         * @returns {google.cloud.recaptchaenterprise.v1.SearchRelatedAccountGroupMembershipsRequest} SearchRelatedAccountGroupMembershipsRequest
+                         * @throws {Error} If the payload is not a reader or valid buffer
+                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
+                         */
+                        SearchRelatedAccountGroupMembershipsRequest.decode = function decode(reader, length) {
+                            if (!(reader instanceof $Reader))
+                                reader = $Reader.create(reader);
+                            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.cloud.recaptchaenterprise.v1.SearchRelatedAccountGroupMembershipsRequest();
+                            while (reader.pos < end) {
+                                var tag = reader.uint32();
+                                switch (tag >>> 3) {
+                                case 1:
+                                    message.parent = reader.string();
+                                    break;
+                                case 2:
+                                    message.hashedAccountId = reader.bytes();
+                                    break;
+                                case 3:
+                                    message.pageSize = reader.int32();
+                                    break;
+                                case 4:
+                                    message.pageToken = reader.string();
+                                    break;
+                                default:
+                                    reader.skipType(tag & 7);
+                                    break;
+                                }
+                            }
+                            return message;
+                        };
+    
+                        /**
+                         * Decodes a SearchRelatedAccountGroupMembershipsRequest message from the specified reader or buffer, length delimited.
+                         * @function decodeDelimited
+                         * @memberof google.cloud.recaptchaenterprise.v1.SearchRelatedAccountGroupMembershipsRequest
+                         * @static
+                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
+                         * @returns {google.cloud.recaptchaenterprise.v1.SearchRelatedAccountGroupMembershipsRequest} SearchRelatedAccountGroupMembershipsRequest
+                         * @throws {Error} If the payload is not a reader or valid buffer
+                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
+                         */
+                        SearchRelatedAccountGroupMembershipsRequest.decodeDelimited = function decodeDelimited(reader) {
+                            if (!(reader instanceof $Reader))
+                                reader = new $Reader(reader);
+                            return this.decode(reader, reader.uint32());
+                        };
+    
+                        /**
+                         * Verifies a SearchRelatedAccountGroupMembershipsRequest message.
+                         * @function verify
+                         * @memberof google.cloud.recaptchaenterprise.v1.SearchRelatedAccountGroupMembershipsRequest
+                         * @static
+                         * @param {Object.<string,*>} message Plain object to verify
+                         * @returns {string|null} `null` if valid, otherwise the reason why it is not
+                         */
+                        SearchRelatedAccountGroupMembershipsRequest.verify = function verify(message) {
+                            if (typeof message !== "object" || message === null)
+                                return "object expected";
+                            if (message.parent != null && message.hasOwnProperty("parent"))
+                                if (!$util.isString(message.parent))
+                                    return "parent: string expected";
+                            if (message.hashedAccountId != null && message.hasOwnProperty("hashedAccountId"))
+                                if (!(message.hashedAccountId && typeof message.hashedAccountId.length === "number" || $util.isString(message.hashedAccountId)))
+                                    return "hashedAccountId: buffer expected";
+                            if (message.pageSize != null && message.hasOwnProperty("pageSize"))
+                                if (!$util.isInteger(message.pageSize))
+                                    return "pageSize: integer expected";
+                            if (message.pageToken != null && message.hasOwnProperty("pageToken"))
+                                if (!$util.isString(message.pageToken))
+                                    return "pageToken: string expected";
+                            return null;
+                        };
+    
+                        /**
+                         * Creates a SearchRelatedAccountGroupMembershipsRequest message from a plain object. Also converts values to their respective internal types.
+                         * @function fromObject
+                         * @memberof google.cloud.recaptchaenterprise.v1.SearchRelatedAccountGroupMembershipsRequest
+                         * @static
+                         * @param {Object.<string,*>} object Plain object
+                         * @returns {google.cloud.recaptchaenterprise.v1.SearchRelatedAccountGroupMembershipsRequest} SearchRelatedAccountGroupMembershipsRequest
+                         */
+                        SearchRelatedAccountGroupMembershipsRequest.fromObject = function fromObject(object) {
+                            if (object instanceof $root.google.cloud.recaptchaenterprise.v1.SearchRelatedAccountGroupMembershipsRequest)
+                                return object;
+                            var message = new $root.google.cloud.recaptchaenterprise.v1.SearchRelatedAccountGroupMembershipsRequest();
+                            if (object.parent != null)
+                                message.parent = String(object.parent);
+                            if (object.hashedAccountId != null)
+                                if (typeof object.hashedAccountId === "string")
+                                    $util.base64.decode(object.hashedAccountId, message.hashedAccountId = $util.newBuffer($util.base64.length(object.hashedAccountId)), 0);
+                                else if (object.hashedAccountId.length)
+                                    message.hashedAccountId = object.hashedAccountId;
+                            if (object.pageSize != null)
+                                message.pageSize = object.pageSize | 0;
+                            if (object.pageToken != null)
+                                message.pageToken = String(object.pageToken);
+                            return message;
+                        };
+    
+                        /**
+                         * Creates a plain object from a SearchRelatedAccountGroupMembershipsRequest message. Also converts values to other types if specified.
+                         * @function toObject
+                         * @memberof google.cloud.recaptchaenterprise.v1.SearchRelatedAccountGroupMembershipsRequest
+                         * @static
+                         * @param {google.cloud.recaptchaenterprise.v1.SearchRelatedAccountGroupMembershipsRequest} message SearchRelatedAccountGroupMembershipsRequest
+                         * @param {$protobuf.IConversionOptions} [options] Conversion options
+                         * @returns {Object.<string,*>} Plain object
+                         */
+                        SearchRelatedAccountGroupMembershipsRequest.toObject = function toObject(message, options) {
+                            if (!options)
+                                options = {};
+                            var object = {};
+                            if (options.defaults) {
+                                object.parent = "";
+                                if (options.bytes === String)
+                                    object.hashedAccountId = "";
+                                else {
+                                    object.hashedAccountId = [];
+                                    if (options.bytes !== Array)
+                                        object.hashedAccountId = $util.newBuffer(object.hashedAccountId);
+                                }
+                                object.pageSize = 0;
+                                object.pageToken = "";
+                            }
+                            if (message.parent != null && message.hasOwnProperty("parent"))
+                                object.parent = message.parent;
+                            if (message.hashedAccountId != null && message.hasOwnProperty("hashedAccountId"))
+                                object.hashedAccountId = options.bytes === String ? $util.base64.encode(message.hashedAccountId, 0, message.hashedAccountId.length) : options.bytes === Array ? Array.prototype.slice.call(message.hashedAccountId) : message.hashedAccountId;
+                            if (message.pageSize != null && message.hasOwnProperty("pageSize"))
+                                object.pageSize = message.pageSize;
+                            if (message.pageToken != null && message.hasOwnProperty("pageToken"))
+                                object.pageToken = message.pageToken;
+                            return object;
+                        };
+    
+                        /**
+                         * Converts this SearchRelatedAccountGroupMembershipsRequest to JSON.
+                         * @function toJSON
+                         * @memberof google.cloud.recaptchaenterprise.v1.SearchRelatedAccountGroupMembershipsRequest
+                         * @instance
+                         * @returns {Object.<string,*>} JSON object
+                         */
+                        SearchRelatedAccountGroupMembershipsRequest.prototype.toJSON = function toJSON() {
+                            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
+                        };
+    
+                        return SearchRelatedAccountGroupMembershipsRequest;
+                    })();
+    
+                    v1.SearchRelatedAccountGroupMembershipsResponse = (function() {
+    
+                        /**
+                         * Properties of a SearchRelatedAccountGroupMembershipsResponse.
+                         * @memberof google.cloud.recaptchaenterprise.v1
+                         * @interface ISearchRelatedAccountGroupMembershipsResponse
+                         * @property {Array.<google.cloud.recaptchaenterprise.v1.IRelatedAccountGroupMembership>|null} [relatedAccountGroupMemberships] SearchRelatedAccountGroupMembershipsResponse relatedAccountGroupMemberships
+                         * @property {string|null} [nextPageToken] SearchRelatedAccountGroupMembershipsResponse nextPageToken
+                         */
+    
+                        /**
+                         * Constructs a new SearchRelatedAccountGroupMembershipsResponse.
+                         * @memberof google.cloud.recaptchaenterprise.v1
+                         * @classdesc Represents a SearchRelatedAccountGroupMembershipsResponse.
+                         * @implements ISearchRelatedAccountGroupMembershipsResponse
+                         * @constructor
+                         * @param {google.cloud.recaptchaenterprise.v1.ISearchRelatedAccountGroupMembershipsResponse=} [properties] Properties to set
+                         */
+                        function SearchRelatedAccountGroupMembershipsResponse(properties) {
+                            this.relatedAccountGroupMemberships = [];
+                            if (properties)
+                                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
+                                    if (properties[keys[i]] != null)
+                                        this[keys[i]] = properties[keys[i]];
+                        }
+    
+                        /**
+                         * SearchRelatedAccountGroupMembershipsResponse relatedAccountGroupMemberships.
+                         * @member {Array.<google.cloud.recaptchaenterprise.v1.IRelatedAccountGroupMembership>} relatedAccountGroupMemberships
+                         * @memberof google.cloud.recaptchaenterprise.v1.SearchRelatedAccountGroupMembershipsResponse
+                         * @instance
+                         */
+                        SearchRelatedAccountGroupMembershipsResponse.prototype.relatedAccountGroupMemberships = $util.emptyArray;
+    
+                        /**
+                         * SearchRelatedAccountGroupMembershipsResponse nextPageToken.
+                         * @member {string} nextPageToken
+                         * @memberof google.cloud.recaptchaenterprise.v1.SearchRelatedAccountGroupMembershipsResponse
+                         * @instance
+                         */
+                        SearchRelatedAccountGroupMembershipsResponse.prototype.nextPageToken = "";
+    
+                        /**
+                         * Creates a new SearchRelatedAccountGroupMembershipsResponse instance using the specified properties.
+                         * @function create
+                         * @memberof google.cloud.recaptchaenterprise.v1.SearchRelatedAccountGroupMembershipsResponse
+                         * @static
+                         * @param {google.cloud.recaptchaenterprise.v1.ISearchRelatedAccountGroupMembershipsResponse=} [properties] Properties to set
+                         * @returns {google.cloud.recaptchaenterprise.v1.SearchRelatedAccountGroupMembershipsResponse} SearchRelatedAccountGroupMembershipsResponse instance
+                         */
+                        SearchRelatedAccountGroupMembershipsResponse.create = function create(properties) {
+                            return new SearchRelatedAccountGroupMembershipsResponse(properties);
+                        };
+    
+                        /**
+                         * Encodes the specified SearchRelatedAccountGroupMembershipsResponse message. Does not implicitly {@link google.cloud.recaptchaenterprise.v1.SearchRelatedAccountGroupMembershipsResponse.verify|verify} messages.
+                         * @function encode
+                         * @memberof google.cloud.recaptchaenterprise.v1.SearchRelatedAccountGroupMembershipsResponse
+                         * @static
+                         * @param {google.cloud.recaptchaenterprise.v1.ISearchRelatedAccountGroupMembershipsResponse} message SearchRelatedAccountGroupMembershipsResponse message or plain object to encode
+                         * @param {$protobuf.Writer} [writer] Writer to encode to
+                         * @returns {$protobuf.Writer} Writer
+                         */
+                        SearchRelatedAccountGroupMembershipsResponse.encode = function encode(message, writer) {
+                            if (!writer)
+                                writer = $Writer.create();
+                            if (message.relatedAccountGroupMemberships != null && message.relatedAccountGroupMemberships.length)
+                                for (var i = 0; i < message.relatedAccountGroupMemberships.length; ++i)
+                                    $root.google.cloud.recaptchaenterprise.v1.RelatedAccountGroupMembership.encode(message.relatedAccountGroupMemberships[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
+                            if (message.nextPageToken != null && Object.hasOwnProperty.call(message, "nextPageToken"))
+                                writer.uint32(/* id 2, wireType 2 =*/18).string(message.nextPageToken);
+                            return writer;
+                        };
+    
+                        /**
+                         * Encodes the specified SearchRelatedAccountGroupMembershipsResponse message, length delimited. Does not implicitly {@link google.cloud.recaptchaenterprise.v1.SearchRelatedAccountGroupMembershipsResponse.verify|verify} messages.
+                         * @function encodeDelimited
+                         * @memberof google.cloud.recaptchaenterprise.v1.SearchRelatedAccountGroupMembershipsResponse
+                         * @static
+                         * @param {google.cloud.recaptchaenterprise.v1.ISearchRelatedAccountGroupMembershipsResponse} message SearchRelatedAccountGroupMembershipsResponse message or plain object to encode
+                         * @param {$protobuf.Writer} [writer] Writer to encode to
+                         * @returns {$protobuf.Writer} Writer
+                         */
+                        SearchRelatedAccountGroupMembershipsResponse.encodeDelimited = function encodeDelimited(message, writer) {
+                            return this.encode(message, writer).ldelim();
+                        };
+    
+                        /**
+                         * Decodes a SearchRelatedAccountGroupMembershipsResponse message from the specified reader or buffer.
+                         * @function decode
+                         * @memberof google.cloud.recaptchaenterprise.v1.SearchRelatedAccountGroupMembershipsResponse
+                         * @static
+                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
+                         * @param {number} [length] Message length if known beforehand
+                         * @returns {google.cloud.recaptchaenterprise.v1.SearchRelatedAccountGroupMembershipsResponse} SearchRelatedAccountGroupMembershipsResponse
+                         * @throws {Error} If the payload is not a reader or valid buffer
+                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
+                         */
+                        SearchRelatedAccountGroupMembershipsResponse.decode = function decode(reader, length) {
+                            if (!(reader instanceof $Reader))
+                                reader = $Reader.create(reader);
+                            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.cloud.recaptchaenterprise.v1.SearchRelatedAccountGroupMembershipsResponse();
+                            while (reader.pos < end) {
+                                var tag = reader.uint32();
+                                switch (tag >>> 3) {
+                                case 1:
+                                    if (!(message.relatedAccountGroupMemberships && message.relatedAccountGroupMemberships.length))
+                                        message.relatedAccountGroupMemberships = [];
+                                    message.relatedAccountGroupMemberships.push($root.google.cloud.recaptchaenterprise.v1.RelatedAccountGroupMembership.decode(reader, reader.uint32()));
+                                    break;
+                                case 2:
+                                    message.nextPageToken = reader.string();
+                                    break;
+                                default:
+                                    reader.skipType(tag & 7);
+                                    break;
+                                }
+                            }
+                            return message;
+                        };
+    
+                        /**
+                         * Decodes a SearchRelatedAccountGroupMembershipsResponse message from the specified reader or buffer, length delimited.
+                         * @function decodeDelimited
+                         * @memberof google.cloud.recaptchaenterprise.v1.SearchRelatedAccountGroupMembershipsResponse
+                         * @static
+                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
+                         * @returns {google.cloud.recaptchaenterprise.v1.SearchRelatedAccountGroupMembershipsResponse} SearchRelatedAccountGroupMembershipsResponse
+                         * @throws {Error} If the payload is not a reader or valid buffer
+                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
+                         */
+                        SearchRelatedAccountGroupMembershipsResponse.decodeDelimited = function decodeDelimited(reader) {
+                            if (!(reader instanceof $Reader))
+                                reader = new $Reader(reader);
+                            return this.decode(reader, reader.uint32());
+                        };
+    
+                        /**
+                         * Verifies a SearchRelatedAccountGroupMembershipsResponse message.
+                         * @function verify
+                         * @memberof google.cloud.recaptchaenterprise.v1.SearchRelatedAccountGroupMembershipsResponse
+                         * @static
+                         * @param {Object.<string,*>} message Plain object to verify
+                         * @returns {string|null} `null` if valid, otherwise the reason why it is not
+                         */
+                        SearchRelatedAccountGroupMembershipsResponse.verify = function verify(message) {
+                            if (typeof message !== "object" || message === null)
+                                return "object expected";
+                            if (message.relatedAccountGroupMemberships != null && message.hasOwnProperty("relatedAccountGroupMemberships")) {
+                                if (!Array.isArray(message.relatedAccountGroupMemberships))
+                                    return "relatedAccountGroupMemberships: array expected";
+                                for (var i = 0; i < message.relatedAccountGroupMemberships.length; ++i) {
+                                    var error = $root.google.cloud.recaptchaenterprise.v1.RelatedAccountGroupMembership.verify(message.relatedAccountGroupMemberships[i]);
+                                    if (error)
+                                        return "relatedAccountGroupMemberships." + error;
+                                }
+                            }
+                            if (message.nextPageToken != null && message.hasOwnProperty("nextPageToken"))
+                                if (!$util.isString(message.nextPageToken))
+                                    return "nextPageToken: string expected";
+                            return null;
+                        };
+    
+                        /**
+                         * Creates a SearchRelatedAccountGroupMembershipsResponse message from a plain object. Also converts values to their respective internal types.
+                         * @function fromObject
+                         * @memberof google.cloud.recaptchaenterprise.v1.SearchRelatedAccountGroupMembershipsResponse
+                         * @static
+                         * @param {Object.<string,*>} object Plain object
+                         * @returns {google.cloud.recaptchaenterprise.v1.SearchRelatedAccountGroupMembershipsResponse} SearchRelatedAccountGroupMembershipsResponse
+                         */
+                        SearchRelatedAccountGroupMembershipsResponse.fromObject = function fromObject(object) {
+                            if (object instanceof $root.google.cloud.recaptchaenterprise.v1.SearchRelatedAccountGroupMembershipsResponse)
+                                return object;
+                            var message = new $root.google.cloud.recaptchaenterprise.v1.SearchRelatedAccountGroupMembershipsResponse();
+                            if (object.relatedAccountGroupMemberships) {
+                                if (!Array.isArray(object.relatedAccountGroupMemberships))
+                                    throw TypeError(".google.cloud.recaptchaenterprise.v1.SearchRelatedAccountGroupMembershipsResponse.relatedAccountGroupMemberships: array expected");
+                                message.relatedAccountGroupMemberships = [];
+                                for (var i = 0; i < object.relatedAccountGroupMemberships.length; ++i) {
+                                    if (typeof object.relatedAccountGroupMemberships[i] !== "object")
+                                        throw TypeError(".google.cloud.recaptchaenterprise.v1.SearchRelatedAccountGroupMembershipsResponse.relatedAccountGroupMemberships: object expected");
+                                    message.relatedAccountGroupMemberships[i] = $root.google.cloud.recaptchaenterprise.v1.RelatedAccountGroupMembership.fromObject(object.relatedAccountGroupMemberships[i]);
+                                }
+                            }
+                            if (object.nextPageToken != null)
+                                message.nextPageToken = String(object.nextPageToken);
+                            return message;
+                        };
+    
+                        /**
+                         * Creates a plain object from a SearchRelatedAccountGroupMembershipsResponse message. Also converts values to other types if specified.
+                         * @function toObject
+                         * @memberof google.cloud.recaptchaenterprise.v1.SearchRelatedAccountGroupMembershipsResponse
+                         * @static
+                         * @param {google.cloud.recaptchaenterprise.v1.SearchRelatedAccountGroupMembershipsResponse} message SearchRelatedAccountGroupMembershipsResponse
+                         * @param {$protobuf.IConversionOptions} [options] Conversion options
+                         * @returns {Object.<string,*>} Plain object
+                         */
+                        SearchRelatedAccountGroupMembershipsResponse.toObject = function toObject(message, options) {
+                            if (!options)
+                                options = {};
+                            var object = {};
+                            if (options.arrays || options.defaults)
+                                object.relatedAccountGroupMemberships = [];
+                            if (options.defaults)
+                                object.nextPageToken = "";
+                            if (message.relatedAccountGroupMemberships && message.relatedAccountGroupMemberships.length) {
+                                object.relatedAccountGroupMemberships = [];
+                                for (var j = 0; j < message.relatedAccountGroupMemberships.length; ++j)
+                                    object.relatedAccountGroupMemberships[j] = $root.google.cloud.recaptchaenterprise.v1.RelatedAccountGroupMembership.toObject(message.relatedAccountGroupMemberships[j], options);
+                            }
+                            if (message.nextPageToken != null && message.hasOwnProperty("nextPageToken"))
+                                object.nextPageToken = message.nextPageToken;
+                            return object;
+                        };
+    
+                        /**
+                         * Converts this SearchRelatedAccountGroupMembershipsResponse to JSON.
+                         * @function toJSON
+                         * @memberof google.cloud.recaptchaenterprise.v1.SearchRelatedAccountGroupMembershipsResponse
+                         * @instance
+                         * @returns {Object.<string,*>} JSON object
+                         */
+                        SearchRelatedAccountGroupMembershipsResponse.prototype.toJSON = function toJSON() {
+                            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
+                        };
+    
+                        return SearchRelatedAccountGroupMembershipsResponse;
+                    })();
+    
+                    v1.RelatedAccountGroupMembership = (function() {
+    
+                        /**
+                         * Properties of a RelatedAccountGroupMembership.
+                         * @memberof google.cloud.recaptchaenterprise.v1
+                         * @interface IRelatedAccountGroupMembership
+                         * @property {string|null} [name] RelatedAccountGroupMembership name
+                         * @property {Uint8Array|null} [hashedAccountId] RelatedAccountGroupMembership hashedAccountId
+                         */
+    
+                        /**
+                         * Constructs a new RelatedAccountGroupMembership.
+                         * @memberof google.cloud.recaptchaenterprise.v1
+                         * @classdesc Represents a RelatedAccountGroupMembership.
+                         * @implements IRelatedAccountGroupMembership
+                         * @constructor
+                         * @param {google.cloud.recaptchaenterprise.v1.IRelatedAccountGroupMembership=} [properties] Properties to set
+                         */
+                        function RelatedAccountGroupMembership(properties) {
+                            if (properties)
+                                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
+                                    if (properties[keys[i]] != null)
+                                        this[keys[i]] = properties[keys[i]];
+                        }
+    
+                        /**
+                         * RelatedAccountGroupMembership name.
+                         * @member {string} name
+                         * @memberof google.cloud.recaptchaenterprise.v1.RelatedAccountGroupMembership
+                         * @instance
+                         */
+                        RelatedAccountGroupMembership.prototype.name = "";
+    
+                        /**
+                         * RelatedAccountGroupMembership hashedAccountId.
+                         * @member {Uint8Array} hashedAccountId
+                         * @memberof google.cloud.recaptchaenterprise.v1.RelatedAccountGroupMembership
+                         * @instance
+                         */
+                        RelatedAccountGroupMembership.prototype.hashedAccountId = $util.newBuffer([]);
+    
+                        /**
+                         * Creates a new RelatedAccountGroupMembership instance using the specified properties.
+                         * @function create
+                         * @memberof google.cloud.recaptchaenterprise.v1.RelatedAccountGroupMembership
+                         * @static
+                         * @param {google.cloud.recaptchaenterprise.v1.IRelatedAccountGroupMembership=} [properties] Properties to set
+                         * @returns {google.cloud.recaptchaenterprise.v1.RelatedAccountGroupMembership} RelatedAccountGroupMembership instance
+                         */
+                        RelatedAccountGroupMembership.create = function create(properties) {
+                            return new RelatedAccountGroupMembership(properties);
+                        };
+    
+                        /**
+                         * Encodes the specified RelatedAccountGroupMembership message. Does not implicitly {@link google.cloud.recaptchaenterprise.v1.RelatedAccountGroupMembership.verify|verify} messages.
+                         * @function encode
+                         * @memberof google.cloud.recaptchaenterprise.v1.RelatedAccountGroupMembership
+                         * @static
+                         * @param {google.cloud.recaptchaenterprise.v1.IRelatedAccountGroupMembership} message RelatedAccountGroupMembership message or plain object to encode
+                         * @param {$protobuf.Writer} [writer] Writer to encode to
+                         * @returns {$protobuf.Writer} Writer
+                         */
+                        RelatedAccountGroupMembership.encode = function encode(message, writer) {
+                            if (!writer)
+                                writer = $Writer.create();
+                            if (message.name != null && Object.hasOwnProperty.call(message, "name"))
+                                writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
+                            if (message.hashedAccountId != null && Object.hasOwnProperty.call(message, "hashedAccountId"))
+                                writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.hashedAccountId);
+                            return writer;
+                        };
+    
+                        /**
+                         * Encodes the specified RelatedAccountGroupMembership message, length delimited. Does not implicitly {@link google.cloud.recaptchaenterprise.v1.RelatedAccountGroupMembership.verify|verify} messages.
+                         * @function encodeDelimited
+                         * @memberof google.cloud.recaptchaenterprise.v1.RelatedAccountGroupMembership
+                         * @static
+                         * @param {google.cloud.recaptchaenterprise.v1.IRelatedAccountGroupMembership} message RelatedAccountGroupMembership message or plain object to encode
+                         * @param {$protobuf.Writer} [writer] Writer to encode to
+                         * @returns {$protobuf.Writer} Writer
+                         */
+                        RelatedAccountGroupMembership.encodeDelimited = function encodeDelimited(message, writer) {
+                            return this.encode(message, writer).ldelim();
+                        };
+    
+                        /**
+                         * Decodes a RelatedAccountGroupMembership message from the specified reader or buffer.
+                         * @function decode
+                         * @memberof google.cloud.recaptchaenterprise.v1.RelatedAccountGroupMembership
+                         * @static
+                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
+                         * @param {number} [length] Message length if known beforehand
+                         * @returns {google.cloud.recaptchaenterprise.v1.RelatedAccountGroupMembership} RelatedAccountGroupMembership
+                         * @throws {Error} If the payload is not a reader or valid buffer
+                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
+                         */
+                        RelatedAccountGroupMembership.decode = function decode(reader, length) {
+                            if (!(reader instanceof $Reader))
+                                reader = $Reader.create(reader);
+                            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.cloud.recaptchaenterprise.v1.RelatedAccountGroupMembership();
+                            while (reader.pos < end) {
+                                var tag = reader.uint32();
+                                switch (tag >>> 3) {
+                                case 1:
+                                    message.name = reader.string();
+                                    break;
+                                case 2:
+                                    message.hashedAccountId = reader.bytes();
+                                    break;
+                                default:
+                                    reader.skipType(tag & 7);
+                                    break;
+                                }
+                            }
+                            return message;
+                        };
+    
+                        /**
+                         * Decodes a RelatedAccountGroupMembership message from the specified reader or buffer, length delimited.
+                         * @function decodeDelimited
+                         * @memberof google.cloud.recaptchaenterprise.v1.RelatedAccountGroupMembership
+                         * @static
+                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
+                         * @returns {google.cloud.recaptchaenterprise.v1.RelatedAccountGroupMembership} RelatedAccountGroupMembership
+                         * @throws {Error} If the payload is not a reader or valid buffer
+                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
+                         */
+                        RelatedAccountGroupMembership.decodeDelimited = function decodeDelimited(reader) {
+                            if (!(reader instanceof $Reader))
+                                reader = new $Reader(reader);
+                            return this.decode(reader, reader.uint32());
+                        };
+    
+                        /**
+                         * Verifies a RelatedAccountGroupMembership message.
+                         * @function verify
+                         * @memberof google.cloud.recaptchaenterprise.v1.RelatedAccountGroupMembership
+                         * @static
+                         * @param {Object.<string,*>} message Plain object to verify
+                         * @returns {string|null} `null` if valid, otherwise the reason why it is not
+                         */
+                        RelatedAccountGroupMembership.verify = function verify(message) {
+                            if (typeof message !== "object" || message === null)
+                                return "object expected";
+                            if (message.name != null && message.hasOwnProperty("name"))
+                                if (!$util.isString(message.name))
+                                    return "name: string expected";
+                            if (message.hashedAccountId != null && message.hasOwnProperty("hashedAccountId"))
+                                if (!(message.hashedAccountId && typeof message.hashedAccountId.length === "number" || $util.isString(message.hashedAccountId)))
+                                    return "hashedAccountId: buffer expected";
+                            return null;
+                        };
+    
+                        /**
+                         * Creates a RelatedAccountGroupMembership message from a plain object. Also converts values to their respective internal types.
+                         * @function fromObject
+                         * @memberof google.cloud.recaptchaenterprise.v1.RelatedAccountGroupMembership
+                         * @static
+                         * @param {Object.<string,*>} object Plain object
+                         * @returns {google.cloud.recaptchaenterprise.v1.RelatedAccountGroupMembership} RelatedAccountGroupMembership
+                         */
+                        RelatedAccountGroupMembership.fromObject = function fromObject(object) {
+                            if (object instanceof $root.google.cloud.recaptchaenterprise.v1.RelatedAccountGroupMembership)
+                                return object;
+                            var message = new $root.google.cloud.recaptchaenterprise.v1.RelatedAccountGroupMembership();
+                            if (object.name != null)
+                                message.name = String(object.name);
+                            if (object.hashedAccountId != null)
+                                if (typeof object.hashedAccountId === "string")
+                                    $util.base64.decode(object.hashedAccountId, message.hashedAccountId = $util.newBuffer($util.base64.length(object.hashedAccountId)), 0);
+                                else if (object.hashedAccountId.length)
+                                    message.hashedAccountId = object.hashedAccountId;
+                            return message;
+                        };
+    
+                        /**
+                         * Creates a plain object from a RelatedAccountGroupMembership message. Also converts values to other types if specified.
+                         * @function toObject
+                         * @memberof google.cloud.recaptchaenterprise.v1.RelatedAccountGroupMembership
+                         * @static
+                         * @param {google.cloud.recaptchaenterprise.v1.RelatedAccountGroupMembership} message RelatedAccountGroupMembership
+                         * @param {$protobuf.IConversionOptions} [options] Conversion options
+                         * @returns {Object.<string,*>} Plain object
+                         */
+                        RelatedAccountGroupMembership.toObject = function toObject(message, options) {
+                            if (!options)
+                                options = {};
+                            var object = {};
+                            if (options.defaults) {
+                                object.name = "";
+                                if (options.bytes === String)
+                                    object.hashedAccountId = "";
+                                else {
+                                    object.hashedAccountId = [];
+                                    if (options.bytes !== Array)
+                                        object.hashedAccountId = $util.newBuffer(object.hashedAccountId);
+                                }
+                            }
+                            if (message.name != null && message.hasOwnProperty("name"))
+                                object.name = message.name;
+                            if (message.hashedAccountId != null && message.hasOwnProperty("hashedAccountId"))
+                                object.hashedAccountId = options.bytes === String ? $util.base64.encode(message.hashedAccountId, 0, message.hashedAccountId.length) : options.bytes === Array ? Array.prototype.slice.call(message.hashedAccountId) : message.hashedAccountId;
+                            return object;
+                        };
+    
+                        /**
+                         * Converts this RelatedAccountGroupMembership to JSON.
+                         * @function toJSON
+                         * @memberof google.cloud.recaptchaenterprise.v1.RelatedAccountGroupMembership
+                         * @instance
+                         * @returns {Object.<string,*>} JSON object
+                         */
+                        RelatedAccountGroupMembership.prototype.toJSON = function toJSON() {
+                            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
+                        };
+    
+                        return RelatedAccountGroupMembership;
+                    })();
+    
+                    v1.RelatedAccountGroup = (function() {
+    
+                        /**
+                         * Properties of a RelatedAccountGroup.
+                         * @memberof google.cloud.recaptchaenterprise.v1
+                         * @interface IRelatedAccountGroup
+                         * @property {string|null} [name] RelatedAccountGroup name
+                         */
+    
+                        /**
+                         * Constructs a new RelatedAccountGroup.
+                         * @memberof google.cloud.recaptchaenterprise.v1
+                         * @classdesc Represents a RelatedAccountGroup.
+                         * @implements IRelatedAccountGroup
+                         * @constructor
+                         * @param {google.cloud.recaptchaenterprise.v1.IRelatedAccountGroup=} [properties] Properties to set
+                         */
+                        function RelatedAccountGroup(properties) {
+                            if (properties)
+                                for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
+                                    if (properties[keys[i]] != null)
+                                        this[keys[i]] = properties[keys[i]];
+                        }
+    
+                        /**
+                         * RelatedAccountGroup name.
+                         * @member {string} name
+                         * @memberof google.cloud.recaptchaenterprise.v1.RelatedAccountGroup
+                         * @instance
+                         */
+                        RelatedAccountGroup.prototype.name = "";
+    
+                        /**
+                         * Creates a new RelatedAccountGroup instance using the specified properties.
+                         * @function create
+                         * @memberof google.cloud.recaptchaenterprise.v1.RelatedAccountGroup
+                         * @static
+                         * @param {google.cloud.recaptchaenterprise.v1.IRelatedAccountGroup=} [properties] Properties to set
+                         * @returns {google.cloud.recaptchaenterprise.v1.RelatedAccountGroup} RelatedAccountGroup instance
+                         */
+                        RelatedAccountGroup.create = function create(properties) {
+                            return new RelatedAccountGroup(properties);
+                        };
+    
+                        /**
+                         * Encodes the specified RelatedAccountGroup message. Does not implicitly {@link google.cloud.recaptchaenterprise.v1.RelatedAccountGroup.verify|verify} messages.
+                         * @function encode
+                         * @memberof google.cloud.recaptchaenterprise.v1.RelatedAccountGroup
+                         * @static
+                         * @param {google.cloud.recaptchaenterprise.v1.IRelatedAccountGroup} message RelatedAccountGroup message or plain object to encode
+                         * @param {$protobuf.Writer} [writer] Writer to encode to
+                         * @returns {$protobuf.Writer} Writer
+                         */
+                        RelatedAccountGroup.encode = function encode(message, writer) {
+                            if (!writer)
+                                writer = $Writer.create();
+                            if (message.name != null && Object.hasOwnProperty.call(message, "name"))
+                                writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
+                            return writer;
+                        };
+    
+                        /**
+                         * Encodes the specified RelatedAccountGroup message, length delimited. Does not implicitly {@link google.cloud.recaptchaenterprise.v1.RelatedAccountGroup.verify|verify} messages.
+                         * @function encodeDelimited
+                         * @memberof google.cloud.recaptchaenterprise.v1.RelatedAccountGroup
+                         * @static
+                         * @param {google.cloud.recaptchaenterprise.v1.IRelatedAccountGroup} message RelatedAccountGroup message or plain object to encode
+                         * @param {$protobuf.Writer} [writer] Writer to encode to
+                         * @returns {$protobuf.Writer} Writer
+                         */
+                        RelatedAccountGroup.encodeDelimited = function encodeDelimited(message, writer) {
+                            return this.encode(message, writer).ldelim();
+                        };
+    
+                        /**
+                         * Decodes a RelatedAccountGroup message from the specified reader or buffer.
+                         * @function decode
+                         * @memberof google.cloud.recaptchaenterprise.v1.RelatedAccountGroup
+                         * @static
+                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
+                         * @param {number} [length] Message length if known beforehand
+                         * @returns {google.cloud.recaptchaenterprise.v1.RelatedAccountGroup} RelatedAccountGroup
+                         * @throws {Error} If the payload is not a reader or valid buffer
+                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
+                         */
+                        RelatedAccountGroup.decode = function decode(reader, length) {
+                            if (!(reader instanceof $Reader))
+                                reader = $Reader.create(reader);
+                            var end = length === undefined ? reader.len : reader.pos + length, message = new $root.google.cloud.recaptchaenterprise.v1.RelatedAccountGroup();
+                            while (reader.pos < end) {
+                                var tag = reader.uint32();
+                                switch (tag >>> 3) {
+                                case 1:
+                                    message.name = reader.string();
+                                    break;
+                                default:
+                                    reader.skipType(tag & 7);
+                                    break;
+                                }
+                            }
+                            return message;
+                        };
+    
+                        /**
+                         * Decodes a RelatedAccountGroup message from the specified reader or buffer, length delimited.
+                         * @function decodeDelimited
+                         * @memberof google.cloud.recaptchaenterprise.v1.RelatedAccountGroup
+                         * @static
+                         * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
+                         * @returns {google.cloud.recaptchaenterprise.v1.RelatedAccountGroup} RelatedAccountGroup
+                         * @throws {Error} If the payload is not a reader or valid buffer
+                         * @throws {$protobuf.util.ProtocolError} If required fields are missing
+                         */
+                        RelatedAccountGroup.decodeDelimited = function decodeDelimited(reader) {
+                            if (!(reader instanceof $Reader))
+                                reader = new $Reader(reader);
+                            return this.decode(reader, reader.uint32());
+                        };
+    
+                        /**
+                         * Verifies a RelatedAccountGroup message.
+                         * @function verify
+                         * @memberof google.cloud.recaptchaenterprise.v1.RelatedAccountGroup
+                         * @static
+                         * @param {Object.<string,*>} message Plain object to verify
+                         * @returns {string|null} `null` if valid, otherwise the reason why it is not
+                         */
+                        RelatedAccountGroup.verify = function verify(message) {
+                            if (typeof message !== "object" || message === null)
+                                return "object expected";
+                            if (message.name != null && message.hasOwnProperty("name"))
+                                if (!$util.isString(message.name))
+                                    return "name: string expected";
+                            return null;
+                        };
+    
+                        /**
+                         * Creates a RelatedAccountGroup message from a plain object. Also converts values to their respective internal types.
+                         * @function fromObject
+                         * @memberof google.cloud.recaptchaenterprise.v1.RelatedAccountGroup
+                         * @static
+                         * @param {Object.<string,*>} object Plain object
+                         * @returns {google.cloud.recaptchaenterprise.v1.RelatedAccountGroup} RelatedAccountGroup
+                         */
+                        RelatedAccountGroup.fromObject = function fromObject(object) {
+                            if (object instanceof $root.google.cloud.recaptchaenterprise.v1.RelatedAccountGroup)
+                                return object;
+                            var message = new $root.google.cloud.recaptchaenterprise.v1.RelatedAccountGroup();
+                            if (object.name != null)
+                                message.name = String(object.name);
+                            return message;
+                        };
+    
+                        /**
+                         * Creates a plain object from a RelatedAccountGroup message. Also converts values to other types if specified.
+                         * @function toObject
+                         * @memberof google.cloud.recaptchaenterprise.v1.RelatedAccountGroup
+                         * @static
+                         * @param {google.cloud.recaptchaenterprise.v1.RelatedAccountGroup} message RelatedAccountGroup
+                         * @param {$protobuf.IConversionOptions} [options] Conversion options
+                         * @returns {Object.<string,*>} Plain object
+                         */
+                        RelatedAccountGroup.toObject = function toObject(message, options) {
+                            if (!options)
+                                options = {};
+                            var object = {};
+                            if (options.defaults)
+                                object.name = "";
+                            if (message.name != null && message.hasOwnProperty("name"))
+                                object.name = message.name;
+                            return object;
+                        };
+    
+                        /**
+                         * Converts this RelatedAccountGroup to JSON.
+                         * @function toJSON
+                         * @memberof google.cloud.recaptchaenterprise.v1.RelatedAccountGroup
+                         * @instance
+                         * @returns {Object.<string,*>} JSON object
+                         */
+                        RelatedAccountGroup.prototype.toJSON = function toJSON() {
+                            return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
+                        };
+    
+                        return RelatedAccountGroup;
+                    })();
+    
                     return v1;
                 })();
     
diff --git a/protos/protos.json b/protos/protos.json
index 22c3cee..c9911f0 100644
--- a/protos/protos.json
+++ b/protos/protos.json
@@ -171,6 +171,62 @@
                               "(google.api.method_signature)": "name"
                             }
                           ]
+                        },
+                        "ListRelatedAccountGroups": {
+                          "requestType": "ListRelatedAccountGroupsRequest",
+                          "responseType": "ListRelatedAccountGroupsResponse",
+                          "options": {
+                            "(google.api.http).get": "/v1/{parent=projects/*}/relatedaccountgroups",
+                            "(google.api.method_signature)": "parent"
+                          },
+                          "parsedOptions": [
+                            {
+                              "(google.api.http)": {
+                                "get": "/v1/{parent=projects/*}/relatedaccountgroups"
+                              }
+                            },
+                            {
+                              "(google.api.method_signature)": "parent"
+                            }
+                          ]
+                        },
+                        "ListRelatedAccountGroupMemberships": {
+                          "requestType": "ListRelatedAccountGroupMembershipsRequest",
+                          "responseType": "ListRelatedAccountGroupMembershipsResponse",
+                          "options": {
+                            "(google.api.http).get": "/v1/{parent=projects/*/relatedaccountgroups/*}/memberships",
+                            "(google.api.method_signature)": "parent"
+                          },
+                          "parsedOptions": [
+                            {
+                              "(google.api.http)": {
+                                "get": "/v1/{parent=projects/*/relatedaccountgroups/*}/memberships"
+                              }
+                            },
+                            {
+                              "(google.api.method_signature)": "parent"
+                            }
+                          ]
+                        },
+                        "SearchRelatedAccountGroupMemberships": {
+                          "requestType": "SearchRelatedAccountGroupMembershipsRequest",
+                          "responseType": "SearchRelatedAccountGroupMembershipsResponse",
+                          "options": {
+                            "(google.api.http).post": "/v1/{parent=projects/*}/relatedaccountgroupmemberships:search",
+                            "(google.api.http).body": "*",
+                            "(google.api.method_signature)": "parent,hashed_account_id"
+                          },
+                          "parsedOptions": [
+                            {
+                              "(google.api.http)": {
+                                "post": "/v1/{parent=projects/*}/relatedaccountgroupmemberships:search",
+                                "body": "*"
+                              }
+                            },
+                            {
+                              "(google.api.method_signature)": "parent,hashed_account_id"
+                            }
+                          ]
                         }
                       }
                     },
@@ -217,6 +273,13 @@
                           "options": {
                             "(google.api.field_behavior)": "OPTIONAL"
                           }
+                        },
+                        "hashedAccountId": {
+                          "type": "bytes",
+                          "id": 4,
+                          "options": {
+                            "(google.api.field_behavior)": "OPTIONAL"
+                          }
                         }
                       },
                       "nested": {
@@ -276,6 +339,10 @@
                           "options": {
                             "(google.api.field_behavior)": "OUTPUT_ONLY"
                           }
+                        },
+                        "accountDefenderAssessment": {
+                          "type": "AccountDefenderAssessment",
+                          "id": 6
                         }
                       }
                     },
@@ -315,6 +382,13 @@
                           "options": {
                             "(google.api.field_behavior)": "OPTIONAL"
                           }
+                        },
+                        "hashedAccountId": {
+                          "type": "bytes",
+                          "id": 6,
+                          "options": {
+                            "(google.api.field_behavior)": "OPTIONAL"
+                          }
                         }
                       }
                     },
@@ -380,6 +454,26 @@
                         }
                       }
                     },
+                    "AccountDefenderAssessment": {
+                      "fields": {
+                        "labels": {
+                          "rule": "repeated",
+                          "type": "AccountDefenderLabel",
+                          "id": 1
+                        }
+                      },
+                      "nested": {
+                        "AccountDefenderLabel": {
+                          "values": {
+                            "ACCOUNT_DEFENDER_LABEL_UNSPECIFIED": 0,
+                            "PROFILE_MATCH": 1,
+                            "SUSPICIOUS_LOGIN_ACTIVITY": 2,
+                            "SUSPICIOUS_ACCOUNT_CREATION": 3,
+                            "RELATED_ACCOUNTS_NUMBER_HIGH": 4
+                          }
+                        }
+                      }
+                    },
                     "CreateKeyRequest": {
                       "fields": {
                         "parent": {
@@ -617,10 +711,7 @@
                         },
                         "allowAmpTraffic": {
                           "type": "bool",
-                          "id": 2,
-                          "options": {
-                            "(google.api.field_behavior)": "REQUIRED"
-                          }
+                          "id": 2
                         },
                         "integrationType": {
                           "type": "IntegrationType",
@@ -720,6 +811,166 @@
                           "id": 4
                         }
                       }
+                    },
+                    "ListRelatedAccountGroupMembershipsRequest": {
+                      "fields": {
+                        "parent": {
+                          "type": "string",
+                          "id": 1,
+                          "options": {
+                            "(google.api.field_behavior)": "REQUIRED",
+                            "(google.api.resource_reference).child_type": "recaptchaenterprise.googleapis.com/RelatedAccountGroupMembership"
+                          }
+                        },
+                        "pageSize": {
+                          "type": "int32",
+                          "id": 2,
+                          "options": {
+                            "(google.api.field_behavior)": "OPTIONAL"
+                          }
+                        },
+                        "pageToken": {
+                          "type": "string",
+                          "id": 3,
+                          "options": {
+                            "(google.api.field_behavior)": "OPTIONAL"
+                          }
+                        }
+                      }
+                    },
+                    "ListRelatedAccountGroupMembershipsResponse": {
+                      "fields": {
+                        "relatedAccountGroupMemberships": {
+                          "rule": "repeated",
+                          "type": "RelatedAccountGroupMembership",
+                          "id": 1
+                        },
+                        "nextPageToken": {
+                          "type": "string",
+                          "id": 2
+                        }
+                      }
+                    },
+                    "ListRelatedAccountGroupsRequest": {
+                      "fields": {
+                        "parent": {
+                          "type": "string",
+                          "id": 1,
+                          "options": {
+                            "(google.api.field_behavior)": "REQUIRED",
+                            "(google.api.resource_reference).child_type": "recaptchaenterprise.googleapis.com/RelatedAccountGroup"
+                          }
+                        },
+                        "pageSize": {
+                          "type": "int32",
+                          "id": 2,
+                          "options": {
+                            "(google.api.field_behavior)": "OPTIONAL"
+                          }
+                        },
+                        "pageToken": {
+                          "type": "string",
+                          "id": 3,
+                          "options": {
+                            "(google.api.field_behavior)": "OPTIONAL"
+                          }
+                        }
+                      }
+                    },
+                    "ListRelatedAccountGroupsResponse": {
+                      "fields": {
+                        "relatedAccountGroups": {
+                          "rule": "repeated",
+                          "type": "RelatedAccountGroup",
+                          "id": 1
+                        },
+                        "nextPageToken": {
+                          "type": "string",
+                          "id": 2
+                        }
+                      }
+                    },
+                    "SearchRelatedAccountGroupMembershipsRequest": {
+                      "fields": {
+                        "parent": {
+                          "type": "string",
+                          "id": 1,
+                          "options": {
+                            "(google.api.field_behavior)": "REQUIRED",
+                            "(google.api.resource_reference).child_type": "recaptchaenterprise.googleapis.com/RelatedAccountGroupMembership"
+                          }
+                        },
+                        "hashedAccountId": {
+                          "type": "bytes",
+                          "id": 2,
+                          "options": {
+                            "(google.api.field_behavior)": "OPTIONAL"
+                          }
+                        },
+                        "pageSize": {
+                          "type": "int32",
+                          "id": 3,
+                          "options": {
+                            "(google.api.field_behavior)": "OPTIONAL"
+                          }
+                        },
+                        "pageToken": {
+                          "type": "string",
+                          "id": 4,
+                          "options": {
+                            "(google.api.field_behavior)": "OPTIONAL"
+                          }
+                        }
+                      }
+                    },
+                    "SearchRelatedAccountGroupMembershipsResponse": {
+                      "fields": {
+                        "relatedAccountGroupMemberships": {
+                          "rule": "repeated",
+                          "type": "RelatedAccountGroupMembership",
+                          "id": 1
+                        },
+                        "nextPageToken": {
+                          "type": "string",
+                          "id": 2
+                        }
+                      }
+                    },
+                    "RelatedAccountGroupMembership": {
+                      "options": {
+                        "(google.api.resource).type": "recaptchaenterprise.googleapis.com/RelatedAccountGroupMembership",
+                        "(google.api.resource).pattern": "projects/{project}/relatedaccountgroups/{relatedaccountgroup}/memberships/{membership}"
+                      },
+                      "fields": {
+                        "name": {
+                          "type": "string",
+                          "id": 1,
+                          "options": {
+                            "(google.api.field_behavior)": "REQUIRED",
+                            "(google.api.resource_reference).type": "recaptchaenterprise.googleapis.com/RelatedAccountGroupMembership"
+                          }
+                        },
+                        "hashedAccountId": {
+                          "type": "bytes",
+                          "id": 2
+                        }
+                      }
+                    },
+                    "RelatedAccountGroup": {
+                      "options": {
+                        "(google.api.resource).type": "recaptchaenterprise.googleapis.com/RelatedAccountGroup",
+                        "(google.api.resource).pattern": "projects/{project}/relatedaccountgroups/{relatedaccountgroup}"
+                      },
+                      "fields": {
+                        "name": {
+                          "type": "string",
+                          "id": 1,
+                          "options": {
+                            "(google.api.field_behavior)": "REQUIRED",
+                            "(google.api.resource_reference).type": "recaptchaenterprise.googleapis.com/RelatedAccountGroup"
+                          }
+                        }
+                      }
                     }
                   }
                 },
diff --git a/samples/generated/v1/recaptcha_enterprise_service.annotate_assessment.js b/samples/generated/v1/recaptcha_enterprise_service.annotate_assessment.js
new file mode 100644
index 0000000..2779787
--- /dev/null
+++ b/samples/generated/v1/recaptcha_enterprise_service.annotate_assessment.js
@@ -0,0 +1,74 @@
+// Copyright 2021 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+'use strict';
+
+function main(name) {
+  // [START recaptchaenterprise_v1_generated_RecaptchaEnterpriseService_AnnotateAssessment_async]
+  /**
+   * TODO(developer): Uncomment these variables before running the sample.
+   */
+  /**
+   *  Required. The resource name of the Assessment, in the format
+   *  "projects/{project}/assessments/{assessment}".
+   */
+  // const name = 'abc123'
+  /**
+   *  Optional. The annotation that will be assigned to the Event. This field can be left
+   *  empty to provide reasons that apply to an event without concluding whether
+   *  the event is legitimate or fraudulent.
+   */
+  // const annotation = ''
+  /**
+   *  Optional. Optional reasons for the annotation that will be assigned to the Event.
+   */
+  // const reasons = 1234
+  /**
+   *  Optional. Optional unique stable hashed user identifier to apply to the assessment.
+   *  This is an alternative to setting the hashed_account_id in
+   *  CreateAssessment, for example when the account identifier is not yet known
+   *  in the initial request. It is recommended that the identifier is hashed
+   *  using hmac-sha256 with stable secret.
+   */
+  // const hashedAccountId = 'Buffer.from('string')'
+
+  // Imports the Recaptchaenterprise library
+  const {RecaptchaEnterpriseServiceClient} =
+    require('@google-cloud/recaptcha-enterprise').v1;
+
+  // Instantiates a client
+  const recaptchaenterpriseClient = new RecaptchaEnterpriseServiceClient();
+
+  async function annotateAssessment() {
+    // Construct request
+    const request = {
+      name,
+    };
+
+    // Run request
+    const response = await recaptchaenterpriseClient.annotateAssessment(
+      request
+    );
+    console.log(response);
+  }
+
+  annotateAssessment();
+  // [END recaptchaenterprise_v1_generated_RecaptchaEnterpriseService_AnnotateAssessment_async]
+}
+
+process.on('unhandledRejection', err => {
+  console.error(err.message);
+  process.exitCode = 1;
+});
+main(...process.argv.slice(2));
diff --git a/samples/generated/v1/recaptcha_enterprise_service.create_assessment.js b/samples/generated/v1/recaptcha_enterprise_service.create_assessment.js
new file mode 100644
index 0000000..5fb3cae
--- /dev/null
+++ b/samples/generated/v1/recaptcha_enterprise_service.create_assessment.js
@@ -0,0 +1,59 @@
+// Copyright 2021 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+'use strict';
+
+function main(parent, assessment) {
+  // [START recaptchaenterprise_v1_generated_RecaptchaEnterpriseService_CreateAssessment_async]
+  /**
+   * TODO(developer): Uncomment these variables before running the sample.
+   */
+  /**
+   *  Required. The name of the project in which the assessment will be created,
+   *  in the format "projects/{project}".
+   */
+  // const parent = 'abc123'
+  /**
+   *  Required. The assessment details.
+   */
+  // const assessment = ''
+
+  // Imports the Recaptchaenterprise library
+  const {RecaptchaEnterpriseServiceClient} =
+    require('@google-cloud/recaptcha-enterprise').v1;
+
+  // Instantiates a client
+  const recaptchaenterpriseClient = new RecaptchaEnterpriseServiceClient();
+
+  async function createAssessment() {
+    // Construct request
+    const request = {
+      parent,
+      assessment,
+    };
+
+    // Run request
+    const response = await recaptchaenterpriseClient.createAssessment(request);
+    console.log(response);
+  }
+
+  createAssessment();
+  // [END recaptchaenterprise_v1_generated_RecaptchaEnterpriseService_CreateAssessment_async]
+}
+
+process.on('unhandledRejection', err => {
+  console.error(err.message);
+  process.exitCode = 1;
+});
+main(...process.argv.slice(2));
diff --git a/samples/generated/v1/recaptcha_enterprise_service.create_key.js b/samples/generated/v1/recaptcha_enterprise_service.create_key.js
new file mode 100644
index 0000000..971ccdb
--- /dev/null
+++ b/samples/generated/v1/recaptcha_enterprise_service.create_key.js
@@ -0,0 +1,59 @@
+// Copyright 2021 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+'use strict';
+
+function main(parent, key) {
+  // [START recaptchaenterprise_v1_generated_RecaptchaEnterpriseService_CreateKey_async]
+  /**
+   * TODO(developer): Uncomment these variables before running the sample.
+   */
+  /**
+   *  Required. The name of the project in which the key will be created, in the
+   *  format "projects/{project}".
+   */
+  // const parent = 'abc123'
+  /**
+   *  Required. Information to create a reCAPTCHA Enterprise key.
+   */
+  // const key = ''
+
+  // Imports the Recaptchaenterprise library
+  const {RecaptchaEnterpriseServiceClient} =
+    require('@google-cloud/recaptcha-enterprise').v1;
+
+  // Instantiates a client
+  const recaptchaenterpriseClient = new RecaptchaEnterpriseServiceClient();
+
+  async function createKey() {
+    // Construct request
+    const request = {
+      parent,
+      key,
+    };
+
+    // Run request
+    const response = await recaptchaenterpriseClient.createKey(request);
+    console.log(response);
+  }
+
+  createKey();
+  // [END recaptchaenterprise_v1_generated_RecaptchaEnterpriseService_CreateKey_async]
+}
+
+process.on('unhandledRejection', err => {
+  console.error(err.message);
+  process.exitCode = 1;
+});
+main(...process.argv.slice(2));
diff --git a/samples/generated/v1/recaptcha_enterprise_service.delete_key.js b/samples/generated/v1/recaptcha_enterprise_service.delete_key.js
new file mode 100644
index 0000000..db974b2
--- /dev/null
+++ b/samples/generated/v1/recaptcha_enterprise_service.delete_key.js
@@ -0,0 +1,54 @@
+// Copyright 2021 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+'use strict';
+
+function main(name) {
+  // [START recaptchaenterprise_v1_generated_RecaptchaEnterpriseService_DeleteKey_async]
+  /**
+   * TODO(developer): Uncomment these variables before running the sample.
+   */
+  /**
+   *  Required. The name of the key to be deleted, in the format
+   *  "projects/{project}/keys/{key}".
+   */
+  // const name = 'abc123'
+
+  // Imports the Recaptchaenterprise library
+  const {RecaptchaEnterpriseServiceClient} =
+    require('@google-cloud/recaptcha-enterprise').v1;
+
+  // Instantiates a client
+  const recaptchaenterpriseClient = new RecaptchaEnterpriseServiceClient();
+
+  async function deleteKey() {
+    // Construct request
+    const request = {
+      name,
+    };
+
+    // Run request
+    const response = await recaptchaenterpriseClient.deleteKey(request);
+    console.log(response);
+  }
+
+  deleteKey();
+  // [END recaptchaenterprise_v1_generated_RecaptchaEnterpriseService_DeleteKey_async]
+}
+
+process.on('unhandledRejection', err => {
+  console.error(err.message);
+  process.exitCode = 1;
+});
+main(...process.argv.slice(2));
diff --git a/samples/generated/v1/recaptcha_enterprise_service.get_key.js b/samples/generated/v1/recaptcha_enterprise_service.get_key.js
new file mode 100644
index 0000000..dec6da8
--- /dev/null
+++ b/samples/generated/v1/recaptcha_enterprise_service.get_key.js
@@ -0,0 +1,54 @@
+// Copyright 2021 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+'use strict';
+
+function main(name) {
+  // [START recaptchaenterprise_v1_generated_RecaptchaEnterpriseService_GetKey_async]
+  /**
+   * TODO(developer): Uncomment these variables before running the sample.
+   */
+  /**
+   *  Required. The name of the requested key, in the format
+   *  "projects/{project}/keys/{key}".
+   */
+  // const name = 'abc123'
+
+  // Imports the Recaptchaenterprise library
+  const {RecaptchaEnterpriseServiceClient} =
+    require('@google-cloud/recaptcha-enterprise').v1;
+
+  // Instantiates a client
+  const recaptchaenterpriseClient = new RecaptchaEnterpriseServiceClient();
+
+  async function getKey() {
+    // Construct request
+    const request = {
+      name,
+    };
+
+    // Run request
+    const response = await recaptchaenterpriseClient.getKey(request);
+    console.log(response);
+  }
+
+  getKey();
+  // [END recaptchaenterprise_v1_generated_RecaptchaEnterpriseService_GetKey_async]
+}
+
+process.on('unhandledRejection', err => {
+  console.error(err.message);
+  process.exitCode = 1;
+});
+main(...process.argv.slice(2));
diff --git a/samples/generated/v1/recaptcha_enterprise_service.get_metrics.js b/samples/generated/v1/recaptcha_enterprise_service.get_metrics.js
new file mode 100644
index 0000000..9227d51
--- /dev/null
+++ b/samples/generated/v1/recaptcha_enterprise_service.get_metrics.js
@@ -0,0 +1,54 @@
+// Copyright 2021 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+'use strict';
+
+function main(name) {
+  // [START recaptchaenterprise_v1_generated_RecaptchaEnterpriseService_GetMetrics_async]
+  /**
+   * TODO(developer): Uncomment these variables before running the sample.
+   */
+  /**
+   *  Required. The name of the requested metrics, in the format
+   *  "projects/{project}/keys/{key}/metrics".
+   */
+  // const name = 'abc123'
+
+  // Imports the Recaptchaenterprise library
+  const {RecaptchaEnterpriseServiceClient} =
+    require('@google-cloud/recaptcha-enterprise').v1;
+
+  // Instantiates a client
+  const recaptchaenterpriseClient = new RecaptchaEnterpriseServiceClient();
+
+  async function getMetrics() {
+    // Construct request
+    const request = {
+      name,
+    };
+
+    // Run request
+    const response = await recaptchaenterpriseClient.getMetrics(request);
+    console.log(response);
+  }
+
+  getMetrics();
+  // [END recaptchaenterprise_v1_generated_RecaptchaEnterpriseService_GetMetrics_async]
+}
+
+process.on('unhandledRejection', err => {
+  console.error(err.message);
+  process.exitCode = 1;
+});
+main(...process.argv.slice(2));
diff --git a/samples/generated/v1/recaptcha_enterprise_service.list_keys.js b/samples/generated/v1/recaptcha_enterprise_service.list_keys.js
new file mode 100644
index 0000000..e1dc8b3
--- /dev/null
+++ b/samples/generated/v1/recaptcha_enterprise_service.list_keys.js
@@ -0,0 +1,66 @@
+// Copyright 2021 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+'use strict';
+
+function main(parent) {
+  // [START recaptchaenterprise_v1_generated_RecaptchaEnterpriseService_ListKeys_async]
+  /**
+   * TODO(developer): Uncomment these variables before running the sample.
+   */
+  /**
+   *  Required. The name of the project that contains the keys that will be
+   *  listed, in the format "projects/{project}".
+   */
+  // const parent = 'abc123'
+  /**
+   *  Optional. The maximum number of keys to return. Default is 10. Max limit is
+   *  1000.
+   */
+  // const pageSize = 1234
+  /**
+   *  Optional. The next_page_token value returned from a previous.
+   *  ListKeysRequest, if any.
+   */
+  // const pageToken = 'abc123'
+
+  // Imports the Recaptchaenterprise library
+  const {RecaptchaEnterpriseServiceClient} =
+    require('@google-cloud/recaptcha-enterprise').v1;
+
+  // Instantiates a client
+  const recaptchaenterpriseClient = new RecaptchaEnterpriseServiceClient();
+
+  async function listKeys() {
+    // Construct request
+    const request = {
+      parent,
+    };
+
+    // Run request
+    const iterable = await recaptchaenterpriseClient.listKeysAsync(request);
+    for await (const response of iterable) {
+      console.log(response);
+    }
+  }
+
+  listKeys();
+  // [END recaptchaenterprise_v1_generated_RecaptchaEnterpriseService_ListKeys_async]
+}
+
+process.on('unhandledRejection', err => {
+  console.error(err.message);
+  process.exitCode = 1;
+});
+main(...process.argv.slice(2));
diff --git a/samples/generated/v1/recaptcha_enterprise_service.list_related_account_group_memberships.js b/samples/generated/v1/recaptcha_enterprise_service.list_related_account_group_memberships.js
new file mode 100644
index 0000000..f747a9b
--- /dev/null
+++ b/samples/generated/v1/recaptcha_enterprise_service.list_related_account_group_memberships.js
@@ -0,0 +1,74 @@
+// Copyright 2021 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+'use strict';
+
+function main(parent) {
+  // [START recaptchaenterprise_v1_generated_RecaptchaEnterpriseService_ListRelatedAccountGroupMemberships_async]
+  /**
+   * TODO(developer): Uncomment these variables before running the sample.
+   */
+  /**
+   *  Required. The resource name for the related account group in the format
+   *  `projects/{project}/relatedaccountgroups/{relatedaccountgroup}`.
+   */
+  // const parent = 'abc123'
+  /**
+   *  Optional. The maximum number of accounts to return. The service may return fewer than
+   *  this value.
+   *  If unspecified, at most 50 accounts will be returned.
+   *  The maximum value is 1000; values above 1000 will be coerced to 1000.
+   */
+  // const pageSize = 1234
+  /**
+   *  Optional. A page token, received from a previous `ListRelatedAccountGroupMemberships`
+   *  call.
+   *  When paginating, all other parameters provided to
+   *  `ListRelatedAccountGroupMemberships` must match the call that provided the
+   *  page token.
+   */
+  // const pageToken = 'abc123'
+
+  // Imports the Recaptchaenterprise library
+  const {RecaptchaEnterpriseServiceClient} =
+    require('@google-cloud/recaptcha-enterprise').v1;
+
+  // Instantiates a client
+  const recaptchaenterpriseClient = new RecaptchaEnterpriseServiceClient();
+
+  async function listRelatedAccountGroupMemberships() {
+    // Construct request
+    const request = {
+      parent,
+    };
+
+    // Run request
+    const iterable =
+      await recaptchaenterpriseClient.listRelatedAccountGroupMembershipsAsync(
+        request
+      );
+    for await (const response of iterable) {
+      console.log(response);
+    }
+  }
+
+  listRelatedAccountGroupMemberships();
+  // [END recaptchaenterprise_v1_generated_RecaptchaEnterpriseService_ListRelatedAccountGroupMemberships_async]
+}
+
+process.on('unhandledRejection', err => {
+  console.error(err.message);
+  process.exitCode = 1;
+});
+main(...process.argv.slice(2));
diff --git a/samples/generated/v1/recaptcha_enterprise_service.list_related_account_groups.js b/samples/generated/v1/recaptcha_enterprise_service.list_related_account_groups.js
new file mode 100644
index 0000000..f5180d6
--- /dev/null
+++ b/samples/generated/v1/recaptcha_enterprise_service.list_related_account_groups.js
@@ -0,0 +1,72 @@
+// Copyright 2021 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+'use strict';
+
+function main(parent) {
+  // [START recaptchaenterprise_v1_generated_RecaptchaEnterpriseService_ListRelatedAccountGroups_async]
+  /**
+   * TODO(developer): Uncomment these variables before running the sample.
+   */
+  /**
+   *  Required. The name of the project to list related account groups from, in the format
+   *  "projects/{project}".
+   */
+  // const parent = 'abc123'
+  /**
+   *  Optional. The maximum number of groups to return. The service may return fewer than
+   *  this value.
+   *  If unspecified, at most 50 groups will be returned.
+   *  The maximum value is 1000; values above 1000 will be coerced to 1000.
+   */
+  // const pageSize = 1234
+  /**
+   *  Optional. A page token, received from a previous `ListRelatedAccountGroups` call.
+   *  Provide this to retrieve the subsequent page.
+   *  When paginating, all other parameters provided to
+   *  `ListRelatedAccountGroups` must match the call that provided the page
+   *  token.
+   */
+  // const pageToken = 'abc123'
+
+  // Imports the Recaptchaenterprise library
+  const {RecaptchaEnterpriseServiceClient} =
+    require('@google-cloud/recaptcha-enterprise').v1;
+
+  // Instantiates a client
+  const recaptchaenterpriseClient = new RecaptchaEnterpriseServiceClient();
+
+  async function listRelatedAccountGroups() {
+    // Construct request
+    const request = {
+      parent,
+    };
+
+    // Run request
+    const iterable =
+      await recaptchaenterpriseClient.listRelatedAccountGroupsAsync(request);
+    for await (const response of iterable) {
+      console.log(response);
+    }
+  }
+
+  listRelatedAccountGroups();
+  // [END recaptchaenterprise_v1_generated_RecaptchaEnterpriseService_ListRelatedAccountGroups_async]
+}
+
+process.on('unhandledRejection', err => {
+  console.error(err.message);
+  process.exitCode = 1;
+});
+main(...process.argv.slice(2));
diff --git a/samples/generated/v1/recaptcha_enterprise_service.migrate_key.js b/samples/generated/v1/recaptcha_enterprise_service.migrate_key.js
new file mode 100644
index 0000000..0804669
--- /dev/null
+++ b/samples/generated/v1/recaptcha_enterprise_service.migrate_key.js
@@ -0,0 +1,54 @@
+// Copyright 2021 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+'use strict';
+
+function main(name) {
+  // [START recaptchaenterprise_v1_generated_RecaptchaEnterpriseService_MigrateKey_async]
+  /**
+   * TODO(developer): Uncomment these variables before running the sample.
+   */
+  /**
+   *  Required. The name of the key to be migrated, in the format
+   *  "projects/{project}/keys/{key}".
+   */
+  // const name = 'abc123'
+
+  // Imports the Recaptchaenterprise library
+  const {RecaptchaEnterpriseServiceClient} =
+    require('@google-cloud/recaptcha-enterprise').v1;
+
+  // Instantiates a client
+  const recaptchaenterpriseClient = new RecaptchaEnterpriseServiceClient();
+
+  async function migrateKey() {
+    // Construct request
+    const request = {
+      name,
+    };
+
+    // Run request
+    const response = await recaptchaenterpriseClient.migrateKey(request);
+    console.log(response);
+  }
+
+  migrateKey();
+  // [END recaptchaenterprise_v1_generated_RecaptchaEnterpriseService_MigrateKey_async]
+}
+
+process.on('unhandledRejection', err => {
+  console.error(err.message);
+  process.exitCode = 1;
+});
+main(...process.argv.slice(2));
diff --git a/samples/generated/v1/recaptcha_enterprise_service.search_related_account_group_memberships.js b/samples/generated/v1/recaptcha_enterprise_service.search_related_account_group_memberships.js
new file mode 100644
index 0000000..febe66f
--- /dev/null
+++ b/samples/generated/v1/recaptcha_enterprise_service.search_related_account_group_memberships.js
@@ -0,0 +1,81 @@
+// Copyright 2021 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+'use strict';
+
+function main(parent) {
+  // [START recaptchaenterprise_v1_generated_RecaptchaEnterpriseService_SearchRelatedAccountGroupMemberships_async]
+  /**
+   * TODO(developer): Uncomment these variables before running the sample.
+   */
+  /**
+   *  Required. The name of the project to search related account group memberships from,
+   *  in the format "projects/{project}".
+   */
+  // const parent = 'abc123'
+  /**
+   *  Optional. The unique stable hashed user identifier we should search connections to.
+   *  The identifier should correspond to a `hashed_account_id` provided in a
+   *  previous CreateAssessment or AnnotateAssessment call.
+   */
+  // const hashedAccountId = 'Buffer.from('string')'
+  /**
+   *  Optional. The maximum number of groups to return. The service may return fewer than
+   *  this value.
+   *  If unspecified, at most 50 groups will be returned.
+   *  The maximum value is 1000; values above 1000 will be coerced to 1000.
+   */
+  // const pageSize = 1234
+  /**
+   *  Optional. A page token, received from a previous
+   *  `SearchRelatedAccountGroupMemberships` call. Provide this to retrieve the
+   *  subsequent page.
+   *  When paginating, all other parameters provided to
+   *  `SearchRelatedAccountGroupMemberships` must match the call that provided
+   *  the page token.
+   */
+  // const pageToken = 'abc123'
+
+  // Imports the Recaptchaenterprise library
+  const {RecaptchaEnterpriseServiceClient} =
+    require('@google-cloud/recaptcha-enterprise').v1;
+
+  // Instantiates a client
+  const recaptchaenterpriseClient = new RecaptchaEnterpriseServiceClient();
+
+  async function searchRelatedAccountGroupMemberships() {
+    // Construct request
+    const request = {
+      parent,
+    };
+
+    // Run request
+    const iterable =
+      await recaptchaenterpriseClient.searchRelatedAccountGroupMembershipsAsync(
+        request
+      );
+    for await (const response of iterable) {
+      console.log(response);
+    }
+  }
+
+  searchRelatedAccountGroupMemberships();
+  // [END recaptchaenterprise_v1_generated_RecaptchaEnterpriseService_SearchRelatedAccountGroupMemberships_async]
+}
+
+process.on('unhandledRejection', err => {
+  console.error(err.message);
+  process.exitCode = 1;
+});
+main(...process.argv.slice(2));
diff --git a/samples/generated/v1/recaptcha_enterprise_service.update_key.js b/samples/generated/v1/recaptcha_enterprise_service.update_key.js
new file mode 100644
index 0000000..eba40fd
--- /dev/null
+++ b/samples/generated/v1/recaptcha_enterprise_service.update_key.js
@@ -0,0 +1,58 @@
+// Copyright 2021 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+'use strict';
+
+function main(key) {
+  // [START recaptchaenterprise_v1_generated_RecaptchaEnterpriseService_UpdateKey_async]
+  /**
+   * TODO(developer): Uncomment these variables before running the sample.
+   */
+  /**
+   *  Required. The key to update.
+   */
+  // const key = ''
+  /**
+   *  Optional. The mask to control which fields of the key get updated. If the mask is not
+   *  present, all fields will be updated.
+   */
+  // const updateMask = ''
+
+  // Imports the Recaptchaenterprise library
+  const {RecaptchaEnterpriseServiceClient} =
+    require('@google-cloud/recaptcha-enterprise').v1;
+
+  // Instantiates a client
+  const recaptchaenterpriseClient = new RecaptchaEnterpriseServiceClient();
+
+  async function updateKey() {
+    // Construct request
+    const request = {
+      key,
+    };
+
+    // Run request
+    const response = await recaptchaenterpriseClient.updateKey(request);
+    console.log(response);
+  }
+
+  updateKey();
+  // [END recaptchaenterprise_v1_generated_RecaptchaEnterpriseService_UpdateKey_async]
+}
+
+process.on('unhandledRejection', err => {
+  console.error(err.message);
+  process.exitCode = 1;
+});
+main(...process.argv.slice(2));
diff --git a/samples/generated/v1beta1/recaptcha_enterprise_service_v1_beta1.annotate_assessment.js b/samples/generated/v1beta1/recaptcha_enterprise_service_v1_beta1.annotate_assessment.js
new file mode 100644
index 0000000..65d244c
--- /dev/null
+++ b/samples/generated/v1beta1/recaptcha_enterprise_service_v1_beta1.annotate_assessment.js
@@ -0,0 +1,62 @@
+// Copyright 2021 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+'use strict';
+
+function main(name, annotation) {
+  // [START recaptchaenterprise_v1beta1_generated_RecaptchaEnterpriseServiceV1Beta1_AnnotateAssessment_async]
+  /**
+   * TODO(developer): Uncomment these variables before running the sample.
+   */
+  /**
+   *  Required. The resource name of the Assessment, in the format
+   *  "projects/{project_number}/assessments/{assessment_id}".
+   */
+  // const name = 'abc123'
+  /**
+   *  Required. The annotation that will be assigned to the Event.
+   */
+  // const annotation = ''
+
+  // Imports the Recaptchaenterprise library
+  const {RecaptchaEnterpriseServiceV1Beta1Client} =
+    require('@google-cloud/recaptcha-enterprise').v1beta1;
+
+  // Instantiates a client
+  const recaptchaenterpriseClient =
+    new RecaptchaEnterpriseServiceV1Beta1Client();
+
+  async function annotateAssessment() {
+    // Construct request
+    const request = {
+      name,
+      annotation,
+    };
+
+    // Run request
+    const response = await recaptchaenterpriseClient.annotateAssessment(
+      request
+    );
+    console.log(response);
+  }
+
+  annotateAssessment();
+  // [END recaptchaenterprise_v1beta1_generated_RecaptchaEnterpriseServiceV1Beta1_AnnotateAssessment_async]
+}
+
+process.on('unhandledRejection', err => {
+  console.error(err.message);
+  process.exitCode = 1;
+});
+main(...process.argv.slice(2));
diff --git a/samples/generated/v1beta1/recaptcha_enterprise_service_v1_beta1.create_assessment.js b/samples/generated/v1beta1/recaptcha_enterprise_service_v1_beta1.create_assessment.js
new file mode 100644
index 0000000..0bc42ac
--- /dev/null
+++ b/samples/generated/v1beta1/recaptcha_enterprise_service_v1_beta1.create_assessment.js
@@ -0,0 +1,60 @@
+// Copyright 2021 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+'use strict';
+
+function main(parent, assessment) {
+  // [START recaptchaenterprise_v1beta1_generated_RecaptchaEnterpriseServiceV1Beta1_CreateAssessment_async]
+  /**
+   * TODO(developer): Uncomment these variables before running the sample.
+   */
+  /**
+   *  Required. The name of the project in which the assessment will be created,
+   *  in the format "projects/{project_number}".
+   */
+  // const parent = 'abc123'
+  /**
+   *  Required. The assessment details.
+   */
+  // const assessment = ''
+
+  // Imports the Recaptchaenterprise library
+  const {RecaptchaEnterpriseServiceV1Beta1Client} =
+    require('@google-cloud/recaptcha-enterprise').v1beta1;
+
+  // Instantiates a client
+  const recaptchaenterpriseClient =
+    new RecaptchaEnterpriseServiceV1Beta1Client();
+
+  async function createAssessment() {
+    // Construct request
+    const request = {
+      parent,
+      assessment,
+    };
+
+    // Run request
+    const response = await recaptchaenterpriseClient.createAssessment(request);
+    console.log(response);
+  }
+
+  createAssessment();
+  // [END recaptchaenterprise_v1beta1_generated_RecaptchaEnterpriseServiceV1Beta1_CreateAssessment_async]
+}
+
+process.on('unhandledRejection', err => {
+  console.error(err.message);
+  process.exitCode = 1;
+});
+main(...process.argv.slice(2));
diff --git a/samples/generated/v1beta1/recaptcha_enterprise_service_v1_beta1.create_key.js b/samples/generated/v1beta1/recaptcha_enterprise_service_v1_beta1.create_key.js
new file mode 100644
index 0000000..adcbe96
--- /dev/null
+++ b/samples/generated/v1beta1/recaptcha_enterprise_service_v1_beta1.create_key.js
@@ -0,0 +1,60 @@
+// Copyright 2021 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+'use strict';
+
+function main(parent, key) {
+  // [START recaptchaenterprise_v1beta1_generated_RecaptchaEnterpriseServiceV1Beta1_CreateKey_async]
+  /**
+   * TODO(developer): Uncomment these variables before running the sample.
+   */
+  /**
+   *  Required. The name of the project in which the key will be created, in the
+   *  format "projects/{project_number}".
+   */
+  // const parent = 'abc123'
+  /**
+   *  Required. Information to create a reCAPTCHA Enterprise key.
+   */
+  // const key = ''
+
+  // Imports the Recaptchaenterprise library
+  const {RecaptchaEnterpriseServiceV1Beta1Client} =
+    require('@google-cloud/recaptcha-enterprise').v1beta1;
+
+  // Instantiates a client
+  const recaptchaenterpriseClient =
+    new RecaptchaEnterpriseServiceV1Beta1Client();
+
+  async function createKey() {
+    // Construct request
+    const request = {
+      parent,
+      key,
+    };
+
+    // Run request
+    const response = await recaptchaenterpriseClient.createKey(request);
+    console.log(response);
+  }
+
+  createKey();
+  // [END recaptchaenterprise_v1beta1_generated_RecaptchaEnterpriseServiceV1Beta1_CreateKey_async]
+}
+
+process.on('unhandledRejection', err => {
+  console.error(err.message);
+  process.exitCode = 1;
+});
+main(...process.argv.slice(2));
diff --git a/samples/generated/v1beta1/recaptcha_enterprise_service_v1_beta1.delete_key.js b/samples/generated/v1beta1/recaptcha_enterprise_service_v1_beta1.delete_key.js
new file mode 100644
index 0000000..d850d9b
--- /dev/null
+++ b/samples/generated/v1beta1/recaptcha_enterprise_service_v1_beta1.delete_key.js
@@ -0,0 +1,55 @@
+// Copyright 2021 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+'use strict';
+
+function main(name) {
+  // [START recaptchaenterprise_v1beta1_generated_RecaptchaEnterpriseServiceV1Beta1_DeleteKey_async]
+  /**
+   * TODO(developer): Uncomment these variables before running the sample.
+   */
+  /**
+   *  Required. The name of the key to be deleted, in the format
+   *  "projects/{project_number}/keys/{key_id}".
+   */
+  // const name = 'abc123'
+
+  // Imports the Recaptchaenterprise library
+  const {RecaptchaEnterpriseServiceV1Beta1Client} =
+    require('@google-cloud/recaptcha-enterprise').v1beta1;
+
+  // Instantiates a client
+  const recaptchaenterpriseClient =
+    new RecaptchaEnterpriseServiceV1Beta1Client();
+
+  async function deleteKey() {
+    // Construct request
+    const request = {
+      name,
+    };
+
+    // Run request
+    const response = await recaptchaenterpriseClient.deleteKey(request);
+    console.log(response);
+  }
+
+  deleteKey();
+  // [END recaptchaenterprise_v1beta1_generated_RecaptchaEnterpriseServiceV1Beta1_DeleteKey_async]
+}
+
+process.on('unhandledRejection', err => {
+  console.error(err.message);
+  process.exitCode = 1;
+});
+main(...process.argv.slice(2));
diff --git a/samples/generated/v1beta1/recaptcha_enterprise_service_v1_beta1.get_key.js b/samples/generated/v1beta1/recaptcha_enterprise_service_v1_beta1.get_key.js
new file mode 100644
index 0000000..d6769ad
--- /dev/null
+++ b/samples/generated/v1beta1/recaptcha_enterprise_service_v1_beta1.get_key.js
@@ -0,0 +1,55 @@
+// Copyright 2021 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+'use strict';
+
+function main(name) {
+  // [START recaptchaenterprise_v1beta1_generated_RecaptchaEnterpriseServiceV1Beta1_GetKey_async]
+  /**
+   * TODO(developer): Uncomment these variables before running the sample.
+   */
+  /**
+   *  Required. The name of the requested key, in the format
+   *  "projects/{project_number}/keys/{key_id}".
+   */
+  // const name = 'abc123'
+
+  // Imports the Recaptchaenterprise library
+  const {RecaptchaEnterpriseServiceV1Beta1Client} =
+    require('@google-cloud/recaptcha-enterprise').v1beta1;
+
+  // Instantiates a client
+  const recaptchaenterpriseClient =
+    new RecaptchaEnterpriseServiceV1Beta1Client();
+
+  async function getKey() {
+    // Construct request
+    const request = {
+      name,
+    };
+
+    // Run request
+    const response = await recaptchaenterpriseClient.getKey(request);
+    console.log(response);
+  }
+
+  getKey();
+  // [END recaptchaenterprise_v1beta1_generated_RecaptchaEnterpriseServiceV1Beta1_GetKey_async]
+}
+
+process.on('unhandledRejection', err => {
+  console.error(err.message);
+  process.exitCode = 1;
+});
+main(...process.argv.slice(2));
diff --git a/samples/generated/v1beta1/recaptcha_enterprise_service_v1_beta1.list_keys.js b/samples/generated/v1beta1/recaptcha_enterprise_service_v1_beta1.list_keys.js
new file mode 100644
index 0000000..4685241
--- /dev/null
+++ b/samples/generated/v1beta1/recaptcha_enterprise_service_v1_beta1.list_keys.js
@@ -0,0 +1,67 @@
+// Copyright 2021 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+'use strict';
+
+function main(parent) {
+  // [START recaptchaenterprise_v1beta1_generated_RecaptchaEnterpriseServiceV1Beta1_ListKeys_async]
+  /**
+   * TODO(developer): Uncomment these variables before running the sample.
+   */
+  /**
+   *  Required. The name of the project that contains the keys that will be
+   *  listed, in the format "projects/{project_number}".
+   */
+  // const parent = 'abc123'
+  /**
+   *  Optional. The maximum number of keys to return. Default is 10. Max limit is
+   *  1000.
+   */
+  // const pageSize = 1234
+  /**
+   *  Optional. The next_page_token value returned from a previous.
+   *  ListKeysRequest, if any.
+   */
+  // const pageToken = 'abc123'
+
+  // Imports the Recaptchaenterprise library
+  const {RecaptchaEnterpriseServiceV1Beta1Client} =
+    require('@google-cloud/recaptcha-enterprise').v1beta1;
+
+  // Instantiates a client
+  const recaptchaenterpriseClient =
+    new RecaptchaEnterpriseServiceV1Beta1Client();
+
+  async function listKeys() {
+    // Construct request
+    const request = {
+      parent,
+    };
+
+    // Run request
+    const iterable = await recaptchaenterpriseClient.listKeysAsync(request);
+    for await (const response of iterable) {
+      console.log(response);
+    }
+  }
+
+  listKeys();
+  // [END recaptchaenterprise_v1beta1_generated_RecaptchaEnterpriseServiceV1Beta1_ListKeys_async]
+}
+
+process.on('unhandledRejection', err => {
+  console.error(err.message);
+  process.exitCode = 1;
+});
+main(...process.argv.slice(2));
diff --git a/samples/generated/v1beta1/recaptcha_enterprise_service_v1_beta1.update_key.js b/samples/generated/v1beta1/recaptcha_enterprise_service_v1_beta1.update_key.js
new file mode 100644
index 0000000..b1188d4
--- /dev/null
+++ b/samples/generated/v1beta1/recaptcha_enterprise_service_v1_beta1.update_key.js
@@ -0,0 +1,59 @@
+// Copyright 2021 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+'use strict';
+
+function main(key) {
+  // [START recaptchaenterprise_v1beta1_generated_RecaptchaEnterpriseServiceV1Beta1_UpdateKey_async]
+  /**
+   * TODO(developer): Uncomment these variables before running the sample.
+   */
+  /**
+   *  Required. The key to update.
+   */
+  // const key = ''
+  /**
+   *  Optional. The mask to control which field of the key get updated. If the mask is not
+   *  present, all fields will be updated.
+   */
+  // const updateMask = ''
+
+  // Imports the Recaptchaenterprise library
+  const {RecaptchaEnterpriseServiceV1Beta1Client} =
+    require('@google-cloud/recaptcha-enterprise').v1beta1;
+
+  // Instantiates a client
+  const recaptchaenterpriseClient =
+    new RecaptchaEnterpriseServiceV1Beta1Client();
+
+  async function updateKey() {
+    // Construct request
+    const request = {
+      key,
+    };
+
+    // Run request
+    const response = await recaptchaenterpriseClient.updateKey(request);
+    console.log(response);
+  }
+
+  updateKey();
+  // [END recaptchaenterprise_v1beta1_generated_RecaptchaEnterpriseServiceV1Beta1_UpdateKey_async]
+}
+
+process.on('unhandledRejection', err => {
+  console.error(err.message);
+  process.exitCode = 1;
+});
+main(...process.argv.slice(2));
diff --git a/samples/package.json b/samples/package.json
index 6da8f22..b83d4d6 100644
--- a/samples/package.json
+++ b/samples/package.json
@@ -4,7 +4,7 @@
   "license": "Apache-2.0",
   "author": "Google LLC",
   "engines": {
-    "node": ">=8"
+    "node": ">=10"
   },
   "files": [
     "*.js"
diff --git a/src/v1/gapic_metadata.json b/src/v1/gapic_metadata.json
index 1663f25..09321f2 100644
--- a/src/v1/gapic_metadata.json
+++ b/src/v1/gapic_metadata.json
@@ -56,6 +56,27 @@
                 "listKeysStream",
                 "listKeysAsync"
               ]
+            },
+            "ListRelatedAccountGroups": {
+              "methods": [
+                "listRelatedAccountGroups",
+                "listRelatedAccountGroupsStream",
+                "listRelatedAccountGroupsAsync"
+              ]
+            },
+            "ListRelatedAccountGroupMemberships": {
+              "methods": [
+                "listRelatedAccountGroupMemberships",
+                "listRelatedAccountGroupMembershipsStream",
+                "listRelatedAccountGroupMembershipsAsync"
+              ]
+            },
+            "SearchRelatedAccountGroupMemberships": {
+              "methods": [
+                "searchRelatedAccountGroupMemberships",
+                "searchRelatedAccountGroupMembershipsStream",
+                "searchRelatedAccountGroupMembershipsAsync"
+              ]
             }
           }
         },
@@ -108,6 +129,27 @@
                 "listKeysStream",
                 "listKeysAsync"
               ]
+            },
+            "ListRelatedAccountGroups": {
+              "methods": [
+                "listRelatedAccountGroups",
+                "listRelatedAccountGroupsStream",
+                "listRelatedAccountGroupsAsync"
+              ]
+            },
+            "ListRelatedAccountGroupMemberships": {
+              "methods": [
+                "listRelatedAccountGroupMemberships",
+                "listRelatedAccountGroupMembershipsStream",
+                "listRelatedAccountGroupMembershipsAsync"
+              ]
+            },
+            "SearchRelatedAccountGroupMemberships": {
+              "methods": [
+                "searchRelatedAccountGroupMemberships",
+                "searchRelatedAccountGroupMembershipsStream",
+                "searchRelatedAccountGroupMembershipsAsync"
+              ]
             }
           }
         }
diff --git a/src/v1/recaptcha_enterprise_service_client.ts b/src/v1/recaptcha_enterprise_service_client.ts
index 92215b8..68d28ae 100644
--- a/src/v1/recaptcha_enterprise_service_client.ts
+++ b/src/v1/recaptcha_enterprise_service_client.ts
@@ -177,6 +177,13 @@ export class RecaptchaEnterpriseServiceClient {
       projectPathTemplate: new this._gaxModule.PathTemplate(
         'projects/{project}'
       ),
+      relatedAccountGroupPathTemplate: new this._gaxModule.PathTemplate(
+        'projects/{project}/relatedaccountgroups/{relatedaccountgroup}'
+      ),
+      relatedAccountGroupMembershipPathTemplate:
+        new this._gaxModule.PathTemplate(
+          'projects/{project}/relatedaccountgroups/{relatedaccountgroup}/memberships/{membership}'
+        ),
     };
 
     // Some of the methods on this service return "paged" results,
@@ -188,6 +195,21 @@ export class RecaptchaEnterpriseServiceClient {
         'nextPageToken',
         'keys'
       ),
+      listRelatedAccountGroups: new this._gaxModule.PageDescriptor(
+        'pageToken',
+        'nextPageToken',
+        'relatedAccountGroups'
+      ),
+      listRelatedAccountGroupMemberships: new this._gaxModule.PageDescriptor(
+        'pageToken',
+        'nextPageToken',
+        'relatedAccountGroupMemberships'
+      ),
+      searchRelatedAccountGroupMemberships: new this._gaxModule.PageDescriptor(
+        'pageToken',
+        'nextPageToken',
+        'relatedAccountGroupMemberships'
+      ),
     };
 
     // Put together the default options sent with requests.
@@ -250,6 +272,9 @@ export class RecaptchaEnterpriseServiceClient {
       'deleteKey',
       'migrateKey',
       'getMetrics',
+      'listRelatedAccountGroups',
+      'listRelatedAccountGroupMemberships',
+      'searchRelatedAccountGroupMemberships',
     ];
     for (const methodName of recaptchaEnterpriseServiceStubMethods) {
       const callPromise = this.recaptchaEnterpriseServiceStub.then(
@@ -481,6 +506,12 @@ export class RecaptchaEnterpriseServiceClient {
    *   the event is legitimate or fraudulent.
    * @param {number[]} [request.reasons]
    *   Optional. Optional reasons for the annotation that will be assigned to the Event.
+   * @param {Buffer} [request.hashedAccountId]
+   *   Optional. Optional unique stable hashed user identifier to apply to the assessment.
+   *   This is an alternative to setting the hashed_account_id in
+   *   CreateAssessment, for example when the account identifier is not yet known
+   *   in the initial request. It is recommended that the identifier is hashed
+   *   using hmac-sha256 with stable secret.
    * @param {object} [options]
    *   Call options. See {@link https://googleapis.dev/nodejs/google-gax/latest/interfaces/CallOptions.html|CallOptions} for more details.
    * @returns {Promise} - The promise which resolves to an array.
@@ -1239,7 +1270,8 @@ export class RecaptchaEnterpriseServiceClient {
       gax.routingHeader.fromParams({
         parent: request.parent || '',
       });
-    const callSettings = new gax.CallSettings(options);
+    const defaultCallSettings = this._defaults['listKeys'];
+    const callSettings = defaultCallSettings.merge(options);
     this.initialize();
     return this.descriptors.page.listKeys.createStream(
       this.innerApiCalls.listKeys as gax.GaxCall,
@@ -1292,7 +1324,8 @@ export class RecaptchaEnterpriseServiceClient {
         parent: request.parent || '',
       });
     options = options || {};
-    const callSettings = new gax.CallSettings(options);
+    const defaultCallSettings = this._defaults['listKeys'];
+    const callSettings = defaultCallSettings.merge(options);
     this.initialize();
     return this.descriptors.page.listKeys.asyncIterate(
       this.innerApiCalls['listKeys'] as GaxCall,
@@ -1300,6 +1333,697 @@ export class RecaptchaEnterpriseServiceClient {
       callSettings
     ) as AsyncIterable<protos.google.cloud.recaptchaenterprise.v1.IKey>;
   }
+  listRelatedAccountGroups(
+    request?: protos.google.cloud.recaptchaenterprise.v1.IListRelatedAccountGroupsRequest,
+    options?: CallOptions
+  ): Promise<
+    [
+      protos.google.cloud.recaptchaenterprise.v1.IRelatedAccountGroup[],
+      protos.google.cloud.recaptchaenterprise.v1.IListRelatedAccountGroupsRequest | null,
+      protos.google.cloud.recaptchaenterprise.v1.IListRelatedAccountGroupsResponse
+    ]
+  >;
+  listRelatedAccountGroups(
+    request: protos.google.cloud.recaptchaenterprise.v1.IListRelatedAccountGroupsRequest,
+    options: CallOptions,
+    callback: PaginationCallback<
+      protos.google.cloud.recaptchaenterprise.v1.IListRelatedAccountGroupsRequest,
+      | protos.google.cloud.recaptchaenterprise.v1.IListRelatedAccountGroupsResponse
+      | null
+      | undefined,
+      protos.google.cloud.recaptchaenterprise.v1.IRelatedAccountGroup
+    >
+  ): void;
+  listRelatedAccountGroups(
+    request: protos.google.cloud.recaptchaenterprise.v1.IListRelatedAccountGroupsRequest,
+    callback: PaginationCallback<
+      protos.google.cloud.recaptchaenterprise.v1.IListRelatedAccountGroupsRequest,
+      | protos.google.cloud.recaptchaenterprise.v1.IListRelatedAccountGroupsResponse
+      | null
+      | undefined,
+      protos.google.cloud.recaptchaenterprise.v1.IRelatedAccountGroup
+    >
+  ): void;
+  /**
+   * List groups of related accounts.
+   *
+   * @param {Object} request
+   *   The request object that will be sent.
+   * @param {string} request.parent
+   *   Required. The name of the project to list related account groups from, in the format
+   *   "projects/{project}".
+   * @param {number} [request.pageSize]
+   *   Optional. The maximum number of groups to return. The service may return fewer than
+   *   this value.
+   *   If unspecified, at most 50 groups will be returned.
+   *   The maximum value is 1000; values above 1000 will be coerced to 1000.
+   * @param {string} [request.pageToken]
+   *   Optional. A page token, received from a previous `ListRelatedAccountGroups` call.
+   *   Provide this to retrieve the subsequent page.
+   *
+   *   When paginating, all other parameters provided to
+   *   `ListRelatedAccountGroups` must match the call that provided the page
+   *   token.
+   * @param {object} [options]
+   *   Call options. See {@link https://googleapis.dev/nodejs/google-gax/latest/interfaces/CallOptions.html|CallOptions} for more details.
+   * @returns {Promise} - The promise which resolves to an array.
+   *   The first element of the array is Array of [RelatedAccountGroup]{@link google.cloud.recaptchaenterprise.v1.RelatedAccountGroup}.
+   *   The client library will perform auto-pagination by default: it will call the API as many
+   *   times as needed and will merge results from all the pages into this array.
+   *   Note that it can affect your quota.
+   *   We recommend using `listRelatedAccountGroupsAsync()`
+   *   method described below for async iteration which you can stop as needed.
+   *   Please see the
+   *   [documentation](https://github.com/googleapis/gax-nodejs/blob/master/client-libraries.md#auto-pagination)
+   *   for more details and examples.
+   */
+  listRelatedAccountGroups(
+    request?: protos.google.cloud.recaptchaenterprise.v1.IListRelatedAccountGroupsRequest,
+    optionsOrCallback?:
+      | CallOptions
+      | PaginationCallback<
+          protos.google.cloud.recaptchaenterprise.v1.IListRelatedAccountGroupsRequest,
+          | protos.google.cloud.recaptchaenterprise.v1.IListRelatedAccountGroupsResponse
+          | null
+          | undefined,
+          protos.google.cloud.recaptchaenterprise.v1.IRelatedAccountGroup
+        >,
+    callback?: PaginationCallback<
+      protos.google.cloud.recaptchaenterprise.v1.IListRelatedAccountGroupsRequest,
+      | protos.google.cloud.recaptchaenterprise.v1.IListRelatedAccountGroupsResponse
+      | null
+      | undefined,
+      protos.google.cloud.recaptchaenterprise.v1.IRelatedAccountGroup
+    >
+  ): Promise<
+    [
+      protos.google.cloud.recaptchaenterprise.v1.IRelatedAccountGroup[],
+      protos.google.cloud.recaptchaenterprise.v1.IListRelatedAccountGroupsRequest | null,
+      protos.google.cloud.recaptchaenterprise.v1.IListRelatedAccountGroupsResponse
+    ]
+  > | void {
+    request = request || {};
+    let options: CallOptions;
+    if (typeof optionsOrCallback === 'function' && callback === undefined) {
+      callback = optionsOrCallback;
+      options = {};
+    } else {
+      options = optionsOrCallback as CallOptions;
+    }
+    options = options || {};
+    options.otherArgs = options.otherArgs || {};
+    options.otherArgs.headers = options.otherArgs.headers || {};
+    options.otherArgs.headers['x-goog-request-params'] =
+      gax.routingHeader.fromParams({
+        parent: request.parent || '',
+      });
+    this.initialize();
+    return this.innerApiCalls.listRelatedAccountGroups(
+      request,
+      options,
+      callback
+    );
+  }
+
+  /**
+   * Equivalent to `method.name.toCamelCase()`, but returns a NodeJS Stream object.
+   * @param {Object} request
+   *   The request object that will be sent.
+   * @param {string} request.parent
+   *   Required. The name of the project to list related account groups from, in the format
+   *   "projects/{project}".
+   * @param {number} [request.pageSize]
+   *   Optional. The maximum number of groups to return. The service may return fewer than
+   *   this value.
+   *   If unspecified, at most 50 groups will be returned.
+   *   The maximum value is 1000; values above 1000 will be coerced to 1000.
+   * @param {string} [request.pageToken]
+   *   Optional. A page token, received from a previous `ListRelatedAccountGroups` call.
+   *   Provide this to retrieve the subsequent page.
+   *
+   *   When paginating, all other parameters provided to
+   *   `ListRelatedAccountGroups` must match the call that provided the page
+   *   token.
+   * @param {object} [options]
+   *   Call options. See {@link https://googleapis.dev/nodejs/google-gax/latest/interfaces/CallOptions.html|CallOptions} for more details.
+   * @returns {Stream}
+   *   An object stream which emits an object representing [RelatedAccountGroup]{@link google.cloud.recaptchaenterprise.v1.RelatedAccountGroup} on 'data' event.
+   *   The client library will perform auto-pagination by default: it will call the API as many
+   *   times as needed. Note that it can affect your quota.
+   *   We recommend using `listRelatedAccountGroupsAsync()`
+   *   method described below for async iteration which you can stop as needed.
+   *   Please see the
+   *   [documentation](https://github.com/googleapis/gax-nodejs/blob/master/client-libraries.md#auto-pagination)
+   *   for more details and examples.
+   */
+  listRelatedAccountGroupsStream(
+    request?: protos.google.cloud.recaptchaenterprise.v1.IListRelatedAccountGroupsRequest,
+    options?: CallOptions
+  ): Transform {
+    request = request || {};
+    options = options || {};
+    options.otherArgs = options.otherArgs || {};
+    options.otherArgs.headers = options.otherArgs.headers || {};
+    options.otherArgs.headers['x-goog-request-params'] =
+      gax.routingHeader.fromParams({
+        parent: request.parent || '',
+      });
+    const defaultCallSettings = this._defaults['listRelatedAccountGroups'];
+    const callSettings = defaultCallSettings.merge(options);
+    this.initialize();
+    return this.descriptors.page.listRelatedAccountGroups.createStream(
+      this.innerApiCalls.listRelatedAccountGroups as gax.GaxCall,
+      request,
+      callSettings
+    );
+  }
+
+  /**
+   * Equivalent to `listRelatedAccountGroups`, but returns an iterable object.
+   *
+   * `for`-`await`-`of` syntax is used with the iterable to get response elements on-demand.
+   * @param {Object} request
+   *   The request object that will be sent.
+   * @param {string} request.parent
+   *   Required. The name of the project to list related account groups from, in the format
+   *   "projects/{project}".
+   * @param {number} [request.pageSize]
+   *   Optional. The maximum number of groups to return. The service may return fewer than
+   *   this value.
+   *   If unspecified, at most 50 groups will be returned.
+   *   The maximum value is 1000; values above 1000 will be coerced to 1000.
+   * @param {string} [request.pageToken]
+   *   Optional. A page token, received from a previous `ListRelatedAccountGroups` call.
+   *   Provide this to retrieve the subsequent page.
+   *
+   *   When paginating, all other parameters provided to
+   *   `ListRelatedAccountGroups` must match the call that provided the page
+   *   token.
+   * @param {object} [options]
+   *   Call options. See {@link https://googleapis.dev/nodejs/google-gax/latest/interfaces/CallOptions.html|CallOptions} for more details.
+   * @returns {Object}
+   *   An iterable Object that allows [async iteration](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols).
+   *   When you iterate the returned iterable, each element will be an object representing
+   *   [RelatedAccountGroup]{@link google.cloud.recaptchaenterprise.v1.RelatedAccountGroup}. The API will be called under the hood as needed, once per the page,
+   *   so you can stop the iteration when you don't need more results.
+   *   Please see the
+   *   [documentation](https://github.com/googleapis/gax-nodejs/blob/master/client-libraries.md#auto-pagination)
+   *   for more details and examples.
+   * @example
+   * const iterable = client.listRelatedAccountGroupsAsync(request);
+   * for await (const response of iterable) {
+   *   // process response
+   * }
+   */
+  listRelatedAccountGroupsAsync(
+    request?: protos.google.cloud.recaptchaenterprise.v1.IListRelatedAccountGroupsRequest,
+    options?: CallOptions
+  ): AsyncIterable<protos.google.cloud.recaptchaenterprise.v1.IRelatedAccountGroup> {
+    request = request || {};
+    options = options || {};
+    options.otherArgs = options.otherArgs || {};
+    options.otherArgs.headers = options.otherArgs.headers || {};
+    options.otherArgs.headers['x-goog-request-params'] =
+      gax.routingHeader.fromParams({
+        parent: request.parent || '',
+      });
+    options = options || {};
+    const defaultCallSettings = this._defaults['listRelatedAccountGroups'];
+    const callSettings = defaultCallSettings.merge(options);
+    this.initialize();
+    return this.descriptors.page.listRelatedAccountGroups.asyncIterate(
+      this.innerApiCalls['listRelatedAccountGroups'] as GaxCall,
+      request as unknown as RequestType,
+      callSettings
+    ) as AsyncIterable<protos.google.cloud.recaptchaenterprise.v1.IRelatedAccountGroup>;
+  }
+  listRelatedAccountGroupMemberships(
+    request?: protos.google.cloud.recaptchaenterprise.v1.IListRelatedAccountGroupMembershipsRequest,
+    options?: CallOptions
+  ): Promise<
+    [
+      protos.google.cloud.recaptchaenterprise.v1.IRelatedAccountGroupMembership[],
+      protos.google.cloud.recaptchaenterprise.v1.IListRelatedAccountGroupMembershipsRequest | null,
+      protos.google.cloud.recaptchaenterprise.v1.IListRelatedAccountGroupMembershipsResponse
+    ]
+  >;
+  listRelatedAccountGroupMemberships(
+    request: protos.google.cloud.recaptchaenterprise.v1.IListRelatedAccountGroupMembershipsRequest,
+    options: CallOptions,
+    callback: PaginationCallback<
+      protos.google.cloud.recaptchaenterprise.v1.IListRelatedAccountGroupMembershipsRequest,
+      | protos.google.cloud.recaptchaenterprise.v1.IListRelatedAccountGroupMembershipsResponse
+      | null
+      | undefined,
+      protos.google.cloud.recaptchaenterprise.v1.IRelatedAccountGroupMembership
+    >
+  ): void;
+  listRelatedAccountGroupMemberships(
+    request: protos.google.cloud.recaptchaenterprise.v1.IListRelatedAccountGroupMembershipsRequest,
+    callback: PaginationCallback<
+      protos.google.cloud.recaptchaenterprise.v1.IListRelatedAccountGroupMembershipsRequest,
+      | protos.google.cloud.recaptchaenterprise.v1.IListRelatedAccountGroupMembershipsResponse
+      | null
+      | undefined,
+      protos.google.cloud.recaptchaenterprise.v1.IRelatedAccountGroupMembership
+    >
+  ): void;
+  /**
+   * Get the memberships in a group of related accounts.
+   *
+   * @param {Object} request
+   *   The request object that will be sent.
+   * @param {string} request.parent
+   *   Required. The resource name for the related account group in the format
+   *   `projects/{project}/relatedaccountgroups/{relatedaccountgroup}`.
+   * @param {number} [request.pageSize]
+   *   Optional. The maximum number of accounts to return. The service may return fewer than
+   *   this value.
+   *   If unspecified, at most 50 accounts will be returned.
+   *   The maximum value is 1000; values above 1000 will be coerced to 1000.
+   * @param {string} [request.pageToken]
+   *   Optional. A page token, received from a previous `ListRelatedAccountGroupMemberships`
+   *   call.
+   *
+   *   When paginating, all other parameters provided to
+   *   `ListRelatedAccountGroupMemberships` must match the call that provided the
+   *   page token.
+   * @param {object} [options]
+   *   Call options. See {@link https://googleapis.dev/nodejs/google-gax/latest/interfaces/CallOptions.html|CallOptions} for more details.
+   * @returns {Promise} - The promise which resolves to an array.
+   *   The first element of the array is Array of [RelatedAccountGroupMembership]{@link google.cloud.recaptchaenterprise.v1.RelatedAccountGroupMembership}.
+   *   The client library will perform auto-pagination by default: it will call the API as many
+   *   times as needed and will merge results from all the pages into this array.
+   *   Note that it can affect your quota.
+   *   We recommend using `listRelatedAccountGroupMembershipsAsync()`
+   *   method described below for async iteration which you can stop as needed.
+   *   Please see the
+   *   [documentation](https://github.com/googleapis/gax-nodejs/blob/master/client-libraries.md#auto-pagination)
+   *   for more details and examples.
+   */
+  listRelatedAccountGroupMemberships(
+    request?: protos.google.cloud.recaptchaenterprise.v1.IListRelatedAccountGroupMembershipsRequest,
+    optionsOrCallback?:
+      | CallOptions
+      | PaginationCallback<
+          protos.google.cloud.recaptchaenterprise.v1.IListRelatedAccountGroupMembershipsRequest,
+          | protos.google.cloud.recaptchaenterprise.v1.IListRelatedAccountGroupMembershipsResponse
+          | null
+          | undefined,
+          protos.google.cloud.recaptchaenterprise.v1.IRelatedAccountGroupMembership
+        >,
+    callback?: PaginationCallback<
+      protos.google.cloud.recaptchaenterprise.v1.IListRelatedAccountGroupMembershipsRequest,
+      | protos.google.cloud.recaptchaenterprise.v1.IListRelatedAccountGroupMembershipsResponse
+      | null
+      | undefined,
+      protos.google.cloud.recaptchaenterprise.v1.IRelatedAccountGroupMembership
+    >
+  ): Promise<
+    [
+      protos.google.cloud.recaptchaenterprise.v1.IRelatedAccountGroupMembership[],
+      protos.google.cloud.recaptchaenterprise.v1.IListRelatedAccountGroupMembershipsRequest | null,
+      protos.google.cloud.recaptchaenterprise.v1.IListRelatedAccountGroupMembershipsResponse
+    ]
+  > | void {
+    request = request || {};
+    let options: CallOptions;
+    if (typeof optionsOrCallback === 'function' && callback === undefined) {
+      callback = optionsOrCallback;
+      options = {};
+    } else {
+      options = optionsOrCallback as CallOptions;
+    }
+    options = options || {};
+    options.otherArgs = options.otherArgs || {};
+    options.otherArgs.headers = options.otherArgs.headers || {};
+    options.otherArgs.headers['x-goog-request-params'] =
+      gax.routingHeader.fromParams({
+        parent: request.parent || '',
+      });
+    this.initialize();
+    return this.innerApiCalls.listRelatedAccountGroupMemberships(
+      request,
+      options,
+      callback
+    );
+  }
+
+  /**
+   * Equivalent to `method.name.toCamelCase()`, but returns a NodeJS Stream object.
+   * @param {Object} request
+   *   The request object that will be sent.
+   * @param {string} request.parent
+   *   Required. The resource name for the related account group in the format
+   *   `projects/{project}/relatedaccountgroups/{relatedaccountgroup}`.
+   * @param {number} [request.pageSize]
+   *   Optional. The maximum number of accounts to return. The service may return fewer than
+   *   this value.
+   *   If unspecified, at most 50 accounts will be returned.
+   *   The maximum value is 1000; values above 1000 will be coerced to 1000.
+   * @param {string} [request.pageToken]
+   *   Optional. A page token, received from a previous `ListRelatedAccountGroupMemberships`
+   *   call.
+   *
+   *   When paginating, all other parameters provided to
+   *   `ListRelatedAccountGroupMemberships` must match the call that provided the
+   *   page token.
+   * @param {object} [options]
+   *   Call options. See {@link https://googleapis.dev/nodejs/google-gax/latest/interfaces/CallOptions.html|CallOptions} for more details.
+   * @returns {Stream}
+   *   An object stream which emits an object representing [RelatedAccountGroupMembership]{@link google.cloud.recaptchaenterprise.v1.RelatedAccountGroupMembership} on 'data' event.
+   *   The client library will perform auto-pagination by default: it will call the API as many
+   *   times as needed. Note that it can affect your quota.
+   *   We recommend using `listRelatedAccountGroupMembershipsAsync()`
+   *   method described below for async iteration which you can stop as needed.
+   *   Please see the
+   *   [documentation](https://github.com/googleapis/gax-nodejs/blob/master/client-libraries.md#auto-pagination)
+   *   for more details and examples.
+   */
+  listRelatedAccountGroupMembershipsStream(
+    request?: protos.google.cloud.recaptchaenterprise.v1.IListRelatedAccountGroupMembershipsRequest,
+    options?: CallOptions
+  ): Transform {
+    request = request || {};
+    options = options || {};
+    options.otherArgs = options.otherArgs || {};
+    options.otherArgs.headers = options.otherArgs.headers || {};
+    options.otherArgs.headers['x-goog-request-params'] =
+      gax.routingHeader.fromParams({
+        parent: request.parent || '',
+      });
+    const defaultCallSettings =
+      this._defaults['listRelatedAccountGroupMemberships'];
+    const callSettings = defaultCallSettings.merge(options);
+    this.initialize();
+    return this.descriptors.page.listRelatedAccountGroupMemberships.createStream(
+      this.innerApiCalls.listRelatedAccountGroupMemberships as gax.GaxCall,
+      request,
+      callSettings
+    );
+  }
+
+  /**
+   * Equivalent to `listRelatedAccountGroupMemberships`, but returns an iterable object.
+   *
+   * `for`-`await`-`of` syntax is used with the iterable to get response elements on-demand.
+   * @param {Object} request
+   *   The request object that will be sent.
+   * @param {string} request.parent
+   *   Required. The resource name for the related account group in the format
+   *   `projects/{project}/relatedaccountgroups/{relatedaccountgroup}`.
+   * @param {number} [request.pageSize]
+   *   Optional. The maximum number of accounts to return. The service may return fewer than
+   *   this value.
+   *   If unspecified, at most 50 accounts will be returned.
+   *   The maximum value is 1000; values above 1000 will be coerced to 1000.
+   * @param {string} [request.pageToken]
+   *   Optional. A page token, received from a previous `ListRelatedAccountGroupMemberships`
+   *   call.
+   *
+   *   When paginating, all other parameters provided to
+   *   `ListRelatedAccountGroupMemberships` must match the call that provided the
+   *   page token.
+   * @param {object} [options]
+   *   Call options. See {@link https://googleapis.dev/nodejs/google-gax/latest/interfaces/CallOptions.html|CallOptions} for more details.
+   * @returns {Object}
+   *   An iterable Object that allows [async iteration](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols).
+   *   When you iterate the returned iterable, each element will be an object representing
+   *   [RelatedAccountGroupMembership]{@link google.cloud.recaptchaenterprise.v1.RelatedAccountGroupMembership}. The API will be called under the hood as needed, once per the page,
+   *   so you can stop the iteration when you don't need more results.
+   *   Please see the
+   *   [documentation](https://github.com/googleapis/gax-nodejs/blob/master/client-libraries.md#auto-pagination)
+   *   for more details and examples.
+   * @example
+   * const iterable = client.listRelatedAccountGroupMembershipsAsync(request);
+   * for await (const response of iterable) {
+   *   // process response
+   * }
+   */
+  listRelatedAccountGroupMembershipsAsync(
+    request?: protos.google.cloud.recaptchaenterprise.v1.IListRelatedAccountGroupMembershipsRequest,
+    options?: CallOptions
+  ): AsyncIterable<protos.google.cloud.recaptchaenterprise.v1.IRelatedAccountGroupMembership> {
+    request = request || {};
+    options = options || {};
+    options.otherArgs = options.otherArgs || {};
+    options.otherArgs.headers = options.otherArgs.headers || {};
+    options.otherArgs.headers['x-goog-request-params'] =
+      gax.routingHeader.fromParams({
+        parent: request.parent || '',
+      });
+    options = options || {};
+    const defaultCallSettings =
+      this._defaults['listRelatedAccountGroupMemberships'];
+    const callSettings = defaultCallSettings.merge(options);
+    this.initialize();
+    return this.descriptors.page.listRelatedAccountGroupMemberships.asyncIterate(
+      this.innerApiCalls['listRelatedAccountGroupMemberships'] as GaxCall,
+      request as unknown as RequestType,
+      callSettings
+    ) as AsyncIterable<protos.google.cloud.recaptchaenterprise.v1.IRelatedAccountGroupMembership>;
+  }
+  searchRelatedAccountGroupMemberships(
+    request?: protos.google.cloud.recaptchaenterprise.v1.ISearchRelatedAccountGroupMembershipsRequest,
+    options?: CallOptions
+  ): Promise<
+    [
+      protos.google.cloud.recaptchaenterprise.v1.IRelatedAccountGroupMembership[],
+      protos.google.cloud.recaptchaenterprise.v1.ISearchRelatedAccountGroupMembershipsRequest | null,
+      protos.google.cloud.recaptchaenterprise.v1.ISearchRelatedAccountGroupMembershipsResponse
+    ]
+  >;
+  searchRelatedAccountGroupMemberships(
+    request: protos.google.cloud.recaptchaenterprise.v1.ISearchRelatedAccountGroupMembershipsRequest,
+    options: CallOptions,
+    callback: PaginationCallback<
+      protos.google.cloud.recaptchaenterprise.v1.ISearchRelatedAccountGroupMembershipsRequest,
+      | protos.google.cloud.recaptchaenterprise.v1.ISearchRelatedAccountGroupMembershipsResponse
+      | null
+      | undefined,
+      protos.google.cloud.recaptchaenterprise.v1.IRelatedAccountGroupMembership
+    >
+  ): void;
+  searchRelatedAccountGroupMemberships(
+    request: protos.google.cloud.recaptchaenterprise.v1.ISearchRelatedAccountGroupMembershipsRequest,
+    callback: PaginationCallback<
+      protos.google.cloud.recaptchaenterprise.v1.ISearchRelatedAccountGroupMembershipsRequest,
+      | protos.google.cloud.recaptchaenterprise.v1.ISearchRelatedAccountGroupMembershipsResponse
+      | null
+      | undefined,
+      protos.google.cloud.recaptchaenterprise.v1.IRelatedAccountGroupMembership
+    >
+  ): void;
+  /**
+   * Search group memberships related to a given account.
+   *
+   * @param {Object} request
+   *   The request object that will be sent.
+   * @param {string} request.parent
+   *   Required. The name of the project to search related account group memberships from,
+   *   in the format "projects/{project}".
+   * @param {Buffer} [request.hashedAccountId]
+   *   Optional. The unique stable hashed user identifier we should search connections to.
+   *   The identifier should correspond to a `hashed_account_id` provided in a
+   *   previous CreateAssessment or AnnotateAssessment call.
+   * @param {number} [request.pageSize]
+   *   Optional. The maximum number of groups to return. The service may return fewer than
+   *   this value.
+   *   If unspecified, at most 50 groups will be returned.
+   *   The maximum value is 1000; values above 1000 will be coerced to 1000.
+   * @param {string} [request.pageToken]
+   *   Optional. A page token, received from a previous
+   *   `SearchRelatedAccountGroupMemberships` call. Provide this to retrieve the
+   *   subsequent page.
+   *
+   *   When paginating, all other parameters provided to
+   *   `SearchRelatedAccountGroupMemberships` must match the call that provided
+   *   the page token.
+   * @param {object} [options]
+   *   Call options. See {@link https://googleapis.dev/nodejs/google-gax/latest/interfaces/CallOptions.html|CallOptions} for more details.
+   * @returns {Promise} - The promise which resolves to an array.
+   *   The first element of the array is Array of [RelatedAccountGroupMembership]{@link google.cloud.recaptchaenterprise.v1.RelatedAccountGroupMembership}.
+   *   The client library will perform auto-pagination by default: it will call the API as many
+   *   times as needed and will merge results from all the pages into this array.
+   *   Note that it can affect your quota.
+   *   We recommend using `searchRelatedAccountGroupMembershipsAsync()`
+   *   method described below for async iteration which you can stop as needed.
+   *   Please see the
+   *   [documentation](https://github.com/googleapis/gax-nodejs/blob/master/client-libraries.md#auto-pagination)
+   *   for more details and examples.
+   */
+  searchRelatedAccountGroupMemberships(
+    request?: protos.google.cloud.recaptchaenterprise.v1.ISearchRelatedAccountGroupMembershipsRequest,
+    optionsOrCallback?:
+      | CallOptions
+      | PaginationCallback<
+          protos.google.cloud.recaptchaenterprise.v1.ISearchRelatedAccountGroupMembershipsRequest,
+          | protos.google.cloud.recaptchaenterprise.v1.ISearchRelatedAccountGroupMembershipsResponse
+          | null
+          | undefined,
+          protos.google.cloud.recaptchaenterprise.v1.IRelatedAccountGroupMembership
+        >,
+    callback?: PaginationCallback<
+      protos.google.cloud.recaptchaenterprise.v1.ISearchRelatedAccountGroupMembershipsRequest,
+      | protos.google.cloud.recaptchaenterprise.v1.ISearchRelatedAccountGroupMembershipsResponse
+      | null
+      | undefined,
+      protos.google.cloud.recaptchaenterprise.v1.IRelatedAccountGroupMembership
+    >
+  ): Promise<
+    [
+      protos.google.cloud.recaptchaenterprise.v1.IRelatedAccountGroupMembership[],
+      protos.google.cloud.recaptchaenterprise.v1.ISearchRelatedAccountGroupMembershipsRequest | null,
+      protos.google.cloud.recaptchaenterprise.v1.ISearchRelatedAccountGroupMembershipsResponse
+    ]
+  > | void {
+    request = request || {};
+    let options: CallOptions;
+    if (typeof optionsOrCallback === 'function' && callback === undefined) {
+      callback = optionsOrCallback;
+      options = {};
+    } else {
+      options = optionsOrCallback as CallOptions;
+    }
+    options = options || {};
+    options.otherArgs = options.otherArgs || {};
+    options.otherArgs.headers = options.otherArgs.headers || {};
+    options.otherArgs.headers['x-goog-request-params'] =
+      gax.routingHeader.fromParams({
+        parent: request.parent || '',
+      });
+    this.initialize();
+    return this.innerApiCalls.searchRelatedAccountGroupMemberships(
+      request,
+      options,
+      callback
+    );
+  }
+
+  /**
+   * Equivalent to `method.name.toCamelCase()`, but returns a NodeJS Stream object.
+   * @param {Object} request
+   *   The request object that will be sent.
+   * @param {string} request.parent
+   *   Required. The name of the project to search related account group memberships from,
+   *   in the format "projects/{project}".
+   * @param {Buffer} [request.hashedAccountId]
+   *   Optional. The unique stable hashed user identifier we should search connections to.
+   *   The identifier should correspond to a `hashed_account_id` provided in a
+   *   previous CreateAssessment or AnnotateAssessment call.
+   * @param {number} [request.pageSize]
+   *   Optional. The maximum number of groups to return. The service may return fewer than
+   *   this value.
+   *   If unspecified, at most 50 groups will be returned.
+   *   The maximum value is 1000; values above 1000 will be coerced to 1000.
+   * @param {string} [request.pageToken]
+   *   Optional. A page token, received from a previous
+   *   `SearchRelatedAccountGroupMemberships` call. Provide this to retrieve the
+   *   subsequent page.
+   *
+   *   When paginating, all other parameters provided to
+   *   `SearchRelatedAccountGroupMemberships` must match the call that provided
+   *   the page token.
+   * @param {object} [options]
+   *   Call options. See {@link https://googleapis.dev/nodejs/google-gax/latest/interfaces/CallOptions.html|CallOptions} for more details.
+   * @returns {Stream}
+   *   An object stream which emits an object representing [RelatedAccountGroupMembership]{@link google.cloud.recaptchaenterprise.v1.RelatedAccountGroupMembership} on 'data' event.
+   *   The client library will perform auto-pagination by default: it will call the API as many
+   *   times as needed. Note that it can affect your quota.
+   *   We recommend using `searchRelatedAccountGroupMembershipsAsync()`
+   *   method described below for async iteration which you can stop as needed.
+   *   Please see the
+   *   [documentation](https://github.com/googleapis/gax-nodejs/blob/master/client-libraries.md#auto-pagination)
+   *   for more details and examples.
+   */
+  searchRelatedAccountGroupMembershipsStream(
+    request?: protos.google.cloud.recaptchaenterprise.v1.ISearchRelatedAccountGroupMembershipsRequest,
+    options?: CallOptions
+  ): Transform {
+    request = request || {};
+    options = options || {};
+    options.otherArgs = options.otherArgs || {};
+    options.otherArgs.headers = options.otherArgs.headers || {};
+    options.otherArgs.headers['x-goog-request-params'] =
+      gax.routingHeader.fromParams({
+        parent: request.parent || '',
+      });
+    const defaultCallSettings =
+      this._defaults['searchRelatedAccountGroupMemberships'];
+    const callSettings = defaultCallSettings.merge(options);
+    this.initialize();
+    return this.descriptors.page.searchRelatedAccountGroupMemberships.createStream(
+      this.innerApiCalls.searchRelatedAccountGroupMemberships as gax.GaxCall,
+      request,
+      callSettings
+    );
+  }
+
+  /**
+   * Equivalent to `searchRelatedAccountGroupMemberships`, but returns an iterable object.
+   *
+   * `for`-`await`-`of` syntax is used with the iterable to get response elements on-demand.
+   * @param {Object} request
+   *   The request object that will be sent.
+   * @param {string} request.parent
+   *   Required. The name of the project to search related account group memberships from,
+   *   in the format "projects/{project}".
+   * @param {Buffer} [request.hashedAccountId]
+   *   Optional. The unique stable hashed user identifier we should search connections to.
+   *   The identifier should correspond to a `hashed_account_id` provided in a
+   *   previous CreateAssessment or AnnotateAssessment call.
+   * @param {number} [request.pageSize]
+   *   Optional. The maximum number of groups to return. The service may return fewer than
+   *   this value.
+   *   If unspecified, at most 50 groups will be returned.
+   *   The maximum value is 1000; values above 1000 will be coerced to 1000.
+   * @param {string} [request.pageToken]
+   *   Optional. A page token, received from a previous
+   *   `SearchRelatedAccountGroupMemberships` call. Provide this to retrieve the
+   *   subsequent page.
+   *
+   *   When paginating, all other parameters provided to
+   *   `SearchRelatedAccountGroupMemberships` must match the call that provided
+   *   the page token.
+   * @param {object} [options]
+   *   Call options. See {@link https://googleapis.dev/nodejs/google-gax/latest/interfaces/CallOptions.html|CallOptions} for more details.
+   * @returns {Object}
+   *   An iterable Object that allows [async iteration](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols).
+   *   When you iterate the returned iterable, each element will be an object representing
+   *   [RelatedAccountGroupMembership]{@link google.cloud.recaptchaenterprise.v1.RelatedAccountGroupMembership}. The API will be called under the hood as needed, once per the page,
+   *   so you can stop the iteration when you don't need more results.
+   *   Please see the
+   *   [documentation](https://github.com/googleapis/gax-nodejs/blob/master/client-libraries.md#auto-pagination)
+   *   for more details and examples.
+   * @example
+   * const iterable = client.searchRelatedAccountGroupMembershipsAsync(request);
+   * for await (const response of iterable) {
+   *   // process response
+   * }
+   */
+  searchRelatedAccountGroupMembershipsAsync(
+    request?: protos.google.cloud.recaptchaenterprise.v1.ISearchRelatedAccountGroupMembershipsRequest,
+    options?: CallOptions
+  ): AsyncIterable<protos.google.cloud.recaptchaenterprise.v1.IRelatedAccountGroupMembership> {
+    request = request || {};
+    options = options || {};
+    options.otherArgs = options.otherArgs || {};
+    options.otherArgs.headers = options.otherArgs.headers || {};
+    options.otherArgs.headers['x-goog-request-params'] =
+      gax.routingHeader.fromParams({
+        parent: request.parent || '',
+      });
+    options = options || {};
+    const defaultCallSettings =
+      this._defaults['searchRelatedAccountGroupMemberships'];
+    const callSettings = defaultCallSettings.merge(options);
+    this.initialize();
+    return this.descriptors.page.searchRelatedAccountGroupMemberships.asyncIterate(
+      this.innerApiCalls['searchRelatedAccountGroupMemberships'] as GaxCall,
+      request as unknown as RequestType,
+      callSettings
+    ) as AsyncIterable<protos.google.cloud.recaptchaenterprise.v1.IRelatedAccountGroupMembership>;
+  }
   // --------------------
   // -- Path templates --
   // --------------------
@@ -1437,6 +2161,113 @@ export class RecaptchaEnterpriseServiceClient {
     return this.pathTemplates.projectPathTemplate.match(projectName).project;
   }
 
+  /**
+   * Return a fully-qualified relatedAccountGroup resource name string.
+   *
+   * @param {string} project
+   * @param {string} relatedaccountgroup
+   * @returns {string} Resource name string.
+   */
+  relatedAccountGroupPath(project: string, relatedaccountgroup: string) {
+    return this.pathTemplates.relatedAccountGroupPathTemplate.render({
+      project: project,
+      relatedaccountgroup: relatedaccountgroup,
+    });
+  }
+
+  /**
+   * Parse the project from RelatedAccountGroup resource.
+   *
+   * @param {string} relatedAccountGroupName
+   *   A fully-qualified path representing RelatedAccountGroup resource.
+   * @returns {string} A string representing the project.
+   */
+  matchProjectFromRelatedAccountGroupName(relatedAccountGroupName: string) {
+    return this.pathTemplates.relatedAccountGroupPathTemplate.match(
+      relatedAccountGroupName
+    ).project;
+  }
+
+  /**
+   * Parse the relatedaccountgroup from RelatedAccountGroup resource.
+   *
+   * @param {string} relatedAccountGroupName
+   *   A fully-qualified path representing RelatedAccountGroup resource.
+   * @returns {string} A string representing the relatedaccountgroup.
+   */
+  matchRelatedaccountgroupFromRelatedAccountGroupName(
+    relatedAccountGroupName: string
+  ) {
+    return this.pathTemplates.relatedAccountGroupPathTemplate.match(
+      relatedAccountGroupName
+    ).relatedaccountgroup;
+  }
+
+  /**
+   * Return a fully-qualified relatedAccountGroupMembership resource name string.
+   *
+   * @param {string} project
+   * @param {string} relatedaccountgroup
+   * @param {string} membership
+   * @returns {string} Resource name string.
+   */
+  relatedAccountGroupMembershipPath(
+    project: string,
+    relatedaccountgroup: string,
+    membership: string
+  ) {
+    return this.pathTemplates.relatedAccountGroupMembershipPathTemplate.render({
+      project: project,
+      relatedaccountgroup: relatedaccountgroup,
+      membership: membership,
+    });
+  }
+
+  /**
+   * Parse the project from RelatedAccountGroupMembership resource.
+   *
+   * @param {string} relatedAccountGroupMembershipName
+   *   A fully-qualified path representing RelatedAccountGroupMembership resource.
+   * @returns {string} A string representing the project.
+   */
+  matchProjectFromRelatedAccountGroupMembershipName(
+    relatedAccountGroupMembershipName: string
+  ) {
+    return this.pathTemplates.relatedAccountGroupMembershipPathTemplate.match(
+      relatedAccountGroupMembershipName
+    ).project;
+  }
+
+  /**
+   * Parse the relatedaccountgroup from RelatedAccountGroupMembership resource.
+   *
+   * @param {string} relatedAccountGroupMembershipName
+   *   A fully-qualified path representing RelatedAccountGroupMembership resource.
+   * @returns {string} A string representing the relatedaccountgroup.
+   */
+  matchRelatedaccountgroupFromRelatedAccountGroupMembershipName(
+    relatedAccountGroupMembershipName: string
+  ) {
+    return this.pathTemplates.relatedAccountGroupMembershipPathTemplate.match(
+      relatedAccountGroupMembershipName
+    ).relatedaccountgroup;
+  }
+
+  /**
+   * Parse the membership from RelatedAccountGroupMembership resource.
+   *
+   * @param {string} relatedAccountGroupMembershipName
+   *   A fully-qualified path representing RelatedAccountGroupMembership resource.
+   * @returns {string} A string representing the membership.
+   */
+  matchMembershipFromRelatedAccountGroupMembershipName(
+    relatedAccountGroupMembershipName: string
+  ) {
+    return this.pathTemplates.relatedAccountGroupMembershipPathTemplate.match(
+      relatedAccountGroupMembershipName
+    ).membership;
+  }
+
   /**
    * Terminate the gRPC channel and close the client.
    *
diff --git a/src/v1/recaptcha_enterprise_service_client_config.json b/src/v1/recaptcha_enterprise_service_client_config.json
index ec264c5..66fe297 100644
--- a/src/v1/recaptcha_enterprise_service_client_config.json
+++ b/src/v1/recaptcha_enterprise_service_client_config.json
@@ -62,6 +62,18 @@
         "GetMetrics": {
           "retry_codes_name": "non_idempotent",
           "retry_params_name": "default"
+        },
+        "ListRelatedAccountGroups": {
+          "retry_codes_name": "non_idempotent",
+          "retry_params_name": "default"
+        },
+        "ListRelatedAccountGroupMemberships": {
+          "retry_codes_name": "non_idempotent",
+          "retry_params_name": "default"
+        },
+        "SearchRelatedAccountGroupMemberships": {
+          "retry_codes_name": "non_idempotent",
+          "retry_params_name": "default"
         }
       }
     }
diff --git a/src/v1beta1/recaptcha_enterprise_service_v1_beta1_client.ts b/src/v1beta1/recaptcha_enterprise_service_v1_beta1_client.ts
index 886beb8..23abb64 100644
--- a/src/v1beta1/recaptcha_enterprise_service_v1_beta1_client.ts
+++ b/src/v1beta1/recaptcha_enterprise_service_v1_beta1_client.ts
@@ -1064,7 +1064,8 @@ export class RecaptchaEnterpriseServiceV1Beta1Client {
       gax.routingHeader.fromParams({
         parent: request.parent || '',
       });
-    const callSettings = new gax.CallSettings(options);
+    const defaultCallSettings = this._defaults['listKeys'];
+    const callSettings = defaultCallSettings.merge(options);
     this.initialize();
     return this.descriptors.page.listKeys.createStream(
       this.innerApiCalls.listKeys as gax.GaxCall,
@@ -1117,7 +1118,8 @@ export class RecaptchaEnterpriseServiceV1Beta1Client {
         parent: request.parent || '',
       });
     options = options || {};
-    const callSettings = new gax.CallSettings(options);
+    const defaultCallSettings = this._defaults['listKeys'];
+    const callSettings = defaultCallSettings.merge(options);
     this.initialize();
     return this.descriptors.page.listKeys.asyncIterate(
       this.innerApiCalls['listKeys'] as GaxCall,
diff --git a/test/gapic_recaptcha_enterprise_service_v1.ts b/test/gapic_recaptcha_enterprise_service_v1.ts
index e2f0967..38bb157 100644
--- a/test/gapic_recaptcha_enterprise_service_v1.ts
+++ b/test/gapic_recaptcha_enterprise_service_v1.ts
@@ -1477,6 +1477,1078 @@ describe('v1.RecaptchaEnterpriseServiceClient', () => {
     });
   });
 
+  describe('listRelatedAccountGroups', () => {
+    it('invokes listRelatedAccountGroups without error', async () => {
+      const client =
+        new recaptchaenterpriseserviceModule.v1.RecaptchaEnterpriseServiceClient(
+          {
+            credentials: {client_email: 'bogus', private_key: 'bogus'},
+            projectId: 'bogus',
+          }
+        );
+      client.initialize();
+      const request = generateSampleMessage(
+        new protos.google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupsRequest()
+      );
+      request.parent = '';
+      const expectedHeaderRequestParams = 'parent=';
+      const expectedOptions = {
+        otherArgs: {
+          headers: {
+            'x-goog-request-params': expectedHeaderRequestParams,
+          },
+        },
+      };
+      const expectedResponse = [
+        generateSampleMessage(
+          new protos.google.cloud.recaptchaenterprise.v1.RelatedAccountGroup()
+        ),
+        generateSampleMessage(
+          new protos.google.cloud.recaptchaenterprise.v1.RelatedAccountGroup()
+        ),
+        generateSampleMessage(
+          new protos.google.cloud.recaptchaenterprise.v1.RelatedAccountGroup()
+        ),
+      ];
+      client.innerApiCalls.listRelatedAccountGroups =
+        stubSimpleCall(expectedResponse);
+      const [response] = await client.listRelatedAccountGroups(request);
+      assert.deepStrictEqual(response, expectedResponse);
+      assert(
+        (client.innerApiCalls.listRelatedAccountGroups as SinonStub)
+          .getCall(0)
+          .calledWith(request, expectedOptions, undefined)
+      );
+    });
+
+    it('invokes listRelatedAccountGroups without error using callback', async () => {
+      const client =
+        new recaptchaenterpriseserviceModule.v1.RecaptchaEnterpriseServiceClient(
+          {
+            credentials: {client_email: 'bogus', private_key: 'bogus'},
+            projectId: 'bogus',
+          }
+        );
+      client.initialize();
+      const request = generateSampleMessage(
+        new protos.google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupsRequest()
+      );
+      request.parent = '';
+      const expectedHeaderRequestParams = 'parent=';
+      const expectedOptions = {
+        otherArgs: {
+          headers: {
+            'x-goog-request-params': expectedHeaderRequestParams,
+          },
+        },
+      };
+      const expectedResponse = [
+        generateSampleMessage(
+          new protos.google.cloud.recaptchaenterprise.v1.RelatedAccountGroup()
+        ),
+        generateSampleMessage(
+          new protos.google.cloud.recaptchaenterprise.v1.RelatedAccountGroup()
+        ),
+        generateSampleMessage(
+          new protos.google.cloud.recaptchaenterprise.v1.RelatedAccountGroup()
+        ),
+      ];
+      client.innerApiCalls.listRelatedAccountGroups =
+        stubSimpleCallWithCallback(expectedResponse);
+      const promise = new Promise((resolve, reject) => {
+        client.listRelatedAccountGroups(
+          request,
+          (
+            err?: Error | null,
+            result?:
+              | protos.google.cloud.recaptchaenterprise.v1.IRelatedAccountGroup[]
+              | null
+          ) => {
+            if (err) {
+              reject(err);
+            } else {
+              resolve(result);
+            }
+          }
+        );
+      });
+      const response = await promise;
+      assert.deepStrictEqual(response, expectedResponse);
+      assert(
+        (client.innerApiCalls.listRelatedAccountGroups as SinonStub)
+          .getCall(0)
+          .calledWith(request, expectedOptions /*, callback defined above */)
+      );
+    });
+
+    it('invokes listRelatedAccountGroups with error', async () => {
+      const client =
+        new recaptchaenterpriseserviceModule.v1.RecaptchaEnterpriseServiceClient(
+          {
+            credentials: {client_email: 'bogus', private_key: 'bogus'},
+            projectId: 'bogus',
+          }
+        );
+      client.initialize();
+      const request = generateSampleMessage(
+        new protos.google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupsRequest()
+      );
+      request.parent = '';
+      const expectedHeaderRequestParams = 'parent=';
+      const expectedOptions = {
+        otherArgs: {
+          headers: {
+            'x-goog-request-params': expectedHeaderRequestParams,
+          },
+        },
+      };
+      const expectedError = new Error('expected');
+      client.innerApiCalls.listRelatedAccountGroups = stubSimpleCall(
+        undefined,
+        expectedError
+      );
+      await assert.rejects(
+        client.listRelatedAccountGroups(request),
+        expectedError
+      );
+      assert(
+        (client.innerApiCalls.listRelatedAccountGroups as SinonStub)
+          .getCall(0)
+          .calledWith(request, expectedOptions, undefined)
+      );
+    });
+
+    it('invokes listRelatedAccountGroupsStream without error', async () => {
+      const client =
+        new recaptchaenterpriseserviceModule.v1.RecaptchaEnterpriseServiceClient(
+          {
+            credentials: {client_email: 'bogus', private_key: 'bogus'},
+            projectId: 'bogus',
+          }
+        );
+      client.initialize();
+      const request = generateSampleMessage(
+        new protos.google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupsRequest()
+      );
+      request.parent = '';
+      const expectedHeaderRequestParams = 'parent=';
+      const expectedResponse = [
+        generateSampleMessage(
+          new protos.google.cloud.recaptchaenterprise.v1.RelatedAccountGroup()
+        ),
+        generateSampleMessage(
+          new protos.google.cloud.recaptchaenterprise.v1.RelatedAccountGroup()
+        ),
+        generateSampleMessage(
+          new protos.google.cloud.recaptchaenterprise.v1.RelatedAccountGroup()
+        ),
+      ];
+      client.descriptors.page.listRelatedAccountGroups.createStream =
+        stubPageStreamingCall(expectedResponse);
+      const stream = client.listRelatedAccountGroupsStream(request);
+      const promise = new Promise((resolve, reject) => {
+        const responses: protos.google.cloud.recaptchaenterprise.v1.RelatedAccountGroup[] =
+          [];
+        stream.on(
+          'data',
+          (
+            response: protos.google.cloud.recaptchaenterprise.v1.RelatedAccountGroup
+          ) => {
+            responses.push(response);
+          }
+        );
+        stream.on('end', () => {
+          resolve(responses);
+        });
+        stream.on('error', (err: Error) => {
+          reject(err);
+        });
+      });
+      const responses = await promise;
+      assert.deepStrictEqual(responses, expectedResponse);
+      assert(
+        (
+          client.descriptors.page.listRelatedAccountGroups
+            .createStream as SinonStub
+        )
+          .getCall(0)
+          .calledWith(client.innerApiCalls.listRelatedAccountGroups, request)
+      );
+      assert.strictEqual(
+        (
+          client.descriptors.page.listRelatedAccountGroups
+            .createStream as SinonStub
+        ).getCall(0).args[2].otherArgs.headers['x-goog-request-params'],
+        expectedHeaderRequestParams
+      );
+    });
+
+    it('invokes listRelatedAccountGroupsStream with error', async () => {
+      const client =
+        new recaptchaenterpriseserviceModule.v1.RecaptchaEnterpriseServiceClient(
+          {
+            credentials: {client_email: 'bogus', private_key: 'bogus'},
+            projectId: 'bogus',
+          }
+        );
+      client.initialize();
+      const request = generateSampleMessage(
+        new protos.google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupsRequest()
+      );
+      request.parent = '';
+      const expectedHeaderRequestParams = 'parent=';
+      const expectedError = new Error('expected');
+      client.descriptors.page.listRelatedAccountGroups.createStream =
+        stubPageStreamingCall(undefined, expectedError);
+      const stream = client.listRelatedAccountGroupsStream(request);
+      const promise = new Promise((resolve, reject) => {
+        const responses: protos.google.cloud.recaptchaenterprise.v1.RelatedAccountGroup[] =
+          [];
+        stream.on(
+          'data',
+          (
+            response: protos.google.cloud.recaptchaenterprise.v1.RelatedAccountGroup
+          ) => {
+            responses.push(response);
+          }
+        );
+        stream.on('end', () => {
+          resolve(responses);
+        });
+        stream.on('error', (err: Error) => {
+          reject(err);
+        });
+      });
+      await assert.rejects(promise, expectedError);
+      assert(
+        (
+          client.descriptors.page.listRelatedAccountGroups
+            .createStream as SinonStub
+        )
+          .getCall(0)
+          .calledWith(client.innerApiCalls.listRelatedAccountGroups, request)
+      );
+      assert.strictEqual(
+        (
+          client.descriptors.page.listRelatedAccountGroups
+            .createStream as SinonStub
+        ).getCall(0).args[2].otherArgs.headers['x-goog-request-params'],
+        expectedHeaderRequestParams
+      );
+    });
+
+    it('uses async iteration with listRelatedAccountGroups without error', async () => {
+      const client =
+        new recaptchaenterpriseserviceModule.v1.RecaptchaEnterpriseServiceClient(
+          {
+            credentials: {client_email: 'bogus', private_key: 'bogus'},
+            projectId: 'bogus',
+          }
+        );
+      client.initialize();
+      const request = generateSampleMessage(
+        new protos.google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupsRequest()
+      );
+      request.parent = '';
+      const expectedHeaderRequestParams = 'parent=';
+      const expectedResponse = [
+        generateSampleMessage(
+          new protos.google.cloud.recaptchaenterprise.v1.RelatedAccountGroup()
+        ),
+        generateSampleMessage(
+          new protos.google.cloud.recaptchaenterprise.v1.RelatedAccountGroup()
+        ),
+        generateSampleMessage(
+          new protos.google.cloud.recaptchaenterprise.v1.RelatedAccountGroup()
+        ),
+      ];
+      client.descriptors.page.listRelatedAccountGroups.asyncIterate =
+        stubAsyncIterationCall(expectedResponse);
+      const responses: protos.google.cloud.recaptchaenterprise.v1.IRelatedAccountGroup[] =
+        [];
+      const iterable = client.listRelatedAccountGroupsAsync(request);
+      for await (const resource of iterable) {
+        responses.push(resource!);
+      }
+      assert.deepStrictEqual(responses, expectedResponse);
+      assert.deepStrictEqual(
+        (
+          client.descriptors.page.listRelatedAccountGroups
+            .asyncIterate as SinonStub
+        ).getCall(0).args[1],
+        request
+      );
+      assert.strictEqual(
+        (
+          client.descriptors.page.listRelatedAccountGroups
+            .asyncIterate as SinonStub
+        ).getCall(0).args[2].otherArgs.headers['x-goog-request-params'],
+        expectedHeaderRequestParams
+      );
+    });
+
+    it('uses async iteration with listRelatedAccountGroups with error', async () => {
+      const client =
+        new recaptchaenterpriseserviceModule.v1.RecaptchaEnterpriseServiceClient(
+          {
+            credentials: {client_email: 'bogus', private_key: 'bogus'},
+            projectId: 'bogus',
+          }
+        );
+      client.initialize();
+      const request = generateSampleMessage(
+        new protos.google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupsRequest()
+      );
+      request.parent = '';
+      const expectedHeaderRequestParams = 'parent=';
+      const expectedError = new Error('expected');
+      client.descriptors.page.listRelatedAccountGroups.asyncIterate =
+        stubAsyncIterationCall(undefined, expectedError);
+      const iterable = client.listRelatedAccountGroupsAsync(request);
+      await assert.rejects(async () => {
+        const responses: protos.google.cloud.recaptchaenterprise.v1.IRelatedAccountGroup[] =
+          [];
+        for await (const resource of iterable) {
+          responses.push(resource!);
+        }
+      });
+      assert.deepStrictEqual(
+        (
+          client.descriptors.page.listRelatedAccountGroups
+            .asyncIterate as SinonStub
+        ).getCall(0).args[1],
+        request
+      );
+      assert.strictEqual(
+        (
+          client.descriptors.page.listRelatedAccountGroups
+            .asyncIterate as SinonStub
+        ).getCall(0).args[2].otherArgs.headers['x-goog-request-params'],
+        expectedHeaderRequestParams
+      );
+    });
+  });
+
+  describe('listRelatedAccountGroupMemberships', () => {
+    it('invokes listRelatedAccountGroupMemberships without error', async () => {
+      const client =
+        new recaptchaenterpriseserviceModule.v1.RecaptchaEnterpriseServiceClient(
+          {
+            credentials: {client_email: 'bogus', private_key: 'bogus'},
+            projectId: 'bogus',
+          }
+        );
+      client.initialize();
+      const request = generateSampleMessage(
+        new protos.google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupMembershipsRequest()
+      );
+      request.parent = '';
+      const expectedHeaderRequestParams = 'parent=';
+      const expectedOptions = {
+        otherArgs: {
+          headers: {
+            'x-goog-request-params': expectedHeaderRequestParams,
+          },
+        },
+      };
+      const expectedResponse = [
+        generateSampleMessage(
+          new protos.google.cloud.recaptchaenterprise.v1.RelatedAccountGroupMembership()
+        ),
+        generateSampleMessage(
+          new protos.google.cloud.recaptchaenterprise.v1.RelatedAccountGroupMembership()
+        ),
+        generateSampleMessage(
+          new protos.google.cloud.recaptchaenterprise.v1.RelatedAccountGroupMembership()
+        ),
+      ];
+      client.innerApiCalls.listRelatedAccountGroupMemberships =
+        stubSimpleCall(expectedResponse);
+      const [response] = await client.listRelatedAccountGroupMemberships(
+        request
+      );
+      assert.deepStrictEqual(response, expectedResponse);
+      assert(
+        (client.innerApiCalls.listRelatedAccountGroupMemberships as SinonStub)
+          .getCall(0)
+          .calledWith(request, expectedOptions, undefined)
+      );
+    });
+
+    it('invokes listRelatedAccountGroupMemberships without error using callback', async () => {
+      const client =
+        new recaptchaenterpriseserviceModule.v1.RecaptchaEnterpriseServiceClient(
+          {
+            credentials: {client_email: 'bogus', private_key: 'bogus'},
+            projectId: 'bogus',
+          }
+        );
+      client.initialize();
+      const request = generateSampleMessage(
+        new protos.google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupMembershipsRequest()
+      );
+      request.parent = '';
+      const expectedHeaderRequestParams = 'parent=';
+      const expectedOptions = {
+        otherArgs: {
+          headers: {
+            'x-goog-request-params': expectedHeaderRequestParams,
+          },
+        },
+      };
+      const expectedResponse = [
+        generateSampleMessage(
+          new protos.google.cloud.recaptchaenterprise.v1.RelatedAccountGroupMembership()
+        ),
+        generateSampleMessage(
+          new protos.google.cloud.recaptchaenterprise.v1.RelatedAccountGroupMembership()
+        ),
+        generateSampleMessage(
+          new protos.google.cloud.recaptchaenterprise.v1.RelatedAccountGroupMembership()
+        ),
+      ];
+      client.innerApiCalls.listRelatedAccountGroupMemberships =
+        stubSimpleCallWithCallback(expectedResponse);
+      const promise = new Promise((resolve, reject) => {
+        client.listRelatedAccountGroupMemberships(
+          request,
+          (
+            err?: Error | null,
+            result?:
+              | protos.google.cloud.recaptchaenterprise.v1.IRelatedAccountGroupMembership[]
+              | null
+          ) => {
+            if (err) {
+              reject(err);
+            } else {
+              resolve(result);
+            }
+          }
+        );
+      });
+      const response = await promise;
+      assert.deepStrictEqual(response, expectedResponse);
+      assert(
+        (client.innerApiCalls.listRelatedAccountGroupMemberships as SinonStub)
+          .getCall(0)
+          .calledWith(request, expectedOptions /*, callback defined above */)
+      );
+    });
+
+    it('invokes listRelatedAccountGroupMemberships with error', async () => {
+      const client =
+        new recaptchaenterpriseserviceModule.v1.RecaptchaEnterpriseServiceClient(
+          {
+            credentials: {client_email: 'bogus', private_key: 'bogus'},
+            projectId: 'bogus',
+          }
+        );
+      client.initialize();
+      const request = generateSampleMessage(
+        new protos.google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupMembershipsRequest()
+      );
+      request.parent = '';
+      const expectedHeaderRequestParams = 'parent=';
+      const expectedOptions = {
+        otherArgs: {
+          headers: {
+            'x-goog-request-params': expectedHeaderRequestParams,
+          },
+        },
+      };
+      const expectedError = new Error('expected');
+      client.innerApiCalls.listRelatedAccountGroupMemberships = stubSimpleCall(
+        undefined,
+        expectedError
+      );
+      await assert.rejects(
+        client.listRelatedAccountGroupMemberships(request),
+        expectedError
+      );
+      assert(
+        (client.innerApiCalls.listRelatedAccountGroupMemberships as SinonStub)
+          .getCall(0)
+          .calledWith(request, expectedOptions, undefined)
+      );
+    });
+
+    it('invokes listRelatedAccountGroupMembershipsStream without error', async () => {
+      const client =
+        new recaptchaenterpriseserviceModule.v1.RecaptchaEnterpriseServiceClient(
+          {
+            credentials: {client_email: 'bogus', private_key: 'bogus'},
+            projectId: 'bogus',
+          }
+        );
+      client.initialize();
+      const request = generateSampleMessage(
+        new protos.google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupMembershipsRequest()
+      );
+      request.parent = '';
+      const expectedHeaderRequestParams = 'parent=';
+      const expectedResponse = [
+        generateSampleMessage(
+          new protos.google.cloud.recaptchaenterprise.v1.RelatedAccountGroupMembership()
+        ),
+        generateSampleMessage(
+          new protos.google.cloud.recaptchaenterprise.v1.RelatedAccountGroupMembership()
+        ),
+        generateSampleMessage(
+          new protos.google.cloud.recaptchaenterprise.v1.RelatedAccountGroupMembership()
+        ),
+      ];
+      client.descriptors.page.listRelatedAccountGroupMemberships.createStream =
+        stubPageStreamingCall(expectedResponse);
+      const stream = client.listRelatedAccountGroupMembershipsStream(request);
+      const promise = new Promise((resolve, reject) => {
+        const responses: protos.google.cloud.recaptchaenterprise.v1.RelatedAccountGroupMembership[] =
+          [];
+        stream.on(
+          'data',
+          (
+            response: protos.google.cloud.recaptchaenterprise.v1.RelatedAccountGroupMembership
+          ) => {
+            responses.push(response);
+          }
+        );
+        stream.on('end', () => {
+          resolve(responses);
+        });
+        stream.on('error', (err: Error) => {
+          reject(err);
+        });
+      });
+      const responses = await promise;
+      assert.deepStrictEqual(responses, expectedResponse);
+      assert(
+        (
+          client.descriptors.page.listRelatedAccountGroupMemberships
+            .createStream as SinonStub
+        )
+          .getCall(0)
+          .calledWith(
+            client.innerApiCalls.listRelatedAccountGroupMemberships,
+            request
+          )
+      );
+      assert.strictEqual(
+        (
+          client.descriptors.page.listRelatedAccountGroupMemberships
+            .createStream as SinonStub
+        ).getCall(0).args[2].otherArgs.headers['x-goog-request-params'],
+        expectedHeaderRequestParams
+      );
+    });
+
+    it('invokes listRelatedAccountGroupMembershipsStream with error', async () => {
+      const client =
+        new recaptchaenterpriseserviceModule.v1.RecaptchaEnterpriseServiceClient(
+          {
+            credentials: {client_email: 'bogus', private_key: 'bogus'},
+            projectId: 'bogus',
+          }
+        );
+      client.initialize();
+      const request = generateSampleMessage(
+        new protos.google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupMembershipsRequest()
+      );
+      request.parent = '';
+      const expectedHeaderRequestParams = 'parent=';
+      const expectedError = new Error('expected');
+      client.descriptors.page.listRelatedAccountGroupMemberships.createStream =
+        stubPageStreamingCall(undefined, expectedError);
+      const stream = client.listRelatedAccountGroupMembershipsStream(request);
+      const promise = new Promise((resolve, reject) => {
+        const responses: protos.google.cloud.recaptchaenterprise.v1.RelatedAccountGroupMembership[] =
+          [];
+        stream.on(
+          'data',
+          (
+            response: protos.google.cloud.recaptchaenterprise.v1.RelatedAccountGroupMembership
+          ) => {
+            responses.push(response);
+          }
+        );
+        stream.on('end', () => {
+          resolve(responses);
+        });
+        stream.on('error', (err: Error) => {
+          reject(err);
+        });
+      });
+      await assert.rejects(promise, expectedError);
+      assert(
+        (
+          client.descriptors.page.listRelatedAccountGroupMemberships
+            .createStream as SinonStub
+        )
+          .getCall(0)
+          .calledWith(
+            client.innerApiCalls.listRelatedAccountGroupMemberships,
+            request
+          )
+      );
+      assert.strictEqual(
+        (
+          client.descriptors.page.listRelatedAccountGroupMemberships
+            .createStream as SinonStub
+        ).getCall(0).args[2].otherArgs.headers['x-goog-request-params'],
+        expectedHeaderRequestParams
+      );
+    });
+
+    it('uses async iteration with listRelatedAccountGroupMemberships without error', async () => {
+      const client =
+        new recaptchaenterpriseserviceModule.v1.RecaptchaEnterpriseServiceClient(
+          {
+            credentials: {client_email: 'bogus', private_key: 'bogus'},
+            projectId: 'bogus',
+          }
+        );
+      client.initialize();
+      const request = generateSampleMessage(
+        new protos.google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupMembershipsRequest()
+      );
+      request.parent = '';
+      const expectedHeaderRequestParams = 'parent=';
+      const expectedResponse = [
+        generateSampleMessage(
+          new protos.google.cloud.recaptchaenterprise.v1.RelatedAccountGroupMembership()
+        ),
+        generateSampleMessage(
+          new protos.google.cloud.recaptchaenterprise.v1.RelatedAccountGroupMembership()
+        ),
+        generateSampleMessage(
+          new protos.google.cloud.recaptchaenterprise.v1.RelatedAccountGroupMembership()
+        ),
+      ];
+      client.descriptors.page.listRelatedAccountGroupMemberships.asyncIterate =
+        stubAsyncIterationCall(expectedResponse);
+      const responses: protos.google.cloud.recaptchaenterprise.v1.IRelatedAccountGroupMembership[] =
+        [];
+      const iterable = client.listRelatedAccountGroupMembershipsAsync(request);
+      for await (const resource of iterable) {
+        responses.push(resource!);
+      }
+      assert.deepStrictEqual(responses, expectedResponse);
+      assert.deepStrictEqual(
+        (
+          client.descriptors.page.listRelatedAccountGroupMemberships
+            .asyncIterate as SinonStub
+        ).getCall(0).args[1],
+        request
+      );
+      assert.strictEqual(
+        (
+          client.descriptors.page.listRelatedAccountGroupMemberships
+            .asyncIterate as SinonStub
+        ).getCall(0).args[2].otherArgs.headers['x-goog-request-params'],
+        expectedHeaderRequestParams
+      );
+    });
+
+    it('uses async iteration with listRelatedAccountGroupMemberships with error', async () => {
+      const client =
+        new recaptchaenterpriseserviceModule.v1.RecaptchaEnterpriseServiceClient(
+          {
+            credentials: {client_email: 'bogus', private_key: 'bogus'},
+            projectId: 'bogus',
+          }
+        );
+      client.initialize();
+      const request = generateSampleMessage(
+        new protos.google.cloud.recaptchaenterprise.v1.ListRelatedAccountGroupMembershipsRequest()
+      );
+      request.parent = '';
+      const expectedHeaderRequestParams = 'parent=';
+      const expectedError = new Error('expected');
+      client.descriptors.page.listRelatedAccountGroupMemberships.asyncIterate =
+        stubAsyncIterationCall(undefined, expectedError);
+      const iterable = client.listRelatedAccountGroupMembershipsAsync(request);
+      await assert.rejects(async () => {
+        const responses: protos.google.cloud.recaptchaenterprise.v1.IRelatedAccountGroupMembership[] =
+          [];
+        for await (const resource of iterable) {
+          responses.push(resource!);
+        }
+      });
+      assert.deepStrictEqual(
+        (
+          client.descriptors.page.listRelatedAccountGroupMemberships
+            .asyncIterate as SinonStub
+        ).getCall(0).args[1],
+        request
+      );
+      assert.strictEqual(
+        (
+          client.descriptors.page.listRelatedAccountGroupMemberships
+            .asyncIterate as SinonStub
+        ).getCall(0).args[2].otherArgs.headers['x-goog-request-params'],
+        expectedHeaderRequestParams
+      );
+    });
+  });
+
+  describe('searchRelatedAccountGroupMemberships', () => {
+    it('invokes searchRelatedAccountGroupMemberships without error', async () => {
+      const client =
+        new recaptchaenterpriseserviceModule.v1.RecaptchaEnterpriseServiceClient(
+          {
+            credentials: {client_email: 'bogus', private_key: 'bogus'},
+            projectId: 'bogus',
+          }
+        );
+      client.initialize();
+      const request = generateSampleMessage(
+        new protos.google.cloud.recaptchaenterprise.v1.SearchRelatedAccountGroupMembershipsRequest()
+      );
+      request.parent = '';
+      const expectedHeaderRequestParams = 'parent=';
+      const expectedOptions = {
+        otherArgs: {
+          headers: {
+            'x-goog-request-params': expectedHeaderRequestParams,
+          },
+        },
+      };
+      const expectedResponse = [
+        generateSampleMessage(
+          new protos.google.cloud.recaptchaenterprise.v1.RelatedAccountGroupMembership()
+        ),
+        generateSampleMessage(
+          new protos.google.cloud.recaptchaenterprise.v1.RelatedAccountGroupMembership()
+        ),
+        generateSampleMessage(
+          new protos.google.cloud.recaptchaenterprise.v1.RelatedAccountGroupMembership()
+        ),
+      ];
+      client.innerApiCalls.searchRelatedAccountGroupMemberships =
+        stubSimpleCall(expectedResponse);
+      const [response] = await client.searchRelatedAccountGroupMemberships(
+        request
+      );
+      assert.deepStrictEqual(response, expectedResponse);
+      assert(
+        (client.innerApiCalls.searchRelatedAccountGroupMemberships as SinonStub)
+          .getCall(0)
+          .calledWith(request, expectedOptions, undefined)
+      );
+    });
+
+    it('invokes searchRelatedAccountGroupMemberships without error using callback', async () => {
+      const client =
+        new recaptchaenterpriseserviceModule.v1.RecaptchaEnterpriseServiceClient(
+          {
+            credentials: {client_email: 'bogus', private_key: 'bogus'},
+            projectId: 'bogus',
+          }
+        );
+      client.initialize();
+      const request = generateSampleMessage(
+        new protos.google.cloud.recaptchaenterprise.v1.SearchRelatedAccountGroupMembershipsRequest()
+      );
+      request.parent = '';
+      const expectedHeaderRequestParams = 'parent=';
+      const expectedOptions = {
+        otherArgs: {
+          headers: {
+            'x-goog-request-params': expectedHeaderRequestParams,
+          },
+        },
+      };
+      const expectedResponse = [
+        generateSampleMessage(
+          new protos.google.cloud.recaptchaenterprise.v1.RelatedAccountGroupMembership()
+        ),
+        generateSampleMessage(
+          new protos.google.cloud.recaptchaenterprise.v1.RelatedAccountGroupMembership()
+        ),
+        generateSampleMessage(
+          new protos.google.cloud.recaptchaenterprise.v1.RelatedAccountGroupMembership()
+        ),
+      ];
+      client.innerApiCalls.searchRelatedAccountGroupMemberships =
+        stubSimpleCallWithCallback(expectedResponse);
+      const promise = new Promise((resolve, reject) => {
+        client.searchRelatedAccountGroupMemberships(
+          request,
+          (
+            err?: Error | null,
+            result?:
+              | protos.google.cloud.recaptchaenterprise.v1.IRelatedAccountGroupMembership[]
+              | null
+          ) => {
+            if (err) {
+              reject(err);
+            } else {
+              resolve(result);
+            }
+          }
+        );
+      });
+      const response = await promise;
+      assert.deepStrictEqual(response, expectedResponse);
+      assert(
+        (client.innerApiCalls.searchRelatedAccountGroupMemberships as SinonStub)
+          .getCall(0)
+          .calledWith(request, expectedOptions /*, callback defined above */)
+      );
+    });
+
+    it('invokes searchRelatedAccountGroupMemberships with error', async () => {
+      const client =
+        new recaptchaenterpriseserviceModule.v1.RecaptchaEnterpriseServiceClient(
+          {
+            credentials: {client_email: 'bogus', private_key: 'bogus'},
+            projectId: 'bogus',
+          }
+        );
+      client.initialize();
+      const request = generateSampleMessage(
+        new protos.google.cloud.recaptchaenterprise.v1.SearchRelatedAccountGroupMembershipsRequest()
+      );
+      request.parent = '';
+      const expectedHeaderRequestParams = 'parent=';
+      const expectedOptions = {
+        otherArgs: {
+          headers: {
+            'x-goog-request-params': expectedHeaderRequestParams,
+          },
+        },
+      };
+      const expectedError = new Error('expected');
+      client.innerApiCalls.searchRelatedAccountGroupMemberships =
+        stubSimpleCall(undefined, expectedError);
+      await assert.rejects(
+        client.searchRelatedAccountGroupMemberships(request),
+        expectedError
+      );
+      assert(
+        (client.innerApiCalls.searchRelatedAccountGroupMemberships as SinonStub)
+          .getCall(0)
+          .calledWith(request, expectedOptions, undefined)
+      );
+    });
+
+    it('invokes searchRelatedAccountGroupMembershipsStream without error', async () => {
+      const client =
+        new recaptchaenterpriseserviceModule.v1.RecaptchaEnterpriseServiceClient(
+          {
+            credentials: {client_email: 'bogus', private_key: 'bogus'},
+            projectId: 'bogus',
+          }
+        );
+      client.initialize();
+      const request = generateSampleMessage(
+        new protos.google.cloud.recaptchaenterprise.v1.SearchRelatedAccountGroupMembershipsRequest()
+      );
+      request.parent = '';
+      const expectedHeaderRequestParams = 'parent=';
+      const expectedResponse = [
+        generateSampleMessage(
+          new protos.google.cloud.recaptchaenterprise.v1.RelatedAccountGroupMembership()
+        ),
+        generateSampleMessage(
+          new protos.google.cloud.recaptchaenterprise.v1.RelatedAccountGroupMembership()
+        ),
+        generateSampleMessage(
+          new protos.google.cloud.recaptchaenterprise.v1.RelatedAccountGroupMembership()
+        ),
+      ];
+      client.descriptors.page.searchRelatedAccountGroupMemberships.createStream =
+        stubPageStreamingCall(expectedResponse);
+      const stream = client.searchRelatedAccountGroupMembershipsStream(request);
+      const promise = new Promise((resolve, reject) => {
+        const responses: protos.google.cloud.recaptchaenterprise.v1.RelatedAccountGroupMembership[] =
+          [];
+        stream.on(
+          'data',
+          (
+            response: protos.google.cloud.recaptchaenterprise.v1.RelatedAccountGroupMembership
+          ) => {
+            responses.push(response);
+          }
+        );
+        stream.on('end', () => {
+          resolve(responses);
+        });
+        stream.on('error', (err: Error) => {
+          reject(err);
+        });
+      });
+      const responses = await promise;
+      assert.deepStrictEqual(responses, expectedResponse);
+      assert(
+        (
+          client.descriptors.page.searchRelatedAccountGroupMemberships
+            .createStream as SinonStub
+        )
+          .getCall(0)
+          .calledWith(
+            client.innerApiCalls.searchRelatedAccountGroupMemberships,
+            request
+          )
+      );
+      assert.strictEqual(
+        (
+          client.descriptors.page.searchRelatedAccountGroupMemberships
+            .createStream as SinonStub
+        ).getCall(0).args[2].otherArgs.headers['x-goog-request-params'],
+        expectedHeaderRequestParams
+      );
+    });
+
+    it('invokes searchRelatedAccountGroupMembershipsStream with error', async () => {
+      const client =
+        new recaptchaenterpriseserviceModule.v1.RecaptchaEnterpriseServiceClient(
+          {
+            credentials: {client_email: 'bogus', private_key: 'bogus'},
+            projectId: 'bogus',
+          }
+        );
+      client.initialize();
+      const request = generateSampleMessage(
+        new protos.google.cloud.recaptchaenterprise.v1.SearchRelatedAccountGroupMembershipsRequest()
+      );
+      request.parent = '';
+      const expectedHeaderRequestParams = 'parent=';
+      const expectedError = new Error('expected');
+      client.descriptors.page.searchRelatedAccountGroupMemberships.createStream =
+        stubPageStreamingCall(undefined, expectedError);
+      const stream = client.searchRelatedAccountGroupMembershipsStream(request);
+      const promise = new Promise((resolve, reject) => {
+        const responses: protos.google.cloud.recaptchaenterprise.v1.RelatedAccountGroupMembership[] =
+          [];
+        stream.on(
+          'data',
+          (
+            response: protos.google.cloud.recaptchaenterprise.v1.RelatedAccountGroupMembership
+          ) => {
+            responses.push(response);
+          }
+        );
+        stream.on('end', () => {
+          resolve(responses);
+        });
+        stream.on('error', (err: Error) => {
+          reject(err);
+        });
+      });
+      await assert.rejects(promise, expectedError);
+      assert(
+        (
+          client.descriptors.page.searchRelatedAccountGroupMemberships
+            .createStream as SinonStub
+        )
+          .getCall(0)
+          .calledWith(
+            client.innerApiCalls.searchRelatedAccountGroupMemberships,
+            request
+          )
+      );
+      assert.strictEqual(
+        (
+          client.descriptors.page.searchRelatedAccountGroupMemberships
+            .createStream as SinonStub
+        ).getCall(0).args[2].otherArgs.headers['x-goog-request-params'],
+        expectedHeaderRequestParams
+      );
+    });
+
+    it('uses async iteration with searchRelatedAccountGroupMemberships without error', async () => {
+      const client =
+        new recaptchaenterpriseserviceModule.v1.RecaptchaEnterpriseServiceClient(
+          {
+            credentials: {client_email: 'bogus', private_key: 'bogus'},
+            projectId: 'bogus',
+          }
+        );
+      client.initialize();
+      const request = generateSampleMessage(
+        new protos.google.cloud.recaptchaenterprise.v1.SearchRelatedAccountGroupMembershipsRequest()
+      );
+      request.parent = '';
+      const expectedHeaderRequestParams = 'parent=';
+      const expectedResponse = [
+        generateSampleMessage(
+          new protos.google.cloud.recaptchaenterprise.v1.RelatedAccountGroupMembership()
+        ),
+        generateSampleMessage(
+          new protos.google.cloud.recaptchaenterprise.v1.RelatedAccountGroupMembership()
+        ),
+        generateSampleMessage(
+          new protos.google.cloud.recaptchaenterprise.v1.RelatedAccountGroupMembership()
+        ),
+      ];
+      client.descriptors.page.searchRelatedAccountGroupMemberships.asyncIterate =
+        stubAsyncIterationCall(expectedResponse);
+      const responses: protos.google.cloud.recaptchaenterprise.v1.IRelatedAccountGroupMembership[] =
+        [];
+      const iterable =
+        client.searchRelatedAccountGroupMembershipsAsync(request);
+      for await (const resource of iterable) {
+        responses.push(resource!);
+      }
+      assert.deepStrictEqual(responses, expectedResponse);
+      assert.deepStrictEqual(
+        (
+          client.descriptors.page.searchRelatedAccountGroupMemberships
+            .asyncIterate as SinonStub
+        ).getCall(0).args[1],
+        request
+      );
+      assert.strictEqual(
+        (
+          client.descriptors.page.searchRelatedAccountGroupMemberships
+            .asyncIterate as SinonStub
+        ).getCall(0).args[2].otherArgs.headers['x-goog-request-params'],
+        expectedHeaderRequestParams
+      );
+    });
+
+    it('uses async iteration with searchRelatedAccountGroupMemberships with error', async () => {
+      const client =
+        new recaptchaenterpriseserviceModule.v1.RecaptchaEnterpriseServiceClient(
+          {
+            credentials: {client_email: 'bogus', private_key: 'bogus'},
+            projectId: 'bogus',
+          }
+        );
+      client.initialize();
+      const request = generateSampleMessage(
+        new protos.google.cloud.recaptchaenterprise.v1.SearchRelatedAccountGroupMembershipsRequest()
+      );
+      request.parent = '';
+      const expectedHeaderRequestParams = 'parent=';
+      const expectedError = new Error('expected');
+      client.descriptors.page.searchRelatedAccountGroupMemberships.asyncIterate =
+        stubAsyncIterationCall(undefined, expectedError);
+      const iterable =
+        client.searchRelatedAccountGroupMembershipsAsync(request);
+      await assert.rejects(async () => {
+        const responses: protos.google.cloud.recaptchaenterprise.v1.IRelatedAccountGroupMembership[] =
+          [];
+        for await (const resource of iterable) {
+          responses.push(resource!);
+        }
+      });
+      assert.deepStrictEqual(
+        (
+          client.descriptors.page.searchRelatedAccountGroupMemberships
+            .asyncIterate as SinonStub
+        ).getCall(0).args[1],
+        request
+      );
+      assert.strictEqual(
+        (
+          client.descriptors.page.searchRelatedAccountGroupMemberships
+            .asyncIterate as SinonStub
+        ).getCall(0).args[2].otherArgs.headers['x-goog-request-params'],
+        expectedHeaderRequestParams
+      );
+    });
+  });
+
   describe('Path templates', () => {
     describe('assessment', () => {
       const fakePath = '/rendered/path/assessment';
@@ -1674,5 +2746,152 @@ describe('v1.RecaptchaEnterpriseServiceClient', () => {
         );
       });
     });
+
+    describe('relatedAccountGroup', () => {
+      const fakePath = '/rendered/path/relatedAccountGroup';
+      const expectedParameters = {
+        project: 'projectValue',
+        relatedaccountgroup: 'relatedaccountgroupValue',
+      };
+      const client =
+        new recaptchaenterpriseserviceModule.v1.RecaptchaEnterpriseServiceClient(
+          {
+            credentials: {client_email: 'bogus', private_key: 'bogus'},
+            projectId: 'bogus',
+          }
+        );
+      client.initialize();
+      client.pathTemplates.relatedAccountGroupPathTemplate.render = sinon
+        .stub()
+        .returns(fakePath);
+      client.pathTemplates.relatedAccountGroupPathTemplate.match = sinon
+        .stub()
+        .returns(expectedParameters);
+
+      it('relatedAccountGroupPath', () => {
+        const result = client.relatedAccountGroupPath(
+          'projectValue',
+          'relatedaccountgroupValue'
+        );
+        assert.strictEqual(result, fakePath);
+        assert(
+          (
+            client.pathTemplates.relatedAccountGroupPathTemplate
+              .render as SinonStub
+          )
+            .getCall(-1)
+            .calledWith(expectedParameters)
+        );
+      });
+
+      it('matchProjectFromRelatedAccountGroupName', () => {
+        const result = client.matchProjectFromRelatedAccountGroupName(fakePath);
+        assert.strictEqual(result, 'projectValue');
+        assert(
+          (
+            client.pathTemplates.relatedAccountGroupPathTemplate
+              .match as SinonStub
+          )
+            .getCall(-1)
+            .calledWith(fakePath)
+        );
+      });
+
+      it('matchRelatedaccountgroupFromRelatedAccountGroupName', () => {
+        const result =
+          client.matchRelatedaccountgroupFromRelatedAccountGroupName(fakePath);
+        assert.strictEqual(result, 'relatedaccountgroupValue');
+        assert(
+          (
+            client.pathTemplates.relatedAccountGroupPathTemplate
+              .match as SinonStub
+          )
+            .getCall(-1)
+            .calledWith(fakePath)
+        );
+      });
+    });
+
+    describe('relatedAccountGroupMembership', () => {
+      const fakePath = '/rendered/path/relatedAccountGroupMembership';
+      const expectedParameters = {
+        project: 'projectValue',
+        relatedaccountgroup: 'relatedaccountgroupValue',
+        membership: 'membershipValue',
+      };
+      const client =
+        new recaptchaenterpriseserviceModule.v1.RecaptchaEnterpriseServiceClient(
+          {
+            credentials: {client_email: 'bogus', private_key: 'bogus'},
+            projectId: 'bogus',
+          }
+        );
+      client.initialize();
+      client.pathTemplates.relatedAccountGroupMembershipPathTemplate.render =
+        sinon.stub().returns(fakePath);
+      client.pathTemplates.relatedAccountGroupMembershipPathTemplate.match =
+        sinon.stub().returns(expectedParameters);
+
+      it('relatedAccountGroupMembershipPath', () => {
+        const result = client.relatedAccountGroupMembershipPath(
+          'projectValue',
+          'relatedaccountgroupValue',
+          'membershipValue'
+        );
+        assert.strictEqual(result, fakePath);
+        assert(
+          (
+            client.pathTemplates.relatedAccountGroupMembershipPathTemplate
+              .render as SinonStub
+          )
+            .getCall(-1)
+            .calledWith(expectedParameters)
+        );
+      });
+
+      it('matchProjectFromRelatedAccountGroupMembershipName', () => {
+        const result =
+          client.matchProjectFromRelatedAccountGroupMembershipName(fakePath);
+        assert.strictEqual(result, 'projectValue');
+        assert(
+          (
+            client.pathTemplates.relatedAccountGroupMembershipPathTemplate
+              .match as SinonStub
+          )
+            .getCall(-1)
+            .calledWith(fakePath)
+        );
+      });
+
+      it('matchRelatedaccountgroupFromRelatedAccountGroupMembershipName', () => {
+        const result =
+          client.matchRelatedaccountgroupFromRelatedAccountGroupMembershipName(
+            fakePath
+          );
+        assert.strictEqual(result, 'relatedaccountgroupValue');
+        assert(
+          (
+            client.pathTemplates.relatedAccountGroupMembershipPathTemplate
+              .match as SinonStub
+          )
+            .getCall(-1)
+            .calledWith(fakePath)
+        );
+      });
+
+      it('matchMembershipFromRelatedAccountGroupMembershipName', () => {
+        const result =
+          client.matchMembershipFromRelatedAccountGroupMembershipName(fakePath);
+        assert.strictEqual(result, 'membershipValue');
+        assert(
+          (
+            client.pathTemplates.relatedAccountGroupMembershipPathTemplate
+              .match as SinonStub
+          )
+            .getCall(-1)
+            .calledWith(fakePath)
+        );
+      });
+    });
   });
 });