chore(docs): Add new discovery artifacts and reference documents
diff --git a/docs/dyn/bigquery_v2.jobs.html b/docs/dyn/bigquery_v2.jobs.html
index 859d1f6..f0a0ffa 100644
--- a/docs/dyn/bigquery_v2.jobs.html
+++ b/docs/dyn/bigquery_v2.jobs.html
@@ -474,6 +474,11 @@
         "billingTier": 42, # [Output-only] Billing tier for the job.
         "cacheHit": True or False, # [Output-only] Whether the query result was fetched from the query cache.
         "ddlAffectedRowAccessPolicyCount": "A String", # [Output-only] [Preview] The number of row access policies affected by a DDL statement. Present only for DROP ALL ROW ACCESS POLICIES queries.
+        "ddlDestinationTable": { # [Output-only] The DDL destination table. Present only for ALTER TABLE RENAME TO queries. Note that ddl_target_table is used just for its type information.
+          "datasetId": "A String", # [Required] The ID of the dataset containing this table.
+          "projectId": "A String", # [Required] The ID of the project containing this table.
+          "tableId": "A String", # [Required] The ID of the table. The ID must contain only letters (a-z, A-Z), numbers (0-9), or underscores (_). The maximum length is 1,024 characters.
+        },
         "ddlOperationPerformed": "A String", # The DDL operation performed, possibly dependent on the pre-existence of the DDL target. Possible values (new values might be added in the future): "CREATE": The query created the DDL target. "SKIP": No-op. Example cases: the query is CREATE TABLE IF NOT EXISTS while the table already exists, or the query is DROP TABLE IF EXISTS while the table does not exist. "REPLACE": The query replaced the DDL target. Example case: the query is CREATE OR REPLACE TABLE, and the table already exists. "DROP": The query deleted the DDL target.
         "ddlTargetDataset": { # [Output-only] The DDL target dataset. Present only for CREATE/ALTER/DROP SCHEMA queries.
           "datasetId": "A String", # [Required] A unique ID for this dataset, without the project name. The ID must contain only letters (a-z, A-Z), numbers (0-9), or underscores (_). The maximum length is 1,024 characters.
@@ -1076,6 +1081,11 @@
       "billingTier": 42, # [Output-only] Billing tier for the job.
       "cacheHit": True or False, # [Output-only] Whether the query result was fetched from the query cache.
       "ddlAffectedRowAccessPolicyCount": "A String", # [Output-only] [Preview] The number of row access policies affected by a DDL statement. Present only for DROP ALL ROW ACCESS POLICIES queries.
+      "ddlDestinationTable": { # [Output-only] The DDL destination table. Present only for ALTER TABLE RENAME TO queries. Note that ddl_target_table is used just for its type information.
+        "datasetId": "A String", # [Required] The ID of the dataset containing this table.
+        "projectId": "A String", # [Required] The ID of the project containing this table.
+        "tableId": "A String", # [Required] The ID of the table. The ID must contain only letters (a-z, A-Z), numbers (0-9), or underscores (_). The maximum length is 1,024 characters.
+      },
       "ddlOperationPerformed": "A String", # The DDL operation performed, possibly dependent on the pre-existence of the DDL target. Possible values (new values might be added in the future): "CREATE": The query created the DDL target. "SKIP": No-op. Example cases: the query is CREATE TABLE IF NOT EXISTS while the table already exists, or the query is DROP TABLE IF EXISTS while the table does not exist. "REPLACE": The query replaced the DDL target. Example case: the query is CREATE OR REPLACE TABLE, and the table already exists. "DROP": The query deleted the DDL target.
       "ddlTargetDataset": { # [Output-only] The DDL target dataset. Present only for CREATE/ALTER/DROP SCHEMA queries.
         "datasetId": "A String", # [Required] A unique ID for this dataset, without the project name. The ID must contain only letters (a-z, A-Z), numbers (0-9), or underscores (_). The maximum length is 1,024 characters.
@@ -1747,6 +1757,11 @@
       "billingTier": 42, # [Output-only] Billing tier for the job.
       "cacheHit": True or False, # [Output-only] Whether the query result was fetched from the query cache.
       "ddlAffectedRowAccessPolicyCount": "A String", # [Output-only] [Preview] The number of row access policies affected by a DDL statement. Present only for DROP ALL ROW ACCESS POLICIES queries.
+      "ddlDestinationTable": { # [Output-only] The DDL destination table. Present only for ALTER TABLE RENAME TO queries. Note that ddl_target_table is used just for its type information.
+        "datasetId": "A String", # [Required] The ID of the dataset containing this table.
+        "projectId": "A String", # [Required] The ID of the project containing this table.
+        "tableId": "A String", # [Required] The ID of the table. The ID must contain only letters (a-z, A-Z), numbers (0-9), or underscores (_). The maximum length is 1,024 characters.
+      },
       "ddlOperationPerformed": "A String", # The DDL operation performed, possibly dependent on the pre-existence of the DDL target. Possible values (new values might be added in the future): "CREATE": The query created the DDL target. "SKIP": No-op. Example cases: the query is CREATE TABLE IF NOT EXISTS while the table already exists, or the query is DROP TABLE IF EXISTS while the table does not exist. "REPLACE": The query replaced the DDL target. Example case: the query is CREATE OR REPLACE TABLE, and the table already exists. "DROP": The query deleted the DDL target.
       "ddlTargetDataset": { # [Output-only] The DDL target dataset. Present only for CREATE/ALTER/DROP SCHEMA queries.
         "datasetId": "A String", # [Required] A unique ID for this dataset, without the project name. The ID must contain only letters (a-z, A-Z), numbers (0-9), or underscores (_). The maximum length is 1,024 characters.
@@ -2324,6 +2339,11 @@
       "billingTier": 42, # [Output-only] Billing tier for the job.
       "cacheHit": True or False, # [Output-only] Whether the query result was fetched from the query cache.
       "ddlAffectedRowAccessPolicyCount": "A String", # [Output-only] [Preview] The number of row access policies affected by a DDL statement. Present only for DROP ALL ROW ACCESS POLICIES queries.
+      "ddlDestinationTable": { # [Output-only] The DDL destination table. Present only for ALTER TABLE RENAME TO queries. Note that ddl_target_table is used just for its type information.
+        "datasetId": "A String", # [Required] The ID of the dataset containing this table.
+        "projectId": "A String", # [Required] The ID of the project containing this table.
+        "tableId": "A String", # [Required] The ID of the table. The ID must contain only letters (a-z, A-Z), numbers (0-9), or underscores (_). The maximum length is 1,024 characters.
+      },
       "ddlOperationPerformed": "A String", # The DDL operation performed, possibly dependent on the pre-existence of the DDL target. Possible values (new values might be added in the future): "CREATE": The query created the DDL target. "SKIP": No-op. Example cases: the query is CREATE TABLE IF NOT EXISTS while the table already exists, or the query is DROP TABLE IF EXISTS while the table does not exist. "REPLACE": The query replaced the DDL target. Example case: the query is CREATE OR REPLACE TABLE, and the table already exists. "DROP": The query deleted the DDL target.
       "ddlTargetDataset": { # [Output-only] The DDL target dataset. Present only for CREATE/ALTER/DROP SCHEMA queries.
         "datasetId": "A String", # [Required] A unique ID for this dataset, without the project name. The ID must contain only letters (a-z, A-Z), numbers (0-9), or underscores (_). The maximum length is 1,024 characters.
@@ -2929,6 +2949,11 @@
           "billingTier": 42, # [Output-only] Billing tier for the job.
           "cacheHit": True or False, # [Output-only] Whether the query result was fetched from the query cache.
           "ddlAffectedRowAccessPolicyCount": "A String", # [Output-only] [Preview] The number of row access policies affected by a DDL statement. Present only for DROP ALL ROW ACCESS POLICIES queries.
+          "ddlDestinationTable": { # [Output-only] The DDL destination table. Present only for ALTER TABLE RENAME TO queries. Note that ddl_target_table is used just for its type information.
+            "datasetId": "A String", # [Required] The ID of the dataset containing this table.
+            "projectId": "A String", # [Required] The ID of the project containing this table.
+            "tableId": "A String", # [Required] The ID of the table. The ID must contain only letters (a-z, A-Z), numbers (0-9), or underscores (_). The maximum length is 1,024 characters.
+          },
           "ddlOperationPerformed": "A String", # The DDL operation performed, possibly dependent on the pre-existence of the DDL target. Possible values (new values might be added in the future): "CREATE": The query created the DDL target. "SKIP": No-op. Example cases: the query is CREATE TABLE IF NOT EXISTS while the table already exists, or the query is DROP TABLE IF EXISTS while the table does not exist. "REPLACE": The query replaced the DDL target. Example case: the query is CREATE OR REPLACE TABLE, and the table already exists. "DROP": The query deleted the DDL target.
           "ddlTargetDataset": { # [Output-only] The DDL target dataset. Present only for CREATE/ALTER/DROP SCHEMA queries.
             "datasetId": "A String", # [Required] A unique ID for this dataset, without the project name. The ID must contain only letters (a-z, A-Z), numbers (0-9), or underscores (_). The maximum length is 1,024 characters.
diff --git a/docs/dyn/dlp_v2.organizations.deidentifyTemplates.html b/docs/dyn/dlp_v2.organizations.deidentifyTemplates.html
index e1ea0b0..94bc0e0 100644
--- a/docs/dyn/dlp_v2.organizations.deidentifyTemplates.html
+++ b/docs/dyn/dlp_v2.organizations.deidentifyTemplates.html
@@ -383,7 +383,7 @@
                 "logicalOperator": "A String", # The operator to apply to the result of conditions. Default and currently only supported value is `AND`.
               },
             },
-            "fields": [ # Required. Input field(s) to apply the transformation to.
+            "fields": [ # Required. Input field(s) to apply the transformation to. When you have columns that reference their position within a list, omit the index from the FieldId. FieldId name matching ignores the index. For example, instead of "contact.nums[0].type", use "contact.nums.type".
               { # General identifier of a data field in a storage service.
                 "name": "A String", # Name describing the field.
               },
@@ -1178,7 +1178,7 @@
               "logicalOperator": "A String", # The operator to apply to the result of conditions. Default and currently only supported value is `AND`.
             },
           },
-          "fields": [ # Required. Input field(s) to apply the transformation to.
+          "fields": [ # Required. Input field(s) to apply the transformation to. When you have columns that reference their position within a list, omit the index from the FieldId. FieldId name matching ignores the index. For example, instead of "contact.nums[0].type", use "contact.nums.type".
             { # General identifier of a data field in a storage service.
               "name": "A String", # Name describing the field.
             },
@@ -1995,7 +1995,7 @@
               "logicalOperator": "A String", # The operator to apply to the result of conditions. Default and currently only supported value is `AND`.
             },
           },
-          "fields": [ # Required. Input field(s) to apply the transformation to.
+          "fields": [ # Required. Input field(s) to apply the transformation to. When you have columns that reference their position within a list, omit the index from the FieldId. FieldId name matching ignores the index. For example, instead of "contact.nums[0].type", use "contact.nums.type".
             { # General identifier of a data field in a storage service.
               "name": "A String", # Name describing the field.
             },
@@ -2800,7 +2800,7 @@
                   "logicalOperator": "A String", # The operator to apply to the result of conditions. Default and currently only supported value is `AND`.
                 },
               },
-              "fields": [ # Required. Input field(s) to apply the transformation to.
+              "fields": [ # Required. Input field(s) to apply the transformation to. When you have columns that reference their position within a list, omit the index from the FieldId. FieldId name matching ignores the index. For example, instead of "contact.nums[0].type", use "contact.nums.type".
                 { # General identifier of a data field in a storage service.
                   "name": "A String", # Name describing the field.
                 },
@@ -3612,7 +3612,7 @@
                 "logicalOperator": "A String", # The operator to apply to the result of conditions. Default and currently only supported value is `AND`.
               },
             },
-            "fields": [ # Required. Input field(s) to apply the transformation to.
+            "fields": [ # Required. Input field(s) to apply the transformation to. When you have columns that reference their position within a list, omit the index from the FieldId. FieldId name matching ignores the index. For example, instead of "contact.nums[0].type", use "contact.nums.type".
               { # General identifier of a data field in a storage service.
                 "name": "A String", # Name describing the field.
               },
@@ -4406,7 +4406,7 @@
               "logicalOperator": "A String", # The operator to apply to the result of conditions. Default and currently only supported value is `AND`.
             },
           },
-          "fields": [ # Required. Input field(s) to apply the transformation to.
+          "fields": [ # Required. Input field(s) to apply the transformation to. When you have columns that reference their position within a list, omit the index from the FieldId. FieldId name matching ignores the index. For example, instead of "contact.nums[0].type", use "contact.nums.type".
             { # General identifier of a data field in a storage service.
               "name": "A String", # Name describing the field.
             },
diff --git a/docs/dyn/dlp_v2.organizations.locations.deidentifyTemplates.html b/docs/dyn/dlp_v2.organizations.locations.deidentifyTemplates.html
index b56c99e..421af29 100644
--- a/docs/dyn/dlp_v2.organizations.locations.deidentifyTemplates.html
+++ b/docs/dyn/dlp_v2.organizations.locations.deidentifyTemplates.html
@@ -383,7 +383,7 @@
                 "logicalOperator": "A String", # The operator to apply to the result of conditions. Default and currently only supported value is `AND`.
               },
             },
-            "fields": [ # Required. Input field(s) to apply the transformation to.
+            "fields": [ # Required. Input field(s) to apply the transformation to. When you have columns that reference their position within a list, omit the index from the FieldId. FieldId name matching ignores the index. For example, instead of "contact.nums[0].type", use "contact.nums.type".
               { # General identifier of a data field in a storage service.
                 "name": "A String", # Name describing the field.
               },
@@ -1178,7 +1178,7 @@
               "logicalOperator": "A String", # The operator to apply to the result of conditions. Default and currently only supported value is `AND`.
             },
           },
-          "fields": [ # Required. Input field(s) to apply the transformation to.
+          "fields": [ # Required. Input field(s) to apply the transformation to. When you have columns that reference their position within a list, omit the index from the FieldId. FieldId name matching ignores the index. For example, instead of "contact.nums[0].type", use "contact.nums.type".
             { # General identifier of a data field in a storage service.
               "name": "A String", # Name describing the field.
             },
@@ -1995,7 +1995,7 @@
               "logicalOperator": "A String", # The operator to apply to the result of conditions. Default and currently only supported value is `AND`.
             },
           },
-          "fields": [ # Required. Input field(s) to apply the transformation to.
+          "fields": [ # Required. Input field(s) to apply the transformation to. When you have columns that reference their position within a list, omit the index from the FieldId. FieldId name matching ignores the index. For example, instead of "contact.nums[0].type", use "contact.nums.type".
             { # General identifier of a data field in a storage service.
               "name": "A String", # Name describing the field.
             },
@@ -2800,7 +2800,7 @@
                   "logicalOperator": "A String", # The operator to apply to the result of conditions. Default and currently only supported value is `AND`.
                 },
               },
-              "fields": [ # Required. Input field(s) to apply the transformation to.
+              "fields": [ # Required. Input field(s) to apply the transformation to. When you have columns that reference their position within a list, omit the index from the FieldId. FieldId name matching ignores the index. For example, instead of "contact.nums[0].type", use "contact.nums.type".
                 { # General identifier of a data field in a storage service.
                   "name": "A String", # Name describing the field.
                 },
@@ -3612,7 +3612,7 @@
                 "logicalOperator": "A String", # The operator to apply to the result of conditions. Default and currently only supported value is `AND`.
               },
             },
-            "fields": [ # Required. Input field(s) to apply the transformation to.
+            "fields": [ # Required. Input field(s) to apply the transformation to. When you have columns that reference their position within a list, omit the index from the FieldId. FieldId name matching ignores the index. For example, instead of "contact.nums[0].type", use "contact.nums.type".
               { # General identifier of a data field in a storage service.
                 "name": "A String", # Name describing the field.
               },
@@ -4406,7 +4406,7 @@
               "logicalOperator": "A String", # The operator to apply to the result of conditions. Default and currently only supported value is `AND`.
             },
           },
-          "fields": [ # Required. Input field(s) to apply the transformation to.
+          "fields": [ # Required. Input field(s) to apply the transformation to. When you have columns that reference their position within a list, omit the index from the FieldId. FieldId name matching ignores the index. For example, instead of "contact.nums[0].type", use "contact.nums.type".
             { # General identifier of a data field in a storage service.
               "name": "A String", # Name describing the field.
             },
diff --git a/docs/dyn/dlp_v2.projects.content.html b/docs/dyn/dlp_v2.projects.content.html
index 3eff83c..c43ec43 100644
--- a/docs/dyn/dlp_v2.projects.content.html
+++ b/docs/dyn/dlp_v2.projects.content.html
@@ -372,7 +372,7 @@
               "logicalOperator": "A String", # The operator to apply to the result of conditions. Default and currently only supported value is `AND`.
             },
           },
-          "fields": [ # Required. Input field(s) to apply the transformation to.
+          "fields": [ # Required. Input field(s) to apply the transformation to. When you have columns that reference their position within a list, omit the index from the FieldId. FieldId name matching ignores the index. For example, instead of "contact.nums[0].type", use "contact.nums.type".
             { # General identifier of a data field in a storage service.
               "name": "A String", # Name describing the field.
             },
@@ -1143,7 +1143,7 @@
                 "logicalOperator": "A String", # The operator to apply to the result of conditions. Default and currently only supported value is `AND`.
               },
             },
-            "fields": [ # Required. Input field(s) to apply the transformation to.
+            "fields": [ # Required. Input field(s) to apply the transformation to. When you have columns that reference their position within a list, omit the index from the FieldId. FieldId name matching ignores the index. For example, instead of "contact.nums[0].type", use "contact.nums.type".
               { # General identifier of a data field in a storage service.
                 "name": "A String", # Name describing the field.
               },
@@ -2648,7 +2648,7 @@
               "logicalOperator": "A String", # The operator to apply to the result of conditions. Default and currently only supported value is `AND`.
             },
           },
-          "fields": [ # Required. Input field(s) to apply the transformation to.
+          "fields": [ # Required. Input field(s) to apply the transformation to. When you have columns that reference their position within a list, omit the index from the FieldId. FieldId name matching ignores the index. For example, instead of "contact.nums[0].type", use "contact.nums.type".
             { # General identifier of a data field in a storage service.
               "name": "A String", # Name describing the field.
             },
@@ -3247,7 +3247,7 @@
                 "logicalOperator": "A String", # The operator to apply to the result of conditions. Default and currently only supported value is `AND`.
               },
             },
-            "fields": [ # Required. Input field(s) to apply the transformation to.
+            "fields": [ # Required. Input field(s) to apply the transformation to. When you have columns that reference their position within a list, omit the index from the FieldId. FieldId name matching ignores the index. For example, instead of "contact.nums[0].type", use "contact.nums.type".
               { # General identifier of a data field in a storage service.
                 "name": "A String", # Name describing the field.
               },
diff --git a/docs/dyn/dlp_v2.projects.deidentifyTemplates.html b/docs/dyn/dlp_v2.projects.deidentifyTemplates.html
index 8d4a938..dbd7294 100644
--- a/docs/dyn/dlp_v2.projects.deidentifyTemplates.html
+++ b/docs/dyn/dlp_v2.projects.deidentifyTemplates.html
@@ -383,7 +383,7 @@
                 "logicalOperator": "A String", # The operator to apply to the result of conditions. Default and currently only supported value is `AND`.
               },
             },
-            "fields": [ # Required. Input field(s) to apply the transformation to.
+            "fields": [ # Required. Input field(s) to apply the transformation to. When you have columns that reference their position within a list, omit the index from the FieldId. FieldId name matching ignores the index. For example, instead of "contact.nums[0].type", use "contact.nums.type".
               { # General identifier of a data field in a storage service.
                 "name": "A String", # Name describing the field.
               },
@@ -1178,7 +1178,7 @@
               "logicalOperator": "A String", # The operator to apply to the result of conditions. Default and currently only supported value is `AND`.
             },
           },
-          "fields": [ # Required. Input field(s) to apply the transformation to.
+          "fields": [ # Required. Input field(s) to apply the transformation to. When you have columns that reference their position within a list, omit the index from the FieldId. FieldId name matching ignores the index. For example, instead of "contact.nums[0].type", use "contact.nums.type".
             { # General identifier of a data field in a storage service.
               "name": "A String", # Name describing the field.
             },
@@ -1995,7 +1995,7 @@
               "logicalOperator": "A String", # The operator to apply to the result of conditions. Default and currently only supported value is `AND`.
             },
           },
-          "fields": [ # Required. Input field(s) to apply the transformation to.
+          "fields": [ # Required. Input field(s) to apply the transformation to. When you have columns that reference their position within a list, omit the index from the FieldId. FieldId name matching ignores the index. For example, instead of "contact.nums[0].type", use "contact.nums.type".
             { # General identifier of a data field in a storage service.
               "name": "A String", # Name describing the field.
             },
@@ -2800,7 +2800,7 @@
                   "logicalOperator": "A String", # The operator to apply to the result of conditions. Default and currently only supported value is `AND`.
                 },
               },
-              "fields": [ # Required. Input field(s) to apply the transformation to.
+              "fields": [ # Required. Input field(s) to apply the transformation to. When you have columns that reference their position within a list, omit the index from the FieldId. FieldId name matching ignores the index. For example, instead of "contact.nums[0].type", use "contact.nums.type".
                 { # General identifier of a data field in a storage service.
                   "name": "A String", # Name describing the field.
                 },
@@ -3612,7 +3612,7 @@
                 "logicalOperator": "A String", # The operator to apply to the result of conditions. Default and currently only supported value is `AND`.
               },
             },
-            "fields": [ # Required. Input field(s) to apply the transformation to.
+            "fields": [ # Required. Input field(s) to apply the transformation to. When you have columns that reference their position within a list, omit the index from the FieldId. FieldId name matching ignores the index. For example, instead of "contact.nums[0].type", use "contact.nums.type".
               { # General identifier of a data field in a storage service.
                 "name": "A String", # Name describing the field.
               },
@@ -4406,7 +4406,7 @@
               "logicalOperator": "A String", # The operator to apply to the result of conditions. Default and currently only supported value is `AND`.
             },
           },
-          "fields": [ # Required. Input field(s) to apply the transformation to.
+          "fields": [ # Required. Input field(s) to apply the transformation to. When you have columns that reference their position within a list, omit the index from the FieldId. FieldId name matching ignores the index. For example, instead of "contact.nums[0].type", use "contact.nums.type".
             { # General identifier of a data field in a storage service.
               "name": "A String", # Name describing the field.
             },
diff --git a/docs/dyn/dlp_v2.projects.locations.content.html b/docs/dyn/dlp_v2.projects.locations.content.html
index 5e4b96f..bc47f7b 100644
--- a/docs/dyn/dlp_v2.projects.locations.content.html
+++ b/docs/dyn/dlp_v2.projects.locations.content.html
@@ -372,7 +372,7 @@
               "logicalOperator": "A String", # The operator to apply to the result of conditions. Default and currently only supported value is `AND`.
             },
           },
-          "fields": [ # Required. Input field(s) to apply the transformation to.
+          "fields": [ # Required. Input field(s) to apply the transformation to. When you have columns that reference their position within a list, omit the index from the FieldId. FieldId name matching ignores the index. For example, instead of "contact.nums[0].type", use "contact.nums.type".
             { # General identifier of a data field in a storage service.
               "name": "A String", # Name describing the field.
             },
@@ -1143,7 +1143,7 @@
                 "logicalOperator": "A String", # The operator to apply to the result of conditions. Default and currently only supported value is `AND`.
               },
             },
-            "fields": [ # Required. Input field(s) to apply the transformation to.
+            "fields": [ # Required. Input field(s) to apply the transformation to. When you have columns that reference their position within a list, omit the index from the FieldId. FieldId name matching ignores the index. For example, instead of "contact.nums[0].type", use "contact.nums.type".
               { # General identifier of a data field in a storage service.
                 "name": "A String", # Name describing the field.
               },
@@ -2648,7 +2648,7 @@
               "logicalOperator": "A String", # The operator to apply to the result of conditions. Default and currently only supported value is `AND`.
             },
           },
-          "fields": [ # Required. Input field(s) to apply the transformation to.
+          "fields": [ # Required. Input field(s) to apply the transformation to. When you have columns that reference their position within a list, omit the index from the FieldId. FieldId name matching ignores the index. For example, instead of "contact.nums[0].type", use "contact.nums.type".
             { # General identifier of a data field in a storage service.
               "name": "A String", # Name describing the field.
             },
@@ -3247,7 +3247,7 @@
                 "logicalOperator": "A String", # The operator to apply to the result of conditions. Default and currently only supported value is `AND`.
               },
             },
-            "fields": [ # Required. Input field(s) to apply the transformation to.
+            "fields": [ # Required. Input field(s) to apply the transformation to. When you have columns that reference their position within a list, omit the index from the FieldId. FieldId name matching ignores the index. For example, instead of "contact.nums[0].type", use "contact.nums.type".
               { # General identifier of a data field in a storage service.
                 "name": "A String", # Name describing the field.
               },
diff --git a/docs/dyn/dlp_v2.projects.locations.deidentifyTemplates.html b/docs/dyn/dlp_v2.projects.locations.deidentifyTemplates.html
index 2667dc1..20937c9 100644
--- a/docs/dyn/dlp_v2.projects.locations.deidentifyTemplates.html
+++ b/docs/dyn/dlp_v2.projects.locations.deidentifyTemplates.html
@@ -383,7 +383,7 @@
                 "logicalOperator": "A String", # The operator to apply to the result of conditions. Default and currently only supported value is `AND`.
               },
             },
-            "fields": [ # Required. Input field(s) to apply the transformation to.
+            "fields": [ # Required. Input field(s) to apply the transformation to. When you have columns that reference their position within a list, omit the index from the FieldId. FieldId name matching ignores the index. For example, instead of "contact.nums[0].type", use "contact.nums.type".
               { # General identifier of a data field in a storage service.
                 "name": "A String", # Name describing the field.
               },
@@ -1178,7 +1178,7 @@
               "logicalOperator": "A String", # The operator to apply to the result of conditions. Default and currently only supported value is `AND`.
             },
           },
-          "fields": [ # Required. Input field(s) to apply the transformation to.
+          "fields": [ # Required. Input field(s) to apply the transformation to. When you have columns that reference their position within a list, omit the index from the FieldId. FieldId name matching ignores the index. For example, instead of "contact.nums[0].type", use "contact.nums.type".
             { # General identifier of a data field in a storage service.
               "name": "A String", # Name describing the field.
             },
@@ -1995,7 +1995,7 @@
               "logicalOperator": "A String", # The operator to apply to the result of conditions. Default and currently only supported value is `AND`.
             },
           },
-          "fields": [ # Required. Input field(s) to apply the transformation to.
+          "fields": [ # Required. Input field(s) to apply the transformation to. When you have columns that reference their position within a list, omit the index from the FieldId. FieldId name matching ignores the index. For example, instead of "contact.nums[0].type", use "contact.nums.type".
             { # General identifier of a data field in a storage service.
               "name": "A String", # Name describing the field.
             },
@@ -2800,7 +2800,7 @@
                   "logicalOperator": "A String", # The operator to apply to the result of conditions. Default and currently only supported value is `AND`.
                 },
               },
-              "fields": [ # Required. Input field(s) to apply the transformation to.
+              "fields": [ # Required. Input field(s) to apply the transformation to. When you have columns that reference their position within a list, omit the index from the FieldId. FieldId name matching ignores the index. For example, instead of "contact.nums[0].type", use "contact.nums.type".
                 { # General identifier of a data field in a storage service.
                   "name": "A String", # Name describing the field.
                 },
@@ -3612,7 +3612,7 @@
                 "logicalOperator": "A String", # The operator to apply to the result of conditions. Default and currently only supported value is `AND`.
               },
             },
-            "fields": [ # Required. Input field(s) to apply the transformation to.
+            "fields": [ # Required. Input field(s) to apply the transformation to. When you have columns that reference their position within a list, omit the index from the FieldId. FieldId name matching ignores the index. For example, instead of "contact.nums[0].type", use "contact.nums.type".
               { # General identifier of a data field in a storage service.
                 "name": "A String", # Name describing the field.
               },
@@ -4406,7 +4406,7 @@
               "logicalOperator": "A String", # The operator to apply to the result of conditions. Default and currently only supported value is `AND`.
             },
           },
-          "fields": [ # Required. Input field(s) to apply the transformation to.
+          "fields": [ # Required. Input field(s) to apply the transformation to. When you have columns that reference their position within a list, omit the index from the FieldId. FieldId name matching ignores the index. For example, instead of "contact.nums[0].type", use "contact.nums.type".
             { # General identifier of a data field in a storage service.
               "name": "A String", # Name describing the field.
             },
diff --git a/docs/dyn/firebasestorage_v1beta.projects.buckets.html b/docs/dyn/firebasestorage_v1beta.projects.buckets.html
index f56592d..7e77bbd 100644
--- a/docs/dyn/firebasestorage_v1beta.projects.buckets.html
+++ b/docs/dyn/firebasestorage_v1beta.projects.buckets.html
@@ -115,7 +115,6 @@
 
     { # A storage bucket and its relation to a parent Firebase project.
   "name": "A String", # Resource name of the bucket.
-  "reconciling": True or False, # Output only. Represents whether a bucket is being moved to a new location, in which case reconciling is set to true.
 }</pre>
 </div>
 
@@ -140,7 +139,6 @@
 
     { # A storage bucket and its relation to a parent Firebase project.
   &quot;name&quot;: &quot;A String&quot;, # Resource name of the bucket.
-  &quot;reconciling&quot;: True or False, # Output only. Represents whether a bucket is being moved to a new location, in which case reconciling is set to true.
 }</pre>
 </div>
 
@@ -164,7 +162,6 @@
   &quot;buckets&quot;: [ # The list of linked buckets.
     { # A storage bucket and its relation to a parent Firebase project.
       &quot;name&quot;: &quot;A String&quot;, # Resource name of the bucket.
-      &quot;reconciling&quot;: True or False, # Output only. Represents whether a bucket is being moved to a new location, in which case reconciling is set to true.
     },
   ],
   &quot;nextPageToken&quot;: &quot;A String&quot;, # A token that can be sent as `page_token` to retrieve the next page. If this field is omitted, there are no subsequent pages.
diff --git a/docs/dyn/recaptchaenterprise_v1.html b/docs/dyn/recaptchaenterprise_v1.html
new file mode 100644
index 0000000..2d401c7
--- /dev/null
+++ b/docs/dyn/recaptchaenterprise_v1.html
@@ -0,0 +1,111 @@
+<html><body>
+<style>
+
+body, h1, h2, h3, div, span, p, pre, a {
+  margin: 0;
+  padding: 0;
+  border: 0;
+  font-weight: inherit;
+  font-style: inherit;
+  font-size: 100%;
+  font-family: inherit;
+  vertical-align: baseline;
+}
+
+body {
+  font-size: 13px;
+  padding: 1em;
+}
+
+h1 {
+  font-size: 26px;
+  margin-bottom: 1em;
+}
+
+h2 {
+  font-size: 24px;
+  margin-bottom: 1em;
+}
+
+h3 {
+  font-size: 20px;
+  margin-bottom: 1em;
+  margin-top: 1em;
+}
+
+pre, code {
+  line-height: 1.5;
+  font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Lucida Console', monospace;
+}
+
+pre {
+  margin-top: 0.5em;
+}
+
+h1, h2, h3, p {
+  font-family: Arial, sans serif;
+}
+
+h1, h2, h3 {
+  border-bottom: solid #CCC 1px;
+}
+
+.toc_element {
+  margin-top: 0.5em;
+}
+
+.firstline {
+  margin-left: 2 em;
+}
+
+.method  {
+  margin-top: 1em;
+  border: solid 1px #CCC;
+  padding: 1em;
+  background: #EEE;
+}
+
+.details {
+  font-weight: bold;
+  font-size: 14px;
+}
+
+</style>
+
+<h1><a href="recaptchaenterprise_v1.html">reCAPTCHA Enterprise API</a></h1>
+<h2>Instance Methods</h2>
+<p class="toc_element">
+  <code><a href="recaptchaenterprise_v1.projects.html">projects()</a></code>
+</p>
+<p class="firstline">Returns the projects Resource.</p>
+
+<p class="toc_element">
+  <code><a href="#close">close()</a></code></p>
+<p class="firstline">Close httplib2 connections.</p>
+<p class="toc_element">
+  <code><a href="#new_batch_http_request">new_batch_http_request()</a></code></p>
+<p class="firstline">Create a BatchHttpRequest object based on the discovery document.</p>
+<h3>Method Details</h3>
+<div class="method">
+    <code class="details" id="close">close()</code>
+  <pre>Close httplib2 connections.</pre>
+</div>
+
+<div class="method">
+    <code class="details" id="new_batch_http_request">new_batch_http_request()</code>
+  <pre>Create a BatchHttpRequest object based on the discovery document.
+
+        Args:
+          callback: callable, A callback to be called for each response, of the
+            form callback(id, response, exception). The first parameter is the
+            request id, and the second is the deserialized response object. The
+            third is an apiclient.errors.HttpError exception object if an HTTP
+            error occurred while processing the request, or None if no error
+            occurred.
+
+        Returns:
+          A BatchHttpRequest object based on the discovery document.
+        </pre>
+</div>
+
+</body></html>
\ No newline at end of file
diff --git a/docs/dyn/recaptchaenterprise_v1.projects.assessments.html b/docs/dyn/recaptchaenterprise_v1.projects.assessments.html
new file mode 100644
index 0000000..94c1e34
--- /dev/null
+++ b/docs/dyn/recaptchaenterprise_v1.projects.assessments.html
@@ -0,0 +1,186 @@
+<html><body>
+<style>
+
+body, h1, h2, h3, div, span, p, pre, a {
+  margin: 0;
+  padding: 0;
+  border: 0;
+  font-weight: inherit;
+  font-style: inherit;
+  font-size: 100%;
+  font-family: inherit;
+  vertical-align: baseline;
+}
+
+body {
+  font-size: 13px;
+  padding: 1em;
+}
+
+h1 {
+  font-size: 26px;
+  margin-bottom: 1em;
+}
+
+h2 {
+  font-size: 24px;
+  margin-bottom: 1em;
+}
+
+h3 {
+  font-size: 20px;
+  margin-bottom: 1em;
+  margin-top: 1em;
+}
+
+pre, code {
+  line-height: 1.5;
+  font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Lucida Console', monospace;
+}
+
+pre {
+  margin-top: 0.5em;
+}
+
+h1, h2, h3, p {
+  font-family: Arial, sans serif;
+}
+
+h1, h2, h3 {
+  border-bottom: solid #CCC 1px;
+}
+
+.toc_element {
+  margin-top: 0.5em;
+}
+
+.firstline {
+  margin-left: 2 em;
+}
+
+.method  {
+  margin-top: 1em;
+  border: solid 1px #CCC;
+  padding: 1em;
+  background: #EEE;
+}
+
+.details {
+  font-weight: bold;
+  font-size: 14px;
+}
+
+</style>
+
+<h1><a href="recaptchaenterprise_v1.html">reCAPTCHA Enterprise API</a> . <a href="recaptchaenterprise_v1.projects.html">projects</a> . <a href="recaptchaenterprise_v1.projects.assessments.html">assessments</a></h1>
+<h2>Instance Methods</h2>
+<p class="toc_element">
+  <code><a href="#annotate">annotate(name, body=None, x__xgafv=None)</a></code></p>
+<p class="firstline">Annotates a previously created Assessment to provide additional information on whether the event turned out to be authentic or fraudulent.</p>
+<p class="toc_element">
+  <code><a href="#close">close()</a></code></p>
+<p class="firstline">Close httplib2 connections.</p>
+<p class="toc_element">
+  <code><a href="#create">create(parent, body=None, x__xgafv=None)</a></code></p>
+<p class="firstline">Creates an Assessment of the likelihood an event is legitimate.</p>
+<h3>Method Details</h3>
+<div class="method">
+    <code class="details" id="annotate">annotate(name, body=None, x__xgafv=None)</code>
+  <pre>Annotates a previously created Assessment to provide additional information on whether the event turned out to be authentic or fraudulent.
+
+Args:
+  name: string, Required. The resource name of the Assessment, in the format &quot;projects/{project}/assessments/{assessment}&quot;. (required)
+  body: object, The request body.
+    The object takes the form of:
+
+{ # The request message to annotate an Assessment.
+  &quot;annotation&quot;: &quot;A String&quot;, # 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.
+  &quot;reasons&quot;: [ # Optional. Optional reasons for the annotation that will be assigned to the Event.
+    &quot;A String&quot;,
+  ],
+}
+
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # Empty response for AnnotateAssessment.
+}</pre>
+</div>
+
+<div class="method">
+    <code class="details" id="close">close()</code>
+  <pre>Close httplib2 connections.</pre>
+</div>
+
+<div class="method">
+    <code class="details" id="create">create(parent, body=None, x__xgafv=None)</code>
+  <pre>Creates an Assessment of the likelihood an event is legitimate.
+
+Args:
+  parent: string, Required. The name of the project in which the assessment will be created, in the format &quot;projects/{project}&quot;. (required)
+  body: object, The request body.
+    The object takes the form of:
+
+{ # A recaptcha assessment resource.
+  &quot;event&quot;: { # The event being assessed.
+    &quot;expectedAction&quot;: &quot;A String&quot;, # Optional. The expected action for this type of event. This should be the same action provided at token generation time on client-side platforms already integrated with recaptcha enterprise.
+    &quot;siteKey&quot;: &quot;A String&quot;, # Optional. The site key that was used to invoke reCAPTCHA on your site and generate the token.
+    &quot;token&quot;: &quot;A String&quot;, # Optional. The user response token provided by the reCAPTCHA client-side integration on your site.
+    &quot;userAgent&quot;: &quot;A String&quot;, # Optional. The user agent present in the request from the user&#x27;s device related to this event.
+    &quot;userIpAddress&quot;: &quot;A String&quot;, # Optional. The IP address in the request from the user&#x27;s device related to this event.
+  },
+  &quot;name&quot;: &quot;A String&quot;, # Output only. The resource name for the Assessment in the format &quot;projects/{project}/assessments/{assessment}&quot;.
+  &quot;riskAnalysis&quot;: { # Risk analysis result for an event. # Output only. The risk analysis result for the event being assessed.
+    &quot;reasons&quot;: [ # Reasons contributing to the risk analysis verdict.
+      &quot;A String&quot;,
+    ],
+    &quot;score&quot;: 3.14, # Legitimate event score from 0.0 to 1.0. (1.0 means very likely legitimate traffic while 0.0 means very likely non-legitimate traffic).
+  },
+  &quot;tokenProperties&quot;: { # Output only. Properties of the provided event token.
+    &quot;action&quot;: &quot;A String&quot;, # Action name provided at token generation.
+    &quot;createTime&quot;: &quot;A String&quot;, # The timestamp corresponding to the generation of the token.
+    &quot;hostname&quot;: &quot;A String&quot;, # The hostname of the page on which the token was generated.
+    &quot;invalidReason&quot;: &quot;A String&quot;, # Reason associated with the response when valid = false.
+    &quot;valid&quot;: True or False, # Whether the provided user response token is valid. When valid = false, the reason could be specified in invalid_reason or it could also be due to a user failing to solve a challenge or a sitekey mismatch (i.e the sitekey used to generate the token was different than the one specified in the assessment).
+  },
+}
+
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # A recaptcha assessment resource.
+  &quot;event&quot;: { # The event being assessed.
+    &quot;expectedAction&quot;: &quot;A String&quot;, # Optional. The expected action for this type of event. This should be the same action provided at token generation time on client-side platforms already integrated with recaptcha enterprise.
+    &quot;siteKey&quot;: &quot;A String&quot;, # Optional. The site key that was used to invoke reCAPTCHA on your site and generate the token.
+    &quot;token&quot;: &quot;A String&quot;, # Optional. The user response token provided by the reCAPTCHA client-side integration on your site.
+    &quot;userAgent&quot;: &quot;A String&quot;, # Optional. The user agent present in the request from the user&#x27;s device related to this event.
+    &quot;userIpAddress&quot;: &quot;A String&quot;, # Optional. The IP address in the request from the user&#x27;s device related to this event.
+  },
+  &quot;name&quot;: &quot;A String&quot;, # Output only. The resource name for the Assessment in the format &quot;projects/{project}/assessments/{assessment}&quot;.
+  &quot;riskAnalysis&quot;: { # Risk analysis result for an event. # Output only. The risk analysis result for the event being assessed.
+    &quot;reasons&quot;: [ # Reasons contributing to the risk analysis verdict.
+      &quot;A String&quot;,
+    ],
+    &quot;score&quot;: 3.14, # Legitimate event score from 0.0 to 1.0. (1.0 means very likely legitimate traffic while 0.0 means very likely non-legitimate traffic).
+  },
+  &quot;tokenProperties&quot;: { # Output only. Properties of the provided event token.
+    &quot;action&quot;: &quot;A String&quot;, # Action name provided at token generation.
+    &quot;createTime&quot;: &quot;A String&quot;, # The timestamp corresponding to the generation of the token.
+    &quot;hostname&quot;: &quot;A String&quot;, # The hostname of the page on which the token was generated.
+    &quot;invalidReason&quot;: &quot;A String&quot;, # Reason associated with the response when valid = false.
+    &quot;valid&quot;: True or False, # Whether the provided user response token is valid. When valid = false, the reason could be specified in invalid_reason or it could also be due to a user failing to solve a challenge or a sitekey mismatch (i.e the sitekey used to generate the token was different than the one specified in the assessment).
+  },
+}</pre>
+</div>
+
+</body></html>
\ No newline at end of file
diff --git a/docs/dyn/recaptchaenterprise_v1.projects.html b/docs/dyn/recaptchaenterprise_v1.projects.html
new file mode 100644
index 0000000..f5f9112
--- /dev/null
+++ b/docs/dyn/recaptchaenterprise_v1.projects.html
@@ -0,0 +1,96 @@
+<html><body>
+<style>
+
+body, h1, h2, h3, div, span, p, pre, a {
+  margin: 0;
+  padding: 0;
+  border: 0;
+  font-weight: inherit;
+  font-style: inherit;
+  font-size: 100%;
+  font-family: inherit;
+  vertical-align: baseline;
+}
+
+body {
+  font-size: 13px;
+  padding: 1em;
+}
+
+h1 {
+  font-size: 26px;
+  margin-bottom: 1em;
+}
+
+h2 {
+  font-size: 24px;
+  margin-bottom: 1em;
+}
+
+h3 {
+  font-size: 20px;
+  margin-bottom: 1em;
+  margin-top: 1em;
+}
+
+pre, code {
+  line-height: 1.5;
+  font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Lucida Console', monospace;
+}
+
+pre {
+  margin-top: 0.5em;
+}
+
+h1, h2, h3, p {
+  font-family: Arial, sans serif;
+}
+
+h1, h2, h3 {
+  border-bottom: solid #CCC 1px;
+}
+
+.toc_element {
+  margin-top: 0.5em;
+}
+
+.firstline {
+  margin-left: 2 em;
+}
+
+.method  {
+  margin-top: 1em;
+  border: solid 1px #CCC;
+  padding: 1em;
+  background: #EEE;
+}
+
+.details {
+  font-weight: bold;
+  font-size: 14px;
+}
+
+</style>
+
+<h1><a href="recaptchaenterprise_v1.html">reCAPTCHA Enterprise API</a> . <a href="recaptchaenterprise_v1.projects.html">projects</a></h1>
+<h2>Instance Methods</h2>
+<p class="toc_element">
+  <code><a href="recaptchaenterprise_v1.projects.assessments.html">assessments()</a></code>
+</p>
+<p class="firstline">Returns the assessments Resource.</p>
+
+<p class="toc_element">
+  <code><a href="recaptchaenterprise_v1.projects.keys.html">keys()</a></code>
+</p>
+<p class="firstline">Returns the keys Resource.</p>
+
+<p class="toc_element">
+  <code><a href="#close">close()</a></code></p>
+<p class="firstline">Close httplib2 connections.</p>
+<h3>Method Details</h3>
+<div class="method">
+    <code class="details" id="close">close()</code>
+  <pre>Close httplib2 connections.</pre>
+</div>
+
+</body></html>
\ No newline at end of file
diff --git a/docs/dyn/recaptchaenterprise_v1.projects.keys.html b/docs/dyn/recaptchaenterprise_v1.projects.keys.html
new file mode 100644
index 0000000..7173cd1
--- /dev/null
+++ b/docs/dyn/recaptchaenterprise_v1.projects.keys.html
@@ -0,0 +1,504 @@
+<html><body>
+<style>
+
+body, h1, h2, h3, div, span, p, pre, a {
+  margin: 0;
+  padding: 0;
+  border: 0;
+  font-weight: inherit;
+  font-style: inherit;
+  font-size: 100%;
+  font-family: inherit;
+  vertical-align: baseline;
+}
+
+body {
+  font-size: 13px;
+  padding: 1em;
+}
+
+h1 {
+  font-size: 26px;
+  margin-bottom: 1em;
+}
+
+h2 {
+  font-size: 24px;
+  margin-bottom: 1em;
+}
+
+h3 {
+  font-size: 20px;
+  margin-bottom: 1em;
+  margin-top: 1em;
+}
+
+pre, code {
+  line-height: 1.5;
+  font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Lucida Console', monospace;
+}
+
+pre {
+  margin-top: 0.5em;
+}
+
+h1, h2, h3, p {
+  font-family: Arial, sans serif;
+}
+
+h1, h2, h3 {
+  border-bottom: solid #CCC 1px;
+}
+
+.toc_element {
+  margin-top: 0.5em;
+}
+
+.firstline {
+  margin-left: 2 em;
+}
+
+.method  {
+  margin-top: 1em;
+  border: solid 1px #CCC;
+  padding: 1em;
+  background: #EEE;
+}
+
+.details {
+  font-weight: bold;
+  font-size: 14px;
+}
+
+</style>
+
+<h1><a href="recaptchaenterprise_v1.html">reCAPTCHA Enterprise API</a> . <a href="recaptchaenterprise_v1.projects.html">projects</a> . <a href="recaptchaenterprise_v1.projects.keys.html">keys</a></h1>
+<h2>Instance Methods</h2>
+<p class="toc_element">
+  <code><a href="#close">close()</a></code></p>
+<p class="firstline">Close httplib2 connections.</p>
+<p class="toc_element">
+  <code><a href="#create">create(parent, body=None, x__xgafv=None)</a></code></p>
+<p class="firstline">Creates a new reCAPTCHA Enterprise key.</p>
+<p class="toc_element">
+  <code><a href="#delete">delete(name, x__xgafv=None)</a></code></p>
+<p class="firstline">Deletes the specified key.</p>
+<p class="toc_element">
+  <code><a href="#get">get(name, x__xgafv=None)</a></code></p>
+<p class="firstline">Returns the specified key.</p>
+<p class="toc_element">
+  <code><a href="#getMetrics">getMetrics(name, x__xgafv=None)</a></code></p>
+<p class="firstline">Get some aggregated metrics for a Key. This data can be used to build dashboards.</p>
+<p class="toc_element">
+  <code><a href="#list">list(parent, pageSize=None, pageToken=None, x__xgafv=None)</a></code></p>
+<p class="firstline">Returns the list of all keys that belong to a project.</p>
+<p class="toc_element">
+  <code><a href="#list_next">list_next(previous_request, previous_response)</a></code></p>
+<p class="firstline">Retrieves the next page of results.</p>
+<p class="toc_element">
+  <code><a href="#migrate">migrate(name, body=None, x__xgafv=None)</a></code></p>
+<p class="firstline">Migrates an existing key from reCAPTCHA to reCAPTCHA Enterprise. Once a key is migrated, it can be used from either product. SiteVerify requests will be billed as CreateAssessment calls.</p>
+<p class="toc_element">
+  <code><a href="#patch">patch(name, body=None, updateMask=None, x__xgafv=None)</a></code></p>
+<p class="firstline">Updates the specified key.</p>
+<h3>Method Details</h3>
+<div class="method">
+    <code class="details" id="close">close()</code>
+  <pre>Close httplib2 connections.</pre>
+</div>
+
+<div class="method">
+    <code class="details" id="create">create(parent, body=None, x__xgafv=None)</code>
+  <pre>Creates a new reCAPTCHA Enterprise key.
+
+Args:
+  parent: string, Required. The name of the project in which the key will be created, in the format &quot;projects/{project}&quot;. (required)
+  body: object, The request body.
+    The object takes the form of:
+
+{ # A key used to identify and configure applications (web and/or mobile) that use reCAPTCHA Enterprise.
+  &quot;androidSettings&quot;: { # Settings specific to keys that can be used by Android apps. # Settings for keys that can be used by Android apps.
+    &quot;allowedPackageNames&quot;: [ # Android package names of apps allowed to use the key. Example: &#x27;com.companyname.appname&#x27;
+      &quot;A String&quot;,
+    ],
+  },
+  &quot;createTime&quot;: &quot;A String&quot;, # The timestamp corresponding to the creation of this Key.
+  &quot;displayName&quot;: &quot;A String&quot;, # Human-readable display name of this key. Modifiable by user.
+  &quot;iosSettings&quot;: { # Settings specific to keys that can be used by iOS apps. # Settings for keys that can be used by iOS apps.
+    &quot;allowedBundleIds&quot;: [ # iOS bundle ids of apps allowed to use the key. Example: &#x27;com.companyname.productname.appname&#x27;
+      &quot;A String&quot;,
+    ],
+  },
+  &quot;labels&quot;: { # See Creating and managing labels.
+    &quot;a_key&quot;: &quot;A String&quot;,
+  },
+  &quot;name&quot;: &quot;A String&quot;, # The resource name for the Key in the format &quot;projects/{project}/keys/{key}&quot;.
+  &quot;testingOptions&quot;: { # Options for user acceptance testing. # Options for user acceptance testing.
+    &quot;testingChallenge&quot;: &quot;A String&quot;, # For challenge-based keys only (CHECKBOX, INVISIBLE), all challenge requests for this site will return nocaptcha if NOCAPTCHA, or an unsolvable challenge if CHALLENGE.
+    &quot;testingScore&quot;: 3.14, # All assessments for this Key will return this score. Must be between 0 (likely not legitimate) and 1 (likely legitimate) inclusive.
+  },
+  &quot;webSettings&quot;: { # Settings specific to keys that can be used by websites. # Settings for keys that can be used by websites.
+    &quot;allowAllDomains&quot;: True or False, # If set to true, it means allowed_domains will not be enforced.
+    &quot;allowAmpTraffic&quot;: True or False, # Required. Whether this key can be used on AMP (Accelerated Mobile Pages) websites. This can only be set for the SCORE integration type.
+    &quot;allowedDomains&quot;: [ # Domains or subdomains of websites allowed to use the key. All subdomains of an allowed domain are automatically allowed. A valid domain requires a host and must not include any path, port, query or fragment. Examples: &#x27;example.com&#x27; or &#x27;subdomain.example.com&#x27;
+      &quot;A String&quot;,
+    ],
+    &quot;challengeSecurityPreference&quot;: &quot;A String&quot;, # Settings for the frequency and difficulty at which this key triggers captcha challenges. This should only be specified for IntegrationTypes CHECKBOX and INVISIBLE.
+    &quot;integrationType&quot;: &quot;A String&quot;, # Required. Describes how this key is integrated with the website.
+  },
+}
+
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # A key used to identify and configure applications (web and/or mobile) that use reCAPTCHA Enterprise.
+  &quot;androidSettings&quot;: { # Settings specific to keys that can be used by Android apps. # Settings for keys that can be used by Android apps.
+    &quot;allowedPackageNames&quot;: [ # Android package names of apps allowed to use the key. Example: &#x27;com.companyname.appname&#x27;
+      &quot;A String&quot;,
+    ],
+  },
+  &quot;createTime&quot;: &quot;A String&quot;, # The timestamp corresponding to the creation of this Key.
+  &quot;displayName&quot;: &quot;A String&quot;, # Human-readable display name of this key. Modifiable by user.
+  &quot;iosSettings&quot;: { # Settings specific to keys that can be used by iOS apps. # Settings for keys that can be used by iOS apps.
+    &quot;allowedBundleIds&quot;: [ # iOS bundle ids of apps allowed to use the key. Example: &#x27;com.companyname.productname.appname&#x27;
+      &quot;A String&quot;,
+    ],
+  },
+  &quot;labels&quot;: { # See Creating and managing labels.
+    &quot;a_key&quot;: &quot;A String&quot;,
+  },
+  &quot;name&quot;: &quot;A String&quot;, # The resource name for the Key in the format &quot;projects/{project}/keys/{key}&quot;.
+  &quot;testingOptions&quot;: { # Options for user acceptance testing. # Options for user acceptance testing.
+    &quot;testingChallenge&quot;: &quot;A String&quot;, # For challenge-based keys only (CHECKBOX, INVISIBLE), all challenge requests for this site will return nocaptcha if NOCAPTCHA, or an unsolvable challenge if CHALLENGE.
+    &quot;testingScore&quot;: 3.14, # All assessments for this Key will return this score. Must be between 0 (likely not legitimate) and 1 (likely legitimate) inclusive.
+  },
+  &quot;webSettings&quot;: { # Settings specific to keys that can be used by websites. # Settings for keys that can be used by websites.
+    &quot;allowAllDomains&quot;: True or False, # If set to true, it means allowed_domains will not be enforced.
+    &quot;allowAmpTraffic&quot;: True or False, # Required. Whether this key can be used on AMP (Accelerated Mobile Pages) websites. This can only be set for the SCORE integration type.
+    &quot;allowedDomains&quot;: [ # Domains or subdomains of websites allowed to use the key. All subdomains of an allowed domain are automatically allowed. A valid domain requires a host and must not include any path, port, query or fragment. Examples: &#x27;example.com&#x27; or &#x27;subdomain.example.com&#x27;
+      &quot;A String&quot;,
+    ],
+    &quot;challengeSecurityPreference&quot;: &quot;A String&quot;, # Settings for the frequency and difficulty at which this key triggers captcha challenges. This should only be specified for IntegrationTypes CHECKBOX and INVISIBLE.
+    &quot;integrationType&quot;: &quot;A String&quot;, # Required. Describes how this key is integrated with the website.
+  },
+}</pre>
+</div>
+
+<div class="method">
+    <code class="details" id="delete">delete(name, x__xgafv=None)</code>
+  <pre>Deletes the specified key.
+
+Args:
+  name: string, Required. The name of the key to be deleted, in the format &quot;projects/{project}/keys/{key}&quot;. (required)
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # A generic empty message that you can re-use to avoid defining duplicated empty messages in your APIs. A typical example is to use it as the request or the response type of an API method. For instance: service Foo { rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty); } The JSON representation for `Empty` is empty JSON object `{}`.
+}</pre>
+</div>
+
+<div class="method">
+    <code class="details" id="get">get(name, x__xgafv=None)</code>
+  <pre>Returns the specified key.
+
+Args:
+  name: string, Required. The name of the requested key, in the format &quot;projects/{project}/keys/{key}&quot;. (required)
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # A key used to identify and configure applications (web and/or mobile) that use reCAPTCHA Enterprise.
+  &quot;androidSettings&quot;: { # Settings specific to keys that can be used by Android apps. # Settings for keys that can be used by Android apps.
+    &quot;allowedPackageNames&quot;: [ # Android package names of apps allowed to use the key. Example: &#x27;com.companyname.appname&#x27;
+      &quot;A String&quot;,
+    ],
+  },
+  &quot;createTime&quot;: &quot;A String&quot;, # The timestamp corresponding to the creation of this Key.
+  &quot;displayName&quot;: &quot;A String&quot;, # Human-readable display name of this key. Modifiable by user.
+  &quot;iosSettings&quot;: { # Settings specific to keys that can be used by iOS apps. # Settings for keys that can be used by iOS apps.
+    &quot;allowedBundleIds&quot;: [ # iOS bundle ids of apps allowed to use the key. Example: &#x27;com.companyname.productname.appname&#x27;
+      &quot;A String&quot;,
+    ],
+  },
+  &quot;labels&quot;: { # See Creating and managing labels.
+    &quot;a_key&quot;: &quot;A String&quot;,
+  },
+  &quot;name&quot;: &quot;A String&quot;, # The resource name for the Key in the format &quot;projects/{project}/keys/{key}&quot;.
+  &quot;testingOptions&quot;: { # Options for user acceptance testing. # Options for user acceptance testing.
+    &quot;testingChallenge&quot;: &quot;A String&quot;, # For challenge-based keys only (CHECKBOX, INVISIBLE), all challenge requests for this site will return nocaptcha if NOCAPTCHA, or an unsolvable challenge if CHALLENGE.
+    &quot;testingScore&quot;: 3.14, # All assessments for this Key will return this score. Must be between 0 (likely not legitimate) and 1 (likely legitimate) inclusive.
+  },
+  &quot;webSettings&quot;: { # Settings specific to keys that can be used by websites. # Settings for keys that can be used by websites.
+    &quot;allowAllDomains&quot;: True or False, # If set to true, it means allowed_domains will not be enforced.
+    &quot;allowAmpTraffic&quot;: True or False, # Required. Whether this key can be used on AMP (Accelerated Mobile Pages) websites. This can only be set for the SCORE integration type.
+    &quot;allowedDomains&quot;: [ # Domains or subdomains of websites allowed to use the key. All subdomains of an allowed domain are automatically allowed. A valid domain requires a host and must not include any path, port, query or fragment. Examples: &#x27;example.com&#x27; or &#x27;subdomain.example.com&#x27;
+      &quot;A String&quot;,
+    ],
+    &quot;challengeSecurityPreference&quot;: &quot;A String&quot;, # Settings for the frequency and difficulty at which this key triggers captcha challenges. This should only be specified for IntegrationTypes CHECKBOX and INVISIBLE.
+    &quot;integrationType&quot;: &quot;A String&quot;, # Required. Describes how this key is integrated with the website.
+  },
+}</pre>
+</div>
+
+<div class="method">
+    <code class="details" id="getMetrics">getMetrics(name, x__xgafv=None)</code>
+  <pre>Get some aggregated metrics for a Key. This data can be used to build dashboards.
+
+Args:
+  name: string, Required. The name of the requested metrics, in the format &quot;projects/{project}/keys/{key}/metrics&quot;. (required)
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # Metrics for a single Key.
+  &quot;challengeMetrics&quot;: [ # Metrics will be continuous and in order by dates, and in the granularity of day. Only challenge-based keys (CHECKBOX, INVISIBLE), will have challenge-based data.
+    { # Metrics related to challenges.
+      &quot;failedCount&quot;: &quot;A String&quot;, # Count of submitted challenge solutions that were incorrect or otherwise deemed suspicious such that a subsequent challenge was triggered.
+      &quot;nocaptchaCount&quot;: &quot;A String&quot;, # Count of nocaptchas (successful verification without a challenge) issued.
+      &quot;pageloadCount&quot;: &quot;A String&quot;, # Count of reCAPTCHA checkboxes or badges rendered. This is mostly equivalent to a count of pageloads for pages that include reCAPTCHA.
+      &quot;passedCount&quot;: &quot;A String&quot;, # Count of nocaptchas (successful verification without a challenge) plus submitted challenge solutions that were correct and resulted in verification.
+    },
+  ],
+  &quot;scoreMetrics&quot;: [ # Metrics will be continuous and in order by dates, and in the granularity of day. All Key types should have score-based data.
+    { # Metrics related to scoring.
+      &quot;actionMetrics&quot;: { # Action-based metrics. The map key is the action name which specified by the site owners at time of the &quot;execute&quot; client-side call. Populated only for SCORE keys.
+        &quot;a_key&quot;: { # Score distribution.
+          &quot;scoreBuckets&quot;: { # Map key is score value multiplied by 100. The scores are discrete values between [0, 1]. The maximum number of buckets is on order of a few dozen, but typically much lower (ie. 10).
+            &quot;a_key&quot;: &quot;A String&quot;,
+          },
+        },
+      },
+      &quot;overallMetrics&quot;: { # Score distribution. # Aggregated score metrics for all traffic.
+        &quot;scoreBuckets&quot;: { # Map key is score value multiplied by 100. The scores are discrete values between [0, 1]. The maximum number of buckets is on order of a few dozen, but typically much lower (ie. 10).
+          &quot;a_key&quot;: &quot;A String&quot;,
+        },
+      },
+    },
+  ],
+  &quot;startTime&quot;: &quot;A String&quot;, # Inclusive start time aligned to a day (UTC).
+}</pre>
+</div>
+
+<div class="method">
+    <code class="details" id="list">list(parent, pageSize=None, pageToken=None, x__xgafv=None)</code>
+  <pre>Returns the list of all keys that belong to a project.
+
+Args:
+  parent: string, Required. The name of the project that contains the keys that will be listed, in the format &quot;projects/{project}&quot;. (required)
+  pageSize: integer, Optional. The maximum number of keys to return. Default is 10. Max limit is 1000.
+  pageToken: string, Optional. The next_page_token value returned from a previous. ListKeysRequest, if any.
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # Response to request to list keys in a project.
+  &quot;keys&quot;: [ # Key details.
+    { # A key used to identify and configure applications (web and/or mobile) that use reCAPTCHA Enterprise.
+      &quot;androidSettings&quot;: { # Settings specific to keys that can be used by Android apps. # Settings for keys that can be used by Android apps.
+        &quot;allowedPackageNames&quot;: [ # Android package names of apps allowed to use the key. Example: &#x27;com.companyname.appname&#x27;
+          &quot;A String&quot;,
+        ],
+      },
+      &quot;createTime&quot;: &quot;A String&quot;, # The timestamp corresponding to the creation of this Key.
+      &quot;displayName&quot;: &quot;A String&quot;, # Human-readable display name of this key. Modifiable by user.
+      &quot;iosSettings&quot;: { # Settings specific to keys that can be used by iOS apps. # Settings for keys that can be used by iOS apps.
+        &quot;allowedBundleIds&quot;: [ # iOS bundle ids of apps allowed to use the key. Example: &#x27;com.companyname.productname.appname&#x27;
+          &quot;A String&quot;,
+        ],
+      },
+      &quot;labels&quot;: { # See Creating and managing labels.
+        &quot;a_key&quot;: &quot;A String&quot;,
+      },
+      &quot;name&quot;: &quot;A String&quot;, # The resource name for the Key in the format &quot;projects/{project}/keys/{key}&quot;.
+      &quot;testingOptions&quot;: { # Options for user acceptance testing. # Options for user acceptance testing.
+        &quot;testingChallenge&quot;: &quot;A String&quot;, # For challenge-based keys only (CHECKBOX, INVISIBLE), all challenge requests for this site will return nocaptcha if NOCAPTCHA, or an unsolvable challenge if CHALLENGE.
+        &quot;testingScore&quot;: 3.14, # All assessments for this Key will return this score. Must be between 0 (likely not legitimate) and 1 (likely legitimate) inclusive.
+      },
+      &quot;webSettings&quot;: { # Settings specific to keys that can be used by websites. # Settings for keys that can be used by websites.
+        &quot;allowAllDomains&quot;: True or False, # If set to true, it means allowed_domains will not be enforced.
+        &quot;allowAmpTraffic&quot;: True or False, # Required. Whether this key can be used on AMP (Accelerated Mobile Pages) websites. This can only be set for the SCORE integration type.
+        &quot;allowedDomains&quot;: [ # Domains or subdomains of websites allowed to use the key. All subdomains of an allowed domain are automatically allowed. A valid domain requires a host and must not include any path, port, query or fragment. Examples: &#x27;example.com&#x27; or &#x27;subdomain.example.com&#x27;
+          &quot;A String&quot;,
+        ],
+        &quot;challengeSecurityPreference&quot;: &quot;A String&quot;, # Settings for the frequency and difficulty at which this key triggers captcha challenges. This should only be specified for IntegrationTypes CHECKBOX and INVISIBLE.
+        &quot;integrationType&quot;: &quot;A String&quot;, # Required. Describes how this key is integrated with the website.
+      },
+    },
+  ],
+  &quot;nextPageToken&quot;: &quot;A String&quot;, # Token to retrieve the next page of results. It is set to empty if no keys remain in results.
+}</pre>
+</div>
+
+<div class="method">
+    <code class="details" id="list_next">list_next(previous_request, previous_response)</code>
+  <pre>Retrieves the next page of results.
+
+Args:
+  previous_request: The request for the previous page. (required)
+  previous_response: The response from the request for the previous page. (required)
+
+Returns:
+  A request object that you can call &#x27;execute()&#x27; on to request the next
+  page. Returns None if there are no more items in the collection.
+    </pre>
+</div>
+
+<div class="method">
+    <code class="details" id="migrate">migrate(name, body=None, x__xgafv=None)</code>
+  <pre>Migrates an existing key from reCAPTCHA to reCAPTCHA Enterprise. Once a key is migrated, it can be used from either product. SiteVerify requests will be billed as CreateAssessment calls.
+
+Args:
+  name: string, Required. The name of the key to be migrated, in the format &quot;projects/{project}/keys/{key}&quot;. (required)
+  body: object, The request body.
+    The object takes the form of:
+
+{ # The migrate key request message.
+}
+
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # A key used to identify and configure applications (web and/or mobile) that use reCAPTCHA Enterprise.
+  &quot;androidSettings&quot;: { # Settings specific to keys that can be used by Android apps. # Settings for keys that can be used by Android apps.
+    &quot;allowedPackageNames&quot;: [ # Android package names of apps allowed to use the key. Example: &#x27;com.companyname.appname&#x27;
+      &quot;A String&quot;,
+    ],
+  },
+  &quot;createTime&quot;: &quot;A String&quot;, # The timestamp corresponding to the creation of this Key.
+  &quot;displayName&quot;: &quot;A String&quot;, # Human-readable display name of this key. Modifiable by user.
+  &quot;iosSettings&quot;: { # Settings specific to keys that can be used by iOS apps. # Settings for keys that can be used by iOS apps.
+    &quot;allowedBundleIds&quot;: [ # iOS bundle ids of apps allowed to use the key. Example: &#x27;com.companyname.productname.appname&#x27;
+      &quot;A String&quot;,
+    ],
+  },
+  &quot;labels&quot;: { # See Creating and managing labels.
+    &quot;a_key&quot;: &quot;A String&quot;,
+  },
+  &quot;name&quot;: &quot;A String&quot;, # The resource name for the Key in the format &quot;projects/{project}/keys/{key}&quot;.
+  &quot;testingOptions&quot;: { # Options for user acceptance testing. # Options for user acceptance testing.
+    &quot;testingChallenge&quot;: &quot;A String&quot;, # For challenge-based keys only (CHECKBOX, INVISIBLE), all challenge requests for this site will return nocaptcha if NOCAPTCHA, or an unsolvable challenge if CHALLENGE.
+    &quot;testingScore&quot;: 3.14, # All assessments for this Key will return this score. Must be between 0 (likely not legitimate) and 1 (likely legitimate) inclusive.
+  },
+  &quot;webSettings&quot;: { # Settings specific to keys that can be used by websites. # Settings for keys that can be used by websites.
+    &quot;allowAllDomains&quot;: True or False, # If set to true, it means allowed_domains will not be enforced.
+    &quot;allowAmpTraffic&quot;: True or False, # Required. Whether this key can be used on AMP (Accelerated Mobile Pages) websites. This can only be set for the SCORE integration type.
+    &quot;allowedDomains&quot;: [ # Domains or subdomains of websites allowed to use the key. All subdomains of an allowed domain are automatically allowed. A valid domain requires a host and must not include any path, port, query or fragment. Examples: &#x27;example.com&#x27; or &#x27;subdomain.example.com&#x27;
+      &quot;A String&quot;,
+    ],
+    &quot;challengeSecurityPreference&quot;: &quot;A String&quot;, # Settings for the frequency and difficulty at which this key triggers captcha challenges. This should only be specified for IntegrationTypes CHECKBOX and INVISIBLE.
+    &quot;integrationType&quot;: &quot;A String&quot;, # Required. Describes how this key is integrated with the website.
+  },
+}</pre>
+</div>
+
+<div class="method">
+    <code class="details" id="patch">patch(name, body=None, updateMask=None, x__xgafv=None)</code>
+  <pre>Updates the specified key.
+
+Args:
+  name: string, The resource name for the Key in the format &quot;projects/{project}/keys/{key}&quot;. (required)
+  body: object, The request body.
+    The object takes the form of:
+
+{ # A key used to identify and configure applications (web and/or mobile) that use reCAPTCHA Enterprise.
+  &quot;androidSettings&quot;: { # Settings specific to keys that can be used by Android apps. # Settings for keys that can be used by Android apps.
+    &quot;allowedPackageNames&quot;: [ # Android package names of apps allowed to use the key. Example: &#x27;com.companyname.appname&#x27;
+      &quot;A String&quot;,
+    ],
+  },
+  &quot;createTime&quot;: &quot;A String&quot;, # The timestamp corresponding to the creation of this Key.
+  &quot;displayName&quot;: &quot;A String&quot;, # Human-readable display name of this key. Modifiable by user.
+  &quot;iosSettings&quot;: { # Settings specific to keys that can be used by iOS apps. # Settings for keys that can be used by iOS apps.
+    &quot;allowedBundleIds&quot;: [ # iOS bundle ids of apps allowed to use the key. Example: &#x27;com.companyname.productname.appname&#x27;
+      &quot;A String&quot;,
+    ],
+  },
+  &quot;labels&quot;: { # See Creating and managing labels.
+    &quot;a_key&quot;: &quot;A String&quot;,
+  },
+  &quot;name&quot;: &quot;A String&quot;, # The resource name for the Key in the format &quot;projects/{project}/keys/{key}&quot;.
+  &quot;testingOptions&quot;: { # Options for user acceptance testing. # Options for user acceptance testing.
+    &quot;testingChallenge&quot;: &quot;A String&quot;, # For challenge-based keys only (CHECKBOX, INVISIBLE), all challenge requests for this site will return nocaptcha if NOCAPTCHA, or an unsolvable challenge if CHALLENGE.
+    &quot;testingScore&quot;: 3.14, # All assessments for this Key will return this score. Must be between 0 (likely not legitimate) and 1 (likely legitimate) inclusive.
+  },
+  &quot;webSettings&quot;: { # Settings specific to keys that can be used by websites. # Settings for keys that can be used by websites.
+    &quot;allowAllDomains&quot;: True or False, # If set to true, it means allowed_domains will not be enforced.
+    &quot;allowAmpTraffic&quot;: True or False, # Required. Whether this key can be used on AMP (Accelerated Mobile Pages) websites. This can only be set for the SCORE integration type.
+    &quot;allowedDomains&quot;: [ # Domains or subdomains of websites allowed to use the key. All subdomains of an allowed domain are automatically allowed. A valid domain requires a host and must not include any path, port, query or fragment. Examples: &#x27;example.com&#x27; or &#x27;subdomain.example.com&#x27;
+      &quot;A String&quot;,
+    ],
+    &quot;challengeSecurityPreference&quot;: &quot;A String&quot;, # Settings for the frequency and difficulty at which this key triggers captcha challenges. This should only be specified for IntegrationTypes CHECKBOX and INVISIBLE.
+    &quot;integrationType&quot;: &quot;A String&quot;, # Required. Describes how this key is integrated with the website.
+  },
+}
+
+  updateMask: string, Optional. The mask to control which field of the key get updated. If the mask is not present, all fields will be updated.
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # A key used to identify and configure applications (web and/or mobile) that use reCAPTCHA Enterprise.
+  &quot;androidSettings&quot;: { # Settings specific to keys that can be used by Android apps. # Settings for keys that can be used by Android apps.
+    &quot;allowedPackageNames&quot;: [ # Android package names of apps allowed to use the key. Example: &#x27;com.companyname.appname&#x27;
+      &quot;A String&quot;,
+    ],
+  },
+  &quot;createTime&quot;: &quot;A String&quot;, # The timestamp corresponding to the creation of this Key.
+  &quot;displayName&quot;: &quot;A String&quot;, # Human-readable display name of this key. Modifiable by user.
+  &quot;iosSettings&quot;: { # Settings specific to keys that can be used by iOS apps. # Settings for keys that can be used by iOS apps.
+    &quot;allowedBundleIds&quot;: [ # iOS bundle ids of apps allowed to use the key. Example: &#x27;com.companyname.productname.appname&#x27;
+      &quot;A String&quot;,
+    ],
+  },
+  &quot;labels&quot;: { # See Creating and managing labels.
+    &quot;a_key&quot;: &quot;A String&quot;,
+  },
+  &quot;name&quot;: &quot;A String&quot;, # The resource name for the Key in the format &quot;projects/{project}/keys/{key}&quot;.
+  &quot;testingOptions&quot;: { # Options for user acceptance testing. # Options for user acceptance testing.
+    &quot;testingChallenge&quot;: &quot;A String&quot;, # For challenge-based keys only (CHECKBOX, INVISIBLE), all challenge requests for this site will return nocaptcha if NOCAPTCHA, or an unsolvable challenge if CHALLENGE.
+    &quot;testingScore&quot;: 3.14, # All assessments for this Key will return this score. Must be between 0 (likely not legitimate) and 1 (likely legitimate) inclusive.
+  },
+  &quot;webSettings&quot;: { # Settings specific to keys that can be used by websites. # Settings for keys that can be used by websites.
+    &quot;allowAllDomains&quot;: True or False, # If set to true, it means allowed_domains will not be enforced.
+    &quot;allowAmpTraffic&quot;: True or False, # Required. Whether this key can be used on AMP (Accelerated Mobile Pages) websites. This can only be set for the SCORE integration type.
+    &quot;allowedDomains&quot;: [ # Domains or subdomains of websites allowed to use the key. All subdomains of an allowed domain are automatically allowed. A valid domain requires a host and must not include any path, port, query or fragment. Examples: &#x27;example.com&#x27; or &#x27;subdomain.example.com&#x27;
+      &quot;A String&quot;,
+    ],
+    &quot;challengeSecurityPreference&quot;: &quot;A String&quot;, # Settings for the frequency and difficulty at which this key triggers captcha challenges. This should only be specified for IntegrationTypes CHECKBOX and INVISIBLE.
+    &quot;integrationType&quot;: &quot;A String&quot;, # Required. Describes how this key is integrated with the website.
+  },
+}</pre>
+</div>
+
+</body></html>
\ No newline at end of file
diff --git a/docs/dyn/spanner_v1.projects.instances.databases.sessions.html b/docs/dyn/spanner_v1.projects.instances.databases.sessions.html
index 5a34d9d..936dae8 100644
--- a/docs/dyn/spanner_v1.projects.instances.databases.sessions.html
+++ b/docs/dyn/spanner_v1.projects.instances.databases.sessions.html
@@ -421,14 +421,7 @@
         &quot;a_key&quot;: { # `Type` indicates the type of a Cloud Spanner value, as might be stored in a table cell or returned from an SQL query.
           &quot;arrayElementType&quot;: # Object with schema name: Type # If code == ARRAY, then `array_element_type` is the type of the array elements.
           &quot;code&quot;: &quot;A String&quot;, # Required. The TypeCode for this type.
-          &quot;structType&quot;: { # `StructType` defines the fields of a STRUCT type. # If code == STRUCT, then `struct_type` provides type information for the struct&#x27;s fields.
-            &quot;fields&quot;: [ # The list of fields that make up this struct. Order is significant, because values of this struct type are represented as lists, where the order of field values matches the order of fields in the StructType. In turn, the order of fields matches the order of columns in a read request, or the order of fields in the `SELECT` clause of a query.
-              { # Message representing a single field of a struct.
-                &quot;name&quot;: &quot;A String&quot;, # The name of the field. For reads, this is the column name. For SQL queries, it is the column alias (e.g., `&quot;Word&quot;` in the query `&quot;SELECT &#x27;hello&#x27; AS Word&quot;`), or the column name (e.g., `&quot;ColName&quot;` in the query `&quot;SELECT ColName FROM Table&quot;`). Some columns might have an empty name (e.g., `&quot;SELECT UPPER(ColName)&quot;`). Note that a query result can contain multiple fields with the same name.
-                &quot;type&quot;: # Object with schema name: Type # The type of the field.
-              },
-            ],
-          },
+          &quot;structType&quot;: # Object with schema name: StructType # If code == STRUCT, then `struct_type` provides type information for the struct&#x27;s fields.
         },
       },
       &quot;params&quot;: { # Parameter names and values that bind to placeholders in the DML string. A parameter placeholder consists of the `@` character followed by the parameter name (for example, `@firstName`). Parameter names can contain letters, numbers, and underscores. Parameters can appear anywhere that a literal value is expected. The same parameter name can be used more than once, for example: `&quot;WHERE id &gt; @msg_id AND id &lt; @msg_id + 100&quot;` It is an error to execute a SQL statement with unbound parameters.
@@ -486,7 +479,11 @@
           &quot;fields&quot;: [ # The list of fields that make up this struct. Order is significant, because values of this struct type are represented as lists, where the order of field values matches the order of fields in the StructType. In turn, the order of fields matches the order of columns in a read request, or the order of fields in the `SELECT` clause of a query.
             { # Message representing a single field of a struct.
               &quot;name&quot;: &quot;A String&quot;, # The name of the field. For reads, this is the column name. For SQL queries, it is the column alias (e.g., `&quot;Word&quot;` in the query `&quot;SELECT &#x27;hello&#x27; AS Word&quot;`), or the column name (e.g., `&quot;ColName&quot;` in the query `&quot;SELECT ColName FROM Table&quot;`). Some columns might have an empty name (e.g., `&quot;SELECT UPPER(ColName)&quot;`). Note that a query result can contain multiple fields with the same name.
-              &quot;type&quot;: # Object with schema name: Type # The type of the field.
+              &quot;type&quot;: { # `Type` indicates the type of a Cloud Spanner value, as might be stored in a table cell or returned from an SQL query. # The type of the field.
+                &quot;arrayElementType&quot;: # Object with schema name: Type # If code == ARRAY, then `array_element_type` is the type of the array elements.
+                &quot;code&quot;: &quot;A String&quot;, # Required. The TypeCode for this type.
+                &quot;structType&quot;: # Object with schema name: StructType # If code == STRUCT, then `struct_type` provides type information for the struct&#x27;s fields.
+              },
             },
           ],
         },
@@ -563,14 +560,7 @@
     &quot;a_key&quot;: { # `Type` indicates the type of a Cloud Spanner value, as might be stored in a table cell or returned from an SQL query.
       &quot;arrayElementType&quot;: # Object with schema name: Type # If code == ARRAY, then `array_element_type` is the type of the array elements.
       &quot;code&quot;: &quot;A String&quot;, # Required. The TypeCode for this type.
-      &quot;structType&quot;: { # `StructType` defines the fields of a STRUCT type. # If code == STRUCT, then `struct_type` provides type information for the struct&#x27;s fields.
-        &quot;fields&quot;: [ # The list of fields that make up this struct. Order is significant, because values of this struct type are represented as lists, where the order of field values matches the order of fields in the StructType. In turn, the order of fields matches the order of columns in a read request, or the order of fields in the `SELECT` clause of a query.
-          { # Message representing a single field of a struct.
-            &quot;name&quot;: &quot;A String&quot;, # The name of the field. For reads, this is the column name. For SQL queries, it is the column alias (e.g., `&quot;Word&quot;` in the query `&quot;SELECT &#x27;hello&#x27; AS Word&quot;`), or the column name (e.g., `&quot;ColName&quot;` in the query `&quot;SELECT ColName FROM Table&quot;`). Some columns might have an empty name (e.g., `&quot;SELECT UPPER(ColName)&quot;`). Note that a query result can contain multiple fields with the same name.
-            &quot;type&quot;: # Object with schema name: Type # The type of the field.
-          },
-        ],
-      },
+      &quot;structType&quot;: # Object with schema name: StructType # If code == STRUCT, then `struct_type` provides type information for the struct&#x27;s fields.
     },
   },
   &quot;params&quot;: { # Parameter names and values that bind to placeholders in the SQL string. A parameter placeholder consists of the `@` character followed by the parameter name (for example, `@firstName`). Parameter names must conform to the naming requirements of identifiers as specified at https://cloud.google.com/spanner/docs/lexical#identifiers. Parameters can appear anywhere that a literal value is expected. The same parameter name can be used more than once, for example: `&quot;WHERE id &gt; @msg_id AND id &lt; @msg_id + 100&quot;` It is an error to execute a SQL statement with unbound parameters.
@@ -637,7 +627,11 @@
       &quot;fields&quot;: [ # The list of fields that make up this struct. Order is significant, because values of this struct type are represented as lists, where the order of field values matches the order of fields in the StructType. In turn, the order of fields matches the order of columns in a read request, or the order of fields in the `SELECT` clause of a query.
         { # Message representing a single field of a struct.
           &quot;name&quot;: &quot;A String&quot;, # The name of the field. For reads, this is the column name. For SQL queries, it is the column alias (e.g., `&quot;Word&quot;` in the query `&quot;SELECT &#x27;hello&#x27; AS Word&quot;`), or the column name (e.g., `&quot;ColName&quot;` in the query `&quot;SELECT ColName FROM Table&quot;`). Some columns might have an empty name (e.g., `&quot;SELECT UPPER(ColName)&quot;`). Note that a query result can contain multiple fields with the same name.
-          &quot;type&quot;: # Object with schema name: Type # The type of the field.
+          &quot;type&quot;: { # `Type` indicates the type of a Cloud Spanner value, as might be stored in a table cell or returned from an SQL query. # The type of the field.
+            &quot;arrayElementType&quot;: # Object with schema name: Type # If code == ARRAY, then `array_element_type` is the type of the array elements.
+            &quot;code&quot;: &quot;A String&quot;, # Required. The TypeCode for this type.
+            &quot;structType&quot;: # Object with schema name: StructType # If code == STRUCT, then `struct_type` provides type information for the struct&#x27;s fields.
+          },
         },
       ],
     },
@@ -703,14 +697,7 @@
     &quot;a_key&quot;: { # `Type` indicates the type of a Cloud Spanner value, as might be stored in a table cell or returned from an SQL query.
       &quot;arrayElementType&quot;: # Object with schema name: Type # If code == ARRAY, then `array_element_type` is the type of the array elements.
       &quot;code&quot;: &quot;A String&quot;, # Required. The TypeCode for this type.
-      &quot;structType&quot;: { # `StructType` defines the fields of a STRUCT type. # If code == STRUCT, then `struct_type` provides type information for the struct&#x27;s fields.
-        &quot;fields&quot;: [ # The list of fields that make up this struct. Order is significant, because values of this struct type are represented as lists, where the order of field values matches the order of fields in the StructType. In turn, the order of fields matches the order of columns in a read request, or the order of fields in the `SELECT` clause of a query.
-          { # Message representing a single field of a struct.
-            &quot;name&quot;: &quot;A String&quot;, # The name of the field. For reads, this is the column name. For SQL queries, it is the column alias (e.g., `&quot;Word&quot;` in the query `&quot;SELECT &#x27;hello&#x27; AS Word&quot;`), or the column name (e.g., `&quot;ColName&quot;` in the query `&quot;SELECT ColName FROM Table&quot;`). Some columns might have an empty name (e.g., `&quot;SELECT UPPER(ColName)&quot;`). Note that a query result can contain multiple fields with the same name.
-            &quot;type&quot;: # Object with schema name: Type # The type of the field.
-          },
-        ],
-      },
+      &quot;structType&quot;: # Object with schema name: StructType # If code == STRUCT, then `struct_type` provides type information for the struct&#x27;s fields.
     },
   },
   &quot;params&quot;: { # Parameter names and values that bind to placeholders in the SQL string. A parameter placeholder consists of the `@` character followed by the parameter name (for example, `@firstName`). Parameter names must conform to the naming requirements of identifiers as specified at https://cloud.google.com/spanner/docs/lexical#identifiers. Parameters can appear anywhere that a literal value is expected. The same parameter name can be used more than once, for example: `&quot;WHERE id &gt; @msg_id AND id &lt; @msg_id + 100&quot;` It is an error to execute a SQL statement with unbound parameters.
@@ -778,7 +765,11 @@
       &quot;fields&quot;: [ # The list of fields that make up this struct. Order is significant, because values of this struct type are represented as lists, where the order of field values matches the order of fields in the StructType. In turn, the order of fields matches the order of columns in a read request, or the order of fields in the `SELECT` clause of a query.
         { # Message representing a single field of a struct.
           &quot;name&quot;: &quot;A String&quot;, # The name of the field. For reads, this is the column name. For SQL queries, it is the column alias (e.g., `&quot;Word&quot;` in the query `&quot;SELECT &#x27;hello&#x27; AS Word&quot;`), or the column name (e.g., `&quot;ColName&quot;` in the query `&quot;SELECT ColName FROM Table&quot;`). Some columns might have an empty name (e.g., `&quot;SELECT UPPER(ColName)&quot;`). Note that a query result can contain multiple fields with the same name.
-          &quot;type&quot;: # Object with schema name: Type # The type of the field.
+          &quot;type&quot;: { # `Type` indicates the type of a Cloud Spanner value, as might be stored in a table cell or returned from an SQL query. # The type of the field.
+            &quot;arrayElementType&quot;: # Object with schema name: Type # If code == ARRAY, then `array_element_type` is the type of the array elements.
+            &quot;code&quot;: &quot;A String&quot;, # Required. The TypeCode for this type.
+            &quot;structType&quot;: # Object with schema name: StructType # If code == STRUCT, then `struct_type` provides type information for the struct&#x27;s fields.
+          },
         },
       ],
     },
@@ -913,14 +904,7 @@
     &quot;a_key&quot;: { # `Type` indicates the type of a Cloud Spanner value, as might be stored in a table cell or returned from an SQL query.
       &quot;arrayElementType&quot;: # Object with schema name: Type # If code == ARRAY, then `array_element_type` is the type of the array elements.
       &quot;code&quot;: &quot;A String&quot;, # Required. The TypeCode for this type.
-      &quot;structType&quot;: { # `StructType` defines the fields of a STRUCT type. # If code == STRUCT, then `struct_type` provides type information for the struct&#x27;s fields.
-        &quot;fields&quot;: [ # The list of fields that make up this struct. Order is significant, because values of this struct type are represented as lists, where the order of field values matches the order of fields in the StructType. In turn, the order of fields matches the order of columns in a read request, or the order of fields in the `SELECT` clause of a query.
-          { # Message representing a single field of a struct.
-            &quot;name&quot;: &quot;A String&quot;, # The name of the field. For reads, this is the column name. For SQL queries, it is the column alias (e.g., `&quot;Word&quot;` in the query `&quot;SELECT &#x27;hello&#x27; AS Word&quot;`), or the column name (e.g., `&quot;ColName&quot;` in the query `&quot;SELECT ColName FROM Table&quot;`). Some columns might have an empty name (e.g., `&quot;SELECT UPPER(ColName)&quot;`). Note that a query result can contain multiple fields with the same name.
-            &quot;type&quot;: # Object with schema name: Type # The type of the field.
-          },
-        ],
-      },
+      &quot;structType&quot;: # Object with schema name: StructType # If code == STRUCT, then `struct_type` provides type information for the struct&#x27;s fields.
     },
   },
   &quot;params&quot;: { # Parameter names and values that bind to placeholders in the SQL string. A parameter placeholder consists of the `@` character followed by the parameter name (for example, `@firstName`). Parameter names can contain letters, numbers, and underscores. Parameters can appear anywhere that a literal value is expected. The same parameter name can be used more than once, for example: `&quot;WHERE id &gt; @msg_id AND id &lt; @msg_id + 100&quot;` It is an error to execute a SQL statement with unbound parameters.
@@ -1176,7 +1160,11 @@
       &quot;fields&quot;: [ # The list of fields that make up this struct. Order is significant, because values of this struct type are represented as lists, where the order of field values matches the order of fields in the StructType. In turn, the order of fields matches the order of columns in a read request, or the order of fields in the `SELECT` clause of a query.
         { # Message representing a single field of a struct.
           &quot;name&quot;: &quot;A String&quot;, # The name of the field. For reads, this is the column name. For SQL queries, it is the column alias (e.g., `&quot;Word&quot;` in the query `&quot;SELECT &#x27;hello&#x27; AS Word&quot;`), or the column name (e.g., `&quot;ColName&quot;` in the query `&quot;SELECT ColName FROM Table&quot;`). Some columns might have an empty name (e.g., `&quot;SELECT UPPER(ColName)&quot;`). Note that a query result can contain multiple fields with the same name.
-          &quot;type&quot;: # Object with schema name: Type # The type of the field.
+          &quot;type&quot;: { # `Type` indicates the type of a Cloud Spanner value, as might be stored in a table cell or returned from an SQL query. # The type of the field.
+            &quot;arrayElementType&quot;: # Object with schema name: Type # If code == ARRAY, then `array_element_type` is the type of the array elements.
+            &quot;code&quot;: &quot;A String&quot;, # Required. The TypeCode for this type.
+            &quot;structType&quot;: # Object with schema name: StructType # If code == STRUCT, then `struct_type` provides type information for the struct&#x27;s fields.
+          },
         },
       ],
     },
@@ -1348,7 +1336,11 @@
       &quot;fields&quot;: [ # The list of fields that make up this struct. Order is significant, because values of this struct type are represented as lists, where the order of field values matches the order of fields in the StructType. In turn, the order of fields matches the order of columns in a read request, or the order of fields in the `SELECT` clause of a query.
         { # Message representing a single field of a struct.
           &quot;name&quot;: &quot;A String&quot;, # The name of the field. For reads, this is the column name. For SQL queries, it is the column alias (e.g., `&quot;Word&quot;` in the query `&quot;SELECT &#x27;hello&#x27; AS Word&quot;`), or the column name (e.g., `&quot;ColName&quot;` in the query `&quot;SELECT ColName FROM Table&quot;`). Some columns might have an empty name (e.g., `&quot;SELECT UPPER(ColName)&quot;`). Note that a query result can contain multiple fields with the same name.
-          &quot;type&quot;: # Object with schema name: Type # The type of the field.
+          &quot;type&quot;: { # `Type` indicates the type of a Cloud Spanner value, as might be stored in a table cell or returned from an SQL query. # The type of the field.
+            &quot;arrayElementType&quot;: # Object with schema name: Type # If code == ARRAY, then `array_element_type` is the type of the array elements.
+            &quot;code&quot;: &quot;A String&quot;, # Required. The TypeCode for this type.
+            &quot;structType&quot;: # Object with schema name: StructType # If code == STRUCT, then `struct_type` provides type information for the struct&#x27;s fields.
+          },
         },
       ],
     },
diff --git a/googleapiclient/discovery_cache/documents/recaptchaenterprise.v1.json b/googleapiclient/discovery_cache/documents/recaptchaenterprise.v1.json
new file mode 100644
index 0000000..4adda77
--- /dev/null
+++ b/googleapiclient/discovery_cache/documents/recaptchaenterprise.v1.json
@@ -0,0 +1,841 @@
+{
+  "auth": {
+    "oauth2": {
+      "scopes": {
+        "https://www.googleapis.com/auth/cloud-platform": {
+          "description": "See, edit, configure, and delete your Google Cloud Platform data"
+        }
+      }
+    }
+  },
+  "basePath": "",
+  "baseUrl": "https://recaptchaenterprise.googleapis.com/",
+  "batchPath": "batch",
+  "canonicalName": "Recaptcha Enterprise",
+  "description": "",
+  "discoveryVersion": "v1",
+  "documentationLink": "https://cloud.google.com/recaptcha-enterprise/",
+  "fullyEncodeReservedExpansion": true,
+  "icons": {
+    "x16": "http://www.google.com/images/icons/product/search-16.gif",
+    "x32": "http://www.google.com/images/icons/product/search-32.gif"
+  },
+  "id": "recaptchaenterprise:v1",
+  "kind": "discovery#restDescription",
+  "mtlsRootUrl": "https://recaptchaenterprise.mtls.googleapis.com/",
+  "name": "recaptchaenterprise",
+  "ownerDomain": "google.com",
+  "ownerName": "Google",
+  "parameters": {
+    "$.xgafv": {
+      "description": "V1 error format.",
+      "enum": [
+        "1",
+        "2"
+      ],
+      "enumDescriptions": [
+        "v1 error format",
+        "v2 error format"
+      ],
+      "location": "query",
+      "type": "string"
+    },
+    "access_token": {
+      "description": "OAuth access token.",
+      "location": "query",
+      "type": "string"
+    },
+    "alt": {
+      "default": "json",
+      "description": "Data format for response.",
+      "enum": [
+        "json",
+        "media",
+        "proto"
+      ],
+      "enumDescriptions": [
+        "Responses with Content-Type of application/json",
+        "Media download with context-dependent Content-Type",
+        "Responses with Content-Type of application/x-protobuf"
+      ],
+      "location": "query",
+      "type": "string"
+    },
+    "callback": {
+      "description": "JSONP",
+      "location": "query",
+      "type": "string"
+    },
+    "fields": {
+      "description": "Selector specifying which fields to include in a partial response.",
+      "location": "query",
+      "type": "string"
+    },
+    "key": {
+      "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.",
+      "location": "query",
+      "type": "string"
+    },
+    "oauth_token": {
+      "description": "OAuth 2.0 token for the current user.",
+      "location": "query",
+      "type": "string"
+    },
+    "prettyPrint": {
+      "default": "true",
+      "description": "Returns response with indentations and line breaks.",
+      "location": "query",
+      "type": "boolean"
+    },
+    "quotaUser": {
+      "description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters.",
+      "location": "query",
+      "type": "string"
+    },
+    "uploadType": {
+      "description": "Legacy upload protocol for media (e.g. \"media\", \"multipart\").",
+      "location": "query",
+      "type": "string"
+    },
+    "upload_protocol": {
+      "description": "Upload protocol for media (e.g. \"raw\", \"multipart\").",
+      "location": "query",
+      "type": "string"
+    }
+  },
+  "protocol": "rest",
+  "resources": {
+    "projects": {
+      "resources": {
+        "assessments": {
+          "methods": {
+            "annotate": {
+              "description": "Annotates a previously created Assessment to provide additional information on whether the event turned out to be authentic or fraudulent.",
+              "flatPath": "v1/projects/{projectsId}/assessments/{assessmentsId}:annotate",
+              "httpMethod": "POST",
+              "id": "recaptchaenterprise.projects.assessments.annotate",
+              "parameterOrder": [
+                "name"
+              ],
+              "parameters": {
+                "name": {
+                  "description": "Required. The resource name of the Assessment, in the format \"projects/{project}/assessments/{assessment}\".",
+                  "location": "path",
+                  "pattern": "^projects/[^/]+/assessments/[^/]+$",
+                  "required": true,
+                  "type": "string"
+                }
+              },
+              "path": "v1/{+name}:annotate",
+              "request": {
+                "$ref": "GoogleCloudRecaptchaenterpriseV1AnnotateAssessmentRequest"
+              },
+              "response": {
+                "$ref": "GoogleCloudRecaptchaenterpriseV1AnnotateAssessmentResponse"
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform"
+              ]
+            },
+            "create": {
+              "description": "Creates an Assessment of the likelihood an event is legitimate.",
+              "flatPath": "v1/projects/{projectsId}/assessments",
+              "httpMethod": "POST",
+              "id": "recaptchaenterprise.projects.assessments.create",
+              "parameterOrder": [
+                "parent"
+              ],
+              "parameters": {
+                "parent": {
+                  "description": "Required. The name of the project in which the assessment will be created, in the format \"projects/{project}\".",
+                  "location": "path",
+                  "pattern": "^projects/[^/]+$",
+                  "required": true,
+                  "type": "string"
+                }
+              },
+              "path": "v1/{+parent}/assessments",
+              "request": {
+                "$ref": "GoogleCloudRecaptchaenterpriseV1Assessment"
+              },
+              "response": {
+                "$ref": "GoogleCloudRecaptchaenterpriseV1Assessment"
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform"
+              ]
+            }
+          }
+        },
+        "keys": {
+          "methods": {
+            "create": {
+              "description": "Creates a new reCAPTCHA Enterprise key.",
+              "flatPath": "v1/projects/{projectsId}/keys",
+              "httpMethod": "POST",
+              "id": "recaptchaenterprise.projects.keys.create",
+              "parameterOrder": [
+                "parent"
+              ],
+              "parameters": {
+                "parent": {
+                  "description": "Required. The name of the project in which the key will be created, in the format \"projects/{project}\".",
+                  "location": "path",
+                  "pattern": "^projects/[^/]+$",
+                  "required": true,
+                  "type": "string"
+                }
+              },
+              "path": "v1/{+parent}/keys",
+              "request": {
+                "$ref": "GoogleCloudRecaptchaenterpriseV1Key"
+              },
+              "response": {
+                "$ref": "GoogleCloudRecaptchaenterpriseV1Key"
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform"
+              ]
+            },
+            "delete": {
+              "description": "Deletes the specified key.",
+              "flatPath": "v1/projects/{projectsId}/keys/{keysId}",
+              "httpMethod": "DELETE",
+              "id": "recaptchaenterprise.projects.keys.delete",
+              "parameterOrder": [
+                "name"
+              ],
+              "parameters": {
+                "name": {
+                  "description": "Required. The name of the key to be deleted, in the format \"projects/{project}/keys/{key}\".",
+                  "location": "path",
+                  "pattern": "^projects/[^/]+/keys/[^/]+$",
+                  "required": true,
+                  "type": "string"
+                }
+              },
+              "path": "v1/{+name}",
+              "response": {
+                "$ref": "GoogleProtobufEmpty"
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform"
+              ]
+            },
+            "get": {
+              "description": "Returns the specified key.",
+              "flatPath": "v1/projects/{projectsId}/keys/{keysId}",
+              "httpMethod": "GET",
+              "id": "recaptchaenterprise.projects.keys.get",
+              "parameterOrder": [
+                "name"
+              ],
+              "parameters": {
+                "name": {
+                  "description": "Required. The name of the requested key, in the format \"projects/{project}/keys/{key}\".",
+                  "location": "path",
+                  "pattern": "^projects/[^/]+/keys/[^/]+$",
+                  "required": true,
+                  "type": "string"
+                }
+              },
+              "path": "v1/{+name}",
+              "response": {
+                "$ref": "GoogleCloudRecaptchaenterpriseV1Key"
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform"
+              ]
+            },
+            "getMetrics": {
+              "description": "Get some aggregated metrics for a Key. This data can be used to build dashboards.",
+              "flatPath": "v1/projects/{projectsId}/keys/{keysId}/metrics",
+              "httpMethod": "GET",
+              "id": "recaptchaenterprise.projects.keys.getMetrics",
+              "parameterOrder": [
+                "name"
+              ],
+              "parameters": {
+                "name": {
+                  "description": "Required. The name of the requested metrics, in the format \"projects/{project}/keys/{key}/metrics\".",
+                  "location": "path",
+                  "pattern": "^projects/[^/]+/keys/[^/]+/metrics$",
+                  "required": true,
+                  "type": "string"
+                }
+              },
+              "path": "v1/{+name}",
+              "response": {
+                "$ref": "GoogleCloudRecaptchaenterpriseV1Metrics"
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform"
+              ]
+            },
+            "list": {
+              "description": "Returns the list of all keys that belong to a project.",
+              "flatPath": "v1/projects/{projectsId}/keys",
+              "httpMethod": "GET",
+              "id": "recaptchaenterprise.projects.keys.list",
+              "parameterOrder": [
+                "parent"
+              ],
+              "parameters": {
+                "pageSize": {
+                  "description": "Optional. The maximum number of keys to return. Default is 10. Max limit is 1000.",
+                  "format": "int32",
+                  "location": "query",
+                  "type": "integer"
+                },
+                "pageToken": {
+                  "description": "Optional. The next_page_token value returned from a previous. ListKeysRequest, if any.",
+                  "location": "query",
+                  "type": "string"
+                },
+                "parent": {
+                  "description": "Required. The name of the project that contains the keys that will be listed, in the format \"projects/{project}\".",
+                  "location": "path",
+                  "pattern": "^projects/[^/]+$",
+                  "required": true,
+                  "type": "string"
+                }
+              },
+              "path": "v1/{+parent}/keys",
+              "response": {
+                "$ref": "GoogleCloudRecaptchaenterpriseV1ListKeysResponse"
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform"
+              ]
+            },
+            "migrate": {
+              "description": "Migrates an existing key from reCAPTCHA to reCAPTCHA Enterprise. Once a key is migrated, it can be used from either product. SiteVerify requests will be billed as CreateAssessment calls.",
+              "flatPath": "v1/projects/{projectsId}/keys/{keysId}:migrate",
+              "httpMethod": "POST",
+              "id": "recaptchaenterprise.projects.keys.migrate",
+              "parameterOrder": [
+                "name"
+              ],
+              "parameters": {
+                "name": {
+                  "description": "Required. The name of the key to be migrated, in the format \"projects/{project}/keys/{key}\".",
+                  "location": "path",
+                  "pattern": "^projects/[^/]+/keys/[^/]+$",
+                  "required": true,
+                  "type": "string"
+                }
+              },
+              "path": "v1/{+name}:migrate",
+              "request": {
+                "$ref": "GoogleCloudRecaptchaenterpriseV1MigrateKeyRequest"
+              },
+              "response": {
+                "$ref": "GoogleCloudRecaptchaenterpriseV1Key"
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform"
+              ]
+            },
+            "patch": {
+              "description": "Updates the specified key.",
+              "flatPath": "v1/projects/{projectsId}/keys/{keysId}",
+              "httpMethod": "PATCH",
+              "id": "recaptchaenterprise.projects.keys.patch",
+              "parameterOrder": [
+                "name"
+              ],
+              "parameters": {
+                "name": {
+                  "description": "The resource name for the Key in the format \"projects/{project}/keys/{key}\".",
+                  "location": "path",
+                  "pattern": "^projects/[^/]+/keys/[^/]+$",
+                  "required": true,
+                  "type": "string"
+                },
+                "updateMask": {
+                  "description": "Optional. The mask to control which field of the key get updated. If the mask is not present, all fields will be updated.",
+                  "format": "google-fieldmask",
+                  "location": "query",
+                  "type": "string"
+                }
+              },
+              "path": "v1/{+name}",
+              "request": {
+                "$ref": "GoogleCloudRecaptchaenterpriseV1Key"
+              },
+              "response": {
+                "$ref": "GoogleCloudRecaptchaenterpriseV1Key"
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform"
+              ]
+            }
+          }
+        }
+      }
+    }
+  },
+  "revision": "20210501",
+  "rootUrl": "https://recaptchaenterprise.googleapis.com/",
+  "schemas": {
+    "GoogleCloudRecaptchaenterpriseV1AndroidKeySettings": {
+      "description": "Settings specific to keys that can be used by Android apps.",
+      "id": "GoogleCloudRecaptchaenterpriseV1AndroidKeySettings",
+      "properties": {
+        "allowedPackageNames": {
+          "description": "Android package names of apps allowed to use the key. Example: 'com.companyname.appname'",
+          "items": {
+            "type": "string"
+          },
+          "type": "array"
+        }
+      },
+      "type": "object"
+    },
+    "GoogleCloudRecaptchaenterpriseV1AnnotateAssessmentRequest": {
+      "description": "The request message to annotate an Assessment.",
+      "id": "GoogleCloudRecaptchaenterpriseV1AnnotateAssessmentRequest",
+      "properties": {
+        "annotation": {
+          "description": "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.",
+          "enum": [
+            "ANNOTATION_UNSPECIFIED",
+            "LEGITIMATE",
+            "FRAUDULENT",
+            "PASSWORD_CORRECT",
+            "PASSWORD_INCORRECT"
+          ],
+          "enumDescriptions": [
+            "Default unspecified type.",
+            "Provides information that the event turned out to be legitimate.",
+            "Provides information that the event turned out to be fraudulent.",
+            "Provides information that the event was related to a login event in which the user typed the correct password. Deprecated, prefer indicating CORRECT_PASSWORD through the reasons field instead.",
+            "Provides information that the event was related to a login event in which the user typed the incorrect password. Deprecated, prefer indicating INCORRECT_PASSWORD through the reasons field instead."
+          ],
+          "type": "string"
+        },
+        "reasons": {
+          "description": "Optional. Optional reasons for the annotation that will be assigned to the Event.",
+          "items": {
+            "enum": [
+              "REASON_UNSPECIFIED",
+              "CHARGEBACK",
+              "PAYMENT_HEURISTICS",
+              "PASSED_TWO_FACTOR",
+              "FAILED_TWO_FACTOR",
+              "CORRECT_PASSWORD",
+              "INCORRECT_PASSWORD"
+            ],
+            "enumDescriptions": [
+              "Default unspecified reason.",
+              "Indicates a chargeback for fraud was issued for the transaction associated with the assessment.",
+              "Indicates the transaction associated with the assessment is suspected of being fraudulent based on the payment method, billing details, shipping address or other transaction information.",
+              "Indicates that the user passed a 2FA challenge.",
+              "Indicates that the user failed a 2FA challenge.",
+              "Indicates the user provided the correct password.",
+              "Indicates the user provided an incorrect password."
+            ],
+            "type": "string"
+          },
+          "type": "array"
+        }
+      },
+      "type": "object"
+    },
+    "GoogleCloudRecaptchaenterpriseV1AnnotateAssessmentResponse": {
+      "description": "Empty response for AnnotateAssessment.",
+      "id": "GoogleCloudRecaptchaenterpriseV1AnnotateAssessmentResponse",
+      "properties": {},
+      "type": "object"
+    },
+    "GoogleCloudRecaptchaenterpriseV1Assessment": {
+      "description": "A recaptcha assessment resource.",
+      "id": "GoogleCloudRecaptchaenterpriseV1Assessment",
+      "properties": {
+        "event": {
+          "$ref": "GoogleCloudRecaptchaenterpriseV1Event",
+          "description": "The event being assessed."
+        },
+        "name": {
+          "description": "Output only. The resource name for the Assessment in the format \"projects/{project}/assessments/{assessment}\".",
+          "readOnly": true,
+          "type": "string"
+        },
+        "riskAnalysis": {
+          "$ref": "GoogleCloudRecaptchaenterpriseV1RiskAnalysis",
+          "description": "Output only. The risk analysis result for the event being assessed.",
+          "readOnly": true
+        },
+        "tokenProperties": {
+          "$ref": "GoogleCloudRecaptchaenterpriseV1TokenProperties",
+          "description": "Output only. Properties of the provided event token.",
+          "readOnly": true
+        }
+      },
+      "type": "object"
+    },
+    "GoogleCloudRecaptchaenterpriseV1ChallengeMetrics": {
+      "description": "Metrics related to challenges.",
+      "id": "GoogleCloudRecaptchaenterpriseV1ChallengeMetrics",
+      "properties": {
+        "failedCount": {
+          "description": "Count of submitted challenge solutions that were incorrect or otherwise deemed suspicious such that a subsequent challenge was triggered.",
+          "format": "int64",
+          "type": "string"
+        },
+        "nocaptchaCount": {
+          "description": "Count of nocaptchas (successful verification without a challenge) issued.",
+          "format": "int64",
+          "type": "string"
+        },
+        "pageloadCount": {
+          "description": "Count of reCAPTCHA checkboxes or badges rendered. This is mostly equivalent to a count of pageloads for pages that include reCAPTCHA.",
+          "format": "int64",
+          "type": "string"
+        },
+        "passedCount": {
+          "description": "Count of nocaptchas (successful verification without a challenge) plus submitted challenge solutions that were correct and resulted in verification.",
+          "format": "int64",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "GoogleCloudRecaptchaenterpriseV1Event": {
+      "id": "GoogleCloudRecaptchaenterpriseV1Event",
+      "properties": {
+        "expectedAction": {
+          "description": "Optional. The expected action for this type of event. This should be the same action provided at token generation time on client-side platforms already integrated with recaptcha enterprise.",
+          "type": "string"
+        },
+        "siteKey": {
+          "description": "Optional. The site key that was used to invoke reCAPTCHA on your site and generate the token.",
+          "type": "string"
+        },
+        "token": {
+          "description": "Optional. The user response token provided by the reCAPTCHA client-side integration on your site.",
+          "type": "string"
+        },
+        "userAgent": {
+          "description": "Optional. The user agent present in the request from the user's device related to this event.",
+          "type": "string"
+        },
+        "userIpAddress": {
+          "description": "Optional. The IP address in the request from the user's device related to this event.",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "GoogleCloudRecaptchaenterpriseV1IOSKeySettings": {
+      "description": "Settings specific to keys that can be used by iOS apps.",
+      "id": "GoogleCloudRecaptchaenterpriseV1IOSKeySettings",
+      "properties": {
+        "allowedBundleIds": {
+          "description": "iOS bundle ids of apps allowed to use the key. Example: 'com.companyname.productname.appname'",
+          "items": {
+            "type": "string"
+          },
+          "type": "array"
+        }
+      },
+      "type": "object"
+    },
+    "GoogleCloudRecaptchaenterpriseV1Key": {
+      "description": "A key used to identify and configure applications (web and/or mobile) that use reCAPTCHA Enterprise.",
+      "id": "GoogleCloudRecaptchaenterpriseV1Key",
+      "properties": {
+        "androidSettings": {
+          "$ref": "GoogleCloudRecaptchaenterpriseV1AndroidKeySettings",
+          "description": "Settings for keys that can be used by Android apps."
+        },
+        "createTime": {
+          "description": "The timestamp corresponding to the creation of this Key.",
+          "format": "google-datetime",
+          "type": "string"
+        },
+        "displayName": {
+          "description": "Human-readable display name of this key. Modifiable by user.",
+          "type": "string"
+        },
+        "iosSettings": {
+          "$ref": "GoogleCloudRecaptchaenterpriseV1IOSKeySettings",
+          "description": "Settings for keys that can be used by iOS apps."
+        },
+        "labels": {
+          "additionalProperties": {
+            "type": "string"
+          },
+          "description": "See Creating and managing labels.",
+          "type": "object"
+        },
+        "name": {
+          "description": "The resource name for the Key in the format \"projects/{project}/keys/{key}\".",
+          "type": "string"
+        },
+        "testingOptions": {
+          "$ref": "GoogleCloudRecaptchaenterpriseV1TestingOptions",
+          "description": "Options for user acceptance testing."
+        },
+        "webSettings": {
+          "$ref": "GoogleCloudRecaptchaenterpriseV1WebKeySettings",
+          "description": "Settings for keys that can be used by websites."
+        }
+      },
+      "type": "object"
+    },
+    "GoogleCloudRecaptchaenterpriseV1ListKeysResponse": {
+      "description": "Response to request to list keys in a project.",
+      "id": "GoogleCloudRecaptchaenterpriseV1ListKeysResponse",
+      "properties": {
+        "keys": {
+          "description": "Key details.",
+          "items": {
+            "$ref": "GoogleCloudRecaptchaenterpriseV1Key"
+          },
+          "type": "array"
+        },
+        "nextPageToken": {
+          "description": "Token to retrieve the next page of results. It is set to empty if no keys remain in results.",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "GoogleCloudRecaptchaenterpriseV1Metrics": {
+      "description": "Metrics for a single Key.",
+      "id": "GoogleCloudRecaptchaenterpriseV1Metrics",
+      "properties": {
+        "challengeMetrics": {
+          "description": "Metrics will be continuous and in order by dates, and in the granularity of day. Only challenge-based keys (CHECKBOX, INVISIBLE), will have challenge-based data.",
+          "items": {
+            "$ref": "GoogleCloudRecaptchaenterpriseV1ChallengeMetrics"
+          },
+          "type": "array"
+        },
+        "scoreMetrics": {
+          "description": "Metrics will be continuous and in order by dates, and in the granularity of day. All Key types should have score-based data.",
+          "items": {
+            "$ref": "GoogleCloudRecaptchaenterpriseV1ScoreMetrics"
+          },
+          "type": "array"
+        },
+        "startTime": {
+          "description": "Inclusive start time aligned to a day (UTC).",
+          "format": "google-datetime",
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "GoogleCloudRecaptchaenterpriseV1MigrateKeyRequest": {
+      "description": "The migrate key request message.",
+      "id": "GoogleCloudRecaptchaenterpriseV1MigrateKeyRequest",
+      "properties": {},
+      "type": "object"
+    },
+    "GoogleCloudRecaptchaenterpriseV1RiskAnalysis": {
+      "description": "Risk analysis result for an event.",
+      "id": "GoogleCloudRecaptchaenterpriseV1RiskAnalysis",
+      "properties": {
+        "reasons": {
+          "description": "Reasons contributing to the risk analysis verdict.",
+          "items": {
+            "enum": [
+              "CLASSIFICATION_REASON_UNSPECIFIED",
+              "AUTOMATION",
+              "UNEXPECTED_ENVIRONMENT",
+              "TOO_MUCH_TRAFFIC",
+              "UNEXPECTED_USAGE_PATTERNS",
+              "LOW_CONFIDENCE_SCORE"
+            ],
+            "enumDescriptions": [
+              "Default unspecified type.",
+              "Interactions matched the behavior of an automated agent.",
+              "The event originated from an illegitimate environment.",
+              "Traffic volume from the event source is higher than normal.",
+              "Interactions with the site were significantly different than expected patterns.",
+              "Too little traffic has been received from this site thus far to generate quality risk analysis."
+            ],
+            "type": "string"
+          },
+          "type": "array"
+        },
+        "score": {
+          "description": "Legitimate event score from 0.0 to 1.0. (1.0 means very likely legitimate traffic while 0.0 means very likely non-legitimate traffic).",
+          "format": "float",
+          "type": "number"
+        }
+      },
+      "type": "object"
+    },
+    "GoogleCloudRecaptchaenterpriseV1ScoreDistribution": {
+      "description": "Score distribution.",
+      "id": "GoogleCloudRecaptchaenterpriseV1ScoreDistribution",
+      "properties": {
+        "scoreBuckets": {
+          "additionalProperties": {
+            "format": "int64",
+            "type": "string"
+          },
+          "description": "Map key is score value multiplied by 100. The scores are discrete values between [0, 1]. The maximum number of buckets is on order of a few dozen, but typically much lower (ie. 10).",
+          "type": "object"
+        }
+      },
+      "type": "object"
+    },
+    "GoogleCloudRecaptchaenterpriseV1ScoreMetrics": {
+      "description": "Metrics related to scoring.",
+      "id": "GoogleCloudRecaptchaenterpriseV1ScoreMetrics",
+      "properties": {
+        "actionMetrics": {
+          "additionalProperties": {
+            "$ref": "GoogleCloudRecaptchaenterpriseV1ScoreDistribution"
+          },
+          "description": "Action-based metrics. The map key is the action name which specified by the site owners at time of the \"execute\" client-side call. Populated only for SCORE keys.",
+          "type": "object"
+        },
+        "overallMetrics": {
+          "$ref": "GoogleCloudRecaptchaenterpriseV1ScoreDistribution",
+          "description": "Aggregated score metrics for all traffic."
+        }
+      },
+      "type": "object"
+    },
+    "GoogleCloudRecaptchaenterpriseV1TestingOptions": {
+      "description": "Options for user acceptance testing.",
+      "id": "GoogleCloudRecaptchaenterpriseV1TestingOptions",
+      "properties": {
+        "testingChallenge": {
+          "description": "For challenge-based keys only (CHECKBOX, INVISIBLE), all challenge requests for this site will return nocaptcha if NOCAPTCHA, or an unsolvable challenge if CHALLENGE.",
+          "enum": [
+            "TESTING_CHALLENGE_UNSPECIFIED",
+            "NOCAPTCHA",
+            "CHALLENGE"
+          ],
+          "enumDescriptions": [
+            "Perform the normal risk analysis and return either nocaptcha or a challenge depending on risk and trust factors.",
+            "Challenge requests for this key will always return a nocaptcha, which does not require a solution.",
+            "Challenge requests for this key will always return an unsolvable challenge."
+          ],
+          "type": "string"
+        },
+        "testingScore": {
+          "description": "All assessments for this Key will return this score. Must be between 0 (likely not legitimate) and 1 (likely legitimate) inclusive.",
+          "format": "float",
+          "type": "number"
+        }
+      },
+      "type": "object"
+    },
+    "GoogleCloudRecaptchaenterpriseV1TokenProperties": {
+      "id": "GoogleCloudRecaptchaenterpriseV1TokenProperties",
+      "properties": {
+        "action": {
+          "description": "Action name provided at token generation.",
+          "type": "string"
+        },
+        "createTime": {
+          "description": "The timestamp corresponding to the generation of the token.",
+          "format": "google-datetime",
+          "type": "string"
+        },
+        "hostname": {
+          "description": "The hostname of the page on which the token was generated.",
+          "type": "string"
+        },
+        "invalidReason": {
+          "description": "Reason associated with the response when valid = false.",
+          "enum": [
+            "INVALID_REASON_UNSPECIFIED",
+            "UNKNOWN_INVALID_REASON",
+            "MALFORMED",
+            "EXPIRED",
+            "DUPE",
+            "MISSING",
+            "BROWSER_ERROR"
+          ],
+          "enumDescriptions": [
+            "Default unspecified type.",
+            "If the failure reason was not accounted for.",
+            "The provided user verification token was malformed.",
+            "The user verification token had expired.",
+            "The user verification had already been seen.",
+            "The user verification token was not present.",
+            "A retriable error (such as network failure) occurred on the browser. Could easily be simulated by an attacker."
+          ],
+          "type": "string"
+        },
+        "valid": {
+          "description": "Whether the provided user response token is valid. When valid = false, the reason could be specified in invalid_reason or it could also be due to a user failing to solve a challenge or a sitekey mismatch (i.e the sitekey used to generate the token was different than the one specified in the assessment).",
+          "type": "boolean"
+        }
+      },
+      "type": "object"
+    },
+    "GoogleCloudRecaptchaenterpriseV1WebKeySettings": {
+      "description": "Settings specific to keys that can be used by websites.",
+      "id": "GoogleCloudRecaptchaenterpriseV1WebKeySettings",
+      "properties": {
+        "allowAllDomains": {
+          "description": "If set to true, it means allowed_domains will not be enforced.",
+          "type": "boolean"
+        },
+        "allowAmpTraffic": {
+          "description": "Required. Whether this key can be used on AMP (Accelerated Mobile Pages) websites. This can only be set for the SCORE integration type.",
+          "type": "boolean"
+        },
+        "allowedDomains": {
+          "description": "Domains or subdomains of websites allowed to use the key. All subdomains of an allowed domain are automatically allowed. A valid domain requires a host and must not include any path, port, query or fragment. Examples: 'example.com' or 'subdomain.example.com'",
+          "items": {
+            "type": "string"
+          },
+          "type": "array"
+        },
+        "challengeSecurityPreference": {
+          "description": "Settings for the frequency and difficulty at which this key triggers captcha challenges. This should only be specified for IntegrationTypes CHECKBOX and INVISIBLE.",
+          "enum": [
+            "CHALLENGE_SECURITY_PREFERENCE_UNSPECIFIED",
+            "USABILITY",
+            "BALANCE",
+            "SECURITY"
+          ],
+          "enumDescriptions": [
+            "Default type that indicates this enum hasn't been specified.",
+            "Key tends to show fewer and easier challenges.",
+            "Key tends to show balanced (in amount and difficulty) challenges.",
+            "Key tends to show more and harder challenges."
+          ],
+          "type": "string"
+        },
+        "integrationType": {
+          "description": "Required. Describes how this key is integrated with the website.",
+          "enum": [
+            "INTEGRATION_TYPE_UNSPECIFIED",
+            "SCORE",
+            "CHECKBOX",
+            "INVISIBLE"
+          ],
+          "enumDescriptions": [
+            "Default type that indicates this enum hasn't been specified. This is not a valid IntegrationType, one of the other types must be specified instead.",
+            "Only used to produce scores. It doesn't display the \"I'm not a robot\" checkbox and never shows captcha challenges.",
+            "Displays the \"I'm not a robot\" checkbox and may show captcha challenges after it is checked.",
+            "Doesn't display the \"I'm not a robot\" checkbox, but may show captcha challenges after risk analysis."
+          ],
+          "type": "string"
+        }
+      },
+      "type": "object"
+    },
+    "GoogleProtobufEmpty": {
+      "description": "A generic empty message that you can re-use to avoid defining duplicated empty messages in your APIs. A typical example is to use it as the request or the response type of an API method. For instance: service Foo { rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty); } The JSON representation for `Empty` is empty JSON object `{}`.",
+      "id": "GoogleProtobufEmpty",
+      "properties": {},
+      "type": "object"
+    }
+  },
+  "servicePath": "",
+  "title": "reCAPTCHA Enterprise API",
+  "version": "v1",
+  "version_module": true
+}
\ No newline at end of file